code.vegaprotocol.io/vega@v0.79.0/datanode/gateway/graphql/resolvers.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  	"encoding/base64"
    21  	"errors"
    22  	"fmt"
    23  	"io"
    24  	"strconv"
    25  
    26  	"code.vegaprotocol.io/vega/datanode/gateway"
    27  	"code.vegaprotocol.io/vega/datanode/vegatime"
    28  	"code.vegaprotocol.io/vega/libs/num"
    29  	"code.vegaprotocol.io/vega/libs/ptr"
    30  	"code.vegaprotocol.io/vega/logging"
    31  	v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2"
    32  	"code.vegaprotocol.io/vega/protos/vega"
    33  	vegapb "code.vegaprotocol.io/vega/protos/vega"
    34  	vegaprotoapi "code.vegaprotocol.io/vega/protos/vega/api/v1"
    35  	commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1"
    36  	eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1"
    37  	v1 "code.vegaprotocol.io/vega/protos/vega/events/v1"
    38  
    39  	"github.com/shopspring/decimal"
    40  	"google.golang.org/grpc"
    41  )
    42  
    43  var (
    44  	// ErrMissingIDOrReference is returned when neither id nor reference has been supplied in the query.
    45  	ErrMissingIDOrReference = errors.New("missing id or reference")
    46  	// ErrMissingNodeID is returned when no node id has been supplied in the query.
    47  	ErrMissingNodeID = errors.New("missing node id")
    48  	// ErrInvalidVotesSubscription is returned if neither proposal ID nor party ID is specified.
    49  	ErrInvalidVotesSubscription = errors.New("invalid subscription, either proposal or party ID required")
    50  	// ErrInvalidProposal is returned when invalid governance data is received by proposal resolver.
    51  	ErrInvalidProposal = errors.New("invalid proposal")
    52  	// ErrInvalidStopOrder is returned when an invalid stop order is received by the stop order resolver.
    53  	ErrInvalidStopOrder = errors.New("invalid stop order")
    54  )
    55  
    56  //go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/datanode/gateway/graphql CoreProxyServiceClient,TradingDataServiceClientV2
    57  
    58  // CoreProxyServiceClient ...
    59  type CoreProxyServiceClient interface {
    60  	vegaprotoapi.CoreServiceClient
    61  }
    62  
    63  type TradingDataServiceClientV2 interface {
    64  	v2.TradingDataServiceClient
    65  }
    66  
    67  // VegaResolverRoot is the root resolver for all graphql types.
    68  type VegaResolverRoot struct {
    69  	gateway.Config
    70  
    71  	log                 *logging.Logger
    72  	tradingProxyClient  CoreProxyServiceClient
    73  	tradingDataClientV2 TradingDataServiceClientV2
    74  	r                   allResolver
    75  }
    76  
    77  // NewResolverRoot instantiate a graphql root resolver.
    78  func NewResolverRoot(
    79  	log *logging.Logger,
    80  	config gateway.Config,
    81  	tradingClient CoreProxyServiceClient,
    82  	tradingDataClientV2 TradingDataServiceClientV2,
    83  ) *VegaResolverRoot {
    84  	return &VegaResolverRoot{
    85  		log:                 log,
    86  		Config:              config,
    87  		tradingProxyClient:  tradingClient,
    88  		tradingDataClientV2: tradingDataClientV2,
    89  		r:                   allResolver{log, tradingDataClientV2},
    90  	}
    91  }
    92  
    93  // Query returns the query resolver.
    94  func (r *VegaResolverRoot) Query() QueryResolver {
    95  	return (*myQueryResolver)(r)
    96  }
    97  
    98  // Candle returns the candles resolver.
    99  func (r *VegaResolverRoot) Candle() CandleResolver {
   100  	return (*myCandleResolver)(r)
   101  }
   102  
   103  func (r *VegaResolverRoot) DataSourceDefinition() DataSourceDefinitionResolver {
   104  	return (*myDataSourceDefinitionResolver)(r)
   105  }
   106  
   107  func (r *VegaResolverRoot) DataSourceDefinitionExternal() DataSourceDefinitionExternalResolver {
   108  	return (*myDataSourceDefinitionExternalResolver)(r)
   109  }
   110  
   111  func (r *VegaResolverRoot) DataSourceDefinitionInternal() DataSourceDefinitionInternalResolver {
   112  	return (*myDataSourceDefinitionInternalResolver)(r)
   113  }
   114  
   115  func (r *VegaResolverRoot) DataSourceSpecConfiguration() DataSourceSpecConfigurationResolver {
   116  	return (*myDataSourceSpecConfigurationResolver)(r)
   117  }
   118  
   119  // MarginLevels returns the market levels resolver.
   120  func (r *VegaResolverRoot) MarginLevels() MarginLevelsResolver {
   121  	return (*myMarginLevelsResolver)(r)
   122  }
   123  
   124  // MarginLevels returns the market levels resolver.
   125  func (r *VegaResolverRoot) MarginEstimate() MarginEstimateResolver {
   126  	return (*myMarginEstimateResolver)(r)
   127  }
   128  
   129  // MarginLevelsUpdate returns the market levels resolver.
   130  func (r *VegaResolverRoot) MarginLevelsUpdate() MarginLevelsUpdateResolver {
   131  	return (*myMarginLevelsUpdateResolver)(r)
   132  }
   133  
   134  func (r *VegaResolverRoot) OrderInfo() OrderInfoResolver {
   135  	return (*myOrderInfoResolver)(r)
   136  }
   137  
   138  type myOrderInfoResolver VegaResolverRoot
   139  
   140  func (r *myOrderInfoResolver) Remaining(ctx context.Context, obj *v2.OrderInfo, data string) error {
   141  	remaining, err := strconv.ParseUint(data, 10, 64)
   142  	if err == nil {
   143  		obj.Remaining = remaining
   144  	}
   145  	return err
   146  }
   147  
   148  // PriceLevel returns the price levels resolver.
   149  func (r *VegaResolverRoot) PriceLevel() PriceLevelResolver {
   150  	return (*myPriceLevelResolver)(r)
   151  }
   152  
   153  // Market returns the markets resolver.
   154  func (r *VegaResolverRoot) Market() MarketResolver {
   155  	return (*myMarketResolver)(r)
   156  }
   157  
   158  // Order returns the order resolver.
   159  func (r *VegaResolverRoot) Order() OrderResolver {
   160  	return (*myOrderResolver)(r)
   161  }
   162  
   163  // OrderUpdate returns the order resolver.
   164  func (r *VegaResolverRoot) OrderUpdate() OrderUpdateResolver {
   165  	return (*myOrderUpdateResolver)(r)
   166  }
   167  
   168  // Trade returns the trades resolver.
   169  func (r *VegaResolverRoot) Trade() TradeResolver {
   170  	return (*myTradeResolver)(r)
   171  }
   172  
   173  // Position returns the positions resolver.
   174  func (r *VegaResolverRoot) Position() PositionResolver {
   175  	return (*myPositionResolver)(r)
   176  }
   177  
   178  // PositionUpdate returns the positionUpdate resolver.
   179  func (r *VegaResolverRoot) PositionUpdate() PositionUpdateResolver {
   180  	return (*positionUpdateResolver)(r)
   181  }
   182  
   183  // Party returns the parties resolver.
   184  func (r *VegaResolverRoot) Party() PartyResolver {
   185  	return (*myPartyResolver)(r)
   186  }
   187  
   188  // Subscription returns the subscriptions resolver.
   189  func (r *VegaResolverRoot) Subscription() SubscriptionResolver {
   190  	return (*mySubscriptionResolver)(r)
   191  }
   192  
   193  // Account returns the accounts resolver.
   194  func (r *VegaResolverRoot) AccountEvent() AccountEventResolver {
   195  	return (*myAccountEventResolver)(r)
   196  }
   197  
   198  // Account returns the accounts resolver.
   199  func (r *VegaResolverRoot) AccountBalance() AccountBalanceResolver {
   200  	return (*myAccountResolver)(r)
   201  }
   202  
   203  // Account returns the accounts resolver.
   204  func (r *VegaResolverRoot) AccountDetails() AccountDetailsResolver {
   205  	return (*myAccountDetailsResolver)(r)
   206  }
   207  
   208  // Proposal returns the proposal resolver.
   209  func (r *VegaResolverRoot) Proposal() ProposalResolver {
   210  	return (*proposalResolver)(r)
   211  }
   212  
   213  // Proposal returns the proposal resolver.
   214  func (r *VegaResolverRoot) ProposalEdge() ProposalEdgeResolver {
   215  	return (*proposalEdgeResolver)(r)
   216  }
   217  
   218  // ProposalDetail returns the Proposal detail resolver.
   219  func (r *VegaResolverRoot) ProposalDetail() ProposalDetailResolver {
   220  	return (*proposalDetailResolver)(r)
   221  }
   222  
   223  // NodeSignature ...
   224  func (r *VegaResolverRoot) NodeSignature() NodeSignatureResolver {
   225  	return (*myNodeSignatureResolver)(r)
   226  }
   227  
   228  // Asset ...
   229  func (r *VegaResolverRoot) Asset() AssetResolver {
   230  	return (*myAssetResolver)(r)
   231  }
   232  
   233  // Deposit ...
   234  func (r *VegaResolverRoot) Deposit() DepositResolver {
   235  	return (*myDepositResolver)(r)
   236  }
   237  
   238  func (r *VegaResolverRoot) MarketFees() MarketFeesResolver {
   239  	return (*partyDiscountStatsResolver)(r)
   240  }
   241  
   242  func (r *VegaResolverRoot) PartyDiscountStats() PartyDiscountStatsResolver {
   243  	return (*partyDiscountStatsResolver)(r)
   244  }
   245  
   246  // Withdrawal ...
   247  func (r *VegaResolverRoot) Withdrawal() WithdrawalResolver {
   248  	return (*myWithdrawalResolver)(r)
   249  }
   250  
   251  func (r *VegaResolverRoot) DataSourceSpecConfigurationTime() DataSourceSpecConfigurationTimeResolver {
   252  	return (*myDataSourceSpecConfigurationTimeResolver)(r)
   253  }
   254  
   255  func (r *VegaResolverRoot) DataSourceSpecConfigurationTimeTrigger() DataSourceSpecConfigurationTimeTriggerResolver {
   256  	return (*myDataSourceSpecConfigurationTimeTriggerResolver)(r)
   257  }
   258  
   259  func (r *VegaResolverRoot) LiquidityOrderReference() LiquidityOrderReferenceResolver {
   260  	return (*myLiquidityOrderReferenceResolver)(r)
   261  }
   262  
   263  func (r *VegaResolverRoot) LiquidityProvision() LiquidityProvisionResolver {
   264  	return (*myLiquidityProvisionResolver)(r)
   265  }
   266  
   267  func (r *VegaResolverRoot) Future() FutureResolver {
   268  	return (*myFutureResolver)(r)
   269  }
   270  
   271  func (r *VegaResolverRoot) FutureProduct() FutureProductResolver {
   272  	return (*myFutureProductResolver)(r)
   273  }
   274  
   275  func (r *VegaResolverRoot) Instrument() InstrumentResolver {
   276  	return (*myInstrumentResolver)(r)
   277  }
   278  
   279  func (r *VegaResolverRoot) InstrumentConfiguration() InstrumentConfigurationResolver {
   280  	return (*myInstrumentConfigurationResolver)(r)
   281  }
   282  
   283  func (r *VegaResolverRoot) TradableInstrument() TradableInstrumentResolver {
   284  	return (*myTradableInstrumentResolver)(r)
   285  }
   286  
   287  func (r *VegaResolverRoot) NewAsset() NewAssetResolver {
   288  	return (*newAssetResolver)(r)
   289  }
   290  
   291  func (r *VegaResolverRoot) UpdateAsset() UpdateAssetResolver {
   292  	return (*updateAssetResolver)(r)
   293  }
   294  
   295  func (r *VegaResolverRoot) NewMarket() NewMarketResolver {
   296  	return (*newMarketResolver)(r)
   297  }
   298  
   299  func (r *VegaResolverRoot) ProposalTerms() ProposalTermsResolver {
   300  	return (*proposalTermsResolver)(r)
   301  }
   302  
   303  func (r *VegaResolverRoot) BatchProposalTerms() BatchProposalTermsResolver {
   304  	return (*batchProposalTermsResolver)(r)
   305  }
   306  
   307  func (r *VegaResolverRoot) BatchProposalTermsChange() BatchProposalTermsChangeResolver {
   308  	return (*batchProposalTermsChangeResolver)(r)
   309  }
   310  
   311  func (r *VegaResolverRoot) UpdateMarket() UpdateMarketResolver {
   312  	return (*updateMarketResolver)(r)
   313  }
   314  
   315  func (r *VegaResolverRoot) UpdateNetworkParameter() UpdateNetworkParameterResolver {
   316  	return (*updateNetworkParameterResolver)(r)
   317  }
   318  
   319  func (r *VegaResolverRoot) NewFreeform() NewFreeformResolver {
   320  	return (*newFreeformResolver)(r)
   321  }
   322  
   323  func (r *VegaResolverRoot) NewTransfer() NewTransferResolver {
   324  	return (*newTransferResolver)(r)
   325  }
   326  
   327  func (r *VegaResolverRoot) CancelTransfer() CancelTransferResolver {
   328  	return (*cancelTransferResolver)(r)
   329  }
   330  
   331  func (r *VegaResolverRoot) UpdateMarketState() UpdateMarketStateResolver {
   332  	return (*updateMarketStateResolver)(r)
   333  }
   334  
   335  func (r *VegaResolverRoot) OracleSpec() OracleSpecResolver {
   336  	return (*oracleSpecResolver)(r)
   337  }
   338  
   339  func (r *VegaResolverRoot) OracleData() OracleDataResolver {
   340  	return (*oracleDataResolver)(r)
   341  }
   342  
   343  func (r *VegaResolverRoot) AuctionEvent() AuctionEventResolver {
   344  	return (*auctionEventResolver)(r)
   345  }
   346  
   347  func (r *VegaResolverRoot) Vote() VoteResolver {
   348  	return (*voteResolver)(r)
   349  }
   350  
   351  func (r *VegaResolverRoot) EquityLikeShareWeightPerMarket() EquityLikeShareWeightPerMarketResolver {
   352  	return (*elsWeightPerMarketResolver)(r)
   353  }
   354  
   355  func (r *VegaResolverRoot) NodeData() NodeDataResolver {
   356  	return (*nodeDataResolver)(r)
   357  }
   358  
   359  func (r *VegaResolverRoot) Node() NodeResolver {
   360  	return (*nodeResolver)(r)
   361  }
   362  
   363  func (r *VegaResolverRoot) RankingScore() RankingScoreResolver {
   364  	return (*rankingScoreResolver)(r)
   365  }
   366  
   367  func (r *VegaResolverRoot) KeyRotation() KeyRotationResolver {
   368  	return (*keyRotationResolver)(r)
   369  }
   370  
   371  func (r *VegaResolverRoot) EthereumKeyRotation() EthereumKeyRotationResolver {
   372  	return (*ethereumKeyRotationResolver)(r)
   373  }
   374  
   375  func (r *VegaResolverRoot) Delegation() DelegationResolver {
   376  	return (*delegationResolver)(r)
   377  }
   378  
   379  func (r *VegaResolverRoot) DateRange() DateRangeResolver {
   380  	return (*dateRangeResolver)(r)
   381  }
   382  
   383  func (r *VegaResolverRoot) Epoch() EpochResolver {
   384  	return (*epochResolver)(r)
   385  }
   386  
   387  func (r *VegaResolverRoot) EpochTimestamps() EpochTimestampsResolver {
   388  	return (*epochTimestampsResolver)(r)
   389  }
   390  
   391  func (r *VegaResolverRoot) EthCallSpec() EthCallSpecResolver {
   392  	return (*ethCallSpecResolver)(r)
   393  }
   394  
   395  func (r *VegaResolverRoot) Reward() RewardResolver {
   396  	return (*rewardResolver)(r)
   397  }
   398  
   399  func (r *VegaResolverRoot) RewardSummary() RewardSummaryResolver {
   400  	return (*rewardSummaryResolver)(r)
   401  }
   402  
   403  func (r *VegaResolverRoot) StakeLinking() StakeLinkingResolver {
   404  	return (*stakeLinkingResolver)(r)
   405  }
   406  
   407  func (r *VegaResolverRoot) PartyStake() PartyStakeResolver {
   408  	return (*partyStakeResolver)(r)
   409  }
   410  
   411  func (r *VegaResolverRoot) Statistics() StatisticsResolver {
   412  	return (*statisticsResolver)(r)
   413  }
   414  
   415  func (r *VegaResolverRoot) Transfer() TransferResolver {
   416  	return (*transferResolver)(r)
   417  }
   418  
   419  func (r *VegaResolverRoot) RecurringTransfer() RecurringTransferResolver {
   420  	return (*recurringTransferResolver)(r)
   421  }
   422  
   423  func (r *VegaResolverRoot) RecurringGovernanceTransfer() RecurringGovernanceTransferResolver {
   424  	return (*recurringGovernanceTransferResolver)(r)
   425  }
   426  
   427  func (r *VegaResolverRoot) UpdateMarketConfiguration() UpdateMarketConfigurationResolver {
   428  	return (*updateMarketConfigurationResolver)(r)
   429  }
   430  
   431  func (r *VegaResolverRoot) AccountUpdate() AccountUpdateResolver {
   432  	return (*accountUpdateResolver)(r)
   433  }
   434  
   435  func (r *VegaResolverRoot) TradeUpdate() TradeUpdateResolver {
   436  	return (*tradeUpdateResolver)(r)
   437  }
   438  
   439  func (r *VegaResolverRoot) LiquidityProvisionUpdate() LiquidityProvisionUpdateResolver {
   440  	return (*liquidityProvisionUpdateResolver)(r)
   441  }
   442  
   443  func (r *VegaResolverRoot) TransactionResult() TransactionResultResolver {
   444  	return (*transactionResultResolver)(r)
   445  }
   446  
   447  func (r *VegaResolverRoot) ProtocolUpgradeProposal() ProtocolUpgradeProposalResolver {
   448  	return (*protocolUpgradeProposalResolver)(r)
   449  }
   450  
   451  func (r *VegaResolverRoot) CoreSnapshotData() CoreSnapshotDataResolver {
   452  	return (*coreDataSnapshotResolver)(r)
   453  }
   454  
   455  func (r *VegaResolverRoot) EpochRewardSummary() EpochRewardSummaryResolver {
   456  	return (*epochRewardSummaryResolver)(r)
   457  }
   458  
   459  func (r *VegaResolverRoot) OrderFilter() OrderFilterResolver {
   460  	return (*orderFilterResolver)(r)
   461  }
   462  
   463  func (r *VegaResolverRoot) LedgerEntry() LedgerEntryResolver {
   464  	return (*ledgerEntryResolver)(r)
   465  }
   466  
   467  func (r *VegaResolverRoot) ERC20MultiSigSignerAddedBundle() ERC20MultiSigSignerAddedBundleResolver {
   468  	return (*erc20MultiSigSignerAddedBundleResolver)(r)
   469  }
   470  
   471  func (r *VegaResolverRoot) ERC20MultiSigSignerRemovedBundle() ERC20MultiSigSignerRemovedBundleResolver {
   472  	return (*erc20MultiSigSignerRemovedBundleResolver)(r)
   473  }
   474  
   475  func (r *VegaResolverRoot) IcebergOrder() IcebergOrderResolver {
   476  	return (*icebergOrderResolver)(r)
   477  }
   478  
   479  func (r *VegaResolverRoot) OrderSubmission() OrderSubmissionResolver {
   480  	return (*orderSubmissionResolver)(r)
   481  }
   482  
   483  func (r *VegaResolverRoot) StopOrder() StopOrderResolver {
   484  	return (*stopOrderResolver)(r)
   485  }
   486  
   487  func (r *VegaResolverRoot) StopOrderFilter() StopOrderFilterResolver {
   488  	return (*stopOrderFilterResolver)(r)
   489  }
   490  
   491  // RewardSummaryFilter returns RewardSummaryFilterResolver implementation.
   492  func (r *VegaResolverRoot) RewardSummaryFilter() RewardSummaryFilterResolver {
   493  	return (*rewardSummaryFilterResolver)(r)
   494  }
   495  
   496  func (r *VegaResolverRoot) LiquidityProvider() LiquidityProviderResolver {
   497  	return (*liquidityProviderResolver)(r)
   498  }
   499  
   500  func (r *VegaResolverRoot) FundingPeriod() FundingPeriodResolver {
   501  	return (*fundingPeriodResolver)(r)
   502  }
   503  
   504  func (r *VegaResolverRoot) FundingPeriodDataPoint() FundingPeriodDataPointResolver {
   505  	return (*fundingPeriodDataPointResolver)(r)
   506  }
   507  
   508  func (r *VegaResolverRoot) Perpetual() PerpetualResolver {
   509  	return (*perpetualResolver)(r)
   510  }
   511  
   512  func (r *VegaResolverRoot) PerpetualProduct() PerpetualProductResolver {
   513  	return (*perpetualProductResolver)(r)
   514  }
   515  
   516  func (r *VegaResolverRoot) Spot() SpotResolver {
   517  	return (*spotResolver)(r)
   518  }
   519  
   520  func (r *VegaResolverRoot) SpotProduct() SpotProductResolver {
   521  	return (*spotProductResolver)(r)
   522  }
   523  
   524  func (r *VegaResolverRoot) LiquiditySLAParameters() LiquiditySLAParametersResolver {
   525  	return (*liquiditySLAParametersResolver)(r)
   526  }
   527  
   528  func (r *VegaResolverRoot) LiquidationStrategy() LiquidationStrategyResolver {
   529  	return (*liquidationStrategyResolver)(r)
   530  }
   531  
   532  func (r *VegaResolverRoot) CompositePriceConfiguration() CompositePriceConfigurationResolver {
   533  	return (*compositePriceConfigurationResolver)(r)
   534  }
   535  
   536  func (r *VegaResolverRoot) NewSpotMarket() NewSpotMarketResolver {
   537  	return (*newSpotMarketResolver)(r)
   538  }
   539  
   540  func (r *VegaResolverRoot) UpdateSpotMarket() UpdateSpotMarketResolver {
   541  	return (*updateSpotMarketResolver)(r)
   542  }
   543  
   544  func (r *VegaResolverRoot) UpdateSpotMarketConfiguration() UpdateSpotMarketConfigurationResolver {
   545  	return (*updateSpotMarketConfigurationResolver)(r)
   546  }
   547  
   548  func (r *VegaResolverRoot) PartyActivityStreak() PartyActivityStreakResolver {
   549  	return (*partyActivityStreakResolver)(r)
   550  }
   551  
   552  func (r *VegaResolverRoot) ReferralProgram() ReferralProgramResolver {
   553  	return (*referralProgramResolver)(r)
   554  }
   555  
   556  func (r *VegaResolverRoot) CurrentReferralProgram() CurrentReferralProgramResolver {
   557  	return (*currentReferralProgramResolver)(r)
   558  }
   559  
   560  func (r *VegaResolverRoot) ReferralSet() ReferralSetResolver {
   561  	return (*referralSetResolver)(r)
   562  }
   563  
   564  func (r *VegaResolverRoot) ReferralSetReferee() ReferralSetRefereeResolver {
   565  	return (*referralSetRefereeResolver)(r)
   566  }
   567  
   568  func (r *VegaResolverRoot) ReferralSetStats() ReferralSetStatsResolver {
   569  	return (*referralSetStatsResolver)(r)
   570  }
   571  
   572  func (r *VegaResolverRoot) BenefitTier() BenefitTierResolver {
   573  	return (*benefitTierResolver)(r)
   574  }
   575  
   576  func (r *VegaResolverRoot) VolumeBenefitTier() VolumeBenefitTierResolver {
   577  	return (*volumeBenefitTierResolver)(r)
   578  }
   579  
   580  func (r *VegaResolverRoot) Team() TeamResolver {
   581  	return (*teamResolver)(r)
   582  }
   583  
   584  func (r *VegaResolverRoot) TeamStatistics() TeamStatisticsResolver {
   585  	return (*teamStatsResolver)(r)
   586  }
   587  
   588  func (r *VegaResolverRoot) QuantumRewardsPerEpoch() QuantumRewardsPerEpochResolver {
   589  	return (*quantumRewardsPerEpochResolver)(r)
   590  }
   591  
   592  func (r *VegaResolverRoot) QuantumVolumesPerEpoch() QuantumVolumesPerEpochResolver {
   593  	return (*quantumVolumesPerEpochResolver)(r)
   594  }
   595  
   596  func (r *VegaResolverRoot) TeamMemberStatistics() TeamMemberStatisticsResolver {
   597  	return (*teamMemberStatsResolver)(r)
   598  }
   599  
   600  func (r *VegaResolverRoot) TeamReferee() TeamRefereeResolver {
   601  	return (*teamRefereeResolver)(r)
   602  }
   603  
   604  func (r *VegaResolverRoot) TeamRefereeHistory() TeamRefereeHistoryResolver {
   605  	return (*teamRefereeHistoryResolver)(r)
   606  }
   607  
   608  func (r *VegaResolverRoot) PartyAmount() PartyAmountResolver {
   609  	return (*partyAmountResolver)(r)
   610  }
   611  
   612  func (r *VegaResolverRoot) FeesStats() FeesStatsResolver {
   613  	return (*feesStatsResolver)(r)
   614  }
   615  
   616  func (r *VegaResolverRoot) ReferrerRewardsGenerated() ReferrerRewardsGeneratedResolver {
   617  	return (*referrerRewardsGeneratedResolver)(r)
   618  }
   619  
   620  func (r *VegaResolverRoot) FundingPayment() FundingPaymentResolver {
   621  	return (*fundingPaymentResolver)(r)
   622  }
   623  
   624  func (r *VegaResolverRoot) VolumeDiscountProgram() VolumeDiscountProgramResolver {
   625  	return (*volumeDiscountProgramResolver)(r)
   626  }
   627  
   628  func (r *VegaResolverRoot) VolumeDiscountStats() VolumeDiscountStatsResolver {
   629  	return (*volumeDiscountStatsResolver)(r)
   630  }
   631  
   632  func (r *VegaResolverRoot) UpdateVolumeDiscountProgram() UpdateVolumeDiscountProgramResolver {
   633  	return (*updateVolumeDiscountProgramResolver)(r)
   634  }
   635  
   636  func (r *VegaResolverRoot) VolumeRebateProgram() VolumeRebateProgramResolver {
   637  	return (*volumeRebateProgramResolver)(r)
   638  }
   639  
   640  func (r *VegaResolverRoot) VolumeRebateStats() VolumeRebateStatsResolver {
   641  	return (*volumeRebateStatsResolver)(r)
   642  }
   643  
   644  func (r *VegaResolverRoot) UpdateReferralProgram() UpdateReferralProgramResolver {
   645  	return (*updateReferralProgramResolver)(r)
   646  }
   647  
   648  func (r *VegaResolverRoot) PaidLiquidityFees() PaidLiquidityFeesResolver {
   649  	return (*paidLiquidityFeesResolver)(r)
   650  }
   651  
   652  func (r *VegaResolverRoot) PartyLockedBalance() PartyLockedBalanceResolver {
   653  	return (*partyLockedBalanceResolver)(r)
   654  }
   655  
   656  func (r *VegaResolverRoot) PartyVestingBalance() PartyVestingBalanceResolver {
   657  	return (*partyVestingBalanceResolver)(r)
   658  }
   659  
   660  func (r *VegaResolverRoot) PartyVestingBalancesSummary() PartyVestingBalancesSummaryResolver {
   661  	return (*partyVestingBalancesSummary)(r)
   662  }
   663  
   664  func (r *VegaResolverRoot) TransferNode() TransferNodeResolver {
   665  	return (*transferNodeResolver)(r)
   666  }
   667  
   668  func (r *VegaResolverRoot) PartyVestingStats() PartyVestingStatsResolver {
   669  	return (*partyVestingStatsResolver)(r)
   670  }
   671  
   672  func (r *VegaResolverRoot) DispatchStrategy() DispatchStrategyResolver {
   673  	return (*dispatchStrategyResolver)(r)
   674  }
   675  
   676  func (r *VegaResolverRoot) Game() GameResolver {
   677  	return (*gameResolver)(r)
   678  }
   679  
   680  func (r *VegaResolverRoot) PartyMarginMode() PartyMarginModeResolver {
   681  	return (*marginModeResolver)(r)
   682  }
   683  
   684  func (r *VegaResolverRoot) PerpetualData() PerpetualDataResolver {
   685  	return (*perpetualDataResolver)(r)
   686  }
   687  
   688  func (r *VegaResolverRoot) TimeWeightedNotionalPosition() TimeWeightedNotionalPositionResolver {
   689  	return (*timeWeightedNotionalPositionResolver)(r)
   690  }
   691  
   692  func (r *VegaResolverRoot) GamePartyScore() GamePartyScoreResolver {
   693  	return (*gamePartyScoresResolver)(r)
   694  }
   695  
   696  func (r *VegaResolverRoot) GameTeamScore() GameTeamScoreResolver {
   697  	return (*gameTeamScoresResolver)(r)
   698  }
   699  
   700  type protocolUpgradeProposalResolver VegaResolverRoot
   701  
   702  func (r *protocolUpgradeProposalResolver) UpgradeBlockHeight(_ context.Context, obj *eventspb.ProtocolUpgradeEvent) (string, error) {
   703  	return fmt.Sprintf("%d", obj.UpgradeBlockHeight), nil
   704  }
   705  
   706  type coreDataSnapshotResolver VegaResolverRoot
   707  
   708  func (r *coreDataSnapshotResolver) BlockHeight(_ context.Context, obj *eventspb.CoreSnapshotData) (string, error) {
   709  	return fmt.Sprintf("%d", obj.BlockHeight), nil
   710  }
   711  
   712  func (r *coreDataSnapshotResolver) VegaCoreVersion(ctx context.Context, obj *eventspb.CoreSnapshotData) (string, error) {
   713  	return obj.CoreVersion, nil
   714  }
   715  
   716  type epochRewardSummaryResolver VegaResolverRoot
   717  
   718  func (r *epochRewardSummaryResolver) RewardType(_ context.Context, obj *vega.EpochRewardSummary) (vega.AccountType, error) {
   719  	accountType, ok := vega.AccountType_value[obj.RewardType]
   720  	if !ok {
   721  		return vega.AccountType_ACCOUNT_TYPE_UNSPECIFIED, fmt.Errorf("unknown account type %v", obj.RewardType)
   722  	}
   723  
   724  	return vega.AccountType(accountType), nil
   725  }
   726  
   727  func (r *epochRewardSummaryResolver) Epoch(_ context.Context, obj *vega.EpochRewardSummary) (int, error) {
   728  	return int(obj.Epoch), nil
   729  }
   730  
   731  type transactionResultResolver VegaResolverRoot
   732  
   733  func (r *transactionResultResolver) Error(ctx context.Context, tr *eventspb.TransactionResult) (*string, error) {
   734  	if tr == nil || tr.Status {
   735  		return nil, nil
   736  	}
   737  
   738  	return &tr.GetFailure().Error, nil
   739  }
   740  
   741  type accountUpdateResolver VegaResolverRoot
   742  
   743  func (r *accountUpdateResolver) AssetID(_ context.Context, obj *v2.AccountBalance) (string, error) {
   744  	return obj.Asset, nil
   745  }
   746  
   747  func (r *accountUpdateResolver) PartyID(_ context.Context, obj *v2.AccountBalance) (string, error) {
   748  	return obj.Owner, nil
   749  }
   750  
   751  // AggregatedLedgerEntriesResolver resolver.
   752  type aggregatedLedgerEntriesResolver VegaResolverRoot
   753  
   754  func (r *VegaResolverRoot) AggregatedLedgerEntry() AggregatedLedgerEntryResolver {
   755  	return (*aggregatedLedgerEntriesResolver)(r)
   756  }
   757  
   758  func (r *aggregatedLedgerEntriesResolver) VegaTime(_ context.Context, obj *v2.AggregatedLedgerEntry) (int64, error) {
   759  	return obj.Timestamp, nil
   760  }
   761  
   762  // LiquidityOrderReference resolver.
   763  
   764  type myLiquidityOrderReferenceResolver VegaResolverRoot
   765  
   766  func (r *myLiquidityOrderReferenceResolver) Order(ctx context.Context, obj *vegapb.LiquidityOrderReference) (*vegapb.Order, error) {
   767  	if len(obj.OrderId) <= 0 {
   768  		return nil, nil
   769  	}
   770  	return r.r.getOrderByID(ctx, obj.OrderId, nil)
   771  }
   772  
   773  // deposit resolver
   774  
   775  type myDepositResolver VegaResolverRoot
   776  
   777  func (r *myDepositResolver) Asset(ctx context.Context, obj *vegapb.Deposit) (*vegapb.Asset, error) {
   778  	return r.r.getAssetByID(ctx, obj.Asset)
   779  }
   780  
   781  func (r *myDepositResolver) Party(_ context.Context, obj *vegapb.Deposit) (*vegapb.Party, error) {
   782  	if len(obj.PartyId) <= 0 {
   783  		return nil, errors.New("missing party ID")
   784  	}
   785  	return &vegapb.Party{Id: obj.PartyId}, nil
   786  }
   787  
   788  func (r *myDepositResolver) CreatedTimestamp(_ context.Context, obj *vegapb.Deposit) (string, error) {
   789  	if obj.CreatedTimestamp == 0 {
   790  		return "", errors.New("invalid timestamp")
   791  	}
   792  	return vegatime.Format(vegatime.UnixNano(obj.CreatedTimestamp)), nil
   793  }
   794  
   795  func (r *myDepositResolver) CreditedTimestamp(_ context.Context, obj *vegapb.Deposit) (*string, error) {
   796  	if obj.CreditedTimestamp == 0 {
   797  		return nil, nil
   798  	}
   799  	t := vegatime.Format(vegatime.UnixNano(obj.CreditedTimestamp))
   800  	return &t, nil
   801  }
   802  
   803  // BEGIN: Query Resolver
   804  
   805  type myQueryResolver VegaResolverRoot
   806  
   807  func (r *myQueryResolver) PartyDiscountStats(ctx context.Context, partyID string, markets []string) (*v2.GetPartyDiscountStatsResponse, error) {
   808  	req := &v2.GetPartyDiscountStatsRequest{
   809  		PartyId:   partyID,
   810  		MarketIds: markets,
   811  	}
   812  	return r.r.clt2.GetPartyDiscountStats(ctx, req)
   813  }
   814  
   815  // VolumeRebateStats implements QueryResolver.
   816  func (r *myQueryResolver) VolumeRebateStats(ctx context.Context, epoch *int, partyID *string, pagination *v2.Pagination) (*v2.VolumeRebateStatsConnection, error) {
   817  	var epoch64p *uint64
   818  	if epoch != nil {
   819  		epoch64 := uint64(*epoch)
   820  		epoch64p = &epoch64
   821  	}
   822  	resp, err := r.tradingDataClientV2.GetVolumeRebateStats(ctx, &v2.GetVolumeRebateStatsRequest{
   823  		AtEpoch: epoch64p,
   824  		PartyId: partyID,
   825  	})
   826  	if err != nil {
   827  		return &v2.VolumeRebateStatsConnection{}, err
   828  	}
   829  	return resp.Stats, err
   830  }
   831  
   832  // CurrentVolumeRebateProgram implements QueryResolver.
   833  func (r *myQueryResolver) CurrentVolumeRebateProgram(ctx context.Context) (*v2.VolumeRebateProgram, error) {
   834  	resp, err := r.tradingDataClientV2.GetCurrentVolumeRebateProgram(ctx, &v2.GetCurrentVolumeRebateProgramRequest{})
   835  	if err != nil {
   836  		return &v2.VolumeRebateProgram{}, err
   837  	}
   838  
   839  	return resp.CurrentVolumeRebateProgram, nil
   840  }
   841  
   842  func (r *myQueryResolver) EstimateAMMBounds(ctx context.Context, basePrice string, upperPrice, lowerPrice, leverageAtUpperPrice, leverageAtLowerPrice *string, commitmentAmount string, marketID string) (*v2.EstimateAMMBoundsResponse, error) {
   843  	res, err := r.tradingDataClientV2.EstimateAMMBounds(ctx, &v2.EstimateAMMBoundsRequest{
   844  		BasePrice:            basePrice,
   845  		UpperPrice:           upperPrice,
   846  		LowerPrice:           lowerPrice,
   847  		LeverageAtUpperPrice: leverageAtUpperPrice,
   848  		LeverageAtLowerPrice: leverageAtLowerPrice,
   849  		CommitmentAmount:     commitmentAmount,
   850  		MarketId:             marketID,
   851  	})
   852  	if err != nil {
   853  		return nil, err
   854  	}
   855  
   856  	return res, nil
   857  }
   858  
   859  func (r *myQueryResolver) TimeWeightedNotionalPosition(ctx context.Context, assetID, partyID, gameID string, epoch *int) (*v2.TimeWeightedNotionalPosition, error) {
   860  	var atEpoch *uint64
   861  	if epoch != nil {
   862  		atEpoch = ptr.From(uint64(*epoch))
   863  	}
   864  	req := &v2.GetTimeWeightedNotionalPositionRequest{
   865  		AssetId: assetID,
   866  		PartyId: partyID,
   867  		GameId:  gameID,
   868  		AtEpoch: atEpoch,
   869  	}
   870  
   871  	res, err := r.tradingDataClientV2.GetTimeWeightedNotionalPosition(ctx, req)
   872  	if err != nil {
   873  		return nil, err
   874  	}
   875  
   876  	return res.TimeWeightedNotionalPosition, nil
   877  }
   878  
   879  func (r *myQueryResolver) Amms(ctx context.Context, partyID *string, marketID *string, id *string,
   880  	ammPartyID *string, status *v1.AMM_Status, liveOnly *bool, pagination *v2.Pagination,
   881  ) (*v2.AMMConnection, error) {
   882  	req := &v2.ListAMMsRequest{
   883  		Id:         id,
   884  		PartyId:    partyID,
   885  		MarketId:   marketID,
   886  		AmmPartyId: ammPartyID,
   887  		Status:     status,
   888  		Pagination: pagination,
   889  	}
   890  
   891  	res, err := r.tradingDataClientV2.ListAMMs(ctx, req)
   892  	if err != nil {
   893  		return nil, err
   894  	}
   895  	return res.Amms, nil
   896  }
   897  
   898  func (r *myQueryResolver) PartiesProfilesConnection(ctx context.Context, ids []string, pagination *v2.Pagination) (*v2.PartiesProfilesConnection, error) {
   899  	req := v2.ListPartiesProfilesRequest{
   900  		Parties:    ids,
   901  		Pagination: pagination,
   902  	}
   903  
   904  	res, err := r.tradingDataClientV2.ListPartiesProfiles(ctx, &req)
   905  	if err != nil {
   906  		return nil, err
   907  	}
   908  	return res.Profiles, nil
   909  }
   910  
   911  func (r *myQueryResolver) GamePartyScores(ctx context.Context, filter *GamePartyScoreFilter, pagination *v2.Pagination) (*v2.GamePartyScoresConnection, error) {
   912  	gameIds := []string{}
   913  	teamIds := []string{}
   914  	partyIds := []string{}
   915  	var epochFrom, epochTo *uint64
   916  
   917  	if filter != nil {
   918  		gameIds = filter.GameIds
   919  		teamIds = filter.TeamIds
   920  		partyIds = filter.PartyIds
   921  		if filter.EpochFrom != nil {
   922  			ef := uint64(*filter.EpochFrom)
   923  			epochFrom = &ef
   924  		}
   925  		if filter.EpochTo != nil {
   926  			et := uint64(*filter.EpochTo)
   927  			epochTo = &et
   928  		}
   929  	}
   930  
   931  	req := v2.ListGamePartyScoresRequest{
   932  		Filter: &v2.GamePartyScoresFilter{
   933  			GameIds:   gameIds,
   934  			TeamIds:   teamIds,
   935  			PartyIds:  partyIds,
   936  			EpochFrom: epochFrom,
   937  			EpochTo:   epochTo,
   938  		},
   939  		Pagination: pagination,
   940  	}
   941  	res, err := r.tradingDataClientV2.ListGamePartyScores(ctx, &req)
   942  	if err != nil {
   943  		return nil, err
   944  	}
   945  	return res.PartyScores, nil
   946  }
   947  
   948  func (r *myQueryResolver) GameTeamScores(ctx context.Context, filter *GameTeamScoreFilter, pagination *v2.Pagination) (*v2.GameTeamScoresConnection, error) {
   949  	gameIds := []string{}
   950  	teamIds := []string{}
   951  	var epochFrom, epochTo *uint64
   952  
   953  	if filter != nil {
   954  		gameIds = filter.GameIds
   955  		teamIds = filter.TeamIds
   956  		if filter.EpochFrom != nil {
   957  			ef := uint64(*filter.EpochFrom)
   958  			epochFrom = &ef
   959  		}
   960  		if filter.EpochTo != nil {
   961  			et := uint64(*filter.EpochTo)
   962  			epochTo = &et
   963  		}
   964  	}
   965  
   966  	req := v2.ListGameTeamScoresRequest{
   967  		Filter: &v2.GameTeamScoresFilter{
   968  			GameIds:   gameIds,
   969  			TeamIds:   teamIds,
   970  			EpochFrom: epochFrom,
   971  			EpochTo:   epochTo,
   972  		},
   973  		Pagination: pagination,
   974  	}
   975  	res, err := r.tradingDataClientV2.ListGameTeamScores(ctx, &req)
   976  	if err != nil {
   977  		return nil, err
   978  	}
   979  	return res.TeamScores, nil
   980  }
   981  
   982  func (r *myQueryResolver) PartyMarginModes(ctx context.Context, marketID *string, partyID *string, pagination *v2.Pagination) (*v2.PartyMarginModesConnection, error) {
   983  	req := v2.ListPartyMarginModesRequest{
   984  		MarketId:   marketID,
   985  		PartyId:    partyID,
   986  		Pagination: pagination,
   987  	}
   988  
   989  	res, err := r.tradingDataClientV2.ListPartyMarginModes(ctx, &req)
   990  	if err != nil {
   991  		return nil, err
   992  	}
   993  	return res.PartyMarginModes, nil
   994  }
   995  
   996  func (r *myQueryResolver) Games(ctx context.Context, gameID *string, epochFrom *int, epochTo *int, entityScope *vega.EntityScope, teamID *string, partyID *string, pagination *v2.Pagination) (*v2.GamesConnection, error) {
   997  	var from *uint64
   998  	var to *uint64
   999  
  1000  	if epochFrom != nil {
  1001  		from = ptr.From(uint64(*epochFrom))
  1002  	}
  1003  
  1004  	if epochTo != nil {
  1005  		to = ptr.From(uint64(*epochTo))
  1006  	}
  1007  
  1008  	req := v2.ListGamesRequest{
  1009  		GameId:      gameID,
  1010  		EpochFrom:   from,
  1011  		EpochTo:     to,
  1012  		EntityScope: entityScope,
  1013  		Pagination:  pagination,
  1014  		TeamId:      teamID,
  1015  		PartyId:     partyID,
  1016  	}
  1017  	res, err := r.tradingDataClientV2.ListGames(ctx, &req)
  1018  	if err != nil {
  1019  		return nil, err
  1020  	}
  1021  	return res.Games, nil
  1022  }
  1023  
  1024  func (r *myQueryResolver) FundingPayments(
  1025  	ctx context.Context,
  1026  	partyID string,
  1027  	marketID *string,
  1028  	pagination *v2.Pagination,
  1029  ) (*v2.FundingPaymentConnection, error) {
  1030  	req := v2.ListFundingPaymentsRequest{
  1031  		PartyId:    partyID,
  1032  		MarketId:   marketID,
  1033  		Pagination: pagination,
  1034  	}
  1035  
  1036  	res, err := r.tradingDataClientV2.ListFundingPayments(ctx, &req)
  1037  	if err != nil {
  1038  		return nil, err
  1039  	}
  1040  	return res.FundingPayments, nil
  1041  }
  1042  
  1043  func (r *myQueryResolver) FundingPeriods(ctx context.Context, marketID string, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.FundingPeriodConnection, error) {
  1044  	req := v2.ListFundingPeriodsRequest{
  1045  		MarketId:   marketID,
  1046  		DateRange:  dateRange,
  1047  		Pagination: pagination,
  1048  	}
  1049  
  1050  	res, err := r.tradingDataClientV2.ListFundingPeriods(ctx, &req)
  1051  	if err != nil {
  1052  		return nil, err
  1053  	}
  1054  	return res.FundingPeriods, nil
  1055  }
  1056  
  1057  func (r *myQueryResolver) FundingPeriodDataPoints(ctx context.Context, marketID string, dateRange *v2.DateRange, source *v1.FundingPeriodDataPoint_Source, pagination *v2.Pagination) (*v2.FundingPeriodDataPointConnection, error) {
  1058  	req := &v2.ListFundingPeriodDataPointsRequest{
  1059  		MarketId:   marketID,
  1060  		DateRange:  dateRange,
  1061  		Source:     source,
  1062  		Pagination: pagination,
  1063  	}
  1064  
  1065  	res, err := r.tradingDataClientV2.ListFundingPeriodDataPoints(ctx, req)
  1066  	if err != nil {
  1067  		return nil, err
  1068  	}
  1069  
  1070  	return res.FundingPeriodDataPoints, nil
  1071  }
  1072  
  1073  func (r *myQueryResolver) Trades(ctx context.Context, filter *TradesFilter, pagination *v2.Pagination, dateRange *v2.DateRange) (*v2.TradeConnection, error) {
  1074  	if filter == nil {
  1075  		filter = &TradesFilter{}
  1076  	}
  1077  
  1078  	resp, err := r.tradingDataClientV2.ListTrades(ctx, &v2.ListTradesRequest{
  1079  		MarketIds:  filter.MarketIds,
  1080  		OrderIds:   filter.OrderIds,
  1081  		PartyIds:   filter.PartyIds,
  1082  		Pagination: pagination,
  1083  		DateRange:  dateRange,
  1084  	})
  1085  	if err != nil {
  1086  		return nil, err
  1087  	}
  1088  
  1089  	return resp.Trades, nil
  1090  }
  1091  
  1092  func (r *myQueryResolver) Positions(ctx context.Context, filter *v2.PositionsFilter, pagination *v2.Pagination) (*v2.PositionConnection, error) {
  1093  	resp, err := r.tradingDataClientV2.ListAllPositions(ctx, &v2.ListAllPositionsRequest{
  1094  		Filter:     filter,
  1095  		Pagination: pagination,
  1096  	})
  1097  	if err != nil {
  1098  		return nil, err
  1099  	}
  1100  
  1101  	return resp.Positions, nil
  1102  }
  1103  
  1104  func (r *myQueryResolver) TransfersConnection(
  1105  	ctx context.Context,
  1106  	partyID *string,
  1107  	direction *TransferDirection,
  1108  	pagination *v2.Pagination,
  1109  	isReward *bool,
  1110  	fromEpoch *int,
  1111  	toEpoch *int,
  1112  	status *eventspb.Transfer_Status,
  1113  	scope *v2.ListTransfersRequest_Scope,
  1114  	gameID *string,
  1115  	fromAccountType, toAccountType *vega.AccountType,
  1116  ) (*v2.TransferConnection, error) {
  1117  	return r.r.transfersConnection(ctx, partyID, direction, pagination, isReward, fromEpoch, toEpoch, status, scope, gameID, fromAccountType, toAccountType)
  1118  }
  1119  
  1120  func (r *myQueryResolver) Transfer(ctx context.Context, id string) (*v2.TransferNode, error) {
  1121  	req := v2.GetTransferRequest{
  1122  		TransferId: id,
  1123  	}
  1124  	resp, err := r.tradingDataClientV2.GetTransfer(ctx, &req)
  1125  	if err != nil {
  1126  		return nil, err
  1127  	}
  1128  	return resp.TransferNode, nil
  1129  }
  1130  
  1131  func (r *myQueryResolver) LastBlockHeight(ctx context.Context) (string, error) {
  1132  	resp, err := r.tradingProxyClient.LastBlockHeight(ctx, &vegaprotoapi.LastBlockHeightRequest{})
  1133  	if err != nil {
  1134  		return "0", err
  1135  	}
  1136  
  1137  	return strconv.FormatUint(resp.Height, 10), nil
  1138  }
  1139  
  1140  func (r *myQueryResolver) OracleSpecsConnection(ctx context.Context, pagination *v2.Pagination) (*v2.OracleSpecsConnection, error) {
  1141  	req := v2.ListOracleSpecsRequest{
  1142  		Pagination: pagination,
  1143  	}
  1144  	res, err := r.tradingDataClientV2.ListOracleSpecs(ctx, &req)
  1145  	if err != nil {
  1146  		return nil, err
  1147  	}
  1148  
  1149  	return res.OracleSpecs, nil
  1150  }
  1151  
  1152  func (r *myQueryResolver) OracleSpec(ctx context.Context, id string) (*vegapb.OracleSpec, error) {
  1153  	res, err := r.tradingDataClientV2.GetOracleSpec(
  1154  		ctx, &v2.GetOracleSpecRequest{OracleSpecId: id},
  1155  	)
  1156  	if err != nil {
  1157  		return nil, err
  1158  	}
  1159  
  1160  	return res.OracleSpec, nil
  1161  }
  1162  
  1163  func (r *myQueryResolver) OracleDataBySpecConnection(ctx context.Context, oracleSpecID string,
  1164  	pagination *v2.Pagination,
  1165  ) (*v2.OracleDataConnection, error) {
  1166  	var specID *string
  1167  	if oracleSpecID != "" {
  1168  		specID = &oracleSpecID
  1169  	}
  1170  	req := v2.ListOracleDataRequest{
  1171  		OracleSpecId: specID,
  1172  		Pagination:   pagination,
  1173  	}
  1174  
  1175  	resp, err := r.tradingDataClientV2.ListOracleData(ctx, &req)
  1176  	if err != nil {
  1177  		return nil, err
  1178  	}
  1179  
  1180  	return resp.OracleData, nil
  1181  }
  1182  
  1183  func (r *myQueryResolver) OracleDataConnection(ctx context.Context, pagination *v2.Pagination) (*v2.OracleDataConnection, error) {
  1184  	req := v2.ListOracleDataRequest{
  1185  		Pagination: pagination,
  1186  	}
  1187  
  1188  	resp, err := r.tradingDataClientV2.ListOracleData(ctx, &req)
  1189  	if err != nil {
  1190  		return nil, err
  1191  	}
  1192  
  1193  	return resp.OracleData, nil
  1194  }
  1195  
  1196  func (r *myQueryResolver) NetworkParametersConnection(ctx context.Context, pagination *v2.Pagination) (*v2.NetworkParameterConnection, error) {
  1197  	res, err := r.tradingDataClientV2.ListNetworkParameters(ctx, &v2.ListNetworkParametersRequest{
  1198  		Pagination: pagination,
  1199  	})
  1200  	if err != nil {
  1201  		return nil, err
  1202  	}
  1203  	return res.NetworkParameters, nil
  1204  }
  1205  
  1206  func (r *myQueryResolver) NetworkParameter(ctx context.Context, key string) (*vegapb.NetworkParameter, error) {
  1207  	res, err := r.tradingDataClientV2.GetNetworkParameter(
  1208  		ctx, &v2.GetNetworkParameterRequest{Key: key},
  1209  	)
  1210  	if err != nil {
  1211  		return nil, err
  1212  	}
  1213  
  1214  	return res.NetworkParameter, nil
  1215  }
  1216  
  1217  func (r *myQueryResolver) Erc20WithdrawalApproval(ctx context.Context, wid string) (*Erc20WithdrawalApproval, error) {
  1218  	res, err := r.tradingDataClientV2.GetERC20WithdrawalApproval(
  1219  		ctx, &v2.GetERC20WithdrawalApprovalRequest{WithdrawalId: wid},
  1220  	)
  1221  	if err != nil {
  1222  		return nil, err
  1223  	}
  1224  
  1225  	return &Erc20WithdrawalApproval{
  1226  		AssetSource:   res.AssetSource,
  1227  		Amount:        res.Amount,
  1228  		Nonce:         res.Nonce,
  1229  		Signatures:    res.Signatures,
  1230  		TargetAddress: res.TargetAddress,
  1231  		Creation:      fmt.Sprintf("%d", res.Creation),
  1232  		SourceChainID: res.SourceChainId,
  1233  	}, nil
  1234  }
  1235  
  1236  func (r *myQueryResolver) Erc20ListAssetBundle(ctx context.Context, assetID string) (*Erc20ListAssetBundle, error) {
  1237  	res, err := r.tradingDataClientV2.GetERC20ListAssetBundle(
  1238  		ctx, &v2.GetERC20ListAssetBundleRequest{AssetId: assetID})
  1239  	if err != nil {
  1240  		return nil, err
  1241  	}
  1242  
  1243  	return &Erc20ListAssetBundle{
  1244  		AssetSource: res.AssetSource,
  1245  		VegaAssetID: res.VegaAssetId,
  1246  		Nonce:       res.Nonce,
  1247  		Signatures:  res.Signatures,
  1248  	}, nil
  1249  }
  1250  
  1251  func (r *myQueryResolver) Erc20SetAssetLimitsBundle(ctx context.Context, proposalID string) (*ERC20SetAssetLimitsBundle, error) {
  1252  	res, err := r.tradingDataClientV2.GetERC20SetAssetLimitsBundle(
  1253  		ctx, &v2.GetERC20SetAssetLimitsBundleRequest{ProposalId: proposalID})
  1254  	if err != nil {
  1255  		return nil, err
  1256  	}
  1257  
  1258  	return &ERC20SetAssetLimitsBundle{
  1259  		AssetSource:   res.AssetSource,
  1260  		VegaAssetID:   res.VegaAssetId,
  1261  		Nonce:         res.Nonce,
  1262  		LifetimeLimit: res.LifetimeLimit,
  1263  		Threshold:     res.Threshold,
  1264  		Signatures:    res.Signatures,
  1265  	}, nil
  1266  }
  1267  
  1268  func (r *myQueryResolver) Erc20MultiSigSignerAddedBundles(ctx context.Context, nodeID string, submitter, epochSeq, chainID *string, pagination *v2.Pagination) (*ERC20MultiSigSignerAddedConnection, error) {
  1269  	res, err := r.tradingDataClientV2.ListERC20MultiSigSignerAddedBundles(
  1270  		ctx, &v2.ListERC20MultiSigSignerAddedBundlesRequest{
  1271  			NodeId:     nodeID,
  1272  			Submitter:  ptr.UnBox(submitter),
  1273  			EpochSeq:   ptr.UnBox(epochSeq),
  1274  			Pagination: pagination,
  1275  			ChainId:    chainID,
  1276  		})
  1277  	if err != nil {
  1278  		return nil, err
  1279  	}
  1280  
  1281  	edges := make([]*ERC20MultiSigSignerAddedBundleEdge, 0, len(res.Bundles.Edges))
  1282  
  1283  	for _, edge := range res.Bundles.Edges {
  1284  		edges = append(edges, &ERC20MultiSigSignerAddedBundleEdge{
  1285  			Node:   edge.Node,
  1286  			Cursor: edge.Cursor,
  1287  		})
  1288  	}
  1289  
  1290  	return &ERC20MultiSigSignerAddedConnection{
  1291  		Edges:    edges,
  1292  		PageInfo: res.Bundles.PageInfo,
  1293  	}, nil
  1294  }
  1295  
  1296  func (r *myQueryResolver) Erc20MultiSigSignerRemovedBundles(ctx context.Context, nodeID string, submitter, epochSeq, chainID *string, pagination *v2.Pagination) (*ERC20MultiSigSignerRemovedConnection, error) {
  1297  	res, err := r.tradingDataClientV2.ListERC20MultiSigSignerRemovedBundles(
  1298  		ctx, &v2.ListERC20MultiSigSignerRemovedBundlesRequest{
  1299  			NodeId:     nodeID,
  1300  			Submitter:  ptr.UnBox(submitter),
  1301  			EpochSeq:   ptr.UnBox(epochSeq),
  1302  			Pagination: pagination,
  1303  			ChainId:    chainID,
  1304  		})
  1305  	if err != nil {
  1306  		return nil, err
  1307  	}
  1308  
  1309  	edges := make([]*ERC20MultiSigSignerRemovedBundleEdge, 0, len(res.Bundles.Edges))
  1310  
  1311  	for _, edge := range res.Bundles.Edges {
  1312  		edges = append(edges, &ERC20MultiSigSignerRemovedBundleEdge{
  1313  			Node:   edge.Node,
  1314  			Cursor: edge.Cursor,
  1315  		})
  1316  	}
  1317  
  1318  	return &ERC20MultiSigSignerRemovedConnection{
  1319  		Edges:    edges,
  1320  		PageInfo: res.Bundles.PageInfo,
  1321  	}, nil
  1322  }
  1323  
  1324  func (r *myQueryResolver) Withdrawal(ctx context.Context, wid string) (*vegapb.Withdrawal, error) {
  1325  	res, err := r.tradingDataClientV2.GetWithdrawal(
  1326  		ctx, &v2.GetWithdrawalRequest{Id: wid},
  1327  	)
  1328  	if err != nil {
  1329  		return nil, err
  1330  	}
  1331  
  1332  	return res.Withdrawal, nil
  1333  }
  1334  
  1335  func (r *myQueryResolver) Withdrawals(ctx context.Context, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.WithdrawalsConnection, error) {
  1336  	res, err := r.tradingDataClientV2.ListWithdrawals(
  1337  		ctx, &v2.ListWithdrawalsRequest{
  1338  			DateRange:  dateRange,
  1339  			Pagination: pagination,
  1340  		},
  1341  	)
  1342  	if err != nil {
  1343  		return nil, err
  1344  	}
  1345  
  1346  	return res.Withdrawals, nil
  1347  }
  1348  
  1349  func (r *myQueryResolver) Deposit(ctx context.Context, did string) (*vegapb.Deposit, error) {
  1350  	res, err := r.tradingDataClientV2.GetDeposit(
  1351  		ctx, &v2.GetDepositRequest{Id: did},
  1352  	)
  1353  	if err != nil {
  1354  		return nil, err
  1355  	}
  1356  
  1357  	return res.Deposit, nil
  1358  }
  1359  
  1360  func (r *myQueryResolver) Deposits(ctx context.Context, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.DepositsConnection, error) {
  1361  	res, err := r.tradingDataClientV2.ListDeposits(
  1362  		ctx, &v2.ListDepositsRequest{DateRange: dateRange, Pagination: pagination},
  1363  	)
  1364  	if err != nil {
  1365  		return nil, err
  1366  	}
  1367  
  1368  	return res.Deposits, nil
  1369  }
  1370  
  1371  func (r *myQueryResolver) EstimateOrder(
  1372  	ctx context.Context,
  1373  	market, party string,
  1374  	price *string,
  1375  	size string,
  1376  	side vega.Side,
  1377  	timeInForce vega.Order_TimeInForce,
  1378  	expiration *int64,
  1379  	ty vega.Order_Type,
  1380  ) (*OrderEstimate, error) {
  1381  	order := &vegapb.Order{}
  1382  	// We need to convert strings to uint64 (JS doesn't yet support uint64)
  1383  	if price != nil {
  1384  		order.Price = *price
  1385  	}
  1386  	s, err := safeStringUint64(size)
  1387  	if err != nil {
  1388  		return nil, err
  1389  	}
  1390  	order.Size = s
  1391  	if len(market) <= 0 {
  1392  		return nil, errors.New("market missing or empty")
  1393  	}
  1394  	order.MarketId = market
  1395  	if len(party) <= 0 {
  1396  		return nil, errors.New("party missing or empty")
  1397  	}
  1398  
  1399  	order.PartyId = party
  1400  	order.TimeInForce = timeInForce
  1401  	order.Side = side
  1402  	order.Type = ty
  1403  
  1404  	// GTT must have an expiration value
  1405  	if order.TimeInForce == vegapb.Order_TIME_IN_FORCE_GTT && expiration != nil {
  1406  		order.ExpiresAt = vegatime.UnixNano(*expiration).UnixNano()
  1407  	}
  1408  
  1409  	req := v2.EstimateFeeRequest{
  1410  		MarketId: order.MarketId,
  1411  		Price:    order.Price,
  1412  		Size:     order.Size,
  1413  		Party:    &party,
  1414  	}
  1415  
  1416  	// Pass the order over for consensus (service layer will use RPC client internally and handle errors etc)
  1417  	resp, err := r.tradingDataClientV2.EstimateFee(ctx, &req)
  1418  	if err != nil {
  1419  		r.log.Error("Failed to get fee estimates using rpc client in graphQL resolver", logging.Error(err))
  1420  		return nil, err
  1421  	}
  1422  
  1423  	// calclate the fee total amount
  1424  	var mfee, ifee, lfee num.Decimal
  1425  	// errors doesn't matter here, they just give us zero values anyway for the decimals
  1426  	if len(resp.Fee.MakerFee) > 0 {
  1427  		mfee, _ = num.DecimalFromString(resp.Fee.MakerFee)
  1428  	}
  1429  	if len(resp.Fee.InfrastructureFee) > 0 {
  1430  		ifee, _ = num.DecimalFromString(resp.Fee.InfrastructureFee)
  1431  	}
  1432  	if len(resp.Fee.LiquidityFee) > 0 {
  1433  		lfee, _ = num.DecimalFromString(resp.Fee.LiquidityFee)
  1434  	}
  1435  
  1436  	fee := TradeFee{
  1437  		MakerFee:                          resp.Fee.MakerFee,
  1438  		InfrastructureFee:                 resp.Fee.InfrastructureFee,
  1439  		LiquidityFee:                      resp.Fee.LiquidityFee,
  1440  		BuyBackFee:                        resp.Fee.BuyBackFee,
  1441  		TreasuryFee:                       resp.Fee.TreasuryFee,
  1442  		HighVolumeMakerFee:                resp.Fee.HighVolumeMakerFee,
  1443  		MakerFeeReferralDiscount:          ptr.From(resp.Fee.MakerFeeReferrerDiscount),
  1444  		MakerFeeVolumeDiscount:            ptr.From(resp.Fee.MakerFeeVolumeDiscount),
  1445  		InfrastructureFeeReferralDiscount: ptr.From(resp.Fee.InfrastructureFeeReferrerDiscount),
  1446  		InfrastructureFeeVolumeDiscount:   ptr.From(resp.Fee.InfrastructureFeeVolumeDiscount),
  1447  		LiquidityFeeReferralDiscount:      ptr.From(resp.Fee.LiquidityFeeReferrerDiscount),
  1448  		LiquidityFeeVolumeDiscount:        ptr.From(resp.Fee.LiquidityFeeVolumeDiscount),
  1449  	}
  1450  
  1451  	// now we calculate the margins
  1452  	reqm := v2.EstimateMarginRequest{
  1453  		MarketId: order.MarketId,
  1454  		PartyId:  order.PartyId,
  1455  		Price:    order.Price,
  1456  		Size:     order.Size,
  1457  		Side:     order.Side,
  1458  		Type:     order.Type,
  1459  	}
  1460  
  1461  	// Pass the order over for consensus (service layer will use RPC client internally and handle errors etc)
  1462  	respm, err := r.tradingDataClientV2.EstimateMargin(ctx, &reqm)
  1463  	if err != nil {
  1464  		r.log.Error("Failed to get margin estimates using rpc client in graphQL resolver", logging.Error(err))
  1465  		return nil, err
  1466  	}
  1467  
  1468  	return &OrderEstimate{
  1469  		Fee:            &fee,
  1470  		TotalFeeAmount: decimal.Sum(mfee, ifee, lfee).String(),
  1471  		MarginLevels:   respm.MarginLevels,
  1472  	}, nil
  1473  }
  1474  
  1475  func (r *myQueryResolver) EstimateFees(
  1476  	ctx context.Context,
  1477  	market, party string,
  1478  	price *string,
  1479  	size string,
  1480  	side vega.Side,
  1481  	timeInForce vega.Order_TimeInForce,
  1482  	expiration *int64,
  1483  	ty vega.Order_Type,
  1484  ) (*FeeEstimate, error) {
  1485  	order := &vegapb.Order{}
  1486  	// We need to convert strings to uint64 (JS doesn't yet support uint64)
  1487  	if price != nil {
  1488  		order.Price = *price
  1489  	}
  1490  	s, err := safeStringUint64(size)
  1491  	if err != nil {
  1492  		return nil, err
  1493  	}
  1494  	order.Size = s
  1495  	if len(market) <= 0 {
  1496  		return nil, errors.New("market missing or empty")
  1497  	}
  1498  	order.MarketId = market
  1499  	if len(party) <= 0 {
  1500  		return nil, errors.New("party missing or empty")
  1501  	}
  1502  
  1503  	order.PartyId = party
  1504  	order.TimeInForce = timeInForce
  1505  	order.Side = side
  1506  	order.Type = ty
  1507  
  1508  	// GTT must have an expiration value
  1509  	if order.TimeInForce == vegapb.Order_TIME_IN_FORCE_GTT && expiration != nil {
  1510  		order.ExpiresAt = vegatime.UnixNano(*expiration).UnixNano()
  1511  	}
  1512  
  1513  	req := v2.EstimateFeeRequest{
  1514  		MarketId: order.MarketId,
  1515  		Price:    order.Price,
  1516  		Size:     order.Size,
  1517  		Party:    &party,
  1518  	}
  1519  
  1520  	// Pass the order over for consensus (service layer will use RPC client internally and handle errors etc)
  1521  	resp, err := r.tradingDataClientV2.EstimateFee(ctx, &req)
  1522  	if err != nil {
  1523  		r.log.Error("Failed to get fee estimates using rpc client in graphQL resolver", logging.Error(err))
  1524  		return nil, err
  1525  	}
  1526  
  1527  	// calclate the fee total amount
  1528  	var mfee, ifee, lfee num.Decimal
  1529  	// errors doesn't matter here, they just give us zero values anyway for the decimals
  1530  	if len(resp.Fee.MakerFee) > 0 {
  1531  		mfee, _ = num.DecimalFromString(resp.Fee.MakerFee)
  1532  	}
  1533  	if len(resp.Fee.InfrastructureFee) > 0 {
  1534  		ifee, _ = num.DecimalFromString(resp.Fee.InfrastructureFee)
  1535  	}
  1536  	if len(resp.Fee.LiquidityFee) > 0 {
  1537  		lfee, _ = num.DecimalFromString(resp.Fee.LiquidityFee)
  1538  	}
  1539  
  1540  	fees := &TradeFee{
  1541  		MakerFee:                          resp.Fee.MakerFee,
  1542  		InfrastructureFee:                 resp.Fee.InfrastructureFee,
  1543  		LiquidityFee:                      resp.Fee.LiquidityFee,
  1544  		BuyBackFee:                        resp.Fee.BuyBackFee,
  1545  		TreasuryFee:                       resp.Fee.TreasuryFee,
  1546  		HighVolumeMakerFee:                resp.Fee.HighVolumeMakerFee,
  1547  		MakerFeeReferralDiscount:          ptr.From(resp.Fee.MakerFeeReferrerDiscount),
  1548  		MakerFeeVolumeDiscount:            ptr.From(resp.Fee.MakerFeeVolumeDiscount),
  1549  		InfrastructureFeeReferralDiscount: ptr.From(resp.Fee.InfrastructureFeeReferrerDiscount),
  1550  		InfrastructureFeeVolumeDiscount:   ptr.From(resp.Fee.InfrastructureFeeVolumeDiscount),
  1551  		LiquidityFeeReferralDiscount:      ptr.From(resp.Fee.LiquidityFeeReferrerDiscount),
  1552  		LiquidityFeeVolumeDiscount:        ptr.From(resp.Fee.LiquidityFeeVolumeDiscount),
  1553  	}
  1554  
  1555  	return &FeeEstimate{
  1556  		Fees:           fees,
  1557  		TotalFeeAmount: decimal.Sum(mfee, ifee, lfee).String(),
  1558  	}, nil
  1559  }
  1560  
  1561  func (r *myQueryResolver) EstimatePosition(
  1562  	ctx context.Context,
  1563  	marketId string,
  1564  	openVolume string,
  1565  	averageEntryPrice string,
  1566  	orders []*v2.OrderInfo,
  1567  	marginAccountBalance string,
  1568  	generalAccountBalance string,
  1569  	orderMarginAccountBalance string,
  1570  	marginMode vega.MarginMode,
  1571  	marginFactor *string,
  1572  	incluedRequiredPositionMarginInAvailableCollateral *bool,
  1573  	scaleLiquidationPriceToMarketDecimals *bool,
  1574  ) (*PositionEstimate, error) {
  1575  	ov, err := safeStringInt64(openVolume)
  1576  	if err != nil {
  1577  		return nil, err
  1578  	}
  1579  
  1580  	req := &v2.EstimatePositionRequest{
  1581  		MarketId:                  marketId,
  1582  		OpenVolume:                ov,
  1583  		AverageEntryPrice:         averageEntryPrice,
  1584  		Orders:                    orders,
  1585  		MarginAccountBalance:      marginAccountBalance,
  1586  		GeneralAccountBalance:     generalAccountBalance,
  1587  		OrderMarginAccountBalance: orderMarginAccountBalance,
  1588  		MarginMode:                vegapb.MarginMode(vega.MarginMode_value[marginMode.String()]),
  1589  		MarginFactor:              marginFactor,
  1590  		IncludeRequiredPositionMarginInAvailableCollateral: incluedRequiredPositionMarginInAvailableCollateral,
  1591  		ScaleLiquidationPriceToMarketDecimals:              scaleLiquidationPriceToMarketDecimals,
  1592  	}
  1593  
  1594  	resp, err := r.tradingDataClientV2.EstimatePosition(ctx, req)
  1595  	if err != nil {
  1596  		return nil, err
  1597  	}
  1598  
  1599  	return &PositionEstimate{
  1600  		Margin:                     resp.Margin,
  1601  		CollateralIncreaseEstimate: resp.CollateralIncreaseEstimate,
  1602  		Liquidation:                resp.Liquidation,
  1603  	}, nil
  1604  }
  1605  
  1606  func (r *myQueryResolver) Asset(ctx context.Context, id string) (*vegapb.Asset, error) {
  1607  	return r.r.getAssetByID(ctx, id)
  1608  }
  1609  
  1610  func (r *myQueryResolver) AssetsConnection(ctx context.Context, id *string, pagination *v2.Pagination) (*v2.AssetsConnection, error) {
  1611  	req := &v2.ListAssetsRequest{
  1612  		AssetId:    id,
  1613  		Pagination: pagination,
  1614  	}
  1615  	resp, err := r.tradingDataClientV2.ListAssets(ctx, req)
  1616  	if err != nil {
  1617  		return nil, err
  1618  	}
  1619  	return resp.Assets, nil
  1620  }
  1621  
  1622  func (r *myQueryResolver) NodeSignaturesConnection(ctx context.Context, resourceID string, pagination *v2.Pagination) (*v2.NodeSignaturesConnection, error) {
  1623  	if len(resourceID) <= 0 {
  1624  		return nil, ErrMissingIDOrReference
  1625  	}
  1626  
  1627  	req := &v2.ListNodeSignaturesRequest{
  1628  		Id:         resourceID,
  1629  		Pagination: pagination,
  1630  	}
  1631  	res, err := r.tradingDataClientV2.ListNodeSignatures(ctx, req)
  1632  	if err != nil {
  1633  		return nil, err
  1634  	}
  1635  	return res.Signatures, nil
  1636  }
  1637  
  1638  func (r *myQueryResolver) Market(ctx context.Context, id string) (*vegapb.Market, error) {
  1639  	return r.r.getMarketByID(ctx, id)
  1640  }
  1641  
  1642  func (r *myQueryResolver) Party(ctx context.Context, name string) (*vegapb.Party, error) {
  1643  	return getParty(ctx, r.log, r.tradingDataClientV2, name)
  1644  }
  1645  
  1646  func (r *myQueryResolver) OrderByID(ctx context.Context, orderID string, version *int) (*vegapb.Order, error) {
  1647  	return r.r.getOrderByID(ctx, orderID, version)
  1648  }
  1649  
  1650  func (r *myQueryResolver) OrderVersionsConnection(ctx context.Context, orderID *string, pagination *v2.Pagination) (*v2.OrderConnection, error) {
  1651  	if orderID == nil {
  1652  		return nil, ErrMissingIDOrReference
  1653  	}
  1654  	req := &v2.ListOrderVersionsRequest{
  1655  		OrderId:    *orderID,
  1656  		Pagination: pagination,
  1657  	}
  1658  
  1659  	resp, err := r.tradingDataClientV2.ListOrderVersions(ctx, req)
  1660  	if err != nil {
  1661  		r.log.Error("tradingData client", logging.Error(err))
  1662  		return nil, err
  1663  	}
  1664  	return resp.Orders, nil
  1665  }
  1666  
  1667  func (r *myQueryResolver) OrderByReference(ctx context.Context, reference string) (*vegapb.Order, error) {
  1668  	req := &v2.ListOrdersRequest{
  1669  		Filter: &v2.OrderFilter{
  1670  			Reference: &reference,
  1671  		},
  1672  	}
  1673  	res, err := r.tradingDataClientV2.ListOrders(ctx, req)
  1674  	if err != nil {
  1675  		r.log.Error("tradingData client", logging.Error(err))
  1676  		return nil, err
  1677  	}
  1678  
  1679  	if len(res.Orders.Edges) == 0 {
  1680  		return nil, fmt.Errorf("order reference not found: %s", reference)
  1681  	}
  1682  
  1683  	return res.Orders.Edges[0].Node, nil
  1684  }
  1685  
  1686  func (r *myQueryResolver) ProposalsConnection(ctx context.Context, proposalType *v2.ListGovernanceDataRequest_Type, inState *vega.Proposal_State,
  1687  	pagination *v2.Pagination,
  1688  ) (*v2.GovernanceDataConnection, error) {
  1689  	return handleProposalsRequest(ctx, r.tradingDataClientV2, nil, nil, proposalType, inState, pagination)
  1690  }
  1691  
  1692  func (r *myQueryResolver) Proposal(ctx context.Context, id *string, reference *string) (ProposalNode, error) {
  1693  	if id != nil {
  1694  		resp, err := r.tradingDataClientV2.GetGovernanceData(ctx, &v2.GetGovernanceDataRequest{
  1695  			ProposalId: id,
  1696  		})
  1697  		if err != nil {
  1698  			return nil, err
  1699  		}
  1700  
  1701  		resolver := (*proposalEdgeResolver)(r)
  1702  		if resp.GetData().ProposalType == vega.GovernanceData_TYPE_BATCH {
  1703  			return resolver.BatchProposal(ctx, resp.GetData())
  1704  		}
  1705  
  1706  		return resp.Data, nil
  1707  	} else if reference != nil {
  1708  		resp, err := r.tradingDataClientV2.GetGovernanceData(ctx, &v2.GetGovernanceDataRequest{
  1709  			Reference: reference,
  1710  		})
  1711  		if err != nil {
  1712  			return nil, err
  1713  		}
  1714  
  1715  		resolver := (*proposalEdgeResolver)(r)
  1716  		if resp.GetData().ProposalType == vega.GovernanceData_TYPE_BATCH {
  1717  			return resolver.BatchProposal(ctx, resp.GetData())
  1718  		}
  1719  
  1720  		return resp.Data, nil
  1721  	}
  1722  
  1723  	return nil, ErrMissingIDOrReference
  1724  }
  1725  
  1726  func (r *myQueryResolver) ProtocolUpgradeStatus(ctx context.Context) (*ProtocolUpgradeStatus, error) {
  1727  	status, err := r.tradingDataClientV2.GetProtocolUpgradeStatus(ctx, &v2.GetProtocolUpgradeStatusRequest{})
  1728  	if err != nil {
  1729  		return nil, err
  1730  	}
  1731  
  1732  	return &ProtocolUpgradeStatus{
  1733  		Ready: status.Ready,
  1734  	}, nil
  1735  }
  1736  
  1737  func (r *myQueryResolver) CoreSnapshots(ctx context.Context, pagination *v2.Pagination) (*v2.CoreSnapshotConnection, error) {
  1738  	req := v2.ListCoreSnapshotsRequest{Pagination: pagination}
  1739  	resp, err := r.tradingDataClientV2.ListCoreSnapshots(ctx, &req)
  1740  	if err != nil {
  1741  		return nil, err
  1742  	}
  1743  
  1744  	return resp.CoreSnapshots, nil
  1745  }
  1746  
  1747  func (r *myQueryResolver) EpochRewardSummaries(
  1748  	ctx context.Context,
  1749  	filter *v2.RewardSummaryFilter,
  1750  	pagination *v2.Pagination,
  1751  ) (*v2.EpochRewardSummaryConnection, error) {
  1752  	req := v2.ListEpochRewardSummariesRequest{
  1753  		Filter:     filter,
  1754  		Pagination: pagination,
  1755  	}
  1756  	resp, err := r.tradingDataClientV2.ListEpochRewardSummaries(ctx, &req)
  1757  	if err != nil {
  1758  		return nil, err
  1759  	}
  1760  	return resp.Summaries, nil
  1761  }
  1762  
  1763  func (r *myQueryResolver) ProtocolUpgradeProposals(
  1764  	ctx context.Context,
  1765  	inState *eventspb.ProtocolUpgradeProposalStatus,
  1766  	approvedBy *string,
  1767  	pagination *v2.Pagination,
  1768  ) (
  1769  	*v2.ProtocolUpgradeProposalConnection, error,
  1770  ) {
  1771  	req := v2.ListProtocolUpgradeProposalsRequest{Status: inState, ApprovedBy: approvedBy, Pagination: pagination}
  1772  	resp, err := r.tradingDataClientV2.ListProtocolUpgradeProposals(ctx, &req)
  1773  	if err != nil {
  1774  		return nil, err
  1775  	}
  1776  
  1777  	return resp.ProtocolUpgradeProposals, nil
  1778  }
  1779  
  1780  func (r *myQueryResolver) NodeData(ctx context.Context) (*vegapb.NodeData, error) {
  1781  	resp, err := r.tradingDataClientV2.GetNetworkData(ctx, &v2.GetNetworkDataRequest{})
  1782  	if err != nil {
  1783  		return nil, err
  1784  	}
  1785  
  1786  	return resp.NodeData, nil
  1787  }
  1788  
  1789  func (r *myQueryResolver) NodesConnection(ctx context.Context, pagination *v2.Pagination) (*v2.NodesConnection, error) {
  1790  	req := &v2.ListNodesRequest{
  1791  		Pagination: pagination,
  1792  	}
  1793  	resp, err := r.tradingDataClientV2.ListNodes(ctx, req)
  1794  	if err != nil {
  1795  		return nil, err
  1796  	}
  1797  
  1798  	return resp.Nodes, nil
  1799  }
  1800  
  1801  func (r *myQueryResolver) Node(ctx context.Context, id string) (*vegapb.Node, error) {
  1802  	resp, err := r.tradingDataClientV2.GetNode(ctx, &v2.GetNodeRequest{
  1803  		Id: id,
  1804  	})
  1805  	if err != nil {
  1806  		return nil, err
  1807  	}
  1808  
  1809  	return resp.Node, nil
  1810  }
  1811  
  1812  func (r *myQueryResolver) KeyRotationsConnection(ctx context.Context, id *string, pagination *v2.Pagination) (*v2.KeyRotationConnection, error) {
  1813  	resp, err := r.tradingDataClientV2.ListKeyRotations(ctx, &v2.ListKeyRotationsRequest{NodeId: id, Pagination: pagination})
  1814  	if err != nil {
  1815  		return nil, err
  1816  	}
  1817  
  1818  	return resp.Rotations, nil
  1819  }
  1820  
  1821  func (r *myQueryResolver) EthereumKeyRotations(ctx context.Context, nodeID *string) (*v2.EthereumKeyRotationsConnection, error) {
  1822  	resp, err := r.tradingDataClientV2.ListEthereumKeyRotations(ctx, &v2.ListEthereumKeyRotationsRequest{NodeId: nodeID})
  1823  	if err != nil {
  1824  		return nil, err
  1825  	}
  1826  
  1827  	return resp.KeyRotations, nil
  1828  }
  1829  
  1830  func (r *myQueryResolver) Epoch(ctx context.Context, id *string, block *string) (*vegapb.Epoch, error) {
  1831  	var (
  1832  		epochID, blockHeight *uint64
  1833  		err                  error
  1834  	)
  1835  	if id != nil {
  1836  		parsedID, err := strconv.ParseUint(*id, 10, 64)
  1837  		if err != nil {
  1838  			return nil, err
  1839  		}
  1840  
  1841  		epochID = &parsedID
  1842  	}
  1843  
  1844  	if block != nil {
  1845  		parsedHeight, err := strconv.ParseUint(*block, 10, 64)
  1846  		if err != nil {
  1847  			return nil, err
  1848  		}
  1849  		blockHeight = &parsedHeight
  1850  	}
  1851  
  1852  	req := &v2.GetEpochRequest{
  1853  		Id:    epochID,
  1854  		Block: blockHeight,
  1855  	}
  1856  	resp, err := r.tradingDataClientV2.GetEpoch(ctx, req)
  1857  	if err != nil {
  1858  		return nil, err
  1859  	}
  1860  
  1861  	return resp.Epoch, nil
  1862  }
  1863  
  1864  func (r *myQueryResolver) Statistics(ctx context.Context) (*vegaprotoapi.Statistics, error) {
  1865  	req := &vegaprotoapi.StatisticsRequest{}
  1866  	resp, err := r.tradingProxyClient.Statistics(ctx, req)
  1867  	if err != nil {
  1868  		return nil, err
  1869  	}
  1870  	return resp.GetStatistics(), nil
  1871  }
  1872  
  1873  func (r *myQueryResolver) BalanceChanges(
  1874  	ctx context.Context,
  1875  	filter *v2.AccountFilter,
  1876  	dateRange *v2.DateRange,
  1877  	pagination *v2.Pagination,
  1878  ) (*v2.AggregatedBalanceConnection, error) {
  1879  	req := &v2.ListBalanceChangesRequest{
  1880  		Filter:     filter,
  1881  		DateRange:  dateRange,
  1882  		Pagination: pagination,
  1883  	}
  1884  
  1885  	resp, err := r.tradingDataClientV2.ListBalanceChanges(ctx, req)
  1886  	if err != nil {
  1887  		return nil, err
  1888  	}
  1889  	return resp.GetBalances(), nil
  1890  }
  1891  
  1892  func (r *myQueryResolver) LedgerEntries(
  1893  	ctx context.Context,
  1894  	filter *v2.LedgerEntryFilter,
  1895  	dateRange *v2.DateRange,
  1896  	pagination *v2.Pagination,
  1897  ) (*v2.AggregatedLedgerEntriesConnection, error) {
  1898  	req := &v2.ListLedgerEntriesRequest{}
  1899  	req.Filter = filter
  1900  
  1901  	req.DateRange = dateRange
  1902  	req.Pagination = pagination
  1903  
  1904  	resp, err := r.tradingDataClientV2.ListLedgerEntries(ctx, req)
  1905  	if err != nil {
  1906  		return nil, err
  1907  	}
  1908  	return resp.GetLedgerEntries(), nil
  1909  }
  1910  
  1911  func (r *myQueryResolver) NetworkLimits(ctx context.Context) (*vegapb.NetworkLimits, error) {
  1912  	req := &v2.GetNetworkLimitsRequest{}
  1913  	resp, err := r.tradingDataClientV2.GetNetworkLimits(ctx, req)
  1914  	if err != nil {
  1915  		return nil, err
  1916  	}
  1917  	return resp.GetLimits(), nil
  1918  }
  1919  
  1920  func (r *myQueryResolver) MostRecentHistorySegment(ctx context.Context) (*v2.HistorySegment, error) {
  1921  	req := &v2.GetMostRecentNetworkHistorySegmentRequest{}
  1922  
  1923  	resp, err := r.tradingDataClientV2.GetMostRecentNetworkHistorySegment(ctx, req)
  1924  	if err != nil {
  1925  		return nil, err
  1926  	}
  1927  	return resp.GetSegment(), nil
  1928  }
  1929  
  1930  func (r *myQueryResolver) SuccessorMarkets(ctx context.Context, marketID string, fullHistory *bool, pagination *v2.Pagination) (*v2.SuccessorMarketConnection, error) {
  1931  	getAll := false
  1932  
  1933  	if fullHistory != nil {
  1934  		getAll = *fullHistory
  1935  	}
  1936  
  1937  	req := &v2.ListSuccessorMarketsRequest{
  1938  		MarketId:           marketID,
  1939  		IncludeFullHistory: getAll,
  1940  		Pagination:         pagination,
  1941  	}
  1942  
  1943  	resp, err := r.tradingDataClientV2.ListSuccessorMarkets(ctx, req)
  1944  	if err != nil {
  1945  		return nil, err
  1946  	}
  1947  
  1948  	return resp.GetSuccessorMarkets(), nil
  1949  }
  1950  
  1951  func (r *myQueryResolver) StopOrder(ctx context.Context, id string) (*eventspb.StopOrderEvent, error) {
  1952  	req := &v2.GetStopOrderRequest{
  1953  		OrderId: id,
  1954  	}
  1955  
  1956  	resp, err := r.tradingDataClientV2.GetStopOrder(ctx, req)
  1957  	if err != nil {
  1958  		return nil, err
  1959  	}
  1960  
  1961  	return resp.Order, nil
  1962  }
  1963  
  1964  func (r *myQueryResolver) StopOrders(ctx context.Context, filter *v2.StopOrderFilter, pagination *v2.Pagination) (*v2.StopOrderConnection, error) {
  1965  	req := &v2.ListStopOrdersRequest{
  1966  		Filter:     filter,
  1967  		Pagination: pagination,
  1968  	}
  1969  
  1970  	resp, err := r.tradingDataClientV2.ListStopOrders(ctx, req)
  1971  	if err != nil {
  1972  		return nil, err
  1973  	}
  1974  
  1975  	return resp.Orders, nil
  1976  }
  1977  
  1978  func (r *myQueryResolver) LiquidityProviders(ctx context.Context, partyID, marketID *string, pagination *v2.Pagination) (*v2.LiquidityProviderConnection, error) {
  1979  	providers, err := r.tradingDataClientV2.ListLiquidityProviders(ctx, &v2.ListLiquidityProvidersRequest{
  1980  		MarketId:   marketID,
  1981  		PartyId:    partyID,
  1982  		Pagination: pagination,
  1983  	})
  1984  	if err != nil {
  1985  		return nil, err
  1986  	}
  1987  
  1988  	return providers.LiquidityProviders, nil
  1989  }
  1990  
  1991  func (r *myQueryResolver) CurrentReferralProgram(ctx context.Context) (*v2.ReferralProgram, error) {
  1992  	resp, err := r.tradingDataClientV2.GetCurrentReferralProgram(ctx, &v2.GetCurrentReferralProgramRequest{})
  1993  	if err != nil {
  1994  		return &v2.ReferralProgram{}, err
  1995  	}
  1996  
  1997  	return resp.CurrentReferralProgram, nil
  1998  }
  1999  
  2000  func (r *myQueryResolver) CurrentVolumeDiscountProgram(ctx context.Context) (*v2.VolumeDiscountProgram, error) {
  2001  	resp, err := r.tradingDataClientV2.GetCurrentVolumeDiscountProgram(ctx, &v2.GetCurrentVolumeDiscountProgramRequest{})
  2002  	if err != nil {
  2003  		return &v2.VolumeDiscountProgram{}, err
  2004  	}
  2005  
  2006  	return resp.CurrentVolumeDiscountProgram, nil
  2007  }
  2008  
  2009  func (r *myQueryResolver) VolumeDiscountStats(ctx context.Context, epoch *int, partyID *string, pagination *v2.Pagination) (*v2.VolumeDiscountStatsConnection, error) {
  2010  	var epochU64Ptr *uint64
  2011  	if epoch != nil {
  2012  		epochU64 := uint64(*epoch)
  2013  		epochU64Ptr = &epochU64
  2014  	}
  2015  
  2016  	resp, err := r.tradingDataClientV2.GetVolumeDiscountStats(ctx, &v2.GetVolumeDiscountStatsRequest{
  2017  		AtEpoch:    epochU64Ptr,
  2018  		PartyId:    partyID,
  2019  		Pagination: pagination,
  2020  	})
  2021  	if err != nil {
  2022  		return &v2.VolumeDiscountStatsConnection{}, err
  2023  	}
  2024  
  2025  	return resp.Stats, nil
  2026  }
  2027  
  2028  func (r *myQueryResolver) ReferralSets(ctx context.Context, id, referrer, referee *string, pagination *v2.Pagination) (*v2.ReferralSetConnection, error) {
  2029  	req := &v2.ListReferralSetsRequest{
  2030  		ReferralSetId: id,
  2031  		Pagination:    pagination,
  2032  		Referrer:      referrer,
  2033  		Referee:       referee,
  2034  	}
  2035  
  2036  	resp, err := r.tradingDataClientV2.ListReferralSets(ctx, req)
  2037  	if err != nil {
  2038  		return &v2.ReferralSetConnection{}, err
  2039  	}
  2040  
  2041  	return resp.ReferralSets, nil
  2042  }
  2043  
  2044  func (r *myQueryResolver) ReferralSetReferees(ctx context.Context, id, referrer, referee *string, pagination *v2.Pagination, epochsToAggregate *int) (*v2.ReferralSetRefereeConnection, error) {
  2045  	var aggregationEpochs uint32 = 30 // default to 30 days
  2046  
  2047  	if epochsToAggregate != nil {
  2048  		aggregationEpochs = uint32(*epochsToAggregate)
  2049  	}
  2050  
  2051  	req := &v2.ListReferralSetRefereesRequest{
  2052  		ReferralSetId:     id,
  2053  		Pagination:        pagination,
  2054  		Referrer:          referrer,
  2055  		Referee:           referee,
  2056  		AggregationEpochs: &aggregationEpochs,
  2057  	}
  2058  
  2059  	resp, err := r.tradingDataClientV2.ListReferralSetReferees(ctx, req)
  2060  	if err != nil {
  2061  		return &v2.ReferralSetRefereeConnection{}, err
  2062  	}
  2063  
  2064  	return resp.ReferralSetReferees, nil
  2065  }
  2066  
  2067  func (r *myQueryResolver) ReferralSetStats(ctx context.Context, setID *string, epoch *int, partyID *string, pagination *v2.Pagination) (*v2.ReferralSetStatsConnection, error) {
  2068  	var epochU64Ptr *uint64
  2069  	if epoch != nil {
  2070  		epochU64 := uint64(*epoch)
  2071  		epochU64Ptr = &epochU64
  2072  	}
  2073  
  2074  	resp, err := r.tradingDataClientV2.GetReferralSetStats(ctx, &v2.GetReferralSetStatsRequest{
  2075  		ReferralSetId: setID,
  2076  		AtEpoch:       epochU64Ptr,
  2077  		Referee:       partyID,
  2078  		Pagination:    pagination,
  2079  	})
  2080  	if err != nil {
  2081  		return nil, err
  2082  	}
  2083  
  2084  	return resp.Stats, nil
  2085  }
  2086  
  2087  func (r *myQueryResolver) Teams(ctx context.Context, teamID *string, partyID *string, pagination *v2.Pagination) (*v2.TeamConnection, error) {
  2088  	teams, err := r.tradingDataClientV2.ListTeams(ctx, &v2.ListTeamsRequest{
  2089  		PartyId:    partyID,
  2090  		TeamId:     teamID,
  2091  		Pagination: pagination,
  2092  	})
  2093  	if err != nil {
  2094  		return nil, err
  2095  	}
  2096  
  2097  	return teams.Teams, nil
  2098  }
  2099  
  2100  func (r *myQueryResolver) TeamsStatistics(ctx context.Context, teamID *string, aggregationEpochs *int, pagination *v2.Pagination) (*v2.TeamsStatisticsConnection, error) {
  2101  	filters := &v2.ListTeamsStatisticsRequest{
  2102  		TeamId:     teamID,
  2103  		Pagination: pagination,
  2104  	}
  2105  
  2106  	if aggregationEpochs != nil {
  2107  		filters.AggregationEpochs = ptr.From(uint64(*aggregationEpochs))
  2108  	}
  2109  
  2110  	stats, err := r.tradingDataClientV2.ListTeamsStatistics(ctx, filters)
  2111  	if err != nil {
  2112  		return nil, err
  2113  	}
  2114  
  2115  	return stats.Statistics, nil
  2116  }
  2117  
  2118  func (r *myQueryResolver) TeamMembersStatistics(ctx context.Context, teamID string, partyID *string, aggregationEpochs *int, pagination *v2.Pagination) (*v2.TeamMembersStatisticsConnection, error) {
  2119  	filters := &v2.ListTeamMembersStatisticsRequest{
  2120  		TeamId:     teamID,
  2121  		PartyId:    partyID,
  2122  		Pagination: pagination,
  2123  	}
  2124  
  2125  	if aggregationEpochs != nil {
  2126  		filters.AggregationEpochs = ptr.From(uint64(*aggregationEpochs))
  2127  	}
  2128  
  2129  	stats, err := r.tradingDataClientV2.ListTeamMembersStatistics(ctx, filters)
  2130  	if err != nil {
  2131  		return nil, err
  2132  	}
  2133  
  2134  	return stats.Statistics, nil
  2135  }
  2136  
  2137  func (r *myQueryResolver) TeamReferees(ctx context.Context, teamID string, pagination *v2.Pagination) (*v2.TeamRefereeConnection, error) {
  2138  	referees, err := r.tradingDataClientV2.ListTeamReferees(ctx, &v2.ListTeamRefereesRequest{
  2139  		TeamId:     teamID,
  2140  		Pagination: pagination,
  2141  	})
  2142  	if err != nil {
  2143  		return nil, err
  2144  	}
  2145  
  2146  	return referees.TeamReferees, nil
  2147  }
  2148  
  2149  func (r *myQueryResolver) TeamRefereeHistory(ctx context.Context, referee string, pagination *v2.Pagination) (*v2.TeamRefereeHistoryConnection, error) {
  2150  	history, err := r.tradingDataClientV2.ListTeamRefereeHistory(ctx, &v2.ListTeamRefereeHistoryRequest{
  2151  		Referee:    referee,
  2152  		Pagination: pagination,
  2153  	})
  2154  	if err != nil {
  2155  		return nil, err
  2156  	}
  2157  
  2158  	return history.TeamRefereeHistory, nil
  2159  }
  2160  
  2161  func (r *myQueryResolver) FeesStats(ctx context.Context, marketID *string, assetID *string, epoch *int,
  2162  	partyID *string, epochFrom, epochTo *int,
  2163  ) (*v1.FeesStats, error) {
  2164  	var epochSeq, from, to *uint64
  2165  
  2166  	if epoch != nil {
  2167  		epochSeq = ptr.From(uint64(*epoch))
  2168  	}
  2169  	if epochFrom != nil {
  2170  		from = ptr.From(uint64(*epochFrom))
  2171  	}
  2172  	if epochTo != nil {
  2173  		to = ptr.From(uint64(*epochTo))
  2174  	}
  2175  
  2176  	req := &v2.GetFeesStatsRequest{
  2177  		MarketId:  marketID,
  2178  		AssetId:   assetID,
  2179  		EpochSeq:  epochSeq,
  2180  		PartyId:   partyID,
  2181  		EpochFrom: from,
  2182  		EpochTo:   to,
  2183  	}
  2184  
  2185  	resp, err := r.tradingDataClientV2.GetFeesStats(ctx, req)
  2186  	if err != nil {
  2187  		return nil, err
  2188  	}
  2189  
  2190  	return resp.FeesStats, nil
  2191  }
  2192  
  2193  func (r *myQueryResolver) FeesStatsForParty(ctx context.Context, partyID string, assetID *string, fromEpoch, toEpoch *int) ([]*v2.FeesStatsForParty, error) {
  2194  	var fromEpochU, toEpochU *uint64
  2195  
  2196  	if fromEpoch != nil {
  2197  		fromEpochU = ptr.From(uint64(*fromEpoch))
  2198  	}
  2199  
  2200  	if toEpoch != nil {
  2201  		toEpochU = ptr.From(uint64(*toEpoch))
  2202  	}
  2203  
  2204  	req := &v2.GetFeesStatsForPartyRequest{
  2205  		PartyId:   partyID,
  2206  		AssetId:   assetID,
  2207  		FromEpoch: fromEpochU,
  2208  		ToEpoch:   toEpochU,
  2209  	}
  2210  
  2211  	resp, err := r.tradingDataClientV2.GetFeesStatsForParty(ctx, req)
  2212  	if err != nil {
  2213  		return nil, err
  2214  	}
  2215  
  2216  	return resp.FeesStatsForParty, nil
  2217  }
  2218  
  2219  func (r *myQueryResolver) PaidLiquidityFees(
  2220  	ctx context.Context,
  2221  	marketID *string,
  2222  	assetID *string,
  2223  	epoch *int,
  2224  	partyIDs []string,
  2225  	includeDerivedParties *bool,
  2226  	from, to *int,
  2227  ) (*v2.PaidLiquidityFeesConnection, error) {
  2228  	var epochSeq, epochFrom, epochTo *uint64
  2229  
  2230  	if epoch != nil {
  2231  		epochSeq = ptr.From(uint64(*epoch))
  2232  	}
  2233  	if from != nil {
  2234  		epochFrom = ptr.From(uint64(*from))
  2235  	}
  2236  	if to != nil {
  2237  		epochTo = ptr.From(uint64(*to))
  2238  	}
  2239  
  2240  	req := &v2.ListPaidLiquidityFeesRequest{
  2241  		MarketId:              marketID,
  2242  		AssetId:               assetID,
  2243  		EpochSeq:              epochSeq,
  2244  		PartyIds:              partyIDs,
  2245  		IncludeDerivedParties: includeDerivedParties,
  2246  		EpochFrom:             epochFrom,
  2247  		EpochTo:               epochTo,
  2248  	}
  2249  
  2250  	resp, err := r.tradingDataClientV2.ListPaidLiquidityFees(ctx, req)
  2251  	if err != nil {
  2252  		return nil, err
  2253  	}
  2254  
  2255  	return resp.PaidLiquidityFees, nil
  2256  }
  2257  
  2258  func (r *myQueryResolver) TotalTransferFeeDiscount(
  2259  	ctx context.Context,
  2260  	partyId string,
  2261  	assetId string,
  2262  ) (*v2.GetTotalTransferFeeDiscountResponse, error) {
  2263  	resp, err := r.tradingDataClientV2.GetTotalTransferFeeDiscount(ctx, &v2.GetTotalTransferFeeDiscountRequest{
  2264  		PartyId: partyId,
  2265  		AssetId: assetId,
  2266  	})
  2267  	if err != nil {
  2268  		return nil, err
  2269  	}
  2270  
  2271  	return resp, nil
  2272  }
  2273  
  2274  func (r *myQueryResolver) EstimateTransferFee(
  2275  	ctx context.Context,
  2276  	fromAccount string,
  2277  	fromAccountType vega.AccountType,
  2278  	toAccount string,
  2279  	amount string,
  2280  	assetId string,
  2281  ) (*v2.EstimateTransferFeeResponse, error) {
  2282  	resp, err := r.tradingDataClientV2.EstimateTransferFee(ctx, &v2.EstimateTransferFeeRequest{
  2283  		FromAccount:     fromAccount,
  2284  		FromAccountType: fromAccountType,
  2285  		ToAccount:       toAccount,
  2286  		Amount:          amount,
  2287  		AssetId:         assetId,
  2288  	})
  2289  	if err != nil {
  2290  		return nil, err
  2291  	}
  2292  
  2293  	return resp, nil
  2294  }
  2295  
  2296  // END: Root Resolver
  2297  
  2298  type myNodeSignatureResolver VegaResolverRoot
  2299  
  2300  func (r *myNodeSignatureResolver) Signature(_ context.Context, obj *commandspb.NodeSignature) (*string, error) {
  2301  	sig := base64.StdEncoding.EncodeToString(obj.Sig)
  2302  	return &sig, nil
  2303  }
  2304  
  2305  // BEGIN: Party Resolver
  2306  
  2307  type myPartyResolver VegaResolverRoot
  2308  
  2309  func (r *myPartyResolver) VestingStats(
  2310  	ctx context.Context,
  2311  	obj *vega.Party,
  2312  ) (*v2.GetPartyVestingStatsResponse, error) {
  2313  	res, err := r.r.clt2.GetPartyVestingStats(ctx, &v2.GetPartyVestingStatsRequest{
  2314  		PartyId: obj.Id,
  2315  	})
  2316  	if err != nil {
  2317  		return nil, err
  2318  	}
  2319  
  2320  	return res, nil
  2321  }
  2322  
  2323  func (r *myPartyResolver) VestingBalancesSummary(
  2324  	ctx context.Context,
  2325  	obj *vega.Party,
  2326  	assetID *string,
  2327  ) (*v2.GetVestingBalancesSummaryResponse, error) {
  2328  	res, err := r.r.clt2.GetVestingBalancesSummary(ctx, &v2.GetVestingBalancesSummaryRequest{
  2329  		PartyId: obj.Id,
  2330  		AssetId: assetID,
  2331  	})
  2332  	if err != nil {
  2333  		return nil, err
  2334  	}
  2335  
  2336  	return res, nil
  2337  }
  2338  
  2339  func (r *myPartyResolver) ActivityStreak(
  2340  	ctx context.Context,
  2341  	obj *vega.Party,
  2342  	epoch *int,
  2343  ) (*eventspb.PartyActivityStreak, error) {
  2344  	var epoc *uint64
  2345  	if epoch != nil {
  2346  		if *epoch <= 0 {
  2347  			return nil, errors.New("epoch must be positive")
  2348  		}
  2349  		epoc = ptr.From(uint64(*epoch))
  2350  	}
  2351  	res, err := r.r.clt2.GetPartyActivityStreak(ctx, &v2.GetPartyActivityStreakRequest{
  2352  		PartyId: obj.Id,
  2353  		Epoch:   epoc,
  2354  	})
  2355  	if err != nil {
  2356  		return nil, err
  2357  	}
  2358  
  2359  	return res.ActivityStreak, nil
  2360  }
  2361  
  2362  func (r *myPartyResolver) TransfersConnection(
  2363  	ctx context.Context,
  2364  	party *vegapb.Party,
  2365  	direction *TransferDirection,
  2366  	pagination *v2.Pagination,
  2367  	isReward *bool,
  2368  	fromEpoch, toEpoch *int,
  2369  	status *eventspb.Transfer_Status,
  2370  	scope *v2.ListTransfersRequest_Scope,
  2371  	gameID *string,
  2372  	fromAccountType, toAccountType *vega.AccountType,
  2373  ) (*v2.TransferConnection, error) {
  2374  	return r.r.transfersConnection(ctx, &party.Id, direction, pagination, isReward, fromEpoch, toEpoch, status, scope, gameID, fromAccountType, toAccountType)
  2375  }
  2376  
  2377  func (r *myPartyResolver) RewardsConnection(ctx context.Context, party *vegapb.Party, assetID *string, pagination *v2.Pagination,
  2378  	fromEpoch *int, toEpoch *int, teamID, gameID *string, includeDerivedParties *bool, marketID *string,
  2379  ) (*v2.RewardsConnection, error) {
  2380  	var from, to *uint64
  2381  
  2382  	if fromEpoch != nil {
  2383  		from = new(uint64)
  2384  		if *fromEpoch < 0 {
  2385  			return nil, errors.New("invalid fromEpoch for reward query - must be positive")
  2386  		}
  2387  		*from = uint64(*fromEpoch)
  2388  	}
  2389  	if toEpoch != nil {
  2390  		to = new(uint64)
  2391  		if *toEpoch < 0 {
  2392  			return nil, errors.New("invalid toEpoch for reward query - must be positive")
  2393  		}
  2394  		*to = uint64(*toEpoch)
  2395  	}
  2396  
  2397  	req := v2.ListRewardsRequest{
  2398  		PartyId:               party.Id,
  2399  		AssetId:               assetID,
  2400  		Pagination:            pagination,
  2401  		FromEpoch:             from,
  2402  		ToEpoch:               to,
  2403  		TeamId:                teamID,
  2404  		GameId:                gameID,
  2405  		IncludeDerivedParties: includeDerivedParties,
  2406  		MarketId:              marketID,
  2407  	}
  2408  	resp, err := r.tradingDataClientV2.ListRewards(ctx, &req)
  2409  	if err != nil {
  2410  		return nil, fmt.Errorf("could not retrieve rewards information: %w", err)
  2411  	}
  2412  
  2413  	return resp.Rewards, nil
  2414  }
  2415  
  2416  func (r *myPartyResolver) RewardSummaries(
  2417  	ctx context.Context,
  2418  	party *vegapb.Party,
  2419  	asset *string,
  2420  	includeDerivedParties *bool,
  2421  ) ([]*vegapb.RewardSummary, error) {
  2422  	var assetID string
  2423  	if asset != nil {
  2424  		assetID = *asset
  2425  	}
  2426  
  2427  	req := &v2.ListRewardSummariesRequest{
  2428  		PartyId:               &party.Id,
  2429  		AssetId:               &assetID,
  2430  		IncludeDerivedParties: includeDerivedParties,
  2431  	}
  2432  
  2433  	resp, err := r.tradingDataClientV2.ListRewardSummaries(ctx, req)
  2434  	if err != nil {
  2435  		return nil, err
  2436  	}
  2437  	return resp.Summaries, err
  2438  }
  2439  
  2440  func (r *myPartyResolver) StakingSummary(ctx context.Context, party *vegapb.Party, pagination *v2.Pagination) (*StakingSummary, error) {
  2441  	if party == nil {
  2442  		return nil, errors.New("party must not be nil")
  2443  	}
  2444  
  2445  	req := &v2.GetStakeRequest{
  2446  		PartyId:    party.Id,
  2447  		Pagination: pagination,
  2448  	}
  2449  
  2450  	resp, err := r.tradingDataClientV2.GetStake(ctx, req)
  2451  	if err != nil {
  2452  		return nil, err
  2453  	}
  2454  
  2455  	return &StakingSummary{
  2456  		CurrentStakeAvailable: resp.CurrentStakeAvailable,
  2457  		Linkings:              resp.StakeLinkings,
  2458  	}, nil
  2459  }
  2460  
  2461  func (r *myPartyResolver) LiquidityProvisionsConnection(
  2462  	ctx context.Context,
  2463  	party *vegapb.Party,
  2464  	market, ref *string,
  2465  	live *bool,
  2466  	pagination *v2.Pagination,
  2467  ) (*v2.LiquidityProvisionsConnection, error) {
  2468  	var partyID string
  2469  	if party != nil {
  2470  		partyID = party.Id
  2471  	}
  2472  	var mid string
  2473  	if market != nil {
  2474  		mid = *market
  2475  	}
  2476  
  2477  	var refID string
  2478  	if ref != nil {
  2479  		refID = *ref
  2480  	}
  2481  
  2482  	var l bool
  2483  	if live != nil {
  2484  		l = *live
  2485  	}
  2486  
  2487  	req := v2.ListLiquidityProvisionsRequest{
  2488  		PartyId:    &partyID,
  2489  		MarketId:   &mid,
  2490  		Reference:  &refID,
  2491  		Live:       &l,
  2492  		Pagination: pagination,
  2493  	}
  2494  
  2495  	res, err := r.tradingDataClientV2.ListLiquidityProvisions(ctx, &req)
  2496  	if err != nil {
  2497  		r.log.Error("tradingData client", logging.Error(err))
  2498  		return nil, err
  2499  	}
  2500  
  2501  	return res.LiquidityProvisions, nil
  2502  }
  2503  
  2504  func (r *myPartyResolver) LiquidityProvisions(ctx context.Context, party *vega.Party, market, ref *string,
  2505  	live *bool, pagination *v2.Pagination,
  2506  ) (*v2.LiquidityProvisionsWithPendingConnection, error) {
  2507  	var partyID string
  2508  	if party != nil {
  2509  		partyID = party.Id
  2510  	}
  2511  	var mid string
  2512  	if market != nil {
  2513  		mid = *market
  2514  	}
  2515  
  2516  	var refID string
  2517  	if ref != nil {
  2518  		refID = *ref
  2519  	}
  2520  
  2521  	var l bool
  2522  	if live != nil {
  2523  		l = *live
  2524  	}
  2525  
  2526  	req := v2.ListAllLiquidityProvisionsRequest{
  2527  		PartyId:    &partyID,
  2528  		MarketId:   &mid,
  2529  		Reference:  &refID,
  2530  		Live:       &l,
  2531  		Pagination: pagination,
  2532  	}
  2533  
  2534  	res, err := r.tradingDataClientV2.ListAllLiquidityProvisions(ctx, &req)
  2535  	if err != nil {
  2536  		r.log.Error("tradingData client", logging.Error(err))
  2537  		return nil, err
  2538  	}
  2539  
  2540  	return res.LiquidityProvisions, nil
  2541  }
  2542  
  2543  func (r *myPartyResolver) MarginsConnection(ctx context.Context, party *vegapb.Party, marketID *string,
  2544  	pagination *v2.Pagination,
  2545  ) (*v2.MarginConnection, error) {
  2546  	if party == nil {
  2547  		return nil, errors.New("party is nil")
  2548  	}
  2549  
  2550  	market := ""
  2551  
  2552  	if marketID != nil {
  2553  		market = *marketID
  2554  	}
  2555  
  2556  	req := v2.ListMarginLevelsRequest{
  2557  		PartyId:    party.Id,
  2558  		MarketId:   market,
  2559  		Pagination: pagination,
  2560  	}
  2561  
  2562  	res, err := r.tradingDataClientV2.ListMarginLevels(ctx, &req)
  2563  	if err != nil {
  2564  		r.log.Error("tradingData client", logging.Error(err))
  2565  		return nil, err
  2566  	}
  2567  
  2568  	return res.MarginLevels, nil
  2569  }
  2570  
  2571  func (r *myPartyResolver) OrdersConnection(ctx context.Context, party *vegapb.Party, pagination *v2.Pagination, filter *OrderByMarketIdsFilter) (*v2.OrderConnection, error) {
  2572  	req := v2.ListOrdersRequest{
  2573  		Pagination: pagination,
  2574  		Filter: &v2.OrderFilter{
  2575  			PartyIds: []string{party.Id},
  2576  		},
  2577  	}
  2578  
  2579  	if filter != nil {
  2580  		req.Filter.MarketIds = filter.MarketIds
  2581  		if filter.Order != nil {
  2582  			req.Filter.Statuses = filter.Order.Statuses
  2583  			req.Filter.Types = filter.Order.Types
  2584  			req.Filter.TimeInForces = filter.Order.TimeInForces
  2585  			req.Filter.ExcludeLiquidity = filter.Order.ExcludeLiquidity
  2586  			req.Filter.Reference = filter.Order.Reference
  2587  			req.Filter.DateRange = filter.Order.DateRange
  2588  			req.Filter.LiveOnly = filter.Order.LiveOnly
  2589  		}
  2590  	}
  2591  
  2592  	res, err := r.tradingDataClientV2.ListOrders(ctx, &req)
  2593  	if err != nil {
  2594  		r.log.Error("tradingData client", logging.Error(err))
  2595  		return nil, err
  2596  	}
  2597  	return res.Orders, nil
  2598  }
  2599  
  2600  func (r *myPartyResolver) TradesConnection(ctx context.Context, party *vegapb.Party, market *string, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.TradeConnection, error) {
  2601  	mkts := []string{}
  2602  	if market != nil {
  2603  		mkts = []string{*market}
  2604  	}
  2605  	req := v2.ListTradesRequest{
  2606  		PartyIds:   []string{party.Id},
  2607  		MarketIds:  mkts,
  2608  		Pagination: pagination,
  2609  		DateRange:  dateRange,
  2610  	}
  2611  
  2612  	res, err := r.tradingDataClientV2.ListTrades(ctx, &req)
  2613  	if err != nil {
  2614  		r.log.Error("tradingData client", logging.Error(err))
  2615  		return nil, err
  2616  	}
  2617  	return res.Trades, nil
  2618  }
  2619  
  2620  func (r *myPartyResolver) PositionsConnection(ctx context.Context, party *vegapb.Party, market *string, pagination *v2.Pagination) (*v2.PositionConnection, error) {
  2621  	partyID := ""
  2622  	if party != nil {
  2623  		partyID = party.Id
  2624  	}
  2625  
  2626  	marketID := ""
  2627  	if market != nil {
  2628  		marketID = *market
  2629  	}
  2630  
  2631  	req := v2.ListPositionsRequest{
  2632  		PartyId:    partyID,
  2633  		MarketId:   marketID,
  2634  		Pagination: pagination,
  2635  	}
  2636  
  2637  	res, err := r.tradingDataClientV2.ListPositions(ctx, &req)
  2638  	if err != nil {
  2639  		r.log.Error("tradingData client", logging.Error(err))
  2640  		return nil, err
  2641  	}
  2642  
  2643  	return res.Positions, nil
  2644  }
  2645  
  2646  func (r *myPartyResolver) AccountsConnection(ctx context.Context, party *vegapb.Party, marketID *string, asset *string, accType *vegapb.AccountType, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.AccountsConnection, error) {
  2647  	if party == nil {
  2648  		return nil, errors.New("a party must be specified when querying accounts")
  2649  	}
  2650  	var (
  2651  		marketIDs    = []string{}
  2652  		mktID        = ""
  2653  		asst         = ""
  2654  		accountTypes = []vegapb.AccountType{}
  2655  		accTy        = vegapb.AccountType_ACCOUNT_TYPE_UNSPECIFIED
  2656  		err          error
  2657  	)
  2658  
  2659  	if marketID != nil {
  2660  		marketIDs = []string{*marketID}
  2661  		mktID = *marketID
  2662  	}
  2663  
  2664  	if asset != nil {
  2665  		asst = *asset
  2666  	}
  2667  	if accType != nil {
  2668  		accTy = *accType
  2669  		if accTy != vegapb.AccountType_ACCOUNT_TYPE_GENERAL &&
  2670  			accTy != vegapb.AccountType_ACCOUNT_TYPE_MARGIN &&
  2671  			accTy != vegapb.AccountType_ACCOUNT_TYPE_ORDER_MARGIN &&
  2672  			accTy != vegapb.AccountType_ACCOUNT_TYPE_BOND &&
  2673  			accTy != vega.AccountType_ACCOUNT_TYPE_VESTED_REWARDS &&
  2674  			accTy != vega.AccountType_ACCOUNT_TYPE_VESTING_REWARDS {
  2675  			return nil, fmt.Errorf("invalid account type for party %v", accType)
  2676  		}
  2677  		accountTypes = []vegapb.AccountType{accTy}
  2678  	}
  2679  
  2680  	filter := v2.AccountFilter{
  2681  		AssetId:      asst,
  2682  		PartyIds:     []string{party.Id},
  2683  		MarketIds:    marketIDs,
  2684  		AccountTypes: accountTypes,
  2685  	}
  2686  
  2687  	req := v2.ListAccountsRequest{Filter: &filter, Pagination: pagination, IncludeDerivedParties: includeDerivedParties}
  2688  	res, err := r.tradingDataClientV2.ListAccounts(ctx, &req)
  2689  	if err != nil {
  2690  		r.log.Error("unable to get Party account",
  2691  			logging.Error(err),
  2692  			logging.String("party-id", party.Id),
  2693  			logging.String("market-id", mktID),
  2694  			logging.String("asset", asst),
  2695  			logging.String("type", accTy.String()))
  2696  		return nil, err
  2697  	}
  2698  
  2699  	return res.Accounts, nil
  2700  }
  2701  
  2702  func (r *myPartyResolver) ProposalsConnection(ctx context.Context, party *vegapb.Party, proposalType *v2.ListGovernanceDataRequest_Type, inState *vega.Proposal_State,
  2703  	pagination *v2.Pagination,
  2704  ) (*v2.GovernanceDataConnection, error) {
  2705  	return handleProposalsRequest(ctx, r.tradingDataClientV2, party, nil, proposalType, inState, pagination)
  2706  }
  2707  
  2708  func (r *myPartyResolver) WithdrawalsConnection(ctx context.Context, party *vegapb.Party, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.WithdrawalsConnection, error) {
  2709  	return handleWithdrawalsConnectionRequest(ctx, r.tradingDataClientV2, party, dateRange, pagination)
  2710  }
  2711  
  2712  func (r *myPartyResolver) DepositsConnection(ctx context.Context, party *vegapb.Party, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.DepositsConnection, error) {
  2713  	return handleDepositsConnectionRequest(ctx, r.tradingDataClientV2, party, dateRange, pagination)
  2714  }
  2715  
  2716  func (r *myPartyResolver) VotesConnection(ctx context.Context, party *vegapb.Party, pagination *v2.Pagination) (*ProposalVoteConnection, error) {
  2717  	req := v2.ListVotesRequest{
  2718  		PartyId:    &party.Id,
  2719  		Pagination: pagination,
  2720  	}
  2721  
  2722  	res, err := r.tradingDataClientV2.ListVotes(ctx, &req)
  2723  	if err != nil {
  2724  		r.log.Error("tradingData client", logging.Error(err))
  2725  		return nil, err
  2726  	}
  2727  
  2728  	edges := make([]*ProposalVoteEdge, 0, len(res.Votes.Edges))
  2729  
  2730  	for _, edge := range res.Votes.Edges {
  2731  		edges = append(edges, &ProposalVoteEdge{
  2732  			Cursor: &edge.Cursor,
  2733  			Node:   ProposalVoteFromProto(edge.Node),
  2734  		})
  2735  	}
  2736  
  2737  	connection := &ProposalVoteConnection{
  2738  		Edges:    edges,
  2739  		PageInfo: res.Votes.PageInfo,
  2740  	}
  2741  
  2742  	return connection, nil
  2743  }
  2744  
  2745  func (r *myPartyResolver) DelegationsConnection(ctx context.Context, party *vegapb.Party, nodeID *string, pagination *v2.Pagination) (*v2.DelegationsConnection, error) {
  2746  	var partyID *string
  2747  	if party != nil {
  2748  		partyID = &party.Id
  2749  	}
  2750  
  2751  	return handleDelegationConnectionRequest(ctx, r.tradingDataClientV2, partyID, nodeID, nil, pagination)
  2752  }
  2753  
  2754  // END: Party Resolver
  2755  
  2756  type myMarginLevelsUpdateResolver VegaResolverRoot
  2757  
  2758  func (r *myMarginLevelsUpdateResolver) InitialLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2759  	return m.InitialMargin, nil
  2760  }
  2761  
  2762  func (r *myMarginLevelsUpdateResolver) SearchLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2763  	return m.SearchLevel, nil
  2764  }
  2765  
  2766  func (r *myMarginLevelsUpdateResolver) MaintenanceLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2767  	return m.MaintenanceMargin, nil
  2768  }
  2769  
  2770  func (r *myMarginLevelsUpdateResolver) OrderMarginLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2771  	return m.OrderMargin, nil
  2772  }
  2773  
  2774  func (r *myMarginLevelsUpdateResolver) MarginFactor(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2775  	return m.MarginFactor, nil
  2776  }
  2777  
  2778  // BEGIN: MarginLevels Resolver
  2779  
  2780  type myMarginLevelsResolver VegaResolverRoot
  2781  
  2782  func (r *myMarginLevelsResolver) Market(ctx context.Context, m *vegapb.MarginLevels) (*vegapb.Market, error) {
  2783  	return r.r.getMarketByID(ctx, m.MarketId)
  2784  }
  2785  
  2786  func (r *myMarginLevelsResolver) Party(ctx context.Context, m *vegapb.MarginLevels) (*vegapb.Party, error) {
  2787  	if m == nil {
  2788  		return nil, errors.New("nil order")
  2789  	}
  2790  	if len(m.PartyId) == 0 {
  2791  		return nil, errors.New("invalid party")
  2792  	}
  2793  	req := v2.GetPartyRequest{PartyId: m.PartyId}
  2794  	res, err := r.tradingDataClientV2.GetParty(ctx, &req)
  2795  	if err != nil {
  2796  		r.log.Error("tradingData client", logging.Error(err))
  2797  		return nil, err
  2798  	}
  2799  	return res.Party, nil
  2800  }
  2801  
  2802  func (r *myMarginLevelsResolver) Asset(ctx context.Context, m *vegapb.MarginLevels) (*vegapb.Asset, error) {
  2803  	return r.r.getAssetByID(ctx, m.Asset)
  2804  }
  2805  
  2806  func (r *myMarginLevelsResolver) CollateralReleaseLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2807  	return m.CollateralReleaseLevel, nil
  2808  }
  2809  
  2810  func (r *myMarginLevelsResolver) InitialLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2811  	return m.InitialMargin, nil
  2812  }
  2813  
  2814  func (r *myMarginLevelsResolver) SearchLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2815  	return m.SearchLevel, nil
  2816  }
  2817  
  2818  func (r *myMarginLevelsResolver) MaintenanceLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2819  	return m.MaintenanceMargin, nil
  2820  }
  2821  
  2822  func (r *myMarginLevelsResolver) OrderMarginLevel(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2823  	return m.OrderMargin, nil
  2824  }
  2825  
  2826  func (r *myMarginLevelsResolver) MarginFactor(_ context.Context, m *vegapb.MarginLevels) (string, error) {
  2827  	return m.MarginFactor, nil
  2828  }
  2829  
  2830  // END: MarginLevels Resolver
  2831  
  2832  type myOrderUpdateResolver VegaResolverRoot
  2833  
  2834  func (r *myOrderUpdateResolver) Price(_ context.Context, obj *vegapb.Order) (string, error) {
  2835  	return obj.Price, nil
  2836  }
  2837  
  2838  func (r *myOrderUpdateResolver) Size(_ context.Context, obj *vegapb.Order) (string, error) {
  2839  	return strconv.FormatUint(obj.Size, 10), nil
  2840  }
  2841  
  2842  func (r *myOrderUpdateResolver) Remaining(_ context.Context, obj *vegapb.Order) (string, error) {
  2843  	return strconv.FormatUint(obj.Remaining, 10), nil
  2844  }
  2845  
  2846  func (r *myOrderUpdateResolver) CreatedAt(_ context.Context, obj *vegapb.Order) (int64, error) {
  2847  	return obj.CreatedAt, nil
  2848  }
  2849  
  2850  func (r *myOrderUpdateResolver) UpdatedAt(_ context.Context, obj *vegapb.Order) (*int64, error) {
  2851  	var updatedAt *int64
  2852  	if obj.UpdatedAt > 0 {
  2853  		t := obj.UpdatedAt
  2854  		updatedAt = &t
  2855  	}
  2856  	return updatedAt, nil
  2857  }
  2858  
  2859  func (r *myOrderUpdateResolver) Version(_ context.Context, obj *vegapb.Order) (string, error) {
  2860  	return strconv.FormatUint(obj.Version, 10), nil
  2861  }
  2862  
  2863  func (r *myOrderUpdateResolver) ExpiresAt(_ context.Context, obj *vegapb.Order) (*string, error) {
  2864  	if obj.ExpiresAt <= 0 {
  2865  		return nil, nil
  2866  	}
  2867  	expiresAt := vegatime.Format(vegatime.UnixNano(obj.ExpiresAt))
  2868  	return &expiresAt, nil
  2869  }
  2870  
  2871  func (r *myOrderUpdateResolver) RejectionReason(_ context.Context, o *vegapb.Order) (*vega.OrderError, error) {
  2872  	return o.Reason, nil
  2873  }
  2874  
  2875  // BEGIN: Order Resolver
  2876  
  2877  type myOrderResolver VegaResolverRoot
  2878  
  2879  func (r *myOrderResolver) RejectionReason(_ context.Context, o *vegapb.Order) (*vega.OrderError, error) {
  2880  	return o.Reason, nil
  2881  }
  2882  
  2883  func (r *myOrderResolver) Price(_ context.Context, obj *vegapb.Order) (string, error) {
  2884  	return obj.Price, nil
  2885  }
  2886  
  2887  func (r *myOrderResolver) Market(ctx context.Context, obj *vegapb.Order) (*vegapb.Market, error) {
  2888  	return r.r.getMarketByID(ctx, obj.MarketId)
  2889  }
  2890  
  2891  func (r *myOrderResolver) Size(_ context.Context, obj *vegapb.Order) (string, error) {
  2892  	return strconv.FormatUint(obj.Size, 10), nil
  2893  }
  2894  
  2895  func (r *myOrderResolver) Remaining(_ context.Context, obj *vegapb.Order) (string, error) {
  2896  	return strconv.FormatUint(obj.Remaining, 10), nil
  2897  }
  2898  
  2899  func (r *myOrderResolver) CreatedAt(_ context.Context, obj *vegapb.Order) (int64, error) {
  2900  	return obj.CreatedAt, nil
  2901  }
  2902  
  2903  func (r *myOrderResolver) UpdatedAt(_ context.Context, obj *vegapb.Order) (*int64, error) {
  2904  	var updatedAt *int64
  2905  	if obj.UpdatedAt > 0 {
  2906  		t := obj.UpdatedAt
  2907  		updatedAt = &t
  2908  	}
  2909  	return updatedAt, nil
  2910  }
  2911  
  2912  func (r *myOrderResolver) Version(_ context.Context, obj *vegapb.Order) (string, error) {
  2913  	return strconv.FormatUint(obj.Version, 10), nil
  2914  }
  2915  
  2916  func (r *myOrderResolver) ExpiresAt(_ context.Context, obj *vegapb.Order) (*string, error) {
  2917  	if obj.ExpiresAt <= 0 {
  2918  		return nil, nil
  2919  	}
  2920  	expiresAt := vegatime.Format(vegatime.UnixNano(obj.ExpiresAt))
  2921  	return &expiresAt, nil
  2922  }
  2923  
  2924  func (r *myOrderResolver) TradesConnection(ctx context.Context, ord *vegapb.Order, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.TradeConnection, error) {
  2925  	if ord == nil {
  2926  		return nil, errors.New("nil order")
  2927  	}
  2928  	req := v2.ListTradesRequest{
  2929  		OrderIds:   []string{ord.Id},
  2930  		Pagination: pagination,
  2931  		DateRange:  dateRange,
  2932  	}
  2933  	res, err := r.tradingDataClientV2.ListTrades(ctx, &req)
  2934  	if err != nil {
  2935  		r.log.Error("tradingData client", logging.Error(err))
  2936  		return nil, err
  2937  	}
  2938  	return res.Trades, nil
  2939  }
  2940  
  2941  func (r *myOrderResolver) Party(_ context.Context, order *vegapb.Order) (*vegapb.Party, error) {
  2942  	if order == nil {
  2943  		return nil, errors.New("nil order")
  2944  	}
  2945  	if len(order.PartyId) == 0 {
  2946  		return nil, errors.New("invalid party")
  2947  	}
  2948  	return &vegapb.Party{Id: order.PartyId}, nil
  2949  }
  2950  
  2951  func (r *myOrderResolver) PeggedOrder(_ context.Context, order *vegapb.Order) (*vegapb.PeggedOrder, error) {
  2952  	return order.PeggedOrder, nil
  2953  }
  2954  
  2955  func (r *myOrderResolver) IcebergOrder(_ context.Context, order *vegapb.Order) IcebergOrderResolver {
  2956  	return (*icebergOrderResolver)(r)
  2957  }
  2958  
  2959  func (r *myOrderResolver) LiquidityProvision(ctx context.Context, obj *vegapb.Order) (*vegapb.LiquidityProvision, error) {
  2960  	if obj == nil || len(obj.LiquidityProvisionId) <= 0 {
  2961  		return nil, nil
  2962  	}
  2963  
  2964  	req := v2.ListLiquidityProvisionsRequest{
  2965  		PartyId:  &obj.PartyId,
  2966  		MarketId: &obj.MarketId,
  2967  	}
  2968  	res, err := r.tradingDataClientV2.ListLiquidityProvisions(ctx, &req)
  2969  	if err != nil {
  2970  		r.log.Error("tradingData client", logging.Error(err))
  2971  		return nil, err
  2972  	}
  2973  
  2974  	if len(res.LiquidityProvisions.Edges) <= 0 {
  2975  		return nil, nil
  2976  	}
  2977  
  2978  	return res.LiquidityProvisions.Edges[0].Node, nil
  2979  }
  2980  
  2981  // END: Order Resolver
  2982  
  2983  // BEGIN: Trade Resolver
  2984  
  2985  type myTradeResolver VegaResolverRoot
  2986  
  2987  func (r *myTradeResolver) Market(ctx context.Context, obj *vegapb.Trade) (*vegapb.Market, error) {
  2988  	return r.r.getMarketByID(ctx, obj.MarketId)
  2989  }
  2990  
  2991  func (r *myTradeResolver) Price(_ context.Context, obj *vegapb.Trade) (string, error) {
  2992  	return obj.Price, nil
  2993  }
  2994  
  2995  func (r *myTradeResolver) Size(_ context.Context, obj *vegapb.Trade) (string, error) {
  2996  	return strconv.FormatUint(obj.Size, 10), nil
  2997  }
  2998  
  2999  func (r *myTradeResolver) CreatedAt(_ context.Context, obj *vegapb.Trade) (int64, error) {
  3000  	return obj.Timestamp, nil
  3001  }
  3002  
  3003  func (r *myTradeResolver) Buyer(ctx context.Context, obj *vegapb.Trade) (*vegapb.Party, error) {
  3004  	if obj == nil {
  3005  		return nil, errors.New("invalid trade")
  3006  	}
  3007  	if len(obj.Buyer) == 0 {
  3008  		return nil, errors.New("invalid buyer")
  3009  	}
  3010  	req := v2.GetPartyRequest{PartyId: obj.Buyer}
  3011  	res, err := r.tradingDataClientV2.GetParty(ctx, &req)
  3012  	if err != nil {
  3013  		r.log.Error("tradingData client", logging.Error(err))
  3014  		return nil, err
  3015  	}
  3016  	return res.Party, nil
  3017  }
  3018  
  3019  func (r *myTradeResolver) Seller(ctx context.Context, obj *vegapb.Trade) (*vegapb.Party, error) {
  3020  	if obj == nil {
  3021  		return nil, errors.New("invalid trade")
  3022  	}
  3023  	if len(obj.Seller) == 0 {
  3024  		return nil, errors.New("invalid seller")
  3025  	}
  3026  	req := v2.GetPartyRequest{PartyId: obj.Seller}
  3027  	res, err := r.tradingDataClientV2.GetParty(ctx, &req)
  3028  	if err != nil {
  3029  		r.log.Error("tradingData client", logging.Error(err))
  3030  		return nil, err
  3031  	}
  3032  	return res.Party, nil
  3033  }
  3034  
  3035  func (r *myTradeResolver) BuyerAuctionBatch(_ context.Context, obj *vegapb.Trade) (*int, error) {
  3036  	i := int(obj.BuyerAuctionBatch)
  3037  	return &i, nil
  3038  }
  3039  
  3040  func setIfExists(v string) *string {
  3041  	if len(v) <= 0 {
  3042  		return nil
  3043  	}
  3044  
  3045  	return ptr.From(v)
  3046  }
  3047  
  3048  func (r *myTradeResolver) BuyerFee(_ context.Context, obj *vegapb.Trade) (*TradeFee, error) {
  3049  	fee := TradeFee{
  3050  		MakerFee:          "0",
  3051  		InfrastructureFee: "0",
  3052  		LiquidityFee:      "0",
  3053  	}
  3054  	if obj.BuyerFee != nil {
  3055  		fee.MakerFee = obj.BuyerFee.MakerFee
  3056  		fee.MakerFeeReferralDiscount = setIfExists(obj.BuyerFee.MakerFeeReferrerDiscount)
  3057  		fee.MakerFeeVolumeDiscount = setIfExists(obj.BuyerFee.MakerFeeVolumeDiscount)
  3058  		fee.InfrastructureFee = obj.BuyerFee.InfrastructureFee
  3059  		fee.InfrastructureFeeReferralDiscount = setIfExists(obj.BuyerFee.InfrastructureFeeReferrerDiscount)
  3060  		fee.InfrastructureFeeVolumeDiscount = setIfExists(obj.BuyerFee.InfrastructureFeeVolumeDiscount)
  3061  		fee.LiquidityFee = obj.BuyerFee.LiquidityFee
  3062  		fee.LiquidityFeeReferralDiscount = setIfExists(obj.BuyerFee.LiquidityFeeReferrerDiscount)
  3063  		fee.LiquidityFeeVolumeDiscount = setIfExists(obj.BuyerFee.LiquidityFeeVolumeDiscount)
  3064  		fee.TreasuryFee = obj.BuyerFee.TreasuryFee
  3065  		fee.BuyBackFee = obj.BuyerFee.BuyBackFee
  3066  		fee.HighVolumeMakerFee = obj.BuyerFee.HighVolumeMakerFee
  3067  	}
  3068  	return &fee, nil
  3069  }
  3070  
  3071  func (r *myTradeResolver) SellerAuctionBatch(_ context.Context, obj *vegapb.Trade) (*int, error) {
  3072  	i := int(obj.SellerAuctionBatch)
  3073  	return &i, nil
  3074  }
  3075  
  3076  func (r *myTradeResolver) SellerFee(_ context.Context, obj *vegapb.Trade) (*TradeFee, error) {
  3077  	fee := TradeFee{
  3078  		MakerFee:          "0",
  3079  		InfrastructureFee: "0",
  3080  		LiquidityFee:      "0",
  3081  	}
  3082  	if obj.SellerFee != nil {
  3083  		fee.MakerFee = obj.SellerFee.MakerFee
  3084  		fee.MakerFeeReferralDiscount = setIfExists(obj.SellerFee.MakerFeeReferrerDiscount)
  3085  		fee.MakerFeeVolumeDiscount = setIfExists(obj.SellerFee.MakerFeeVolumeDiscount)
  3086  		fee.InfrastructureFee = obj.SellerFee.InfrastructureFee
  3087  		fee.InfrastructureFeeReferralDiscount = setIfExists(obj.SellerFee.InfrastructureFeeReferrerDiscount)
  3088  		fee.InfrastructureFeeVolumeDiscount = setIfExists(obj.SellerFee.InfrastructureFeeVolumeDiscount)
  3089  		fee.LiquidityFee = obj.SellerFee.LiquidityFee
  3090  		fee.LiquidityFeeReferralDiscount = setIfExists(obj.SellerFee.LiquidityFeeReferrerDiscount)
  3091  		fee.LiquidityFeeVolumeDiscount = setIfExists(obj.SellerFee.LiquidityFeeVolumeDiscount)
  3092  		fee.TreasuryFee = obj.SellerFee.TreasuryFee
  3093  		fee.BuyBackFee = obj.SellerFee.BuyBackFee
  3094  		fee.HighVolumeMakerFee = obj.SellerFee.HighVolumeMakerFee
  3095  	}
  3096  
  3097  	return &fee, nil
  3098  }
  3099  
  3100  // END: Trade Resolver
  3101  
  3102  // BEGIN: Candle Resolver
  3103  
  3104  type myCandleResolver VegaResolverRoot
  3105  
  3106  func (r *myCandleResolver) PeriodStart(_ context.Context, obj *v2.Candle) (int64, error) {
  3107  	return obj.Start, nil
  3108  }
  3109  
  3110  func (r *myCandleResolver) LastUpdateInPeriod(_ context.Context, obj *v2.Candle) (int64, error) {
  3111  	return obj.LastUpdate, nil
  3112  }
  3113  
  3114  func (r *myCandleResolver) Volume(_ context.Context, obj *v2.Candle) (string, error) {
  3115  	return strconv.FormatUint(obj.Volume, 10), nil
  3116  }
  3117  
  3118  func (r *myCandleResolver) Notional(_ context.Context, obj *v2.Candle) (string, error) {
  3119  	return strconv.FormatUint(obj.Notional, 10), nil
  3120  }
  3121  
  3122  // END: Candle Resolver
  3123  
  3124  // BEGIN: DataSourceSpecConfiguration Resolver.
  3125  type myDataSourceSpecConfigurationResolver VegaResolverRoot
  3126  
  3127  func (m *myDataSourceSpecConfigurationResolver) Signers(_ context.Context, obj *vegapb.DataSourceSpecConfiguration) ([]*Signer, error) {
  3128  	return resolveSigners(obj.Signers), nil
  3129  }
  3130  
  3131  func (m *myDataSourceSpecConfigurationResolver) Filters(ctx context.Context, obj *vega.DataSourceSpecConfiguration) ([]*Filter, error) {
  3132  	if obj != nil {
  3133  		return resolveFilters(obj.Filters)
  3134  	}
  3135  
  3136  	return nil, errors.New("dataSourceSpecConfiguration object is empty")
  3137  }
  3138  
  3139  // END: DataSourceSpecConfiguration Resolver.
  3140  
  3141  // BEGIN: DataSourceSpecConfigurationTime Resolver.
  3142  type myDataSourceSpecConfigurationTimeResolver VegaResolverRoot
  3143  
  3144  func (m *myDataSourceSpecConfigurationTimeResolver) Conditions(ctx context.Context, obj *vega.DataSourceSpecConfigurationTime) ([]*Condition, error) {
  3145  	if obj != nil {
  3146  		if obj.Conditions != nil {
  3147  			return resolveConditions(obj.Conditions), nil
  3148  		}
  3149  		return nil, errors.New("conditions in internal data source time object are empty")
  3150  	}
  3151  	return nil, errors.New("internal data source time object is empty")
  3152  }
  3153  
  3154  // END: DataSourceSpecConfigurationTime Resolver.
  3155  
  3156  // BEGIN: DataSourceSpecConfigurationTimeTriggerResolver.
  3157  type myDataSourceSpecConfigurationTimeTriggerResolver VegaResolverRoot
  3158  
  3159  func (m *myDataSourceSpecConfigurationTimeTriggerResolver) Conditions(ctx context.Context, obj *vega.DataSourceSpecConfigurationTimeTrigger) ([]*Condition, error) {
  3160  	if obj != nil {
  3161  		if obj.Conditions != nil {
  3162  			return resolveConditions(obj.Conditions), nil
  3163  		}
  3164  		return nil, errors.New("conditions in internal data source time trigger object are empty")
  3165  	}
  3166  	return nil, errors.New("internal data source time trigger object is empty")
  3167  }
  3168  
  3169  // END: DataSourceSpecConfigurationTimeTriggerResolver.
  3170  
  3171  // BEGIN: EthCallSpec Resolver.
  3172  type ethCallSpecResolver VegaResolverRoot
  3173  
  3174  func (m *ethCallSpecResolver) SourceChainID(ctx context.Context, obj *vegapb.EthCallSpec) (int, error) {
  3175  	if obj != nil {
  3176  		return int(obj.SourceChainId), nil
  3177  	}
  3178  
  3179  	return 0, nil
  3180  }
  3181  
  3182  func (m *ethCallSpecResolver) Abi(ctx context.Context, obj *vegapb.EthCallSpec) ([]string, error) {
  3183  	if obj != nil {
  3184  		if len(obj.Abi) > 0 {
  3185  			return []string{obj.Abi}, nil
  3186  		}
  3187  	}
  3188  	return nil, errors.New("abi in ethereum spec object is empty")
  3189  }
  3190  
  3191  func (m *ethCallSpecResolver) Args(ctx context.Context, obj *vegapb.EthCallSpec) ([]string, error) {
  3192  	if obj != nil {
  3193  		jsonArgs := []string{}
  3194  		for _, arg := range obj.Args {
  3195  			jsonArg, err := arg.MarshalJSON()
  3196  			if err != nil {
  3197  				return nil, fmt.Errorf("unable to marshal args: %s", arg)
  3198  			}
  3199  			jsonArgs = append(jsonArgs, string(jsonArg))
  3200  		}
  3201  		return jsonArgs, nil
  3202  	}
  3203  	return nil, errors.New("ethereum spec object is empty")
  3204  }
  3205  
  3206  func (m *ethCallSpecResolver) Trigger(_ context.Context, obj *vegapb.EthCallSpec) (*EthCallTrigger, error) {
  3207  	if obj != nil {
  3208  		if obj.Trigger != nil {
  3209  			return &EthCallTrigger{
  3210  				Trigger: resolveTrigger(obj.Trigger.Trigger),
  3211  			}, nil
  3212  		}
  3213  		return nil, errors.New("trigger in ethereum spec object is empty")
  3214  	}
  3215  
  3216  	return nil, errors.New("ethereum spec object is empty")
  3217  }
  3218  
  3219  func (m *ethCallSpecResolver) RequiredConfirmations(ctx context.Context, obj *vega.EthCallSpec) (int, error) {
  3220  	if obj != nil {
  3221  		return int(obj.RequiredConfirmations), nil
  3222  	}
  3223  
  3224  	return int(0), errors.New("ethereum spec object is empty")
  3225  }
  3226  
  3227  func (m *ethCallSpecResolver) Normalisers(ctx context.Context, obj *vegapb.EthCallSpec) ([]*Normaliser, error) {
  3228  	if obj != nil {
  3229  		if obj.Normalisers != nil {
  3230  			return resolveNormalisers(obj.Normalisers), nil
  3231  		}
  3232  
  3233  		return nil, errors.New("normalisers in ethereum spec object are empty")
  3234  	}
  3235  
  3236  	return nil, errors.New("ethereum spec object is empty")
  3237  }
  3238  
  3239  func (m *ethCallSpecResolver) Filters(ctx context.Context, obj *vegapb.EthCallSpec) ([]*Filter, error) {
  3240  	if obj != nil {
  3241  		if obj.Filters != nil {
  3242  			return resolveFilters(obj.Filters)
  3243  		}
  3244  
  3245  		return nil, errors.New("filters in ethereum spec object are empty")
  3246  	}
  3247  
  3248  	return nil, errors.New("ethereum spec object is empty")
  3249  }
  3250  
  3251  // END: EthCallSpec resolver.
  3252  
  3253  // BEGIN: Price Level Resolver
  3254  
  3255  type myPriceLevelResolver VegaResolverRoot
  3256  
  3257  func (r *myPriceLevelResolver) Price(_ context.Context, obj *vegapb.PriceLevel) (string, error) {
  3258  	return obj.Price, nil
  3259  }
  3260  
  3261  func (r *myPriceLevelResolver) Volume(_ context.Context, obj *vegapb.PriceLevel) (string, error) {
  3262  	return strconv.FormatUint(obj.Volume, 10), nil
  3263  }
  3264  
  3265  func (r *myPriceLevelResolver) AmmVolume(_ context.Context, obj *vegapb.PriceLevel) (string, error) {
  3266  	return strconv.FormatUint(obj.AmmVolume, 10), nil
  3267  }
  3268  
  3269  func (r *myPriceLevelResolver) AmmVolumeEstimated(_ context.Context, obj *vegapb.PriceLevel) (string, error) {
  3270  	return strconv.FormatUint(obj.AmmVolumeEstimated, 10), nil
  3271  }
  3272  
  3273  func (r *myPriceLevelResolver) NumberOfOrders(_ context.Context, obj *vegapb.PriceLevel) (string, error) {
  3274  	return strconv.FormatUint(obj.NumberOfOrders, 10), nil
  3275  }
  3276  
  3277  // END: Price Level Resolver
  3278  
  3279  type positionUpdateResolver VegaResolverRoot
  3280  
  3281  func (r *positionUpdateResolver) OpenVolume(_ context.Context, obj *vegapb.Position) (string, error) {
  3282  	return strconv.FormatInt(obj.OpenVolume, 10), nil
  3283  }
  3284  
  3285  func (r *positionUpdateResolver) UpdatedAt(_ context.Context, obj *vegapb.Position) (*string, error) {
  3286  	var updatedAt *string
  3287  	if obj.UpdatedAt > 0 {
  3288  		t := vegatime.Format(vegatime.UnixNano(obj.UpdatedAt))
  3289  		updatedAt = &t
  3290  	}
  3291  	return updatedAt, nil
  3292  }
  3293  
  3294  func (r *positionUpdateResolver) LossSocializationAmount(_ context.Context, obj *vegapb.Position) (string, error) {
  3295  	return obj.LossSocialisationAmount, nil
  3296  }
  3297  
  3298  // BEGIN: Position Resolver
  3299  
  3300  type myPositionResolver VegaResolverRoot
  3301  
  3302  func (r *myPositionResolver) Market(ctx context.Context, obj *vegapb.Position) (*vegapb.Market, error) {
  3303  	return r.r.getMarketByID(ctx, obj.MarketId)
  3304  }
  3305  
  3306  func (r *myPositionResolver) UpdatedAt(_ context.Context, obj *vegapb.Position) (*string, error) {
  3307  	var updatedAt *string
  3308  	if obj.UpdatedAt > 0 {
  3309  		t := vegatime.Format(vegatime.UnixNano(obj.UpdatedAt))
  3310  		updatedAt = &t
  3311  	}
  3312  	return updatedAt, nil
  3313  }
  3314  
  3315  func (r *myPositionResolver) OpenVolume(_ context.Context, obj *vegapb.Position) (string, error) {
  3316  	return strconv.FormatInt(obj.OpenVolume, 10), nil
  3317  }
  3318  
  3319  func (r *myPositionResolver) RealisedPnl(_ context.Context, obj *vegapb.Position) (string, error) {
  3320  	return obj.RealisedPnl, nil
  3321  }
  3322  
  3323  func (r *myPositionResolver) UnrealisedPnl(_ context.Context, obj *vegapb.Position) (string, error) {
  3324  	return obj.UnrealisedPnl, nil
  3325  }
  3326  
  3327  func (r *myPositionResolver) AverageEntryPrice(_ context.Context, obj *vegapb.Position) (string, error) {
  3328  	return obj.AverageEntryPrice, nil
  3329  }
  3330  
  3331  func (r *myPositionResolver) LossSocializationAmount(_ context.Context, obj *vegapb.Position) (string, error) {
  3332  	return obj.LossSocialisationAmount, nil
  3333  }
  3334  
  3335  func (r *myPositionResolver) Party(ctx context.Context, obj *vegapb.Position) (*vegapb.Party, error) {
  3336  	return getParty(ctx, r.log, r.tradingDataClientV2, obj.PartyId)
  3337  }
  3338  
  3339  func (r *myPositionResolver) MarginsConnection(ctx context.Context, pos *vegapb.Position, pagination *v2.Pagination) (*v2.MarginConnection, error) {
  3340  	req := v2.ListMarginLevelsRequest{
  3341  		PartyId:    pos.PartyId,
  3342  		MarketId:   pos.MarketId,
  3343  		Pagination: pagination,
  3344  	}
  3345  
  3346  	res, err := r.tradingDataClientV2.ListMarginLevels(ctx, &req)
  3347  	if err != nil {
  3348  		r.log.Error("tradingData client", logging.Error(err))
  3349  		return nil, err
  3350  	}
  3351  
  3352  	return res.MarginLevels, nil
  3353  }
  3354  
  3355  // END: Position Resolver
  3356  
  3357  // BEGIN: Subscription Resolver
  3358  
  3359  type mySubscriptionResolver VegaResolverRoot
  3360  
  3361  func (r *mySubscriptionResolver) Margins(ctx context.Context, partyID string, marketID *string) (<-chan *vegapb.MarginLevels, error) {
  3362  	req := &v2.ObserveMarginLevelsRequest{
  3363  		MarketId: marketID,
  3364  		PartyId:  partyID,
  3365  	}
  3366  	stream, err := r.tradingDataClientV2.ObserveMarginLevels(ctx, req)
  3367  	if err != nil {
  3368  		return nil, err
  3369  	}
  3370  
  3371  	sCtx := stream.Context()
  3372  	ch := make(chan *vegapb.MarginLevels)
  3373  	go func() {
  3374  		defer func() {
  3375  			if err := stream.CloseSend(); err != nil {
  3376  				r.log.Error("margin levels: stream closed", logging.Error(err))
  3377  			}
  3378  			close(ch)
  3379  		}()
  3380  		for {
  3381  			m, err := stream.Recv()
  3382  			if err == io.EOF {
  3383  				r.log.Error("margin levels: stream closed by server", logging.Error(err))
  3384  				break
  3385  			}
  3386  			if err != nil {
  3387  				r.log.Error("margin levls: stream closed", logging.Error(err))
  3388  				break
  3389  			}
  3390  			select {
  3391  			case ch <- m.MarginLevels:
  3392  				r.log.Debug("margin levels: data sent")
  3393  			case <-ctx.Done():
  3394  				r.log.Error("margin levels: stream closed")
  3395  				break
  3396  			case <-sCtx.Done():
  3397  				r.log.Error("margin levels: stream closed by server")
  3398  				break
  3399  			}
  3400  		}
  3401  	}()
  3402  
  3403  	return ch, nil
  3404  }
  3405  
  3406  func (r *mySubscriptionResolver) Accounts(ctx context.Context, marketID *string, partyID *string, asset *string, typeArg *vegapb.AccountType, includeDerivedParties *bool) (<-chan []*v2.AccountBalance, error) {
  3407  	var (
  3408  		mkt, pty, ast string
  3409  		ty            vegapb.AccountType
  3410  	)
  3411  
  3412  	if marketID == nil && partyID == nil && asset == nil && typeArg == nil {
  3413  		// Updates on every balance update, on every account, for everyone and shouldn't be allowed for GraphQL.
  3414  		return nil, errors.New("at least one query filter must be applied for this subscription")
  3415  	}
  3416  	if asset != nil {
  3417  		ast = *asset
  3418  	}
  3419  	if marketID != nil {
  3420  		mkt = *marketID
  3421  	}
  3422  	if partyID != nil {
  3423  		pty = *partyID
  3424  	}
  3425  	if typeArg != nil {
  3426  		ty = *typeArg
  3427  	}
  3428  
  3429  	req := &v2.ObserveAccountsRequest{
  3430  		Asset:                 ast,
  3431  		MarketId:              mkt,
  3432  		PartyId:               pty,
  3433  		Type:                  ty,
  3434  		IncludeDerivedParties: includeDerivedParties,
  3435  	}
  3436  	stream, err := r.tradingDataClientV2.ObserveAccounts(ctx, req)
  3437  	if err != nil {
  3438  		return nil, err
  3439  	}
  3440  
  3441  	c := make(chan []*v2.AccountBalance)
  3442  	var accounts []*v2.AccountBalance
  3443  	sCtx := stream.Context()
  3444  	go func() {
  3445  		defer func() {
  3446  			if err := stream.CloseSend(); err != nil {
  3447  				r.log.Error("accounts: stream closed", logging.Error(err))
  3448  			}
  3449  			close(c)
  3450  		}()
  3451  		for {
  3452  			a, err := stream.Recv()
  3453  			if err == io.EOF {
  3454  				r.log.Error("accounts: stream closed by server", logging.Error(err))
  3455  				break
  3456  			}
  3457  			if err != nil {
  3458  				r.log.Error("accounts: stream closed", logging.Error(err))
  3459  				break
  3460  			}
  3461  
  3462  			// empty slice, but preserve cap to avoid excessive reallocation
  3463  			accounts = accounts[:0]
  3464  			if snapshot := a.GetSnapshot(); snapshot != nil {
  3465  				accounts = append(accounts, snapshot.Accounts...)
  3466  			}
  3467  
  3468  			if updates := a.GetUpdates(); updates != nil {
  3469  				accounts = append(accounts, updates.Accounts...)
  3470  			}
  3471  			select {
  3472  			case c <- accounts:
  3473  				r.log.Debug("accounts: data sent")
  3474  			case <-ctx.Done():
  3475  				r.log.Error("accounts: stream closed")
  3476  				break
  3477  			case <-sCtx.Done():
  3478  				r.log.Error("accounts: stream closed by server")
  3479  				break
  3480  			}
  3481  		}
  3482  	}()
  3483  
  3484  	return c, nil
  3485  }
  3486  
  3487  func (r *mySubscriptionResolver) Orders(ctx context.Context, filter *OrderByMarketAndPartyIdsFilter) (<-chan []*vegapb.Order, error) {
  3488  	req := &v2.ObserveOrdersRequest{}
  3489  	if filter != nil {
  3490  		req.MarketIds = filter.MarketIds
  3491  		req.PartyIds = filter.PartyIds
  3492  	}
  3493  
  3494  	stream, err := r.tradingDataClientV2.ObserveOrders(ctx, req)
  3495  	if err != nil {
  3496  		return nil, err
  3497  	}
  3498  
  3499  	c := make(chan []*vegapb.Order)
  3500  	sCtx := stream.Context()
  3501  	go func() {
  3502  		defer func() {
  3503  			if err := stream.CloseSend(); err != nil {
  3504  				r.log.Error("orders: stream closed", logging.Error(err))
  3505  			}
  3506  			close(c)
  3507  		}()
  3508  		for {
  3509  			o, err := stream.Recv()
  3510  			if err == io.EOF {
  3511  				r.log.Error("orders: stream closed by server", logging.Error(err))
  3512  				break
  3513  			}
  3514  			if err != nil {
  3515  				r.log.Error("orders: stream closed", logging.Error(err))
  3516  				break
  3517  			}
  3518  			orders := []*vegapb.Order{}
  3519  			if snapshot := o.GetSnapshot(); snapshot != nil {
  3520  				orders = append(orders, snapshot.Orders...)
  3521  			}
  3522  			if updates := o.GetUpdates(); updates != nil {
  3523  				orders = append(orders, updates.Orders...)
  3524  			}
  3525  			select {
  3526  			case c <- orders:
  3527  				r.log.Debug("orders: data sent")
  3528  			case <-ctx.Done():
  3529  				r.log.Error("orders: stream closed")
  3530  				return
  3531  			case <-sCtx.Done():
  3532  				r.log.Error("orders: stream closed by server")
  3533  				return
  3534  			}
  3535  		}
  3536  	}()
  3537  
  3538  	return c, nil
  3539  }
  3540  
  3541  func (r *mySubscriptionResolver) Trades(ctx context.Context, market *string, party *string) (<-chan []*vegapb.Trade, error) {
  3542  	markets := []string{}
  3543  	parties := []string{}
  3544  	if market != nil {
  3545  		markets = append(markets, *market)
  3546  	}
  3547  
  3548  	if party != nil {
  3549  		parties = append(parties, *party)
  3550  	}
  3551  
  3552  	req := &v2.ObserveTradesRequest{
  3553  		MarketIds: markets,
  3554  		PartyIds:  parties,
  3555  	}
  3556  
  3557  	stream, err := r.tradingDataClientV2.ObserveTrades(ctx, req)
  3558  	if err != nil {
  3559  		return nil, err
  3560  	}
  3561  
  3562  	c := make(chan []*vegapb.Trade)
  3563  	sCtx := stream.Context()
  3564  	go func() {
  3565  		defer func() {
  3566  			if err := stream.CloseSend(); err != nil {
  3567  				r.log.Error("trades: stream closed", logging.Error(err))
  3568  			}
  3569  			close(c)
  3570  		}()
  3571  		for {
  3572  			t, err := stream.Recv()
  3573  			if err == io.EOF {
  3574  				r.log.Error("trades: stream closed by server", logging.Error(err))
  3575  				break
  3576  			}
  3577  			if err != nil {
  3578  				r.log.Error("trades: stream closed", logging.Error(err))
  3579  				break
  3580  			}
  3581  			select {
  3582  			case c <- t.Trades:
  3583  				r.log.Debug("trades: data sent")
  3584  			case <-ctx.Done():
  3585  				r.log.Error("trades: stream closed")
  3586  				break
  3587  			case <-sCtx.Done():
  3588  				r.log.Error("trades: stream closed by server")
  3589  				break
  3590  			}
  3591  		}
  3592  	}()
  3593  
  3594  	return c, nil
  3595  }
  3596  
  3597  func (r *mySubscriptionResolver) TradesStream(ctx context.Context, filter TradesSubscriptionFilter) (<-chan []*vegapb.Trade, error) {
  3598  	req := &v2.ObserveTradesRequest{
  3599  		MarketIds: filter.MarketIds,
  3600  		PartyIds:  filter.PartyIds,
  3601  	}
  3602  	stream, err := r.tradingDataClientV2.ObserveTrades(ctx, req)
  3603  	if err != nil {
  3604  		return nil, err
  3605  	}
  3606  
  3607  	c := make(chan []*vegapb.Trade)
  3608  	sCtx := stream.Context()
  3609  	go func() {
  3610  		defer func() {
  3611  			if err := stream.CloseSend(); err != nil {
  3612  				r.log.Error("trades: stream closed", logging.Error(err))
  3613  			}
  3614  			close(c)
  3615  		}()
  3616  		for {
  3617  			t, err := stream.Recv()
  3618  			if err == io.EOF {
  3619  				r.log.Error("trades: stream closed by server", logging.Error(err))
  3620  				break
  3621  			}
  3622  			if err != nil {
  3623  				r.log.Error("trades: stream closed", logging.Error(err))
  3624  				break
  3625  			}
  3626  			select {
  3627  			case c <- t.Trades:
  3628  				r.log.Debug("trades: data sent")
  3629  			case <-ctx.Done():
  3630  				r.log.Error("trades: stream closed")
  3631  				break
  3632  			case <-sCtx.Done():
  3633  				r.log.Error("trades: stream closed by server")
  3634  				break
  3635  			}
  3636  		}
  3637  	}()
  3638  
  3639  	return c, nil
  3640  }
  3641  
  3642  func (r *mySubscriptionResolver) Positions(ctx context.Context, party, market *string, includeDerivedParties *bool) (<-chan []*vegapb.Position, error) {
  3643  	req := &v2.ObservePositionsRequest{
  3644  		PartyId:               party,
  3645  		MarketId:              market,
  3646  		IncludeDerivedParties: includeDerivedParties,
  3647  	}
  3648  	stream, err := r.tradingDataClientV2.ObservePositions(ctx, req)
  3649  	if err != nil {
  3650  		return nil, err
  3651  	}
  3652  
  3653  	c := make(chan []*vegapb.Position)
  3654  	var positions []*vegapb.Position
  3655  	sCtx := stream.Context()
  3656  	go func() {
  3657  		defer func() {
  3658  			if err := stream.CloseSend(); err != nil {
  3659  				r.log.Error("positions: stream closed", logging.Error(err))
  3660  			}
  3661  			close(c)
  3662  		}()
  3663  		for {
  3664  			t, err := stream.Recv()
  3665  			if err == io.EOF {
  3666  				r.log.Error("positions: stream closed by server", logging.Error(err))
  3667  				break
  3668  			}
  3669  			if err != nil {
  3670  				r.log.Error("positions: stream closed", logging.Error(err))
  3671  				break
  3672  			}
  3673  			positions = positions[:0]
  3674  			if snapshot := t.GetSnapshot(); snapshot != nil {
  3675  				positions = append(positions, snapshot.Positions...)
  3676  			}
  3677  
  3678  			if updates := t.GetUpdates(); updates != nil {
  3679  				positions = append(positions, updates.Positions...)
  3680  			}
  3681  			select {
  3682  			case c <- positions:
  3683  				r.log.Debug("positions: data sent")
  3684  			case <-ctx.Done():
  3685  				r.log.Error("positions: stream closed")
  3686  				break
  3687  			case <-sCtx.Done():
  3688  				r.log.Error("positions: stream closed by server")
  3689  				break
  3690  			}
  3691  		}
  3692  	}()
  3693  
  3694  	return c, nil
  3695  }
  3696  
  3697  func (r *mySubscriptionResolver) Candles(ctx context.Context, market string, interval vega.Interval) (<-chan *v2.Candle, error) {
  3698  	intervalToCandleIDs, err := r.tradingDataClientV2.ListCandleIntervals(ctx, &v2.ListCandleIntervalsRequest{
  3699  		MarketId: market,
  3700  	})
  3701  	if err != nil {
  3702  		return nil, err
  3703  	}
  3704  
  3705  	candleID := ""
  3706  	var candleInterval vegapb.Interval
  3707  	for _, ic := range intervalToCandleIDs.IntervalToCandleId {
  3708  		candleInterval, err = convertDataNodeIntervalToProto(ic.Interval)
  3709  		if err != nil {
  3710  			r.log.Errorf("convert interval to candle id failed: %v", err)
  3711  			continue
  3712  		}
  3713  		if candleInterval == interval {
  3714  			candleID = ic.CandleId
  3715  			break
  3716  		}
  3717  	}
  3718  
  3719  	if candleID == "" {
  3720  		return nil, fmt.Errorf("candle information not found for market: %s, interval: %s", market, interval)
  3721  	}
  3722  
  3723  	req := &v2.ObserveCandleDataRequest{
  3724  		CandleId: candleID,
  3725  	}
  3726  	stream, err := r.tradingDataClientV2.ObserveCandleData(ctx, req)
  3727  	if err != nil {
  3728  		return nil, err
  3729  	}
  3730  
  3731  	sCtx := stream.Context()
  3732  	c := make(chan *v2.Candle)
  3733  	go func() {
  3734  		defer func() {
  3735  			if err := stream.CloseSend(); err != nil {
  3736  				r.log.Error("candles: stream closed", logging.Error(err))
  3737  			}
  3738  			close(c)
  3739  		}()
  3740  		for {
  3741  			cdl, err := stream.Recv()
  3742  			if err == io.EOF {
  3743  				r.log.Error("candles: stream closed by server", logging.Error(err))
  3744  				break
  3745  			}
  3746  			if err != nil {
  3747  				r.log.Error("candles: stream closed", logging.Error(err))
  3748  				break
  3749  			}
  3750  
  3751  			select {
  3752  			case c <- cdl.Candle:
  3753  				r.log.Debug("candles: data sent")
  3754  			case <-ctx.Done():
  3755  				r.log.Error("candles: stream closed")
  3756  				break
  3757  			case <-sCtx.Done():
  3758  				r.log.Error("candles: stream closed by server")
  3759  				break
  3760  			}
  3761  		}
  3762  	}()
  3763  	return c, nil
  3764  }
  3765  
  3766  func isStreamClosed(err error, log *logging.Logger) bool {
  3767  	if err == io.EOF {
  3768  		log.Error("stream closed by server", logging.Error(err))
  3769  		return true
  3770  	}
  3771  	if err != nil {
  3772  		log.Error("stream closed", logging.Error(err))
  3773  		return true
  3774  	}
  3775  	return false
  3776  }
  3777  
  3778  func (r *mySubscriptionResolver) subscribeAllProposals(ctx context.Context) (<-chan *vegapb.GovernanceData, error) {
  3779  	stream, err := r.tradingDataClientV2.ObserveGovernance(ctx, &v2.ObserveGovernanceRequest{})
  3780  	if err != nil {
  3781  		return nil, err
  3782  	}
  3783  	output := make(chan *vegapb.GovernanceData)
  3784  	sCtx := stream.Context()
  3785  	go func() {
  3786  		defer func() {
  3787  			if err := stream.CloseSend(); err != nil {
  3788  				r.log.Error("governance (all): failed to close stream", logging.Error(err))
  3789  			}
  3790  			close(output)
  3791  		}()
  3792  		for proposals, err := stream.Recv(); !isStreamClosed(err, r.log); proposals, err = stream.Recv() {
  3793  			select {
  3794  			case output <- proposals.Data:
  3795  				r.log.Debug("governance (all): data sent")
  3796  			case <-ctx.Done():
  3797  				r.log.Error("governance (all): stream closed")
  3798  				break
  3799  			case <-sCtx.Done():
  3800  				r.log.Error("governance (all): stream closed by server")
  3801  				break
  3802  			}
  3803  		}
  3804  	}()
  3805  	return output, nil
  3806  }
  3807  
  3808  func (r *mySubscriptionResolver) subscribePartyProposals(ctx context.Context, partyID string) (<-chan *vegapb.GovernanceData, error) {
  3809  	stream, err := r.tradingDataClientV2.ObserveGovernance(ctx, &v2.ObserveGovernanceRequest{
  3810  		PartyId: &partyID,
  3811  	})
  3812  	if err != nil {
  3813  		return nil, err
  3814  	}
  3815  	sCtx := stream.Context()
  3816  	output := make(chan *vegapb.GovernanceData)
  3817  	go func() {
  3818  		defer func() {
  3819  			if err := stream.CloseSend(); err != nil {
  3820  				r.log.Error("governance (party): stream close failed", logging.Error(err))
  3821  			}
  3822  			close(output)
  3823  		}()
  3824  		for proposals, err := stream.Recv(); !isStreamClosed(err, r.log); proposals, err = stream.Recv() {
  3825  			select {
  3826  			case output <- proposals.Data:
  3827  				r.log.Debug("governance (party): data sent")
  3828  			case <-ctx.Done():
  3829  				r.log.Error("governance (party): stream closed")
  3830  				break
  3831  			case <-sCtx.Done():
  3832  				r.log.Error("governance (party): stream closed by server")
  3833  				break
  3834  			}
  3835  		}
  3836  	}()
  3837  	return output, nil
  3838  }
  3839  
  3840  func (r *mySubscriptionResolver) Proposals(ctx context.Context, partyID *string) (<-chan *vegapb.GovernanceData, error) {
  3841  	if partyID != nil && len(*partyID) > 0 {
  3842  		return r.subscribePartyProposals(ctx, *partyID)
  3843  	}
  3844  	return r.subscribeAllProposals(ctx)
  3845  }
  3846  
  3847  func (r *mySubscriptionResolver) subscribeProposalVotes(ctx context.Context, proposalID string) (<-chan *ProposalVote, error) {
  3848  	output := make(chan *ProposalVote)
  3849  	stream, err := r.tradingDataClientV2.ObserveVotes(ctx, &v2.ObserveVotesRequest{
  3850  		ProposalId: &proposalID,
  3851  	})
  3852  	if err != nil {
  3853  		return nil, err
  3854  	}
  3855  	sCtx := stream.Context()
  3856  	go func() {
  3857  		defer func() {
  3858  			if err := stream.CloseSend(); err != nil {
  3859  				r.log.Error("votes (proposal): stream close failed", logging.Error(err))
  3860  			}
  3861  			close(output)
  3862  		}()
  3863  		for {
  3864  			votes, err := stream.Recv()
  3865  			if isStreamClosed(err, r.log) {
  3866  				break
  3867  			}
  3868  			select {
  3869  			case output <- ProposalVoteFromProto(votes.Vote):
  3870  				r.log.Debug("votes (proposal): data sent")
  3871  			case <-ctx.Done():
  3872  				r.log.Error("votes (proposal): stream closed")
  3873  				break
  3874  			case <-sCtx.Done():
  3875  				r.log.Error("votes (proposal): stream closed by server")
  3876  				break
  3877  			}
  3878  		}
  3879  	}()
  3880  	return output, nil
  3881  }
  3882  
  3883  func (r *mySubscriptionResolver) subscribePartyVotes(ctx context.Context, partyID string) (<-chan *ProposalVote, error) {
  3884  	output := make(chan *ProposalVote)
  3885  	stream, err := r.tradingDataClientV2.ObserveVotes(ctx, &v2.ObserveVotesRequest{
  3886  		PartyId: &partyID,
  3887  	})
  3888  	if err != nil {
  3889  		return nil, err
  3890  	}
  3891  	sCtx := stream.Context()
  3892  	go func() {
  3893  		defer func() {
  3894  			if err := stream.CloseSend(); err != nil {
  3895  				r.log.Error("votes (party): failed to close stream", logging.Error(err))
  3896  			}
  3897  			close(output)
  3898  		}()
  3899  		for {
  3900  			votes, err := stream.Recv()
  3901  			if isStreamClosed(err, r.log) {
  3902  				break
  3903  			}
  3904  			select {
  3905  			case output <- ProposalVoteFromProto(votes.Vote):
  3906  				r.log.Debug("votes (party): data sent")
  3907  			case <-ctx.Done():
  3908  				r.log.Error("votes (party): stream closed")
  3909  				break
  3910  			case <-sCtx.Done():
  3911  				r.log.Error("votes (party): stream closed by server")
  3912  				break
  3913  			}
  3914  		}
  3915  	}()
  3916  	return output, nil
  3917  }
  3918  
  3919  func (r *mySubscriptionResolver) Votes(ctx context.Context, proposalID *string, partyID *string) (<-chan *ProposalVote, error) {
  3920  	if proposalID != nil && len(*proposalID) != 0 {
  3921  		return r.subscribeProposalVotes(ctx, *proposalID)
  3922  	} else if partyID != nil && len(*partyID) != 0 {
  3923  		return r.subscribePartyVotes(ctx, *partyID)
  3924  	}
  3925  	return nil, ErrInvalidVotesSubscription
  3926  }
  3927  
  3928  func (r *mySubscriptionResolver) BusEvents(ctx context.Context, types []BusEventType, marketID, partyID *string, batchSize int) (<-chan []*BusEvent, error) {
  3929  	if len(types) > 1 {
  3930  		return nil, errors.New("busEvents subscription support streaming 1 event at a time for now")
  3931  	}
  3932  	if len(types) <= 0 {
  3933  		return nil, errors.New("busEvents subscription requires 1 event type")
  3934  	}
  3935  	t := eventTypeToProto(types...)
  3936  	req := v2.ObserveEventBusRequest{
  3937  		Type:      t,
  3938  		BatchSize: int64(batchSize),
  3939  	}
  3940  	if req.BatchSize == 0 {
  3941  		// req.BatchSize = -1 // sending this with -1 to indicate to underlying gRPC call this is a special case: GQL
  3942  		batchSize = 0
  3943  	}
  3944  	if marketID != nil {
  3945  		req.MarketId = *marketID
  3946  	}
  3947  	if partyID != nil {
  3948  		req.PartyId = *partyID
  3949  	}
  3950  	mb := 10
  3951  	// about 10MB message size allowed
  3952  	msgSize := grpc.MaxCallRecvMsgSize(mb * 10e6)
  3953  
  3954  	// build the bidirectional stream connection
  3955  	stream, err := r.tradingDataClientV2.ObserveEventBus(ctx, msgSize)
  3956  	if err != nil {
  3957  		return nil, err
  3958  	}
  3959  
  3960  	// send our initial message to initialize the connection
  3961  	if err := stream.Send(&req); err != nil {
  3962  		return nil, err
  3963  	}
  3964  
  3965  	// we no longer buffer this channel. Client receives batch, then we request the next batch
  3966  	out := make(chan []*BusEvent)
  3967  
  3968  	go func() {
  3969  		defer func() {
  3970  			if err := stream.CloseSend(); err != nil {
  3971  				r.log.Error("Event bus stream close error", logging.Error(err))
  3972  			}
  3973  			close(out)
  3974  		}()
  3975  
  3976  		if batchSize == 0 {
  3977  			r.busEvents(ctx, stream, out)
  3978  		} else {
  3979  			r.busEventsWithBatch(ctx, int64(batchSize), stream, out)
  3980  		}
  3981  	}()
  3982  
  3983  	return out, nil
  3984  }
  3985  
  3986  func (r *mySubscriptionResolver) busEvents(ctx context.Context, stream v2.TradingDataService_ObserveEventBusClient, out chan []*BusEvent) {
  3987  	sCtx := stream.Context()
  3988  	for {
  3989  		// receive batch
  3990  		batch, err := stream.Recv()
  3991  		if isStreamClosed(err, r.log) {
  3992  			return
  3993  		}
  3994  		if err != nil {
  3995  			r.log.Error("Event bus stream error", logging.Error(err))
  3996  			return
  3997  		}
  3998  		select {
  3999  		case out <- busEventFromProto(batch.Events...):
  4000  			r.log.Debug("bus events: data sent")
  4001  		case <-ctx.Done():
  4002  			r.log.Debug("bus events: stream closed")
  4003  			return
  4004  		case <-sCtx.Done():
  4005  			r.log.Debug("bus events: stream closed by server")
  4006  			return
  4007  		}
  4008  	}
  4009  }
  4010  
  4011  func (r *mySubscriptionResolver) busEventsWithBatch(ctx context.Context, batchSize int64, stream v2.TradingDataService_ObserveEventBusClient, out chan []*BusEvent) {
  4012  	sCtx := stream.Context()
  4013  	poll := &v2.ObserveEventBusRequest{
  4014  		BatchSize: batchSize,
  4015  	}
  4016  	for {
  4017  		// receive batch
  4018  		batch, err := stream.Recv()
  4019  		if isStreamClosed(err, r.log) {
  4020  			return
  4021  		}
  4022  		if err != nil {
  4023  			r.log.Error("Event bus stream error", logging.Error(err))
  4024  			return
  4025  		}
  4026  		select {
  4027  		case out <- busEventFromProto(batch.Events...):
  4028  			r.log.Debug("bus events: data sent")
  4029  		case <-ctx.Done():
  4030  			r.log.Debug("bus events: stream closed")
  4031  			return
  4032  		case <-sCtx.Done():
  4033  			r.log.Debug("bus events: stream closed by server")
  4034  			return
  4035  		}
  4036  		// send request for the next batch
  4037  		if err := stream.SendMsg(poll); err != nil {
  4038  			r.log.Error("Failed to poll next event batch", logging.Error(err))
  4039  			return
  4040  		}
  4041  	}
  4042  }
  4043  
  4044  func (r *mySubscriptionResolver) LiquidityProvisions(ctx context.Context, partyID *string, marketID *string) (<-chan []*vegapb.LiquidityProvision, error) {
  4045  	req := &v2.ObserveLiquidityProvisionsRequest{
  4046  		MarketId: marketID,
  4047  		PartyId:  partyID,
  4048  	}
  4049  	stream, err := r.tradingDataClientV2.ObserveLiquidityProvisions(ctx, req)
  4050  	if err != nil {
  4051  		return nil, err
  4052  	}
  4053  
  4054  	c := make(chan []*vegapb.LiquidityProvision)
  4055  	sCtx := stream.Context()
  4056  	go func() {
  4057  		defer func() {
  4058  			if err := stream.CloseSend(); err != nil {
  4059  				r.log.Error("liquidity provisions: failed to close stream", logging.Error(err))
  4060  			}
  4061  			close(c)
  4062  		}()
  4063  		for {
  4064  			received, err := stream.Recv()
  4065  			if err == io.EOF {
  4066  				r.log.Error("orders: stream closed by server", logging.Error(err))
  4067  				break
  4068  			}
  4069  			if err != nil {
  4070  				r.log.Error("orders: stream closed", logging.Error(err))
  4071  				break
  4072  			}
  4073  			lps := received.LiquidityProvisions
  4074  			if len(lps) == 0 {
  4075  				continue
  4076  			}
  4077  			select {
  4078  			case c <- lps:
  4079  				r.log.Debug("liquidity provisions: data sent")
  4080  			case <-sCtx.Done():
  4081  				r.log.Debug("liquidity provisions: stream closed by server")
  4082  				break
  4083  			case <-ctx.Done():
  4084  				r.log.Debug("liquidity provisions: stream closed")
  4085  				break
  4086  			}
  4087  		}
  4088  	}()
  4089  
  4090  	return c, nil
  4091  }
  4092  
  4093  type myAccountDetailsResolver VegaResolverRoot
  4094  
  4095  func (r *myAccountDetailsResolver) PartyID(ctx context.Context, acc *vegapb.AccountDetails) (*string, error) {
  4096  	if acc.Owner != nil {
  4097  		return acc.Owner, nil
  4098  	}
  4099  	return nil, nil
  4100  }
  4101  
  4102  // START: Account Resolver
  4103  
  4104  type myAccountResolver VegaResolverRoot
  4105  
  4106  func (r *myAccountResolver) Balance(ctx context.Context, acc *v2.AccountBalance) (string, error) {
  4107  	return acc.Balance, nil
  4108  }
  4109  
  4110  func (r *myAccountResolver) Market(ctx context.Context, acc *v2.AccountBalance) (*vegapb.Market, error) {
  4111  	if acc.MarketId == "" {
  4112  		return nil, nil
  4113  	}
  4114  	return r.r.getMarketByID(ctx, acc.MarketId)
  4115  }
  4116  
  4117  func (r *myAccountResolver) Party(ctx context.Context, acc *v2.AccountBalance) (*vegapb.Party, error) {
  4118  	if acc.Owner == "" {
  4119  		return nil, nil
  4120  	}
  4121  	return getParty(ctx, r.log, r.r.clt2, acc.Owner)
  4122  }
  4123  
  4124  func (r *myAccountResolver) ParentPartyID(ctx context.Context, acc *v2.AccountBalance) (*vegapb.Party, error) {
  4125  	if acc.ParentPartyId == nil || *acc.ParentPartyId == "" {
  4126  		return nil, nil
  4127  	}
  4128  	return getParty(ctx, r.log, r.r.clt2, *acc.ParentPartyId)
  4129  }
  4130  
  4131  func (r *myAccountResolver) Asset(ctx context.Context, obj *v2.AccountBalance) (*vegapb.Asset, error) {
  4132  	return r.r.getAssetByID(ctx, obj.Asset)
  4133  }
  4134  
  4135  // START: Account Resolver
  4136  
  4137  type myAccountEventResolver VegaResolverRoot
  4138  
  4139  func (r *myAccountEventResolver) Balance(ctx context.Context, acc *vega.Account) (string, error) {
  4140  	return acc.Balance, nil
  4141  }
  4142  
  4143  func (r *myAccountEventResolver) Market(ctx context.Context, acc *vega.Account) (*vegapb.Market, error) {
  4144  	if acc.MarketId == "" {
  4145  		return nil, nil
  4146  	}
  4147  	return r.r.getMarketByID(ctx, acc.MarketId)
  4148  }
  4149  
  4150  func (r *myAccountEventResolver) Party(ctx context.Context, acc *vega.Account) (*vegapb.Party, error) {
  4151  	if acc.Owner == "" {
  4152  		return nil, nil
  4153  	}
  4154  	return getParty(ctx, r.log, r.r.clt2, acc.Owner)
  4155  }
  4156  
  4157  func (r *myAccountEventResolver) Asset(ctx context.Context, obj *vega.Account) (*vegapb.Asset, error) {
  4158  	return r.r.getAssetByID(ctx, obj.Asset)
  4159  }
  4160  
  4161  // END: Account Resolver
  4162  
  4163  func getParty(ctx context.Context, _ *logging.Logger, client TradingDataServiceClientV2, id string) (*vegapb.Party, error) {
  4164  	if len(id) == 0 {
  4165  		return nil, nil
  4166  	}
  4167  	res, err := client.GetParty(ctx, &v2.GetPartyRequest{PartyId: id})
  4168  	if err != nil {
  4169  		return nil, err
  4170  	}
  4171  	return res.Party, nil
  4172  }
  4173  
  4174  func (r *myQueryResolver) GetMarketDataHistoryConnectionByID(ctx context.Context, marketID string, start, end *int64, pagination *v2.Pagination) (*v2.MarketDataConnection, error) {
  4175  	req := v2.GetMarketDataHistoryByIDRequest{
  4176  		MarketId:       marketID,
  4177  		StartTimestamp: start,
  4178  		EndTimestamp:   end,
  4179  		Pagination:     pagination,
  4180  	}
  4181  
  4182  	resp, err := r.tradingDataClientV2.GetMarketDataHistoryByID(ctx, &req)
  4183  	if err != nil {
  4184  		r.log.Error("tradingData client", logging.Error(err))
  4185  		return nil, err
  4186  	}
  4187  
  4188  	return resp.GetMarketData(), nil
  4189  }
  4190  
  4191  func (r *myQueryResolver) MarketsConnection(ctx context.Context, id *string, pagination *v2.Pagination, includeSettled *bool) (*v2.MarketConnection, error) {
  4192  	var marketID string
  4193  
  4194  	if id != nil {
  4195  		marketID = *id
  4196  
  4197  		resp, err := r.tradingDataClientV2.GetMarket(ctx, &v2.GetMarketRequest{MarketId: marketID})
  4198  		if err != nil {
  4199  			return nil, err
  4200  		}
  4201  
  4202  		connection := &v2.MarketConnection{
  4203  			Edges: []*v2.MarketEdge{
  4204  				{
  4205  					Node:   resp.Market,
  4206  					Cursor: "",
  4207  				},
  4208  			},
  4209  			PageInfo: &v2.PageInfo{
  4210  				HasNextPage:     false,
  4211  				HasPreviousPage: false,
  4212  				StartCursor:     "",
  4213  				EndCursor:       "",
  4214  			},
  4215  		}
  4216  
  4217  		return connection, nil
  4218  	}
  4219  
  4220  	resp, err := r.tradingDataClientV2.ListMarkets(ctx, &v2.ListMarketsRequest{
  4221  		Pagination:     pagination,
  4222  		IncludeSettled: includeSettled,
  4223  	})
  4224  	if err != nil {
  4225  		return nil, err
  4226  	}
  4227  
  4228  	return resp.Markets, nil
  4229  }
  4230  
  4231  func (r *myQueryResolver) Entities(ctx context.Context, txHash string) (*v2.ListEntitiesResponse, error) {
  4232  	resp, err := r.tradingDataClientV2.ListEntities(ctx, &v2.ListEntitiesRequest{
  4233  		TransactionHash: txHash,
  4234  	})
  4235  	if err != nil {
  4236  		return nil, err
  4237  	}
  4238  
  4239  	return resp, nil
  4240  }
  4241  
  4242  func (r *myQueryResolver) PartiesConnection(ctx context.Context, partyID *string, pagination *v2.Pagination) (*v2.PartyConnection, error) {
  4243  	resp, err := r.tradingDataClientV2.ListParties(ctx, &v2.ListPartiesRequest{
  4244  		PartyId:    ptr.UnBox(partyID),
  4245  		Pagination: pagination,
  4246  	})
  4247  	if err != nil {
  4248  		return nil, err
  4249  	}
  4250  
  4251  	return resp.Parties, nil
  4252  }