@ar.io/sdk 4.0.0-solana.9 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +721 -673
- package/lib/esm/cli/cli.js +28 -152
- package/lib/esm/cli/commands/antCommands.js +5 -66
- package/lib/esm/cli/commands/arnsPurchaseCommands.js +7 -28
- package/lib/esm/cli/commands/escrowCommands.js +23 -4
- package/lib/esm/cli/commands/gatewayWriteCommands.js +15 -8
- package/lib/esm/cli/commands/pruneCommands.js +14 -26
- package/lib/esm/cli/commands/readCommands.js +12 -1
- package/lib/esm/cli/options.js +2 -75
- package/lib/esm/cli/utils.js +96 -209
- package/lib/esm/common/ant-registry.js +12 -160
- package/lib/esm/common/ant.js +40 -1208
- package/lib/esm/common/faucet.js +17 -6
- package/lib/esm/common/index.js +0 -4
- package/lib/esm/common/io.js +13 -1441
- package/lib/esm/constants.js +0 -18
- package/lib/esm/solana/ant-readable.js +391 -54
- package/lib/esm/solana/ant-registry-readable.js +15 -0
- package/lib/esm/solana/ant-registry-writeable.js +19 -4
- package/lib/esm/solana/ant-writeable.js +43 -11
- package/lib/esm/solana/ata.js +15 -0
- package/lib/esm/solana/canonical-message.js +45 -9
- package/lib/esm/solana/clusters.js +71 -22
- package/lib/esm/solana/constants.js +21 -5
- package/lib/esm/solana/delegation-math.js +49 -0
- package/lib/esm/solana/deserialize.js +263 -727
- package/lib/esm/solana/escrow.js +145 -103
- package/lib/esm/solana/events.js +20 -199
- package/lib/esm/solana/funding-plan.js +19 -2
- package/lib/esm/solana/index.js +53 -12
- package/lib/esm/solana/instruction.js +15 -0
- package/lib/esm/solana/io-readable.js +510 -58
- package/lib/esm/solana/io-writeable.js +1179 -183
- package/lib/esm/solana/json-rpc.js +20 -4
- package/lib/esm/solana/metadata.js +15 -0
- package/lib/esm/solana/mpl-core.js +55 -5
- package/lib/esm/solana/pda.js +15 -0
- package/lib/esm/solana/predict-prescribed-observers.js +110 -0
- package/lib/esm/solana/retry.js +117 -0
- package/lib/esm/solana/rpc-circuit-breaker.js +258 -0
- package/lib/esm/solana/send.js +258 -3
- package/lib/esm/solana/spawn-ant.js +16 -2
- package/lib/esm/types/ant.js +8 -8
- package/lib/esm/types/io.js +0 -10
- package/lib/esm/utils/ant.js +0 -64
- package/lib/esm/utils/index.js +0 -3
- package/lib/esm/version.js +1 -1
- package/lib/types/cli/commands/antCommands.d.ts +6 -9
- package/lib/types/cli/commands/arnsPurchaseCommands.d.ts +27 -13
- package/lib/types/cli/commands/escrowCommands.d.ts +6 -0
- package/lib/types/cli/commands/gatewayWriteCommands.d.ts +12 -11
- package/lib/types/cli/commands/pruneCommands.d.ts +11 -11
- package/lib/types/cli/commands/readCommands.d.ts +25 -22
- package/lib/types/cli/commands/transfer.d.ts +9 -9
- package/lib/types/cli/options.d.ts +0 -57
- package/lib/types/cli/types.d.ts +6 -14
- package/lib/types/cli/utils.d.ts +34 -32
- package/lib/types/common/ant-registry.d.ts +35 -74
- package/lib/types/common/ant.d.ts +52 -570
- package/lib/types/common/faucet.d.ts +20 -8
- package/lib/types/common/index.d.ts +0 -3
- package/lib/types/common/io.d.ts +56 -288
- package/lib/types/constants.d.ts +0 -17
- package/lib/types/solana/ant-readable.d.ts +65 -6
- package/lib/types/solana/ant-registry-readable.d.ts +17 -2
- package/lib/types/solana/ant-registry-writeable.d.ts +20 -5
- package/lib/types/solana/ant-writeable.d.ts +39 -24
- package/lib/types/solana/ata.d.ts +15 -0
- package/lib/types/solana/canonical-message.d.ts +44 -5
- package/lib/types/solana/clusters.d.ts +68 -21
- package/lib/types/solana/constants.d.ts +16 -0
- package/lib/types/solana/delegation-math.d.ts +25 -0
- package/lib/types/solana/deserialize.d.ts +28 -198
- package/lib/types/solana/escrow.d.ts +128 -51
- package/lib/types/solana/events.d.ts +26 -144
- package/lib/types/solana/funding-plan.d.ts +15 -0
- package/lib/types/solana/index.d.ts +27 -3
- package/lib/types/solana/instruction.d.ts +15 -0
- package/lib/types/solana/io-readable.d.ts +185 -46
- package/lib/types/solana/io-writeable.d.ts +450 -77
- package/lib/types/solana/json-rpc.d.ts +15 -0
- package/lib/types/solana/metadata.d.ts +15 -0
- package/lib/types/solana/mpl-core.d.ts +44 -0
- package/lib/types/solana/predict-prescribed-observers.d.ts +28 -0
- package/lib/types/solana/retry.d.ts +62 -0
- package/lib/types/solana/rpc-circuit-breaker.d.ts +78 -0
- package/lib/types/solana/send.d.ts +80 -2
- package/lib/types/solana/spawn-ant.d.ts +15 -0
- package/lib/types/solana/types.d.ts +15 -0
- package/lib/types/types/ant-registry.d.ts +4 -4
- package/lib/types/types/ant.d.ts +92 -92
- package/lib/types/types/common.d.ts +18 -74
- package/lib/types/types/faucet.d.ts +2 -2
- package/lib/types/types/io.d.ts +189 -158
- package/lib/types/types/token.d.ts +0 -12
- package/lib/types/utils/ant.d.ts +1 -12
- package/lib/types/utils/index.d.ts +0 -3
- package/lib/types/version.d.ts +1 -1
- package/package.json +23 -37
- package/lib/esm/common/ant-versions.js +0 -87
- package/lib/esm/common/arweave.js +0 -21
- package/lib/esm/common/contracts/ao-process.js +0 -218
- package/lib/esm/common/hyperbeam/hb.js +0 -169
- package/lib/esm/common/marketplace.js +0 -669
- package/lib/esm/common/turbo.js +0 -215
- package/lib/esm/node/index.js +0 -20
- package/lib/esm/solana/generated/ant/events/aclEntryAddedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/aclEntryRemovedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/antMetadataUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/antReconciledEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/antTransferredEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/attributesClearedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/attributesSyncedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/controllerAddedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/controllerRemovedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/index.js +0 -16
- package/lib/esm/solana/generated/ant/events/recordMetadataPrunedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/recordMetadataRemovedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/recordMetadataUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/recordRemovedEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/recordSetEvent.js +0 -21
- package/lib/esm/solana/generated/ant/events/recordTransferredEvent.js +0 -21
- package/lib/esm/solana/generated/ant-escrow/events/escrowCancelledEvent.js +0 -21
- package/lib/esm/solana/generated/ant-escrow/events/escrowClaimedEvent.js +0 -21
- package/lib/esm/solana/generated/ant-escrow/events/escrowDepositedEvent.js +0 -21
- package/lib/esm/solana/generated/ant-escrow/events/escrowRecipientUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/ant-escrow/events/index.js +0 -5
- package/lib/esm/solana/generated/arns/events/demandFactorUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/index.js +0 -13
- package/lib/esm/solana/generated/arns/events/leaseExtendedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/namePurchasedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/nameReassignedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/nameReleasedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/nameReservedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/nameUnreservedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/nameUpgradedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/namesPrunedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/reservedNameClaimedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/returnedNamePurchasedEvent.js +0 -21
- package/lib/esm/solana/generated/arns/events/undernameIncreasedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/configUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/coreMigrationFinalizedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/index.js +0 -14
- package/lib/esm/solana/generated/core/events/primaryNameRemovedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/primaryNameRequestExpiredEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/primaryNameRequestedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/primaryNameSetEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/supplyFinalizedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/transferEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/vaultCreatedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/vaultExtendedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/vaultIncreasedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/vaultReleasedEvent.js +0 -21
- package/lib/esm/solana/generated/core/events/vaultRevokedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/allowlistToggledEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/delegateAllowlistedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/delegationClosedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/delegationDecreasedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/delegationEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/epochClosedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/epochCreatedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/epochDistributedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/epochPrescribedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/epochWeightsTalliedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/epochsToggledEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/fundingPlanAppliedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/garMigrationFinalizedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/gatewayFinalizedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/gatewayJoinedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/gatewayLeavingEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/gatewayPrunedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/gatewaySettingsUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/index.js +0 -31
- package/lib/esm/solana/generated/gar/events/instantWithdrawalEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/observationSubmittedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/observerAddressUpdatedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/operatorStakeIncreasedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/redelegationEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/residueVaultCreatedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/rewardsCompoundedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/stakePaymentEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/withdrawalCancelledEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/withdrawalClaimedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/withdrawalCreatedEvent.js +0 -21
- package/lib/esm/solana/generated/gar/events/withdrawalPaymentEvent.js +0 -21
- package/lib/esm/solana/generated/mpl-core/accounts/assetV1.js +0 -42
- package/lib/esm/solana/generated/mpl-core/accounts/collectionV1.js +0 -42
- package/lib/esm/solana/generated/mpl-core/accounts/hashedAssetV1.js +0 -45
- package/lib/esm/solana/generated/mpl-core/accounts/index.js +0 -12
- package/lib/esm/solana/generated/mpl-core/accounts/pluginHeaderV1.js +0 -45
- package/lib/esm/solana/generated/mpl-core/accounts/pluginRegistryV1.js +0 -42
- package/lib/esm/solana/generated/mpl-core/errors/index.js +0 -8
- package/lib/esm/solana/generated/mpl-core/errors/mplCore.js +0 -136
- package/lib/esm/solana/generated/mpl-core/index.js +0 -8
- package/lib/esm/solana/generated/mpl-core/instructions/addCollectionExternalPluginAdapterV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/addCollectionPluginV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/addExternalPluginAdapterV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/addPluginV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/approveCollectionPluginAuthorityV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/approvePluginAuthorityV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/burnCollectionV1.js +0 -49
- package/lib/esm/solana/generated/mpl-core/instructions/burnV1.js +0 -49
- package/lib/esm/solana/generated/mpl-core/instructions/collect.js +0 -42
- package/lib/esm/solana/generated/mpl-core/instructions/compressV1.js +0 -50
- package/lib/esm/solana/generated/mpl-core/instructions/createCollectionV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/createCollectionV2.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/createV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/createV2.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/decompressV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/executeV1.js +0 -56
- package/lib/esm/solana/generated/mpl-core/instructions/index.js +0 -40
- package/lib/esm/solana/generated/mpl-core/instructions/removeCollectionExternalPluginAdapterV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/removeCollectionPluginV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/removeExternalPluginAdapterV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/removePluginV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/revokeCollectionPluginAuthorityV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/revokePluginAuthorityV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/transferV1.js +0 -49
- package/lib/esm/solana/generated/mpl-core/instructions/updateCollectionExternalPluginAdapterV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/updateCollectionInfoV1.js +0 -45
- package/lib/esm/solana/generated/mpl-core/instructions/updateCollectionPluginV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/updateCollectionV1.js +0 -52
- package/lib/esm/solana/generated/mpl-core/instructions/updateExternalPluginAdapterV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/updatePluginV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/updateV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/updateV2.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/writeCollectionExternalPluginAdapterDataV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/instructions/writeExternalPluginAdapterDataV1.js +0 -53
- package/lib/esm/solana/generated/mpl-core/program-address.js +0 -1
- package/lib/esm/solana/generated/mpl-core/types/addAssetsToGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/addBlocker.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/addCollectionsToGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/addGroupsToGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/agentIdentity.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/agentIdentityInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/agentIdentityUpdateInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/appData.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/appDataInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/appDataUpdateInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/attribute.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/attributes.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/authority.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/autograph.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/autographSignature.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/bubblegumV2.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/burnDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/closeGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/compressionProof.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/creator.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/dataSection.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/dataSectionInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/dataSectionUpdateInfo.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/dataState.js +0 -23
- package/lib/esm/solana/generated/mpl-core/types/edition.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/externalCheckResult.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/externalPluginAdapter.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/externalPluginAdapterInitInfo.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/externalPluginAdapterKey.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/externalPluginAdapterSchema.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/externalPluginAdapterType.js +0 -28
- package/lib/esm/solana/generated/mpl-core/types/externalPluginAdapterUpdateInfo.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/externalRegistryRecord.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/externalValidationResult.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/extraAccount.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/freezeDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/freezeExecute.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/groups.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/hashablePluginSchema.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/hashedAssetSchema.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/hookableLifecycleEvent.js +0 -26
- package/lib/esm/solana/generated/mpl-core/types/immutableMetadata.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/index.js +0 -89
- package/lib/esm/solana/generated/mpl-core/types/key.js +0 -28
- package/lib/esm/solana/generated/mpl-core/types/lifecycleHook.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/lifecycleHookInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/lifecycleHookUpdateInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/linkedAppData.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/linkedAppDataInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/linkedAppDataUpdateInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/linkedDataKey.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/linkedLifecycleHook.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/linkedLifecycleHookInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/linkedLifecycleHookUpdateInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/masterEdition.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/oracle.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/oracleInitInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/oracleUpdateInfo.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/oracleValidation.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/permanentBurnDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/permanentFreezeDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/permanentFreezeExecute.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/permanentTransferDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/plugin.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/pluginAuthorityPair.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/pluginType.js +0 -40
- package/lib/esm/solana/generated/mpl-core/types/registryRecord.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/relationshipKind.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/removeAssetsFromGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/removeCollectionsFromGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/removeGroupsFromGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/royalties.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/ruleSet.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/seed.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/transferDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/updateAuthority.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/updateDelegate.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/updateGroupV1Args.js +0 -17
- package/lib/esm/solana/generated/mpl-core/types/updateType.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/validationResult.js +0 -25
- package/lib/esm/solana/generated/mpl-core/types/validationResultsOffset.js +0 -24
- package/lib/esm/solana/generated/mpl-core/types/verifiedCreators.js +0 -18
- package/lib/esm/solana/generated/mpl-core/types/verifiedCreatorsSignature.js +0 -17
- package/lib/esm/utils/ao.js +0 -421
- package/lib/esm/utils/arweave.js +0 -271
- package/lib/esm/utils/processes.js +0 -167
- package/lib/esm/web/index.js +0 -20
- package/lib/types/common/ant-versions.d.ts +0 -39
- package/lib/types/common/arweave.d.ts +0 -17
- package/lib/types/common/contracts/ao-process.d.ts +0 -33
- package/lib/types/common/hyperbeam/hb.d.ts +0 -88
- package/lib/types/common/marketplace.d.ts +0 -556
- package/lib/types/common/turbo.d.ts +0 -61
- package/lib/types/node/index.d.ts +0 -20
- package/lib/types/solana/generated/ant/events/aclEntryAddedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/aclEntryRemovedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/antMetadataUpdatedEvent.d.ts +0 -28
- package/lib/types/solana/generated/ant/events/antReconciledEvent.d.ts +0 -28
- package/lib/types/solana/generated/ant/events/antTransferredEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/attributesClearedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/attributesSyncedEvent.d.ts +0 -24
- package/lib/types/solana/generated/ant/events/controllerAddedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/controllerRemovedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/index.d.ts +0 -15
- package/lib/types/solana/generated/ant/events/recordMetadataPrunedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/recordMetadataRemovedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/recordMetadataUpdatedEvent.d.ts +0 -28
- package/lib/types/solana/generated/ant/events/recordRemovedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant/events/recordSetEvent.d.ts +0 -34
- package/lib/types/solana/generated/ant/events/recordTransferredEvent.d.ts +0 -30
- package/lib/types/solana/generated/ant-escrow/events/escrowCancelledEvent.d.ts +0 -28
- package/lib/types/solana/generated/ant-escrow/events/escrowClaimedEvent.d.ts +0 -32
- package/lib/types/solana/generated/ant-escrow/events/escrowDepositedEvent.d.ts +0 -36
- package/lib/types/solana/generated/ant-escrow/events/escrowRecipientUpdatedEvent.d.ts +0 -26
- package/lib/types/solana/generated/ant-escrow/events/index.d.ts +0 -4
- package/lib/types/solana/generated/arns/events/demandFactorUpdatedEvent.d.ts +0 -28
- package/lib/types/solana/generated/arns/events/index.d.ts +0 -12
- package/lib/types/solana/generated/arns/events/leaseExtendedEvent.d.ts +0 -32
- package/lib/types/solana/generated/arns/events/namePurchasedEvent.d.ts +0 -34
- package/lib/types/solana/generated/arns/events/nameReassignedEvent.d.ts +0 -28
- package/lib/types/solana/generated/arns/events/nameReleasedEvent.d.ts +0 -24
- package/lib/types/solana/generated/arns/events/nameReservedEvent.d.ts +0 -28
- package/lib/types/solana/generated/arns/events/nameUnreservedEvent.d.ts +0 -24
- package/lib/types/solana/generated/arns/events/nameUpgradedEvent.d.ts +0 -28
- package/lib/types/solana/generated/arns/events/namesPrunedEvent.d.ts +0 -26
- package/lib/types/solana/generated/arns/events/reservedNameClaimedEvent.d.ts +0 -24
- package/lib/types/solana/generated/arns/events/returnedNamePurchasedEvent.d.ts +0 -32
- package/lib/types/solana/generated/arns/events/undernameIncreasedEvent.d.ts +0 -32
- package/lib/types/solana/generated/core/events/configUpdatedEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/coreMigrationFinalizedEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/index.d.ts +0 -13
- package/lib/types/solana/generated/core/events/primaryNameRemovedEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/primaryNameRequestExpiredEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/primaryNameRequestedEvent.d.ts +0 -30
- package/lib/types/solana/generated/core/events/primaryNameSetEvent.d.ts +0 -24
- package/lib/types/solana/generated/core/events/supplyFinalizedEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/transferEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/vaultCreatedEvent.d.ts +0 -28
- package/lib/types/solana/generated/core/events/vaultExtendedEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/vaultIncreasedEvent.d.ts +0 -28
- package/lib/types/solana/generated/core/events/vaultReleasedEvent.d.ts +0 -26
- package/lib/types/solana/generated/core/events/vaultRevokedEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/allowlistToggledEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/delegateAllowlistedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/delegationClosedEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/delegationDecreasedEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/delegationEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/epochClosedEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/epochCreatedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/epochDistributedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/epochPrescribedEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/epochWeightsTalliedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/epochsToggledEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/fundingPlanAppliedEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/garMigrationFinalizedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/gatewayFinalizedEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/gatewayJoinedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/gatewayLeavingEvent.d.ts +0 -22
- package/lib/types/solana/generated/gar/events/gatewayPrunedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/gatewaySettingsUpdatedEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/index.d.ts +0 -30
- package/lib/types/solana/generated/gar/events/instantWithdrawalEvent.d.ts +0 -30
- package/lib/types/solana/generated/gar/events/observationSubmittedEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/observerAddressUpdatedEvent.d.ts +0 -24
- package/lib/types/solana/generated/gar/events/operatorStakeIncreasedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/redelegationEvent.d.ts +0 -30
- package/lib/types/solana/generated/gar/events/residueVaultCreatedEvent.d.ts +0 -30
- package/lib/types/solana/generated/gar/events/rewardsCompoundedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/stakePaymentEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/withdrawalCancelledEvent.d.ts +0 -30
- package/lib/types/solana/generated/gar/events/withdrawalClaimedEvent.d.ts +0 -26
- package/lib/types/solana/generated/gar/events/withdrawalCreatedEvent.d.ts +0 -28
- package/lib/types/solana/generated/gar/events/withdrawalPaymentEvent.d.ts +0 -28
- package/lib/types/solana/generated/mpl-core/accounts/assetV1.d.ts +0 -37
- package/lib/types/solana/generated/mpl-core/accounts/collectionV1.d.ts +0 -37
- package/lib/types/solana/generated/mpl-core/accounts/hashedAssetV1.d.ts +0 -30
- package/lib/types/solana/generated/mpl-core/accounts/index.d.ts +0 -12
- package/lib/types/solana/generated/mpl-core/accounts/pluginHeaderV1.d.ts +0 -30
- package/lib/types/solana/generated/mpl-core/accounts/pluginRegistryV1.d.ts +0 -31
- package/lib/types/solana/generated/mpl-core/errors/index.d.ts +0 -8
- package/lib/types/solana/generated/mpl-core/errors/mplCore.d.ts +0 -133
- package/lib/types/solana/generated/mpl-core/index.d.ts +0 -8
- package/lib/types/solana/generated/mpl-core/instructions/addCollectionExternalPluginAdapterV1.d.ts +0 -56
- package/lib/types/solana/generated/mpl-core/instructions/addCollectionPluginV1.d.ts +0 -59
- package/lib/types/solana/generated/mpl-core/instructions/addExternalPluginAdapterV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/addPluginV1.d.ts +0 -63
- package/lib/types/solana/generated/mpl-core/instructions/approveCollectionPluginAuthorityV1.d.ts +0 -59
- package/lib/types/solana/generated/mpl-core/instructions/approvePluginAuthorityV1.d.ts +0 -63
- package/lib/types/solana/generated/mpl-core/instructions/burnCollectionV1.d.ts +0 -52
- package/lib/types/solana/generated/mpl-core/instructions/burnV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/collect.d.ts +0 -39
- package/lib/types/solana/generated/mpl-core/instructions/compressV1.d.ts +0 -55
- package/lib/types/solana/generated/mpl-core/instructions/createCollectionV1.d.ts +0 -58
- package/lib/types/solana/generated/mpl-core/instructions/createCollectionV2.d.ts +0 -61
- package/lib/types/solana/generated/mpl-core/instructions/createV1.d.ts +0 -77
- package/lib/types/solana/generated/mpl-core/instructions/createV2.d.ts +0 -80
- package/lib/types/solana/generated/mpl-core/instructions/decompressV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/executeV1.d.ts +0 -63
- package/lib/types/solana/generated/mpl-core/instructions/index.d.ts +0 -40
- package/lib/types/solana/generated/mpl-core/instructions/removeCollectionExternalPluginAdapterV1.d.ts +0 -56
- package/lib/types/solana/generated/mpl-core/instructions/removeCollectionPluginV1.d.ts +0 -56
- package/lib/types/solana/generated/mpl-core/instructions/removeExternalPluginAdapterV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/removePluginV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/revokeCollectionPluginAuthorityV1.d.ts +0 -56
- package/lib/types/solana/generated/mpl-core/instructions/revokePluginAuthorityV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/transferV1.d.ts +0 -64
- package/lib/types/solana/generated/mpl-core/instructions/updateCollectionExternalPluginAdapterV1.d.ts +0 -59
- package/lib/types/solana/generated/mpl-core/instructions/updateCollectionInfoV1.d.ts +0 -47
- package/lib/types/solana/generated/mpl-core/instructions/updateCollectionPluginV1.d.ts +0 -56
- package/lib/types/solana/generated/mpl-core/instructions/updateCollectionV1.d.ts +0 -62
- package/lib/types/solana/generated/mpl-core/instructions/updateExternalPluginAdapterV1.d.ts +0 -63
- package/lib/types/solana/generated/mpl-core/instructions/updatePluginV1.d.ts +0 -60
- package/lib/types/solana/generated/mpl-core/instructions/updateV1.d.ts +0 -66
- package/lib/types/solana/generated/mpl-core/instructions/updateV2.d.ts +0 -70
- package/lib/types/solana/generated/mpl-core/instructions/writeCollectionExternalPluginAdapterDataV1.d.ts +0 -63
- package/lib/types/solana/generated/mpl-core/instructions/writeExternalPluginAdapterDataV1.d.ts +0 -67
- package/lib/types/solana/generated/mpl-core/program-address.d.ts +0 -7
- package/lib/types/solana/generated/mpl-core/types/addAssetsToGroupV1Args.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/addBlocker.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/addCollectionsToGroupV1Args.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/addGroupsToGroupV1Args.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/agentIdentity.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/agentIdentityInitInfo.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/agentIdentityUpdateInfo.d.ts +0 -20
- package/lib/types/solana/generated/mpl-core/types/appData.d.ts +0 -20
- package/lib/types/solana/generated/mpl-core/types/appDataInitInfo.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/appDataUpdateInfo.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/attribute.d.ts +0 -16
- package/lib/types/solana/generated/mpl-core/types/attributes.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/authority.d.ts +0 -29
- package/lib/types/solana/generated/mpl-core/types/autograph.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/autographSignature.d.ts +0 -16
- package/lib/types/solana/generated/mpl-core/types/bubblegumV2.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/burnDelegate.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/closeGroupV1Args.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/compressionProof.d.ts +0 -28
- package/lib/types/solana/generated/mpl-core/types/creator.d.ts +0 -16
- package/lib/types/solana/generated/mpl-core/types/dataSection.d.ts +0 -20
- package/lib/types/solana/generated/mpl-core/types/dataSectionInitInfo.d.ts +0 -20
- package/lib/types/solana/generated/mpl-core/types/dataSectionUpdateInfo.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/dataState.d.ts +0 -16
- package/lib/types/solana/generated/mpl-core/types/edition.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/externalCheckResult.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/externalPluginAdapter.d.ts +0 -66
- package/lib/types/solana/generated/mpl-core/types/externalPluginAdapterInitInfo.d.ts +0 -66
- package/lib/types/solana/generated/mpl-core/types/externalPluginAdapterKey.d.ts +0 -64
- package/lib/types/solana/generated/mpl-core/types/externalPluginAdapterSchema.d.ts +0 -17
- package/lib/types/solana/generated/mpl-core/types/externalPluginAdapterType.d.ts +0 -21
- package/lib/types/solana/generated/mpl-core/types/externalPluginAdapterUpdateInfo.d.ts +0 -59
- package/lib/types/solana/generated/mpl-core/types/externalRegistryRecord.d.ts +0 -28
- package/lib/types/solana/generated/mpl-core/types/externalValidationResult.d.ts +0 -17
- package/lib/types/solana/generated/mpl-core/types/extraAccount.d.ts +0 -86
- package/lib/types/solana/generated/mpl-core/types/freezeDelegate.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/freezeExecute.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/groups.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/hashablePluginSchema.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/hashedAssetSchema.d.ts +0 -16
- package/lib/types/solana/generated/mpl-core/types/hookableLifecycleEvent.d.ts +0 -19
- package/lib/types/solana/generated/mpl-core/types/immutableMetadata.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/index.d.ts +0 -89
- package/lib/types/solana/generated/mpl-core/types/key.d.ts +0 -21
- package/lib/types/solana/generated/mpl-core/types/lifecycleHook.d.ts +0 -24
- package/lib/types/solana/generated/mpl-core/types/lifecycleHookInitInfo.d.ts +0 -28
- package/lib/types/solana/generated/mpl-core/types/lifecycleHookUpdateInfo.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/linkedAppData.d.ts +0 -20
- package/lib/types/solana/generated/mpl-core/types/linkedAppDataInitInfo.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/linkedAppDataUpdateInfo.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/linkedDataKey.d.ts +0 -31
- package/lib/types/solana/generated/mpl-core/types/linkedLifecycleHook.d.ts +0 -24
- package/lib/types/solana/generated/mpl-core/types/linkedLifecycleHookInitInfo.d.ts +0 -28
- package/lib/types/solana/generated/mpl-core/types/linkedLifecycleHookUpdateInfo.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/masterEdition.d.ts +0 -21
- package/lib/types/solana/generated/mpl-core/types/oracle.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/oracleInitInfo.d.ts +0 -26
- package/lib/types/solana/generated/mpl-core/types/oracleUpdateInfo.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/oracleValidation.d.ts +0 -35
- package/lib/types/solana/generated/mpl-core/types/permanentBurnDelegate.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/permanentFreezeDelegate.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/permanentFreezeExecute.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/permanentTransferDelegate.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/plugin.d.ts +0 -150
- package/lib/types/solana/generated/mpl-core/types/pluginAuthorityPair.d.ts +0 -20
- package/lib/types/solana/generated/mpl-core/types/pluginType.d.ts +0 -33
- package/lib/types/solana/generated/mpl-core/types/registryRecord.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/relationshipKind.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/removeAssetsFromGroupV1Args.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/removeCollectionsFromGroupV1Args.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/removeGroupsFromGroupV1Args.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/royalties.d.ts +0 -22
- package/lib/types/solana/generated/mpl-core/types/ruleSet.d.ts +0 -27
- package/lib/types/solana/generated/mpl-core/types/seed.d.ts +0 -36
- package/lib/types/solana/generated/mpl-core/types/transferDelegate.d.ts +0 -13
- package/lib/types/solana/generated/mpl-core/types/updateAuthority.d.ts +0 -27
- package/lib/types/solana/generated/mpl-core/types/updateDelegate.d.ts +0 -15
- package/lib/types/solana/generated/mpl-core/types/updateGroupV1Args.d.ts +0 -19
- package/lib/types/solana/generated/mpl-core/types/updateType.d.ts +0 -17
- package/lib/types/solana/generated/mpl-core/types/validationResult.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/validationResultsOffset.d.ts +0 -33
- package/lib/types/solana/generated/mpl-core/types/verifiedCreators.d.ts +0 -18
- package/lib/types/solana/generated/mpl-core/types/verifiedCreatorsSignature.d.ts +0 -16
- package/lib/types/utils/ao.d.ts +0 -80
- package/lib/types/utils/arweave.d.ts +0 -79
- package/lib/types/utils/processes.d.ts +0 -39
- package/lib/types/web/index.d.ts +0 -20
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
1
16
|
/**
|
|
2
17
|
* Helpers for JSON-RPC reads against {@link SolanaRpc} that return a
|
|
3
18
|
* web3.js-shaped `AccountInfo` (Buffer-backed `data`, plain Address strings).
|
|
@@ -5,6 +20,7 @@
|
|
|
5
20
|
* the RPC client's response shape.
|
|
6
21
|
*/
|
|
7
22
|
import { address } from '@solana/kit';
|
|
23
|
+
import { withRetry } from './retry.js';
|
|
8
24
|
/**
|
|
9
25
|
* Map an arbitrary commitment string to one of kit's three supported tiers.
|
|
10
26
|
* Anything we don't recognise (or `undefined`) falls back to `confirmed`,
|
|
@@ -24,12 +40,12 @@ function toKitCommitment(commitment) {
|
|
|
24
40
|
* doesn't exist (so callers can handle "missing PDA" without try/catch).
|
|
25
41
|
*/
|
|
26
42
|
export async function getAccountInfoLegacy(rpc, pda, commitment) {
|
|
27
|
-
const res = await rpc
|
|
43
|
+
const res = await withRetry(() => rpc
|
|
28
44
|
.getAccountInfo(pda, {
|
|
29
45
|
encoding: 'base64',
|
|
30
46
|
commitment: toKitCommitment(commitment),
|
|
31
47
|
})
|
|
32
|
-
.send();
|
|
48
|
+
.send());
|
|
33
49
|
if (!res.value)
|
|
34
50
|
return null;
|
|
35
51
|
const [dataB64] = res.value.data;
|
|
@@ -53,12 +69,12 @@ export async function getAccountInfoLegacy(rpc, pda, commitment) {
|
|
|
53
69
|
export async function getMultipleAccountsInfoLegacy(rpc, pdas, commitment) {
|
|
54
70
|
if (pdas.length === 0)
|
|
55
71
|
return [];
|
|
56
|
-
const res = await rpc
|
|
72
|
+
const res = await withRetry(() => rpc
|
|
57
73
|
.getMultipleAccounts(pdas, {
|
|
58
74
|
encoding: 'base64',
|
|
59
75
|
commitment: toKitCommitment(commitment),
|
|
60
76
|
})
|
|
61
|
-
.send();
|
|
77
|
+
.send());
|
|
62
78
|
return res.value.map((acct) => {
|
|
63
79
|
if (!acct)
|
|
64
80
|
return null;
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
1
16
|
/**
|
|
2
17
|
* Metaplex-standard JSON metadata builder for AR.IO ANT NFTs.
|
|
3
18
|
*
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
1
16
|
/**
|
|
2
17
|
* Reader for the on-chain Metaplex Core asset (`AssetV1` + plugin chain).
|
|
3
18
|
*
|
|
@@ -26,11 +41,8 @@
|
|
|
26
41
|
* `ANT Program` attribute or has a layout the walker doesn't recognise.
|
|
27
42
|
*/
|
|
28
43
|
import { fetchEncodedAccount, } from '@solana/kit';
|
|
29
|
-
import { getAssetV1Decoder } from '
|
|
30
|
-
import {
|
|
31
|
-
import { getPluginRegistryV1Decoder } from './generated/mpl-core/accounts/pluginRegistryV1.js';
|
|
32
|
-
import { getPluginDecoder } from './generated/mpl-core/types/plugin.js';
|
|
33
|
-
import { PluginType } from './generated/mpl-core/types/pluginType.js';
|
|
44
|
+
import { PluginType, getAssetV1Decoder, getPluginDecoder, getPluginHeaderV1Decoder, getPluginRegistryV1Decoder, } from '@ar.io/solana-contracts/mpl-core';
|
|
45
|
+
import { ARIO_ANT_PROGRAM_ID } from './constants.js';
|
|
34
46
|
/**
|
|
35
47
|
* On-chain trait keys. Marketplaces and DAS indexers query these by
|
|
36
48
|
* exact string match — keep in lock-step with:
|
|
@@ -116,6 +128,44 @@ export async function fetchAntProgramFromAsset(rpc, mint, config) {
|
|
|
116
128
|
// self-grief that surfaces at the next PDA derivation.
|
|
117
129
|
return value;
|
|
118
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Decide which ANT program id to trust for a SIGNING (write) transaction.
|
|
133
|
+
*
|
|
134
|
+
* The `ANT Program` trait returned by {@link fetchAntProgramFromAsset} is read
|
|
135
|
+
* from Metaplex Core asset / RPC data and is NOT authenticated — a malicious
|
|
136
|
+
* asset owner, or a spoofed/compromised RPC response, can set it to an
|
|
137
|
+
* attacker-controlled program. Write instructions use this value as the
|
|
138
|
+
* instruction `programAddress` while including the caller as a signer, so
|
|
139
|
+
* silently trusting a non-canonical detected value would let an attacker route
|
|
140
|
+
* a victim's signed transaction to their own program and inherit signer /
|
|
141
|
+
* writable privileges over the included accounts.
|
|
142
|
+
*
|
|
143
|
+
* Trust rules — BYO-ANT (ADR-016 / BD-100) stays supported, but only via
|
|
144
|
+
* explicit opt-in:
|
|
145
|
+
* - An `explicit` program id (the caller passed `antProgramId`) is always
|
|
146
|
+
* honored — the caller has taken responsibility for it.
|
|
147
|
+
* - Otherwise a detected value is honored only when it is `null` (no trait)
|
|
148
|
+
* or equals the canonical {@link ARIO_ANT_PROGRAM_ID}.
|
|
149
|
+
* - A detected NON-canonical value with no explicit opt-in throws, rather
|
|
150
|
+
* than silently signing against an untrusted program.
|
|
151
|
+
*
|
|
152
|
+
* Read-only paths never sign, so they may auto-detect freely; this guard is
|
|
153
|
+
* only for the write path.
|
|
154
|
+
*/
|
|
155
|
+
export function resolveWriteAntProgram(args) {
|
|
156
|
+
const canonical = args.canonical ?? ARIO_ANT_PROGRAM_ID;
|
|
157
|
+
if (args.explicit !== undefined)
|
|
158
|
+
return args.explicit;
|
|
159
|
+
if (args.detected === null || args.detected === canonical)
|
|
160
|
+
return canonical;
|
|
161
|
+
throw new Error(`ANT.init auto-detected a non-canonical ANT program (${args.detected}) ` +
|
|
162
|
+
`from the asset's "${TRAIT_KEY_ANT_PROGRAM}" trait. That value is read ` +
|
|
163
|
+
`from asset/RPC data and is not authenticated, so the SDK refuses to ` +
|
|
164
|
+
`build a *signed* transaction against it implicitly (doing so could ` +
|
|
165
|
+
`route your signature to an attacker-controlled program). To use a ` +
|
|
166
|
+
`third-party (BYO-ANT) program for writes, pass it explicitly: ` +
|
|
167
|
+
`ANT.init({ ..., antProgramId }).`);
|
|
168
|
+
}
|
|
119
169
|
/**
|
|
120
170
|
* Fetch the current owner of an MPL Core asset. Returns `null` when the
|
|
121
171
|
* account doesn't exist or the AssetV1 layout can't be decoded.
|
package/lib/esm/solana/pda.js
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
1
16
|
import { createHash } from 'crypto';
|
|
2
17
|
/**
|
|
3
18
|
* PDA derivation helpers for AR.IO Solana programs.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Off-chain prediction of `prescribe_epoch`'s observer selection.
|
|
18
|
+
*
|
|
19
|
+
* `ario_gar::prescribe_epoch` selects observers INTERNALLY via a weighted
|
|
20
|
+
* roulette over the `GatewayRegistry`, then uses `remaining_accounts` only as a
|
|
21
|
+
* lookup table for the ~50 selected Gateway PDAs (+ NameRegistry). A cranker
|
|
22
|
+
* that instead supplies every registry gateway hits Solana's
|
|
23
|
+
* `MAX_TX_ACCOUNT_LOCKS = 64` on large registries and the tx is rejected at
|
|
24
|
+
* pre-flight. This helper mirrors the on-chain selection so the caller can
|
|
25
|
+
* supply exactly the selected set.
|
|
26
|
+
*
|
|
27
|
+
* The selection is deterministic from on-chain state that is stable once
|
|
28
|
+
* `epoch.weights_tallied == 1`: the frozen `epoch.hashchain` entropy beacon and
|
|
29
|
+
* the live `registry.gateways[*].composite_weight`.
|
|
30
|
+
*
|
|
31
|
+
* Cross-language parity with the Rust handler
|
|
32
|
+
* (`ar-io-solana-contracts/programs/ario-gar/src/instructions/epoch.rs`, the
|
|
33
|
+
* `prescribe_epoch` observer-selection block) is asserted in
|
|
34
|
+
* `predict-prescribed-observers.test.ts` against vectors generated by the Rust
|
|
35
|
+
* reference example `programs/ario-gar/examples/predict_prescribed_observers.rs`.
|
|
36
|
+
* If you change this algorithm, update that example and the test together.
|
|
37
|
+
*/
|
|
38
|
+
import { createHash } from 'crypto';
|
|
39
|
+
function sha256(data) {
|
|
40
|
+
return createHash('sha256').update(data).digest();
|
|
41
|
+
}
|
|
42
|
+
/** `u128::from_le_bytes(bytes[0..16])` — little-endian, first 16 bytes only. */
|
|
43
|
+
function leU128(bytes) {
|
|
44
|
+
let v = 0n;
|
|
45
|
+
for (let i = 15; i >= 0; i--) {
|
|
46
|
+
v = (v << 8n) | BigInt(bytes[i]);
|
|
47
|
+
}
|
|
48
|
+
return v;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Predict the operator pubkeys `prescribe_epoch` will select as observers.
|
|
52
|
+
*
|
|
53
|
+
* Returns the selected `GatewaySlot.address` values (operator pubkeys) in
|
|
54
|
+
* selection order, at most `maxObservers`. These correspond 1:1 to the on-chain
|
|
55
|
+
* `epoch.prescribed_observer_gateways` array, and are what Gateway PDAs are
|
|
56
|
+
* derived from (`[GATEWAY_SEED, operator]`). NOTE this is NOT
|
|
57
|
+
* `epoch.prescribed_observers`, which `prescribe_epoch` later overwrites with
|
|
58
|
+
* each gateway's resolved `observer_address`.
|
|
59
|
+
*
|
|
60
|
+
* @param epochHashchain `epoch.hashchain` — exactly 32 bytes, frozen at
|
|
61
|
+
* `create_epoch`.
|
|
62
|
+
* @param slots `registry.gateways[0 .. epoch.active_gateway_count]` in registry
|
|
63
|
+
* (slot-index) order. Pass the whole prefix including any zero-weight slots —
|
|
64
|
+
* order and the live weight sum must match the on-chain walk exactly. Empty /
|
|
65
|
+
* zero-weight slots contribute nothing and can never be selected.
|
|
66
|
+
* @param maxObservers `epoch_settings.prescribed_observer_count`. Clamped to
|
|
67
|
+
* `slots.length` (the on-chain `min(prescribed_observer_count, active_count)`).
|
|
68
|
+
*/
|
|
69
|
+
export function predictPrescribedObservers(epochHashchain, slots, maxObservers) {
|
|
70
|
+
if (epochHashchain.length !== 32) {
|
|
71
|
+
throw new Error(`epochHashchain must be 32 bytes, got ${epochHashchain.length}`);
|
|
72
|
+
}
|
|
73
|
+
const activeCount = slots.length;
|
|
74
|
+
const cap = Math.min(maxObservers, activeCount);
|
|
75
|
+
// Live total weight (epoch.rs: `for i in 0..active_count { total += w }`).
|
|
76
|
+
// u128 sum of u64 weights over <=3000 slots cannot overflow, so the Rust
|
|
77
|
+
// `saturating_add` never actually saturates; plain BigInt addition matches.
|
|
78
|
+
let totalWeight = 0n;
|
|
79
|
+
for (const slot of slots) {
|
|
80
|
+
totalWeight += slot.compositeWeight;
|
|
81
|
+
}
|
|
82
|
+
const selected = [];
|
|
83
|
+
if (totalWeight === 0n || activeCount === 0 || cap === 0) {
|
|
84
|
+
return selected;
|
|
85
|
+
}
|
|
86
|
+
// Initial entropy: sha256(hashchain).
|
|
87
|
+
let hashBytes = sha256(epochHashchain);
|
|
88
|
+
// GAR-019: bounded retries, up to cap * 10 rounds.
|
|
89
|
+
const maxRounds = cap * 10;
|
|
90
|
+
for (let round = 0; round < maxRounds; round++) {
|
|
91
|
+
if (selected.length >= cap)
|
|
92
|
+
break;
|
|
93
|
+
const randomValue = leU128(hashBytes.subarray(0, 16)) % totalWeight;
|
|
94
|
+
let cumulative = 0n;
|
|
95
|
+
for (const slot of slots) {
|
|
96
|
+
cumulative += slot.compositeWeight;
|
|
97
|
+
if (cumulative > randomValue && slot.compositeWeight > 0n) {
|
|
98
|
+
// Anti-duplicate: skip if already chosen, but the round still consumes
|
|
99
|
+
// the roulette hit — break the walk either way (epoch.rs).
|
|
100
|
+
if (!selected.includes(slot.address)) {
|
|
101
|
+
selected.push(slot.address);
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Re-hash for the next round: sha256(hash_bytes).
|
|
107
|
+
hashBytes = sha256(hashBytes);
|
|
108
|
+
}
|
|
109
|
+
return selected;
|
|
110
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Lightweight retry helper with exponential back-off + jitter for Solana RPC
|
|
18
|
+
* read calls.
|
|
19
|
+
*
|
|
20
|
+
* Wraps any async function so transient transport errors (HTTP 429/5xx,
|
|
21
|
+
* network timeouts, etc.) are retried automatically while "normal" failures
|
|
22
|
+
* (account-not-found, deserialization) bubble immediately.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* ```ts
|
|
26
|
+
* const account = await withRetry(() => fetchEncodedAccount(rpc, pda));
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { Logger } from '../common/logger.js';
|
|
30
|
+
const logger = new Logger({ level: 'error' });
|
|
31
|
+
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
32
|
+
const DEFAULT_BASE_DELAY_MS = 1_000;
|
|
33
|
+
const DEFAULT_MAX_DELAY_MS = 10_000;
|
|
34
|
+
/**
|
|
35
|
+
* Default retryable-error heuristic.
|
|
36
|
+
*
|
|
37
|
+
* We retry on:
|
|
38
|
+
* - Network / fetch errors (`TypeError: fetch failed`)
|
|
39
|
+
* - HTTP 429 (rate-limit) and 5xx (server) surfaced by kit's transport as
|
|
40
|
+
* `SolanaError` with "HTTP error (4xx|5xx)" in the message.
|
|
41
|
+
* - Timeout errors from opossum or native `AbortError`.
|
|
42
|
+
*
|
|
43
|
+
* We do NOT retry on:
|
|
44
|
+
* - JSON-RPC application errors (account not found, invalid params, etc.)
|
|
45
|
+
* - Deserialization / decoding errors
|
|
46
|
+
* - Any error without a recognisable transport signature
|
|
47
|
+
*/
|
|
48
|
+
export function isRetryableError(error) {
|
|
49
|
+
if (error == null)
|
|
50
|
+
return false;
|
|
51
|
+
const name = error.name ?? '';
|
|
52
|
+
const message = String(error.message ?? '');
|
|
53
|
+
const code = error.context
|
|
54
|
+
?.__code;
|
|
55
|
+
// SolanaError from kit's transport for HTTP 429 / 5xx
|
|
56
|
+
if (/HTTP error \(4(?:0[89]|[1-9]\d)|HTTP error \(5\d\d\)/.test(message))
|
|
57
|
+
return true;
|
|
58
|
+
// Specific 429 match (rate-limit) — always retry
|
|
59
|
+
if (/HTTP error \(429\)/.test(message))
|
|
60
|
+
return true;
|
|
61
|
+
// Network-level failures: fetch failed, ECONNRESET, ETIMEDOUT, etc.
|
|
62
|
+
if (name === 'TypeError' && /fetch failed/i.test(message))
|
|
63
|
+
return true;
|
|
64
|
+
if (/ECONNRESET|ETIMEDOUT|ENOTFOUND|EAI_AGAIN/i.test(message))
|
|
65
|
+
return true;
|
|
66
|
+
// Abort / timeout
|
|
67
|
+
if (name === 'AbortError' || name === 'TimeoutError')
|
|
68
|
+
return true;
|
|
69
|
+
if (/timed out/i.test(message))
|
|
70
|
+
return true;
|
|
71
|
+
// Opossum circuit-breaker open — the breaker itself will fallback, but if
|
|
72
|
+
// we're layered on top we shouldn't retry (the breaker handles it).
|
|
73
|
+
if (/breaker is open/i.test(message))
|
|
74
|
+
return false;
|
|
75
|
+
// Numeric Solana JSON-RPC codes that indicate transient overload
|
|
76
|
+
if (typeof code === 'number' && (code === -32005 || code === -32016))
|
|
77
|
+
return true;
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
function sleep(ms) {
|
|
81
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
82
|
+
}
|
|
83
|
+
function jitteredDelay(base, attempt, cap) {
|
|
84
|
+
const exponential = base * 2 ** attempt;
|
|
85
|
+
const capped = Math.min(exponential, cap);
|
|
86
|
+
return capped * (0.5 + Math.random() * 0.5);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Execute `fn` with automatic retries on transient failures.
|
|
90
|
+
*
|
|
91
|
+
* ```ts
|
|
92
|
+
* const data = await withRetry(() => rpc.getAccountInfo(addr).send());
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export async function withRetry(fn, opts) {
|
|
96
|
+
const maxAttempts = opts?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
97
|
+
const baseDelayMs = opts?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
98
|
+
const maxDelayMs = opts?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
99
|
+
const retryable = opts?.isRetryable ?? isRetryableError;
|
|
100
|
+
let lastError;
|
|
101
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
102
|
+
try {
|
|
103
|
+
return await fn();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
lastError = error;
|
|
107
|
+
const isLast = attempt === maxAttempts - 1;
|
|
108
|
+
if (isLast || !retryable(error)) {
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
const delay = jitteredDelay(baseDelayMs, attempt, maxDelayMs);
|
|
112
|
+
logger.debug(`[retry] attempt ${attempt + 1}/${maxAttempts} failed, retrying in ${Math.round(delay)}ms`, { error: String(error) });
|
|
113
|
+
await sleep(delay);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
throw lastError;
|
|
117
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Circuit-breaker wrapper for Solana RPC transports using
|
|
18
|
+
* [opossum](https://nodeshift.dev/opossum/).
|
|
19
|
+
*
|
|
20
|
+
* When the primary RPC endpoint starts failing (rate-limits, downtime, etc.)
|
|
21
|
+
* the circuit opens and subsequent calls are routed transparently to a
|
|
22
|
+
* fallback RPC until the primary recovers.
|
|
23
|
+
*
|
|
24
|
+
* Works at the **transport level** — no Proxy magic required. Every RPC
|
|
25
|
+
* method (`getAccountInfo`, `sendTransaction`, etc.) goes through the same
|
|
26
|
+
* transport function, so a single circuit breaker covers them all.
|
|
27
|
+
*
|
|
28
|
+
* Usage:
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { ARIO, createCircuitBreakerRpc } from '@ar.io/sdk';
|
|
31
|
+
*
|
|
32
|
+
* const rpc = createCircuitBreakerRpc({
|
|
33
|
+
* primaryUrl: 'https://my-premium-rpc.example.com',
|
|
34
|
+
* fallbackUrl: 'https://api.mainnet-beta.solana.com',
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* const ario = ARIO.init({ rpc });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
import { createDefaultRpcTransport, createSolanaRpcFromTransport, } from '@solana/kit';
|
|
41
|
+
import CircuitBreaker from 'opossum';
|
|
42
|
+
import { Logger } from '../common/logger.js';
|
|
43
|
+
const logger = new Logger({ level: 'error' });
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Defaults
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
const DEFAULT_MAINNET_RPC = 'https://api.mainnet-beta.solana.com';
|
|
48
|
+
const DEFAULT_DEVNET_RPC = 'https://api.devnet.solana.com';
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Adaptive rate gate (token bucket + cooldown)
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/** Default ceiling when `maxRequestsPerSecond` is not provided. */
|
|
53
|
+
const DEFAULT_MAX_RPS = 10;
|
|
54
|
+
/** Multiply the current rate by this on a 429 with no usable header. */
|
|
55
|
+
const AIMD_DECREASE = 0.5;
|
|
56
|
+
/** Never throttle below this many requests/second. */
|
|
57
|
+
const MIN_RATE = 1;
|
|
58
|
+
/** Consecutive successes before nudging the rate up by 1 (additive recovery). */
|
|
59
|
+
const RECOVERY_SUCCESSES = 20;
|
|
60
|
+
/** Fraction of a provider-advertised limit to actually use (safety margin). */
|
|
61
|
+
const RATE_SAFETY_FACTOR = 0.9;
|
|
62
|
+
/** Cooldown applied on a 429 that carries no `Retry-After`. */
|
|
63
|
+
const DEFAULT_COOLDOWN_MS = 1_000;
|
|
64
|
+
/**
|
|
65
|
+
* Token-bucket throttle whose rate can be retuned at runtime and which can be
|
|
66
|
+
* paused on demand. Tokens refill continuously at the current rate, capped at
|
|
67
|
+
* one second's worth (the burst allowance); waiters are released FIFO.
|
|
68
|
+
*/
|
|
69
|
+
function createRateGate(initialRate) {
|
|
70
|
+
let rate = Math.max(MIN_RATE, initialRate);
|
|
71
|
+
let capacity = Math.max(1, rate);
|
|
72
|
+
let tokens = capacity;
|
|
73
|
+
let lastRefill = Date.now();
|
|
74
|
+
let pausedUntil = 0;
|
|
75
|
+
const queue = [];
|
|
76
|
+
let timer = null;
|
|
77
|
+
const schedule = (ms) => {
|
|
78
|
+
if (timer !== null)
|
|
79
|
+
return;
|
|
80
|
+
timer = setTimeout(() => {
|
|
81
|
+
timer = null;
|
|
82
|
+
pump();
|
|
83
|
+
}, Math.max(ms, 1));
|
|
84
|
+
};
|
|
85
|
+
const refill = () => {
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
const elapsed = (now - lastRefill) / 1000;
|
|
88
|
+
if (elapsed > 0) {
|
|
89
|
+
tokens = Math.min(capacity, tokens + elapsed * rate);
|
|
90
|
+
lastRefill = now;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const pump = () => {
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
if (pausedUntil > now) {
|
|
96
|
+
schedule(pausedUntil - now);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
refill();
|
|
100
|
+
while (tokens >= 1) {
|
|
101
|
+
const release = queue.shift();
|
|
102
|
+
if (!release)
|
|
103
|
+
break;
|
|
104
|
+
tokens -= 1;
|
|
105
|
+
release();
|
|
106
|
+
}
|
|
107
|
+
if (queue.length > 0) {
|
|
108
|
+
// Wake when the next whole token will have accrued.
|
|
109
|
+
schedule(Math.ceil(((1 - tokens) / rate) * 1000));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
return {
|
|
113
|
+
acquire: () => new Promise((resolve) => {
|
|
114
|
+
queue.push(resolve);
|
|
115
|
+
pump();
|
|
116
|
+
}),
|
|
117
|
+
setRate: (ratePerSecond) => {
|
|
118
|
+
rate = Math.max(MIN_RATE, ratePerSecond);
|
|
119
|
+
capacity = Math.max(1, rate);
|
|
120
|
+
tokens = Math.min(tokens, capacity);
|
|
121
|
+
lastRefill = Date.now();
|
|
122
|
+
pump();
|
|
123
|
+
},
|
|
124
|
+
pauseFor: (ms) => {
|
|
125
|
+
const until = Date.now() + Math.max(0, ms);
|
|
126
|
+
if (until > pausedUntil)
|
|
127
|
+
pausedUntil = until;
|
|
128
|
+
schedule(ms);
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// 429 / rate-limit header parsing
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
/**
|
|
136
|
+
* If `err` is a transport HTTP 429, return its response `Headers`; else null.
|
|
137
|
+
* Duck-typed against the `@solana/errors` HTTP-error context
|
|
138
|
+
* (`{ statusCode, headers }`) so we avoid a hard dependency on the error code.
|
|
139
|
+
*/
|
|
140
|
+
function http429Headers(err) {
|
|
141
|
+
const ctx = err
|
|
142
|
+
?.context;
|
|
143
|
+
if (ctx?.statusCode === 429 && ctx.headers instanceof Headers) {
|
|
144
|
+
return ctx.headers;
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
/** Parse `Retry-After` (delta-seconds or HTTP-date) into ms, or null. */
|
|
149
|
+
function parseRetryAfterMs(headers) {
|
|
150
|
+
const v = headers.get('retry-after');
|
|
151
|
+
if (v === null || v === '')
|
|
152
|
+
return null;
|
|
153
|
+
const secs = Number(v);
|
|
154
|
+
if (Number.isFinite(secs))
|
|
155
|
+
return Math.max(0, secs * 1000);
|
|
156
|
+
const when = Date.parse(v);
|
|
157
|
+
return Number.isNaN(when) ? null : Math.max(0, when - Date.now());
|
|
158
|
+
}
|
|
159
|
+
/** Provider-advertised requests/second limit (`x-ratelimit-rps-limit`), or null. */
|
|
160
|
+
function parseRpsLimit(headers) {
|
|
161
|
+
const v = Number(headers.get('x-ratelimit-rps-limit'));
|
|
162
|
+
return Number.isFinite(v) && v > 0 ? v : null;
|
|
163
|
+
}
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// Implementation
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
/**
|
|
168
|
+
* Create a {@link SolanaRpc} whose transport is backed by an opossum circuit
|
|
169
|
+
* breaker. Reads and writes flow through the primary transport; when it
|
|
170
|
+
* becomes unhealthy the circuit opens and subsequent calls are routed to
|
|
171
|
+
* the fallback transport until the primary recovers.
|
|
172
|
+
*/
|
|
173
|
+
export function createCircuitBreakerRpc({ primaryUrl, fallbackUrl, circuitBreakerOptions: opts = {}, }) {
|
|
174
|
+
const primaryTransport = createDefaultRpcTransport({ url: primaryUrl });
|
|
175
|
+
const fallbackTransport = createDefaultRpcTransport({ url: fallbackUrl });
|
|
176
|
+
// Throttling is always on. `maxRequestsPerSecond` is the *ceiling*: every
|
|
177
|
+
// request flows through an adaptive token bucket that backs off on HTTP 429
|
|
178
|
+
// (honoring `Retry-After` and `x-ratelimit-rps-limit` when present, AIMD
|
|
179
|
+
// otherwise) and recovers back toward the ceiling on sustained success.
|
|
180
|
+
const ceilingRate = opts.maxRequestsPerSecond !== undefined && opts.maxRequestsPerSecond > 0
|
|
181
|
+
? opts.maxRequestsPerSecond
|
|
182
|
+
: DEFAULT_MAX_RPS;
|
|
183
|
+
const gate = createRateGate(ceilingRate);
|
|
184
|
+
let currentRate = ceilingRate;
|
|
185
|
+
let successStreak = 0;
|
|
186
|
+
const onError = (err) => {
|
|
187
|
+
const headers = http429Headers(err);
|
|
188
|
+
if (!headers)
|
|
189
|
+
return; // only adapt to rate-limit (429) failures
|
|
190
|
+
successStreak = 0;
|
|
191
|
+
const advertised = parseRpsLimit(headers);
|
|
192
|
+
const next = advertised !== null
|
|
193
|
+
? Math.min(ceilingRate, Math.max(MIN_RATE, advertised * RATE_SAFETY_FACTOR))
|
|
194
|
+
: Math.max(MIN_RATE, currentRate * AIMD_DECREASE);
|
|
195
|
+
if (next !== currentRate) {
|
|
196
|
+
currentRate = next;
|
|
197
|
+
gate.setRate(currentRate);
|
|
198
|
+
}
|
|
199
|
+
const retryAfter = parseRetryAfterMs(headers);
|
|
200
|
+
gate.pauseFor(retryAfter ?? DEFAULT_COOLDOWN_MS);
|
|
201
|
+
logger.warn(`[rpc-circuit-breaker] 429 — throttling to ${currentRate.toFixed(1)} req/s` +
|
|
202
|
+
`, cooling down ${retryAfter ?? DEFAULT_COOLDOWN_MS}ms`);
|
|
203
|
+
};
|
|
204
|
+
const onSuccess = () => {
|
|
205
|
+
if (currentRate >= ceilingRate)
|
|
206
|
+
return;
|
|
207
|
+
if (++successStreak >= RECOVERY_SUCCESSES) {
|
|
208
|
+
successStreak = 0;
|
|
209
|
+
currentRate = Math.min(ceilingRate, currentRate + 1);
|
|
210
|
+
gate.setRate(currentRate);
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
const breaker = new CircuitBreaker((request) => primaryTransport(request), {
|
|
214
|
+
timeout: opts.timeout ?? 10_000,
|
|
215
|
+
errorThresholdPercentage: opts.errorThresholdPercentage ?? 25,
|
|
216
|
+
resetTimeout: opts.resetTimeout ?? 60_000,
|
|
217
|
+
volumeThreshold: opts.volumeThreshold ?? 3,
|
|
218
|
+
...(opts.maxConcurrent !== undefined && opts.maxConcurrent > 0
|
|
219
|
+
? { capacity: opts.maxConcurrent }
|
|
220
|
+
: {}),
|
|
221
|
+
});
|
|
222
|
+
breaker.fallback((request) => fallbackTransport(request));
|
|
223
|
+
breaker.on('open', () => {
|
|
224
|
+
logger.warn('[rpc-circuit-breaker] circuit OPEN — routing to fallback RPC');
|
|
225
|
+
});
|
|
226
|
+
breaker.on('halfOpen', () => {
|
|
227
|
+
logger.info('[rpc-circuit-breaker] circuit HALF-OPEN — probing primary RPC');
|
|
228
|
+
});
|
|
229
|
+
breaker.on('close', () => {
|
|
230
|
+
logger.info('[rpc-circuit-breaker] circuit CLOSED — primary RPC recovered');
|
|
231
|
+
});
|
|
232
|
+
// Adapt the rate to the *primary's* health via opossum's events: `failure`
|
|
233
|
+
// fires whenever the primary call rejects (a 429 included) even when the
|
|
234
|
+
// fallback then masks it by resolving `fire()`, and `success` fires on a
|
|
235
|
+
// healthy primary call. A plain try/catch around `fire()` would miss the
|
|
236
|
+
// fallback-masked 429s entirely.
|
|
237
|
+
breaker.on('failure', (err) => onError(err));
|
|
238
|
+
breaker.on('success', () => onSuccess());
|
|
239
|
+
const transport = (async (request) => {
|
|
240
|
+
// Throttle entry to the breaker so we stay under the provider's rate
|
|
241
|
+
// limit; the queue wait sits outside `fire`, so opossum's per-request
|
|
242
|
+
// timeout only measures the actual transport call.
|
|
243
|
+
await gate.acquire();
|
|
244
|
+
return breaker.fire(request);
|
|
245
|
+
});
|
|
246
|
+
return createSolanaRpcFromTransport(transport);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Convenience: pick a sensible public fallback URL based on the primary URL.
|
|
250
|
+
*
|
|
251
|
+
* - Primary contains `devnet` → devnet public RPC
|
|
252
|
+
* - Everything else → mainnet-beta public RPC
|
|
253
|
+
*/
|
|
254
|
+
export function defaultFallbackUrl(primaryUrl) {
|
|
255
|
+
if (/devnet/i.test(primaryUrl))
|
|
256
|
+
return DEFAULT_DEVNET_RPC;
|
|
257
|
+
return DEFAULT_MAINNET_RPC;
|
|
258
|
+
}
|