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 }