diff --git a/pkg/fetchers/neutron/fetcher.go b/pkg/fetchers/neutron/fetcher.go index 69301d8..b261131 100644 --- a/pkg/fetchers/neutron/fetcher.go +++ b/pkg/fetchers/neutron/fetcher.go @@ -1,6 +1,8 @@ package neutron import ( + "encoding/base64" + "fmt" "main/pkg/http" "main/pkg/types" @@ -20,3 +22,22 @@ func NewFetcher(chainConfig *types.Chain, logger zerolog.Logger) *Fetcher { Client: http.NewClient(chainConfig.Name, chainConfig.LCDEndpoints, logger), } } + +func (fetcher *Fetcher) GetSmartContractState(queryString string, output interface{}) *types.QueryError { + query := base64.StdEncoding.EncodeToString([]byte(queryString)) + + url := fmt.Sprintf( + "/cosmwasm/wasm/v1/contract/%s/smart/%s", + fetcher.ChainConfig.NeutronSmartContract, + query, + ) + + if errs := fetcher.Client.Get(url, &output); len(errs) > 0 { + return &types.QueryError{ + QueryError: nil, + NodeErrors: errs, + } + } + + return nil +} diff --git a/pkg/fetchers/neutron/proposals.go b/pkg/fetchers/neutron/proposals.go index 4503b88..3c92546 100644 --- a/pkg/fetchers/neutron/proposals.go +++ b/pkg/fetchers/neutron/proposals.go @@ -1,27 +1,16 @@ package neutron import ( - "encoding/base64" - "fmt" "main/pkg/fetchers/neutron/responses" "main/pkg/types" ) func (fetcher *Fetcher) GetAllProposals() ([]types.Proposal, *types.QueryError) { - query := base64.StdEncoding.EncodeToString([]byte("{\"list_proposals\": {}}")) - - url := fmt.Sprintf( - "/cosmwasm/wasm/v1/contract/%s/smart/%s", - fetcher.ChainConfig.NeutronSmartContract, - query, - ) + query := "{\"list_proposals\": {}}" var proposals responses.ProposalsResponse - if errs := fetcher.Client.Get(url, &proposals); len(errs) > 0 { - return nil, &types.QueryError{ - QueryError: nil, - NodeErrors: errs, - } + if err := fetcher.GetSmartContractState(query, &proposals); err != nil { + return nil, err } proposalsParsed, err := proposals.ToProposals() diff --git a/pkg/fetchers/neutron/responses/vote.go b/pkg/fetchers/neutron/responses/vote.go new file mode 100644 index 0000000..5b62e09 --- /dev/null +++ b/pkg/fetchers/neutron/responses/vote.go @@ -0,0 +1,44 @@ +package responses + +import ( + "main/pkg/types" +) + +type Vote struct { + Voter string `json:"voter"` + Vote string `json:"vote"` +} + +func (v Vote) GetOption() string { + options := map[string]string{ + "yes": "Yes", + "no": "No", + "abstain": "Abstain", + } + + if option, ok := options[v.Vote]; ok { + return option + } + + return v.Vote +} + +type VoteResponse struct { + Data struct { + Vote *Vote `json:"vote"` + } `json:"data"` +} + +func (v VoteResponse) ToVote(proposalID string) *types.Vote { + if v.Data.Vote == nil { + return nil + } + + return &types.Vote{ + ProposalID: proposalID, + Voter: v.Data.Vote.Voter, + Options: []types.VoteOption{ + {Option: v.Data.Vote.GetOption(), Weight: 1}, + }, + } +} diff --git a/pkg/fetchers/neutron/tally.go b/pkg/fetchers/neutron/tally.go index 74be8c8..c9720da 100644 --- a/pkg/fetchers/neutron/tally.go +++ b/pkg/fetchers/neutron/tally.go @@ -1,27 +1,16 @@ package neutron import ( - "encoding/base64" - "fmt" "main/pkg/fetchers/neutron/responses" "main/pkg/types" ) func (fetcher *Fetcher) GetTallies() (types.ChainTallyInfos, error) { - query := base64.StdEncoding.EncodeToString([]byte("{\"list_proposals\": {}}")) - - url := fmt.Sprintf( - "/cosmwasm/wasm/v1/contract/%s/smart/%s", - fetcher.ChainConfig.NeutronSmartContract, - query, - ) + query := "{\"list_proposals\": {}}" var proposals responses.ProposalsResponse - if errs := fetcher.Client.Get(url, &proposals); len(errs) > 0 { - return types.ChainTallyInfos{}, &types.QueryError{ - QueryError: nil, - NodeErrors: errs, - } + if err := fetcher.GetSmartContractState(query, &proposals); err != nil { + return types.ChainTallyInfos{}, err } tallyInfos, err := proposals.ToTally() diff --git a/pkg/fetchers/neutron/vote.go b/pkg/fetchers/neutron/vote.go index e8e2fc0..8a42f69 100644 --- a/pkg/fetchers/neutron/vote.go +++ b/pkg/fetchers/neutron/vote.go @@ -1,8 +1,23 @@ package neutron -import "main/pkg/types" +import ( + "fmt" + "main/pkg/fetchers/neutron/responses" + "main/pkg/types" +) func (fetcher *Fetcher) GetVote(proposal, voter string) (*types.Vote, *types.QueryError) { - // TODO: fix - return nil, nil + query := fmt.Sprintf( + "{\"get_vote\":{\"proposal_id\":%s,\"voter\":\"%s\"}}", + proposal, + voter, + ) + + var vote responses.VoteResponse + if err := fetcher.GetSmartContractState(query, &vote); err != nil { + return nil, err + } + + voteParsed := vote.ToVote(proposal) + return voteParsed, nil } diff --git a/pkg/types/chain.go b/pkg/types/chain.go index 420d6ea..2cfa322 100644 --- a/pkg/types/chain.go +++ b/pkg/types/chain.go @@ -108,18 +108,14 @@ func (c Chain) GetProposalLink(proposal Proposal) Link { func (c Chain) GetWalletLink(wallet *Wallet) Link { if c.Explorer == nil || c.Explorer.WalletLinkPattern == "" { - return Link{Name: wallet.Address} + return Link{Name: wallet.AddressOrAlias()} } link := Link{ - Name: wallet.Address, + Name: wallet.AddressOrAlias(), Href: fmt.Sprintf(c.Explorer.WalletLinkPattern, wallet.Address), } - if wallet.Alias != "" { - link.Name = wallet.Alias - } - return link }