code.vegaprotocol.io/vega@v0.79.0/datanode/gateway/graphql/asset_resolver.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package gql 17 18 import ( 19 "context" 20 21 v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" 22 types "code.vegaprotocol.io/vega/protos/vega" 23 ) 24 25 type myAssetResolver VegaResolverRoot 26 27 func listAssetAccounts(ctx context.Context, client TradingDataServiceClientV2, asset *types.Asset, accountType types.AccountType) (*v2.AccountBalance, error) { 28 if asset == nil || len(asset.Id) <= 0 { 29 return nil, ErrMissingIDOrReference 30 } 31 32 req := &v2.ListAccountsRequest{ 33 Filter: &v2.AccountFilter{ 34 AssetId: asset.Id, 35 AccountTypes: []types.AccountType{accountType}, 36 }, 37 } 38 39 res, err := client.ListAccounts(ctx, req) 40 if err != nil { 41 return nil, err 42 } 43 44 var acc *v2.AccountBalance 45 if len(res.Accounts.Edges) > 0 { 46 acc = res.Accounts.Edges[0].Node 47 } 48 49 return acc, nil 50 } 51 52 func (r *myAssetResolver) InfrastructureFeeAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 53 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_FEES_INFRASTRUCTURE) 54 } 55 56 func (r *myAssetResolver) GlobalRewardPoolAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 57 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_GLOBAL_REWARD) 58 } 59 60 func (r *myAssetResolver) TakerFeeRewardAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 61 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES) 62 } 63 64 func (r *myAssetResolver) MakerFeeRewardAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 65 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES) 66 } 67 68 func (r *myAssetResolver) LpFeeRewardAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 69 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES) 70 } 71 72 func (r *myAssetResolver) MarketProposerRewardAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 73 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS) 74 } 75 76 func (r *myAssetResolver) NetworkTreasuryAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 77 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_NETWORK_TREASURY) 78 } 79 80 func (r *myAssetResolver) GlobalInsuranceAccount(ctx context.Context, asset *types.Asset) (*v2.AccountBalance, error) { 81 return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_GLOBAL_INSURANCE) 82 } 83 84 func (r myAssetResolver) Name(_ context.Context, obj *types.Asset) (string, error) { 85 return obj.Details.Name, nil 86 } 87 88 func (r myAssetResolver) Symbol(_ context.Context, obj *types.Asset) (string, error) { 89 return obj.Details.Symbol, nil 90 } 91 92 func (r *myAssetResolver) Decimals(_ context.Context, obj *types.Asset) (int, error) { 93 return int(obj.Details.Decimals), nil 94 } 95 96 func (r *myAssetResolver) Quantum(_ context.Context, obj *types.Asset) (string, error) { 97 return obj.Details.Quantum, nil 98 } 99 100 func (r *myAssetResolver) Source(_ context.Context, obj *types.Asset) (AssetSource, error) { 101 return AssetSourceFromProto(obj.Details) 102 } 103 104 func AssetSourceFromProto(pdetails *types.AssetDetails) (AssetSource, error) { 105 if pdetails == nil { 106 return nil, ErrNilAssetSource 107 } 108 switch asimpl := pdetails.Source.(type) { 109 case *types.AssetDetails_BuiltinAsset: 110 return BuiltinAssetFromProto(asimpl.BuiltinAsset), nil 111 case *types.AssetDetails_Erc20: 112 return ERC20FromProto(asimpl.Erc20), nil 113 default: 114 return nil, ErrUnimplementedAssetSource 115 } 116 } 117 118 func BuiltinAssetFromProto(ba *types.BuiltinAsset) *BuiltinAsset { 119 return &BuiltinAsset{ 120 MaxFaucetAmountMint: ba.MaxFaucetAmountMint, 121 } 122 } 123 124 func ERC20FromProto(ea *types.ERC20) *Erc20 { 125 return &Erc20{ 126 ContractAddress: ea.ContractAddress, 127 LifetimeLimit: ea.LifetimeLimit, 128 WithdrawThreshold: ea.WithdrawThreshold, 129 ChainID: ea.ChainId, 130 } 131 }