diff --git a/content/api-reference/solana/solana-api-overview.mdx b/content/api-reference/solana/solana-api-overview.mdx index 4cbf2f123..cc1a22da4 100644 --- a/content/api-reference/solana/solana-api-overview.mdx +++ b/content/api-reference/solana/solana-api-overview.mdx @@ -12,34 +12,34 @@ slug: docs/solana/solana-api-overview | | | | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | [`getAccountInfo`](/docs/chains/solana/solana-api-endpoints/get-account-info) | [`getBalance`](/docs/chains/solana/solana-api-endpoints/get-balance) | -| [`getBlock`](/docs/chains/solana/solana-api-endpoints/get-block) | [`getBlockCommitment`](/docs/chains/solana/solana-api-endpoints/get-block-commitment) | -| [`getBlockHeight`](/docs/chains/solana/solana-api-endpoints/get-block-height) | [`getBlockProduction`](/docs/chains/solana/solana-api-endpoints/get-block-production) | -| [`getBlocks`](/docs/chains/solana/solana-api-endpoints/get-blocks) | [`getBlocksWithLimit`](/docs/chains/solana/solana-api-endpoints/get-blocks-with-limit) | -| [`getBlockTime`](/docs/chains/solana/solana-api-endpoints/get-block-time) | [`getClusterNodes`](/docs/chains/solana/solana-api-endpoints/get-cluster-nodes) | -| [`getEpochInfo`](/docs/chains/solana/solana-api-endpoints/get-epoch-info) | [`getEpochSchedule`](/docs/chains/solana/solana-api-endpoints/get-epoch-schedule) | -| [`getFeeForMessage`](/docs/chains/solana/solana-api-endpoints/get-fee-for-message) | [`getFirstAvailableBlock`](/docs/chains/solana/solana-api-endpoints/get-first-available-block) | -| [`getGenesisHash`](/docs/chains/solana/solana-api-endpoints/get-genesis-hash) | [`getHealth`](/docs/chains/solana/solana-api-endpoints/get-health) | -| [`getHighestSnapshotSlot`](/docs/chains/solana/solana-api-endpoints/get-highest-snapshot-slot) | [`getIdentity`](/docs/chains/solana/solana-api-endpoints/get-identity) | -| [`getInflationGovernor`](/docs/chains/solana/solana-api-endpoints/get-inflation-governor) | [`getInflationRate`](/docs/chains/solana/solana-api-endpoints/get-inflation-rate) | -| [`getInflationReward`](/docs/chains/solana/solana-api-endpoints/get-inflation-reward) | [`getLargestAccounts`](/docs/chains/solana/solana-api-endpoints/get-largest-accounts) | -| [`getLatestBlockhash`](/docs/chains/solana/solana-api-endpoints/get-latest-blockhash) | [`getLeaderSchedule`](/docs/chains/solana/solana-api-endpoints/get-leader-schedule) | -| [`getMaxRetransmitSlot`](/docs/chains/solana/solana-api-endpoints/get-max-retransmit-slot) | [`getMaxShredInsertSlot`](/docs/chains/solana/solana-api-endpoints/get-max-shred-insert-slot) | -| [`getMinimumBalanceForRentExemption`](/docs/chains/solana/solana-api-endpoints/get-minimum-balance-for-rent-exemption) | [`getMultipleAccounts`](/docs/chains/solana/solana-api-endpoints/get-multiple-accounts) | -| [`getPriorityFeeEstimate`](/docs/chains/solana/solana-api-endpoints/get-priority-fee-estimate) | [`getProgramAccounts`](/docs/chains/solana/solana-api-endpoints/get-program-accounts) | -| [`getRecentPerformanceSamples`](/docs/chains/solana/solana-api-endpoints/get-recent-performance-samples) | [`getRecentPrioritizationFees`](/docs/chains/solana/solana-api-endpoints/get-recent-prioritization-fees) | -| [`getSignaturesForAddress`](/docs/chains/solana/solana-api-endpoints/get-signatures-for-address) | [`getSignatureStatuses`](/docs/chains/solana/solana-api-endpoints/get-signature-statuses) | -| [`getSlot`](/docs/chains/solana/solana-api-endpoints/get-slot) | [`getSlotLeader`](/docs/chains/solana/solana-api-endpoints/get-slot-leader) | -| [`getSlotLeaders`](/docs/chains/solana/solana-api-endpoints/get-slot-leaders) | [`getStakeActivation`](/docs/chains/solana/solana-api-endpoints/get-stake-activation) | -| [`getStakeMinimumDelegation`](/docs/chains/solana/solana-api-endpoints/get-stake-minimum-delegation) | [`getSupply`](/docs/chains/solana/solana-api-endpoints/get-supply) | -| [`getTokenAccountBalance`](/docs/chains/solana/solana-api-endpoints/get-token-account-balance) | [`getTokenAccountsByDelegate`](/docs/chains/solana/solana-api-endpoints/get-token-accounts-by-delegate) | -| [`getTokenAccountsByOwner`](/docs/chains/solana/solana-api-endpoints/get-token-accounts-by-owner) | [`getTokenAccountsByOwnerAtSlot`](/docs/chains/solana/solana-api-endpoints/get-token-accounts-by-owner-at-slot) | -| [`getTokenLargestAccounts`](/docs/chains/solana/solana-api-endpoints/get-token-largest-accounts) | [`getTokenSupply`](/docs/chains/solana/solana-api-endpoints/get-token-supply) | -| [`getTransaction`](/docs/chains/solana/solana-api-endpoints/get-transaction) | [`getTransactionCount`](/docs/chains/solana/solana-api-endpoints/get-transaction-count) | -| [`getTransactionsForAddress`](/docs/chains/solana/solana-api-endpoints/get-transactions-for-address) | [`getVersion`](/docs/chains/solana/solana-api-endpoints/get-version) | -| [`getVoteAccounts`](/docs/chains/solana/solana-api-endpoints/get-vote-accounts) | [`isBlockhashValid`](/docs/chains/solana/solana-api-endpoints/is-blockhash-valid) | -| [`minimumLedgerSlot`](/docs/chains/solana/solana-api-endpoints/minimum-ledger-slot) | [`requestAirdrop`](/docs/chains/solana/solana-api-endpoints/request-airdrop) | -| [`sendTransaction`](/docs/chains/solana/solana-api-endpoints/send-transaction) | [`simulateBundle`](/docs/chains/solana/solana-api-endpoints/simulate-bundle) | -| [`simulateTransaction`](/docs/chains/solana/solana-api-endpoints/simulate-transaction) | | +| [`getBalanceByOwnerAtSlot`](/docs/chains/solana/solana-api-endpoints/get-balance-by-owner-at-slot) | [`getBlock`](/docs/chains/solana/solana-api-endpoints/get-block) | +| [`getBlockCommitment`](/docs/chains/solana/solana-api-endpoints/get-block-commitment) | [`getBlockHeight`](/docs/chains/solana/solana-api-endpoints/get-block-height) | +| [`getBlockProduction`](/docs/chains/solana/solana-api-endpoints/get-block-production) | [`getBlocks`](/docs/chains/solana/solana-api-endpoints/get-blocks) | +| [`getBlocksWithLimit`](/docs/chains/solana/solana-api-endpoints/get-blocks-with-limit) | [`getBlockTime`](/docs/chains/solana/solana-api-endpoints/get-block-time) | +| [`getClusterNodes`](/docs/chains/solana/solana-api-endpoints/get-cluster-nodes) | [`getEpochInfo`](/docs/chains/solana/solana-api-endpoints/get-epoch-info) | +| [`getEpochSchedule`](/docs/chains/solana/solana-api-endpoints/get-epoch-schedule) | [`getFeeForMessage`](/docs/chains/solana/solana-api-endpoints/get-fee-for-message) | +| [`getFirstAvailableBlock`](/docs/chains/solana/solana-api-endpoints/get-first-available-block) | [`getGenesisHash`](/docs/chains/solana/solana-api-endpoints/get-genesis-hash) | +| [`getHealth`](/docs/chains/solana/solana-api-endpoints/get-health) | [`getHighestSnapshotSlot`](/docs/chains/solana/solana-api-endpoints/get-highest-snapshot-slot) | +| [`getIdentity`](/docs/chains/solana/solana-api-endpoints/get-identity) | [`getInflationGovernor`](/docs/chains/solana/solana-api-endpoints/get-inflation-governor) | +| [`getInflationRate`](/docs/chains/solana/solana-api-endpoints/get-inflation-rate) | [`getInflationReward`](/docs/chains/solana/solana-api-endpoints/get-inflation-reward) | +| [`getLargestAccounts`](/docs/chains/solana/solana-api-endpoints/get-largest-accounts) | [`getLatestBlockhash`](/docs/chains/solana/solana-api-endpoints/get-latest-blockhash) | +| [`getLeaderSchedule`](/docs/chains/solana/solana-api-endpoints/get-leader-schedule) | [`getMaxRetransmitSlot`](/docs/chains/solana/solana-api-endpoints/get-max-retransmit-slot) | +| [`getMaxShredInsertSlot`](/docs/chains/solana/solana-api-endpoints/get-max-shred-insert-slot) | [`getMinimumBalanceForRentExemption`](/docs/chains/solana/solana-api-endpoints/get-minimum-balance-for-rent-exemption) | +| [`getMultipleAccounts`](/docs/chains/solana/solana-api-endpoints/get-multiple-accounts) | [`getPriorityFeeEstimate`](/docs/chains/solana/solana-api-endpoints/get-priority-fee-estimate) | +| [`getProgramAccounts`](/docs/chains/solana/solana-api-endpoints/get-program-accounts) | [`getRecentPerformanceSamples`](/docs/chains/solana/solana-api-endpoints/get-recent-performance-samples) | +| [`getRecentPrioritizationFees`](/docs/chains/solana/solana-api-endpoints/get-recent-prioritization-fees) | [`getSignaturesForAddress`](/docs/chains/solana/solana-api-endpoints/get-signatures-for-address) | +| [`getSignatureStatuses`](/docs/chains/solana/solana-api-endpoints/get-signature-statuses) | [`getSlot`](/docs/chains/solana/solana-api-endpoints/get-slot) | +| [`getSlotLeader`](/docs/chains/solana/solana-api-endpoints/get-slot-leader) | [`getSlotLeaders`](/docs/chains/solana/solana-api-endpoints/get-slot-leaders) | +| [`getStakeActivation`](/docs/chains/solana/solana-api-endpoints/get-stake-activation) | [`getStakeMinimumDelegation`](/docs/chains/solana/solana-api-endpoints/get-stake-minimum-delegation) | +| [`getSupply`](/docs/chains/solana/solana-api-endpoints/get-supply) | [`getTokenAccountBalance`](/docs/chains/solana/solana-api-endpoints/get-token-account-balance) | +| [`getTokenAccountsByDelegate`](/docs/chains/solana/solana-api-endpoints/get-token-accounts-by-delegate) | [`getTokenAccountsByOwner`](/docs/chains/solana/solana-api-endpoints/get-token-accounts-by-owner) | +| [`getTokenAccountsByOwnerAtSlot`](/docs/chains/solana/solana-api-endpoints/get-token-accounts-by-owner-at-slot) | [`getTokenLargestAccounts`](/docs/chains/solana/solana-api-endpoints/get-token-largest-accounts) | +| [`getTokenSupply`](/docs/chains/solana/solana-api-endpoints/get-token-supply) | [`getTransaction`](/docs/chains/solana/solana-api-endpoints/get-transaction) | +| [`getTransactionCount`](/docs/chains/solana/solana-api-endpoints/get-transaction-count) | [`getTransactionsForAddress`](/docs/chains/solana/solana-api-endpoints/get-transactions-for-address) | +| [`getVersion`](/docs/chains/solana/solana-api-endpoints/get-version) | [`getVoteAccounts`](/docs/chains/solana/solana-api-endpoints/get-vote-accounts) | +| [`isBlockhashValid`](/docs/chains/solana/solana-api-endpoints/is-blockhash-valid) | [`minimumLedgerSlot`](/docs/chains/solana/solana-api-endpoints/minimum-ledger-slot) | +| [`requestAirdrop`](/docs/chains/solana/solana-api-endpoints/request-airdrop) | [`sendTransaction`](/docs/chains/solana/solana-api-endpoints/send-transaction) | +| [`simulateBundle`](/docs/chains/solana/solana-api-endpoints/simulate-bundle) | [`simulateTransaction`](/docs/chains/solana/solana-api-endpoints/simulate-transaction) | ## Related APIs diff --git a/src/openrpc/chains/_components/solana/account.yaml b/src/openrpc/chains/_components/solana/account.yaml index d599552d5..c5a08c769 100644 --- a/src/openrpc/chains/_components/solana/account.yaml +++ b/src/openrpc/chains/_components/solana/account.yaml @@ -326,6 +326,40 @@ components: description: >- Cursor for the next page, or `null` on the last page. Send it back in `config.pageKey` to continue paging. + GetBalanceByOwnerAtSlotResult: + title: GetBalanceByOwnerAtSlot Result + type: object + description: >- + A wallet's aggregated balance of a single SPL Token or Token-2022 + mint at the requested slot. The response shape is identical for + every `scope`, so callers never need to branch. + properties: + wallet: + $ref: "./base-types.yaml#/components/schemas/Pubkey" + description: The wallet queried. + mint: + $ref: "./base-types.yaml#/components/schemas/Pubkey" + description: The token mint queried. + isNative: + type: boolean + description: "`true` for Wrapped SOL, otherwise `false`." + balance: + type: string + description: >- + Human-readable amount (`balanceRaw` scaled by `decimals`). + Returned as a string so large values survive JSON parsing + without precision loss. + balanceRaw: + type: string + description: >- + Raw token amount, as an integer string. Parse as a big + integer, not a float. + decimals: + type: integer + description: Mint decimals. + slot: + type: integer + description: The slot the balance was computed at. LargestAccountsConfig: title: LargestAccounts Configuration type: object diff --git a/src/openrpc/chains/_components/solana/methods.yaml b/src/openrpc/chains/_components/solana/methods.yaml index 0eb64389b..1f6720ed9 100644 --- a/src/openrpc/chains/_components/solana/methods.yaml +++ b/src/openrpc/chains/_components/solana/methods.yaml @@ -320,6 +320,115 @@ components: Internal error. Retry the request; if it persists, contact support. + getBalanceByOwnerAtSlot: + name: getBalanceByOwnerAtSlot + summary: >- + Returns a wallet's total balance of a single SPL Token or + Token-2022 mint as of a specific slot. + description: >- + Returns a wallet's total balance of a single SPL Token or + Token-2022 mint as of a specific slot, already summed across + every token account the wallet held of that mint. It returns a + single figure rather than the list of accounts returned by + `getTokenAccountsByOwnerAtSlot`. + + + A wallet can own more than one token account for the same mint. + The optional `scope` parameter selects which of them the result + covers: `all` (default) sums every token account the wallet held + of that mint at that slot, `ata` returns the balance of the + wallet's canonical Associated Token Account only (derived from + `(wallet, token program, mint)`, with the token program selected + from the mint so Token-2022 mints resolve correctly). When a + wallet holds exactly one token account of the mint, both scopes + return the same value. + + + Available on Solana mainnet only. The request may also be sent + as a positional array `[wallet, mint, slot, scope]`, and `owner` + is accepted as an alias for `wallet`. + x-compute-units: 40 + paramStructure: by-name + params: + - name: wallet + required: true + description: >- + Base-58 encoded pubkey of the wallet whose balance you want. + `owner` is accepted as an alias. + schema: + $ref: "./base-types.yaml#/components/schemas/Pubkey" + - name: mint + required: true + description: >- + Base-58 encoded pubkey of the token mint. SPL Token and + Token-2022 mints are both supported. + schema: + $ref: "./base-types.yaml#/components/schemas/Pubkey" + - name: slot + required: true + description: >- + The slot to reconstruct the balance at. There is no + "latest slot" default; omitting `slot` is an error. + schema: + type: integer + minimum: 0 + - name: scope + required: false + description: >- + Which of the wallet's token accounts the balance covers. + `all` (default) sums every token account the wallet held of + that mint at that slot; `ata` returns the balance of the + wallet's canonical Associated Token Account only. + Case-sensitive. + schema: + type: string + enum: + - all + - ata + default: all + examples: + - name: getBalanceByOwnerAtSlot example + params: + - name: wallet + value: "FHX9fPAUVA1MxPme28f4eeVH81QVRHDWofa2V6FUJaiR" + - name: mint + value: "poLisWXnNRwC6oBu1vHiuKQzFjGL4XDSu4g9qjz9qVk" + - name: slot + value: 225000000 + result: + name: Balance at slot + value: + wallet: "FHX9fPAUVA1MxPme28f4eeVH81QVRHDWofa2V6FUJaiR" + mint: "poLisWXnNRwC6oBu1vHiuKQzFjGL4XDSu4g9qjz9qVk" + isNative: false + balance: "38205.4" + balanceRaw: "3820540000000" + decimals: 8 + slot: 225000000 + result: + name: Balance at slot + description: >- + The wallet's total token balance for that mint at the + requested slot, with the slot the balance was computed at. + schema: + $ref: "./account.yaml#/components/schemas/GetBalanceByOwnerAtSlotResult" + errors: + - code: -32602 + message: >- + Invalid params. Common causes include a missing or malformed + `wallet` / `mint` (each must be a 32-byte base58 pubkey), a + missing or non-integer `slot`, an unknown `scope` value + (only `all` and `ata` are accepted, case-sensitive), or a + mint that is not present in the index. + - code: -32600 + message: >- + Unsupported method. Returned when the method is called + against a chain other than Solana mainnet. + - code: -32603 + message: >- + Internal error. Retry the request; if it persists, contact + support. + getLargestAccounts: name: getLargestAccounts description: Returns the 20 largest accounts, by lamport balance. diff --git a/src/openrpc/chains/solana/solana.yaml b/src/openrpc/chains/solana/solana.yaml index 72f79159f..0f9f51a7e 100644 --- a/src/openrpc/chains/solana/solana.yaml +++ b/src/openrpc/chains/solana/solana.yaml @@ -83,6 +83,8 @@ methods: - $ref: ../_components/solana/methods.yaml#/components/methods/simulateBundle - $ref: >- ../_components/solana/methods.yaml#/components/methods/getTokenAccountsByOwnerAtSlot + - $ref: >- + ../_components/solana/methods.yaml#/components/methods/getBalanceByOwnerAtSlot - $ref: ../_components/solana/methods.yaml#/components/methods/getHealth - $ref: ../_components/solana/methods.yaml#/components/methods/sendTransaction - $ref: ../_components/solana/methods.yaml#/components/methods/simulateTransaction @@ -141,6 +143,7 @@ x-bot-ignore: - getTokenAccounts - getTokenAccounts_v2 - getTokenAccountsByOwnerAtSlot + - getBalanceByOwnerAtSlot - getTransaction - alchemy_getProgramAccounts - alchemy_getTokenAccountsByDelegate