@algorandfoundation/algokit-utils 10.0.0-beta.2 → 10.0.0-beta.4
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/account-manager.d.ts +72 -1
- package/account-manager.js +63 -1
- package/account-manager.js.map +1 -1
- package/account-manager.mjs +63 -1
- package/account-manager.mjs.map +1 -1
- package/algo25/index.d.ts +1 -1
- package/algo25/index.js +1 -1
- package/algo25/index.mjs +1 -1
- package/algorand-client-transaction-creator.js.map +1 -1
- package/algorand-client-transaction-creator.mjs.map +1 -1
- package/algorand-client-transaction-sender.js +0 -1
- package/algorand-client-transaction-sender.js.map +1 -1
- package/algorand-client-transaction-sender.mjs.map +1 -1
- package/algorand-client.js +5 -1
- package/algorand-client.js.map +1 -1
- package/algorand-client.mjs +5 -1
- package/algorand-client.mjs.map +1 -1
- package/amount.js.map +1 -1
- package/amount.mjs.map +1 -1
- package/app-client.js +174 -17
- package/app-client.js.map +1 -1
- package/app-client.mjs +174 -16
- package/app-client.mjs.map +1 -1
- package/app-deployer.js +8 -8
- package/app-deployer.js.map +1 -1
- package/app-deployer.mjs +9 -9
- package/app-deployer.mjs.map +1 -1
- package/app-factory.d.ts +2 -2
- package/app-factory.js +49 -9
- package/app-factory.js.map +1 -1
- package/app-factory.mjs +49 -9
- package/app-factory.mjs.map +1 -1
- package/app-manager.js.map +1 -1
- package/app-manager.mjs.map +1 -1
- package/app-spec.js.map +1 -1
- package/app-spec.mjs.map +1 -1
- package/app.js.map +1 -1
- package/app.mjs.map +1 -1
- package/asset-manager.js.map +1 -1
- package/asset-manager.mjs.map +1 -1
- package/async-event-emitter.js.map +1 -1
- package/async-event-emitter.mjs.map +1 -1
- package/client-manager.js.map +1 -1
- package/client-manager.mjs.map +1 -1
- package/composer.js +17 -18
- package/composer.js.map +1 -1
- package/composer.mjs +17 -17
- package/composer.mjs.map +1 -1
- package/config.js.map +1 -1
- package/config.mjs.map +1 -1
- package/crypto/index.d.ts +3 -3
- package/crypto/index.js +5 -2
- package/crypto/index.mjs +3 -3
- package/dispenser-client.js +4 -8
- package/dispenser-client.js.map +1 -1
- package/dispenser-client.mjs +4 -8
- package/dispenser-client.mjs.map +1 -1
- package/indexer-client/indexer-lookup.js.map +1 -1
- package/indexer-client/indexer-lookup.mjs.map +1 -1
- package/indexer.js.map +1 -1
- package/indexer.mjs.map +1 -1
- package/kmd-account-manager.js.map +1 -1
- package/kmd-account-manager.mjs.map +1 -1
- package/lifecycle-events.js.map +1 -1
- package/lifecycle-events.mjs.map +1 -1
- package/logging.js.map +1 -1
- package/logging.mjs.map +1 -1
- package/logic-error.js.map +1 -1
- package/logic-error.mjs.map +1 -1
- package/network-client.js.map +1 -1
- package/network-client.mjs.map +1 -1
- package/network-manager.js.map +1 -1
- package/network-manager.mjs.map +1 -1
- package/package.json +3 -2
- package/packages/abi/src/abi-method.js +6 -6
- package/packages/abi/src/abi-method.js.map +1 -1
- package/packages/abi/src/abi-method.mjs +6 -5
- package/packages/abi/src/abi-method.mjs.map +1 -1
- package/packages/abi/src/abi-type.js +9 -0
- package/packages/abi/src/abi-type.js.map +1 -1
- package/packages/abi/src/abi-type.mjs +9 -0
- package/packages/abi/src/abi-type.mjs.map +1 -1
- package/packages/abi/src/arc56-contract.js.map +1 -1
- package/packages/abi/src/arc56-contract.mjs.map +1 -1
- package/packages/abi/src/bigint.js.map +1 -1
- package/packages/abi/src/bigint.mjs.map +1 -1
- package/packages/abi/src/utils.js.map +1 -1
- package/packages/abi/src/utils.mjs.map +1 -1
- package/packages/algod_client/src/apis/api-service.js +3 -1
- package/packages/algod_client/src/apis/api-service.js.map +1 -1
- package/packages/algod_client/src/apis/api-service.mjs +3 -1
- package/packages/algod_client/src/apis/api-service.mjs.map +1 -1
- package/packages/algod_client/src/client.js.map +1 -1
- package/packages/algod_client/src/client.mjs.map +1 -1
- package/packages/algod_client/src/core/api-error.js.map +1 -1
- package/packages/algod_client/src/core/api-error.mjs.map +1 -1
- package/packages/algod_client/src/core/base-http-request.js +1 -0
- package/packages/algod_client/src/core/base-http-request.js.map +1 -1
- package/packages/algod_client/src/core/base-http-request.mjs +1 -0
- package/packages/algod_client/src/core/base-http-request.mjs.map +1 -1
- package/packages/algod_client/src/core/fetch-http-request.js.map +1 -1
- package/packages/algod_client/src/core/fetch-http-request.mjs.map +1 -1
- package/packages/algod_client/src/core/model-runtime.js.map +1 -1
- package/packages/algod_client/src/core/model-runtime.mjs.map +1 -1
- package/packages/algod_client/src/core/request.js.map +1 -1
- package/packages/algod_client/src/core/request.mjs.map +1 -1
- package/packages/algod_client/src/models/account-application-response.js.map +1 -1
- package/packages/algod_client/src/models/account-application-response.mjs.map +1 -1
- package/packages/algod_client/src/models/account-asset-response.js.map +1 -1
- package/packages/algod_client/src/models/account-asset-response.mjs.map +1 -1
- package/packages/algod_client/src/models/account-participation.js.map +1 -1
- package/packages/algod_client/src/models/account-participation.mjs.map +1 -1
- package/packages/algod_client/src/models/account-state-delta.js.map +1 -1
- package/packages/algod_client/src/models/account-state-delta.mjs.map +1 -1
- package/packages/algod_client/src/models/account.js.map +1 -1
- package/packages/algod_client/src/models/account.mjs.map +1 -1
- package/packages/algod_client/src/models/application-initial-states.js.map +1 -1
- package/packages/algod_client/src/models/application-initial-states.mjs.map +1 -1
- package/packages/algod_client/src/models/application-kv-storage.js.map +1 -1
- package/packages/algod_client/src/models/application-kv-storage.mjs.map +1 -1
- package/packages/algod_client/src/models/application-local-state.js.map +1 -1
- package/packages/algod_client/src/models/application-local-state.mjs.map +1 -1
- package/packages/algod_client/src/models/application-params.js.map +1 -1
- package/packages/algod_client/src/models/application-params.mjs.map +1 -1
- package/packages/algod_client/src/models/application-state-operation.js.map +1 -1
- package/packages/algod_client/src/models/application-state-operation.mjs.map +1 -1
- package/packages/algod_client/src/models/application-state-schema.js.map +1 -1
- package/packages/algod_client/src/models/application-state-schema.mjs.map +1 -1
- package/packages/algod_client/src/models/application.js.map +1 -1
- package/packages/algod_client/src/models/application.mjs.map +1 -1
- package/packages/algod_client/src/models/asset-holding.js.map +1 -1
- package/packages/algod_client/src/models/asset-holding.mjs.map +1 -1
- package/packages/algod_client/src/models/asset-params.js.map +1 -1
- package/packages/algod_client/src/models/asset-params.mjs.map +1 -1
- package/packages/algod_client/src/models/asset.js.map +1 -1
- package/packages/algod_client/src/models/asset.mjs.map +1 -1
- package/packages/algod_client/src/models/avm-key-value.js.map +1 -1
- package/packages/algod_client/src/models/avm-key-value.mjs.map +1 -1
- package/packages/algod_client/src/models/avm-value.js.map +1 -1
- package/packages/algod_client/src/models/avm-value.mjs.map +1 -1
- package/packages/algod_client/src/models/block-hash-response.js.map +1 -1
- package/packages/algod_client/src/models/block-hash-response.mjs.map +1 -1
- package/packages/algod_client/src/models/block-response.js.map +1 -1
- package/packages/algod_client/src/models/block-response.mjs.map +1 -1
- package/packages/algod_client/src/models/block-txids-response.js.map +1 -1
- package/packages/algod_client/src/models/block-txids-response.mjs.map +1 -1
- package/packages/algod_client/src/models/block.js.map +1 -1
- package/packages/algod_client/src/models/block.mjs.map +1 -1
- package/packages/algod_client/src/models/box-descriptor.js.map +1 -1
- package/packages/algod_client/src/models/box-descriptor.mjs.map +1 -1
- package/packages/algod_client/src/models/box.js.map +1 -1
- package/packages/algod_client/src/models/box.mjs.map +1 -1
- package/packages/algod_client/src/models/boxes-response.js.map +1 -1
- package/packages/algod_client/src/models/boxes-response.mjs.map +1 -1
- package/packages/algod_client/src/models/build-version.js.map +1 -1
- package/packages/algod_client/src/models/build-version.mjs.map +1 -1
- package/packages/algod_client/src/models/compile-response.js.map +1 -1
- package/packages/algod_client/src/models/compile-response.mjs.map +1 -1
- package/packages/algod_client/src/models/disassemble-response.js.map +1 -1
- package/packages/algod_client/src/models/disassemble-response.mjs.map +1 -1
- package/packages/algod_client/src/models/eval-delta-key-value.js.map +1 -1
- package/packages/algod_client/src/models/eval-delta-key-value.mjs.map +1 -1
- package/packages/algod_client/src/models/eval-delta.js.map +1 -1
- package/packages/algod_client/src/models/eval-delta.mjs.map +1 -1
- package/packages/algod_client/src/models/genesis-allocation.js.map +1 -1
- package/packages/algod_client/src/models/genesis-allocation.mjs.map +1 -1
- package/packages/algod_client/src/models/genesis.js.map +1 -1
- package/packages/algod_client/src/models/genesis.mjs.map +1 -1
- package/packages/algod_client/src/models/get-block-time-stamp-offset-response.js.map +1 -1
- package/packages/algod_client/src/models/get-block-time-stamp-offset-response.mjs.map +1 -1
- package/packages/algod_client/src/models/get-sync-round-response.js.map +1 -1
- package/packages/algod_client/src/models/get-sync-round-response.mjs.map +1 -1
- package/packages/algod_client/src/models/ledger-state-delta-for-transaction-group.js.map +1 -1
- package/packages/algod_client/src/models/ledger-state-delta-for-transaction-group.mjs.map +1 -1
- package/packages/algod_client/src/models/ledger-state-delta.js.map +1 -1
- package/packages/algod_client/src/models/ledger-state-delta.mjs.map +1 -1
- package/packages/algod_client/src/models/light-block-header-proof.js.map +1 -1
- package/packages/algod_client/src/models/light-block-header-proof.mjs.map +1 -1
- package/packages/algod_client/src/models/node-status-response.js.map +1 -1
- package/packages/algod_client/src/models/node-status-response.mjs.map +1 -1
- package/packages/algod_client/src/models/pending-transaction-response.js.map +1 -1
- package/packages/algod_client/src/models/pending-transaction-response.mjs.map +1 -1
- package/packages/algod_client/src/models/pending-transactions-response.js.map +1 -1
- package/packages/algod_client/src/models/pending-transactions-response.mjs.map +1 -1
- package/packages/algod_client/src/models/post-transactions-response.js.map +1 -1
- package/packages/algod_client/src/models/post-transactions-response.mjs.map +1 -1
- package/packages/algod_client/src/models/scratch-change.js.map +1 -1
- package/packages/algod_client/src/models/scratch-change.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-initial-states.js.map +1 -1
- package/packages/algod_client/src/models/simulate-initial-states.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-request-transaction-group.js.map +1 -1
- package/packages/algod_client/src/models/simulate-request-transaction-group.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-request.js.map +1 -1
- package/packages/algod_client/src/models/simulate-request.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-response.js.map +1 -1
- package/packages/algod_client/src/models/simulate-response.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-trace-config.js.map +1 -1
- package/packages/algod_client/src/models/simulate-trace-config.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-transaction-group-result.js.map +1 -1
- package/packages/algod_client/src/models/simulate-transaction-group-result.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-transaction-result.js.map +1 -1
- package/packages/algod_client/src/models/simulate-transaction-result.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js.map +1 -1
- package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs.map +1 -1
- package/packages/algod_client/src/models/simulation-eval-overrides.js.map +1 -1
- package/packages/algod_client/src/models/simulation-eval-overrides.mjs.map +1 -1
- package/packages/algod_client/src/models/simulation-opcode-trace-unit.js.map +1 -1
- package/packages/algod_client/src/models/simulation-opcode-trace-unit.mjs.map +1 -1
- package/packages/algod_client/src/models/simulation-transaction-exec-trace.js.map +1 -1
- package/packages/algod_client/src/models/simulation-transaction-exec-trace.mjs.map +1 -1
- package/packages/algod_client/src/models/source-map.js.map +1 -1
- package/packages/algod_client/src/models/source-map.mjs.map +1 -1
- package/packages/algod_client/src/models/state-delta.js.map +1 -1
- package/packages/algod_client/src/models/state-delta.mjs.map +1 -1
- package/packages/algod_client/src/models/state-proof-message.js.map +1 -1
- package/packages/algod_client/src/models/state-proof-message.mjs.map +1 -1
- package/packages/algod_client/src/models/state-proof.js.map +1 -1
- package/packages/algod_client/src/models/state-proof.mjs.map +1 -1
- package/packages/algod_client/src/models/supply-response.js.map +1 -1
- package/packages/algod_client/src/models/supply-response.mjs.map +1 -1
- package/packages/algod_client/src/models/teal-key-value-store.js.map +1 -1
- package/packages/algod_client/src/models/teal-key-value-store.mjs.map +1 -1
- package/packages/algod_client/src/models/teal-key-value.js.map +1 -1
- package/packages/algod_client/src/models/teal-key-value.mjs.map +1 -1
- package/packages/algod_client/src/models/teal-value.js.map +1 -1
- package/packages/algod_client/src/models/teal-value.mjs.map +1 -1
- package/packages/algod_client/src/models/transaction-group-ledger-state-deltas-for-round-response.js.map +1 -1
- package/packages/algod_client/src/models/transaction-group-ledger-state-deltas-for-round-response.mjs.map +1 -1
- package/packages/algod_client/src/models/transaction-parameters-response.js.map +1 -1
- package/packages/algod_client/src/models/transaction-parameters-response.mjs.map +1 -1
- package/packages/algod_client/src/models/transaction-proof.js.map +1 -1
- package/packages/algod_client/src/models/transaction-proof.mjs.map +1 -1
- package/packages/algod_client/src/models/version.js.map +1 -1
- package/packages/algod_client/src/models/version.mjs.map +1 -1
- package/packages/common/src/address.js.map +1 -1
- package/packages/common/src/address.mjs.map +1 -1
- package/packages/common/src/array.js.map +1 -1
- package/packages/common/src/array.mjs.map +1 -1
- package/packages/common/src/codecs/codec.js.map +1 -1
- package/packages/common/src/codecs/codec.mjs.map +1 -1
- package/packages/common/src/codecs/composite/array.js +1 -0
- package/packages/common/src/codecs/composite/array.js.map +1 -1
- package/packages/common/src/codecs/composite/array.mjs +1 -0
- package/packages/common/src/codecs/composite/array.mjs.map +1 -1
- package/packages/common/src/codecs/composite/map.js +2 -0
- package/packages/common/src/codecs/composite/map.js.map +1 -1
- package/packages/common/src/codecs/composite/map.mjs +2 -0
- package/packages/common/src/codecs/composite/map.mjs.map +1 -1
- package/packages/common/src/codecs/composite/record.js +1 -1
- package/packages/common/src/codecs/composite/record.js.map +1 -1
- package/packages/common/src/codecs/composite/record.mjs +1 -0
- package/packages/common/src/codecs/composite/record.mjs.map +1 -1
- package/packages/common/src/codecs/models/array-model.js +1 -0
- package/packages/common/src/codecs/models/array-model.js.map +1 -1
- package/packages/common/src/codecs/models/array-model.mjs +1 -0
- package/packages/common/src/codecs/models/array-model.mjs.map +1 -1
- package/packages/common/src/codecs/models/object-model.js +3 -1
- package/packages/common/src/codecs/models/object-model.js.map +1 -1
- package/packages/common/src/codecs/models/object-model.mjs +3 -1
- package/packages/common/src/codecs/models/object-model.mjs.map +1 -1
- package/packages/common/src/codecs/models/primitive-model.js +1 -0
- package/packages/common/src/codecs/models/primitive-model.js.map +1 -1
- package/packages/common/src/codecs/models/primitive-model.mjs +1 -0
- package/packages/common/src/codecs/models/primitive-model.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/address.js +0 -1
- package/packages/common/src/codecs/primitives/address.js.map +1 -1
- package/packages/common/src/codecs/primitives/address.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/bigint.js.map +1 -1
- package/packages/common/src/codecs/primitives/bigint.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/boolean.js.map +1 -1
- package/packages/common/src/codecs/primitives/boolean.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/bytes-base64.js +0 -1
- package/packages/common/src/codecs/primitives/bytes-base64.js.map +1 -1
- package/packages/common/src/codecs/primitives/bytes-base64.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/bytes.js +0 -1
- package/packages/common/src/codecs/primitives/bytes.js.map +1 -1
- package/packages/common/src/codecs/primitives/bytes.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/fixed-bytes.js +1 -1
- package/packages/common/src/codecs/primitives/fixed-bytes.js.map +1 -1
- package/packages/common/src/codecs/primitives/fixed-bytes.mjs +1 -0
- package/packages/common/src/codecs/primitives/fixed-bytes.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/number.js.map +1 -1
- package/packages/common/src/codecs/primitives/number.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/string.js.map +1 -1
- package/packages/common/src/codecs/primitives/string.mjs.map +1 -1
- package/packages/common/src/codecs/primitives/unknown.js.map +1 -1
- package/packages/common/src/codecs/primitives/unknown.mjs.map +1 -1
- package/packages/common/src/codecs/wire.js +0 -1
- package/packages/common/src/codecs/wire.js.map +1 -1
- package/packages/common/src/codecs/wire.mjs.map +1 -1
- package/packages/common/src/constants.js.map +1 -1
- package/packages/common/src/constants.mjs.map +1 -1
- package/packages/common/src/encoding.js +0 -1
- package/packages/common/src/encoding.js.map +1 -1
- package/packages/common/src/encoding.mjs.map +1 -1
- package/packages/common/src/json.js.map +1 -1
- package/packages/common/src/json.mjs.map +1 -1
- package/packages/common/src/msgpack.js +0 -1
- package/packages/common/src/msgpack.js.map +1 -1
- package/packages/common/src/msgpack.mjs.map +1 -1
- package/packages/common/src/sourcemap.js.map +1 -1
- package/packages/common/src/sourcemap.mjs.map +1 -1
- package/packages/{algo25/src → crypto/src/algo25}/english.js +1 -1
- package/packages/crypto/src/algo25/english.js.map +1 -0
- package/packages/{algo25/src → crypto/src/algo25}/english.mjs +1 -1
- package/packages/crypto/src/algo25/english.mjs.map +1 -0
- package/packages/{algo25/src → crypto/src/algo25}/index.d.ts +1 -1
- package/packages/{algo25/src → crypto/src/algo25}/index.js +2 -2
- package/packages/crypto/src/algo25/index.js.map +1 -0
- package/packages/{algo25/src → crypto/src/algo25}/index.mjs +2 -2
- package/packages/crypto/src/algo25/index.mjs.map +1 -0
- package/packages/crypto/src/ed25519.d.ts +13 -3
- package/packages/crypto/src/ed25519.js.map +1 -1
- package/packages/crypto/src/ed25519.mjs.map +1 -1
- package/packages/crypto/src/hash.js +0 -1
- package/packages/crypto/src/hash.js.map +1 -1
- package/packages/crypto/src/hash.mjs.map +1 -1
- package/packages/crypto/src/hd.d.ts +17 -4
- package/packages/crypto/src/hd.js +13 -1
- package/packages/crypto/src/hd.js.map +1 -1
- package/packages/crypto/src/hd.mjs +11 -1
- package/packages/crypto/src/hd.mjs.map +1 -1
- package/packages/crypto/src/index.d.ts +12 -6
- package/packages/crypto/src/index.js +27 -18
- package/packages/crypto/src/index.js.map +1 -1
- package/packages/crypto/src/index.mjs +27 -18
- package/packages/crypto/src/index.mjs.map +1 -1
- package/packages/indexer_client/src/apis/api-service.js +1 -0
- package/packages/indexer_client/src/apis/api-service.js.map +1 -1
- package/packages/indexer_client/src/apis/api-service.mjs +1 -0
- package/packages/indexer_client/src/apis/api-service.mjs.map +1 -1
- package/packages/indexer_client/src/client.js.map +1 -1
- package/packages/indexer_client/src/client.mjs.map +1 -1
- package/packages/indexer_client/src/core/api-error.js.map +1 -1
- package/packages/indexer_client/src/core/api-error.mjs.map +1 -1
- package/packages/indexer_client/src/core/base-http-request.js +1 -0
- package/packages/indexer_client/src/core/base-http-request.js.map +1 -1
- package/packages/indexer_client/src/core/base-http-request.mjs +1 -0
- package/packages/indexer_client/src/core/base-http-request.mjs.map +1 -1
- package/packages/indexer_client/src/core/fetch-http-request.js.map +1 -1
- package/packages/indexer_client/src/core/fetch-http-request.mjs.map +1 -1
- package/packages/indexer_client/src/core/model-runtime.js.map +1 -1
- package/packages/indexer_client/src/core/model-runtime.mjs.map +1 -1
- package/packages/indexer_client/src/core/request.js.map +1 -1
- package/packages/indexer_client/src/core/request.mjs.map +1 -1
- package/packages/indexer_client/src/models/account-participation.js.map +1 -1
- package/packages/indexer_client/src/models/account-participation.mjs.map +1 -1
- package/packages/indexer_client/src/models/account-response.js.map +1 -1
- package/packages/indexer_client/src/models/account-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/account-state-delta.js.map +1 -1
- package/packages/indexer_client/src/models/account-state-delta.mjs.map +1 -1
- package/packages/indexer_client/src/models/account.js.map +1 -1
- package/packages/indexer_client/src/models/account.mjs.map +1 -1
- package/packages/indexer_client/src/models/accounts-response.js.map +1 -1
- package/packages/indexer_client/src/models/accounts-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-local-state.js.map +1 -1
- package/packages/indexer_client/src/models/application-local-state.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-local-states-response.js.map +1 -1
- package/packages/indexer_client/src/models/application-local-states-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-log-data.js.map +1 -1
- package/packages/indexer_client/src/models/application-log-data.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-logs-response.js.map +1 -1
- package/packages/indexer_client/src/models/application-logs-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-params.js.map +1 -1
- package/packages/indexer_client/src/models/application-params.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-response.js.map +1 -1
- package/packages/indexer_client/src/models/application-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-state-schema.js.map +1 -1
- package/packages/indexer_client/src/models/application-state-schema.mjs.map +1 -1
- package/packages/indexer_client/src/models/application.js.map +1 -1
- package/packages/indexer_client/src/models/application.mjs.map +1 -1
- package/packages/indexer_client/src/models/applications-response.js.map +1 -1
- package/packages/indexer_client/src/models/applications-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset-balances-response.js.map +1 -1
- package/packages/indexer_client/src/models/asset-balances-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset-holding.js.map +1 -1
- package/packages/indexer_client/src/models/asset-holding.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset-holdings-response.js.map +1 -1
- package/packages/indexer_client/src/models/asset-holdings-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset-params.js.map +1 -1
- package/packages/indexer_client/src/models/asset-params.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset-response.js.map +1 -1
- package/packages/indexer_client/src/models/asset-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset.js.map +1 -1
- package/packages/indexer_client/src/models/asset.mjs.map +1 -1
- package/packages/indexer_client/src/models/assets-response.js.map +1 -1
- package/packages/indexer_client/src/models/assets-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/block-headers-response.js.map +1 -1
- package/packages/indexer_client/src/models/block-headers-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/block-rewards.js.map +1 -1
- package/packages/indexer_client/src/models/block-rewards.mjs.map +1 -1
- package/packages/indexer_client/src/models/block-upgrade-state.js.map +1 -1
- package/packages/indexer_client/src/models/block-upgrade-state.mjs.map +1 -1
- package/packages/indexer_client/src/models/block-upgrade-vote.js.map +1 -1
- package/packages/indexer_client/src/models/block-upgrade-vote.mjs.map +1 -1
- package/packages/indexer_client/src/models/block.js.map +1 -1
- package/packages/indexer_client/src/models/block.mjs.map +1 -1
- package/packages/indexer_client/src/models/box-descriptor.js.map +1 -1
- package/packages/indexer_client/src/models/box-descriptor.mjs.map +1 -1
- package/packages/indexer_client/src/models/box-reference.js.map +1 -1
- package/packages/indexer_client/src/models/box-reference.mjs.map +1 -1
- package/packages/indexer_client/src/models/box.js.map +1 -1
- package/packages/indexer_client/src/models/box.mjs.map +1 -1
- package/packages/indexer_client/src/models/boxes-response.js.map +1 -1
- package/packages/indexer_client/src/models/boxes-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/eval-delta-key-value.js.map +1 -1
- package/packages/indexer_client/src/models/eval-delta-key-value.mjs.map +1 -1
- package/packages/indexer_client/src/models/eval-delta.js.map +1 -1
- package/packages/indexer_client/src/models/eval-delta.mjs.map +1 -1
- package/packages/indexer_client/src/models/hash-factory.js.map +1 -1
- package/packages/indexer_client/src/models/hash-factory.mjs.map +1 -1
- package/packages/indexer_client/src/models/hb-proof-fields.js.map +1 -1
- package/packages/indexer_client/src/models/hb-proof-fields.mjs.map +1 -1
- package/packages/indexer_client/src/models/health-check.js.map +1 -1
- package/packages/indexer_client/src/models/health-check.mjs.map +1 -1
- package/packages/indexer_client/src/models/holding-ref.js.map +1 -1
- package/packages/indexer_client/src/models/holding-ref.mjs.map +1 -1
- package/packages/indexer_client/src/models/indexer-state-proof-message.js.map +1 -1
- package/packages/indexer_client/src/models/indexer-state-proof-message.mjs.map +1 -1
- package/packages/indexer_client/src/models/locals-ref.js.map +1 -1
- package/packages/indexer_client/src/models/locals-ref.mjs.map +1 -1
- package/packages/indexer_client/src/models/merkle-array-proof.js.map +1 -1
- package/packages/indexer_client/src/models/merkle-array-proof.mjs.map +1 -1
- package/packages/indexer_client/src/models/mini-asset-holding.js.map +1 -1
- package/packages/indexer_client/src/models/mini-asset-holding.mjs.map +1 -1
- package/packages/indexer_client/src/models/on-completion.js.map +1 -1
- package/packages/indexer_client/src/models/on-completion.mjs.map +1 -1
- package/packages/indexer_client/src/models/participation-updates.js.map +1 -1
- package/packages/indexer_client/src/models/participation-updates.mjs.map +1 -1
- package/packages/indexer_client/src/models/resource-ref.js.map +1 -1
- package/packages/indexer_client/src/models/resource-ref.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-delta.js.map +1 -1
- package/packages/indexer_client/src/models/state-delta.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-fields.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-fields.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-participant.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-participant.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-reveal.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-reveal.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-sig-slot.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-sig-slot.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-signature.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-signature.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-tracking.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-tracking.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-verifier.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-verifier.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-schema.js.map +1 -1
- package/packages/indexer_client/src/models/state-schema.mjs.map +1 -1
- package/packages/indexer_client/src/models/teal-key-value-store.js.map +1 -1
- package/packages/indexer_client/src/models/teal-key-value-store.mjs.map +1 -1
- package/packages/indexer_client/src/models/teal-key-value.js.map +1 -1
- package/packages/indexer_client/src/models/teal-key-value.mjs.map +1 -1
- package/packages/indexer_client/src/models/teal-value.js.map +1 -1
- package/packages/indexer_client/src/models/teal-value.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-application.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-application.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-asset-config.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-asset-config.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-asset-freeze.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-asset-freeze.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-asset-transfer.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-asset-transfer.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-heartbeat.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-heartbeat.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-keyreg.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-keyreg.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-payment.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-payment.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-response.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-response.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-logicsig.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-logicsig.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-multisig.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-multisig.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-state-proof.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-state-proof.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction.js.map +1 -1
- package/packages/indexer_client/src/models/transaction.mjs.map +1 -1
- package/packages/indexer_client/src/models/transactions-response.js.map +1 -1
- package/packages/indexer_client/src/models/transactions-response.mjs.map +1 -1
- package/packages/kmd_client/src/apis/api-service.js +4 -2
- package/packages/kmd_client/src/apis/api-service.js.map +1 -1
- package/packages/kmd_client/src/apis/api-service.mjs +4 -2
- package/packages/kmd_client/src/apis/api-service.mjs.map +1 -1
- package/packages/kmd_client/src/client.js.map +1 -1
- package/packages/kmd_client/src/client.mjs.map +1 -1
- package/packages/kmd_client/src/core/api-error.js.map +1 -1
- package/packages/kmd_client/src/core/api-error.mjs.map +1 -1
- package/packages/kmd_client/src/core/base-http-request.js +1 -0
- package/packages/kmd_client/src/core/base-http-request.js.map +1 -1
- package/packages/kmd_client/src/core/base-http-request.mjs +1 -0
- package/packages/kmd_client/src/core/base-http-request.mjs.map +1 -1
- package/packages/kmd_client/src/core/fetch-http-request.js.map +1 -1
- package/packages/kmd_client/src/core/fetch-http-request.mjs.map +1 -1
- package/packages/kmd_client/src/core/model-runtime.js.map +1 -1
- package/packages/kmd_client/src/core/model-runtime.mjs.map +1 -1
- package/packages/kmd_client/src/core/request.js.map +1 -1
- package/packages/kmd_client/src/core/request.mjs.map +1 -1
- package/packages/kmd_client/src/models/create-wallet-request.js.map +1 -1
- package/packages/kmd_client/src/models/create-wallet-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/create-wallet-response.js.map +1 -1
- package/packages/kmd_client/src/models/create-wallet-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/delete-key-request.js.map +1 -1
- package/packages/kmd_client/src/models/delete-key-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/delete-multisig-request.js.map +1 -1
- package/packages/kmd_client/src/models/delete-multisig-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/export-key-request.js.map +1 -1
- package/packages/kmd_client/src/models/export-key-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/export-key-response.js.map +1 -1
- package/packages/kmd_client/src/models/export-key-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/export-master-key-request.js.map +1 -1
- package/packages/kmd_client/src/models/export-master-key-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/export-master-key-response.js.map +1 -1
- package/packages/kmd_client/src/models/export-master-key-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/export-multisig-request.js.map +1 -1
- package/packages/kmd_client/src/models/export-multisig-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/export-multisig-response.js.map +1 -1
- package/packages/kmd_client/src/models/export-multisig-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/generate-key-request.js.map +1 -1
- package/packages/kmd_client/src/models/generate-key-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/generate-key-response.js.map +1 -1
- package/packages/kmd_client/src/models/generate-key-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/import-key-request.js.map +1 -1
- package/packages/kmd_client/src/models/import-key-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/import-key-response.js.map +1 -1
- package/packages/kmd_client/src/models/import-key-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/import-multisig-request.js.map +1 -1
- package/packages/kmd_client/src/models/import-multisig-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/import-multisig-response.js.map +1 -1
- package/packages/kmd_client/src/models/import-multisig-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/init-wallet-handle-token-request.js.map +1 -1
- package/packages/kmd_client/src/models/init-wallet-handle-token-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/init-wallet-handle-token-response.js.map +1 -1
- package/packages/kmd_client/src/models/init-wallet-handle-token-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/list-keys-request.js.map +1 -1
- package/packages/kmd_client/src/models/list-keys-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/list-keys-response.js.map +1 -1
- package/packages/kmd_client/src/models/list-keys-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/list-multisig-request.js.map +1 -1
- package/packages/kmd_client/src/models/list-multisig-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/list-multisig-response.js.map +1 -1
- package/packages/kmd_client/src/models/list-multisig-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/list-wallets-response.js.map +1 -1
- package/packages/kmd_client/src/models/list-wallets-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/multisig-sig.js.map +1 -1
- package/packages/kmd_client/src/models/multisig-sig.mjs.map +1 -1
- package/packages/kmd_client/src/models/multisig-subsig.js.map +1 -1
- package/packages/kmd_client/src/models/multisig-subsig.mjs.map +1 -1
- package/packages/kmd_client/src/models/release-wallet-handle-token-request.js.map +1 -1
- package/packages/kmd_client/src/models/release-wallet-handle-token-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/rename-wallet-request.js.map +1 -1
- package/packages/kmd_client/src/models/rename-wallet-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/rename-wallet-response.js.map +1 -1
- package/packages/kmd_client/src/models/rename-wallet-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/renew-wallet-handle-token-request.js.map +1 -1
- package/packages/kmd_client/src/models/renew-wallet-handle-token-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/renew-wallet-handle-token-response.js.map +1 -1
- package/packages/kmd_client/src/models/renew-wallet-handle-token-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-multisig-response.js.map +1 -1
- package/packages/kmd_client/src/models/sign-multisig-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-multisig-txn-request.js.map +1 -1
- package/packages/kmd_client/src/models/sign-multisig-txn-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-program-multisig-request.js.map +1 -1
- package/packages/kmd_client/src/models/sign-program-multisig-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-program-multisig-response.js.map +1 -1
- package/packages/kmd_client/src/models/sign-program-multisig-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-program-request.js.map +1 -1
- package/packages/kmd_client/src/models/sign-program-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-program-response.js.map +1 -1
- package/packages/kmd_client/src/models/sign-program-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-transaction-response.js.map +1 -1
- package/packages/kmd_client/src/models/sign-transaction-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/sign-txn-request.js.map +1 -1
- package/packages/kmd_client/src/models/sign-txn-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/tx-type.js.map +1 -1
- package/packages/kmd_client/src/models/tx-type.mjs.map +1 -1
- package/packages/kmd_client/src/models/versions-response.js.map +1 -1
- package/packages/kmd_client/src/models/versions-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/wallet-handle.js.map +1 -1
- package/packages/kmd_client/src/models/wallet-handle.mjs.map +1 -1
- package/packages/kmd_client/src/models/wallet-info-request.js.map +1 -1
- package/packages/kmd_client/src/models/wallet-info-request.mjs.map +1 -1
- package/packages/kmd_client/src/models/wallet-info-response.js.map +1 -1
- package/packages/kmd_client/src/models/wallet-info-response.mjs.map +1 -1
- package/packages/kmd_client/src/models/wallet.js.map +1 -1
- package/packages/kmd_client/src/models/wallet.mjs.map +1 -1
- package/packages/testing/src/globalSetup.js +0 -1
- package/packages/testing/src/globalSetup.js.map +1 -1
- package/packages/testing/src/globalSetup.mjs.map +1 -1
- package/packages/testing/src/mockServer.js.map +1 -1
- package/packages/testing/src/mockServer.mjs.map +1 -1
- package/packages/transact/src/logicsig.js +2 -1
- package/packages/transact/src/logicsig.js.map +1 -1
- package/packages/transact/src/logicsig.mjs +2 -1
- package/packages/transact/src/logicsig.mjs.map +1 -1
- package/packages/transact/src/multisig.js +0 -2
- package/packages/transact/src/multisig.js.map +1 -1
- package/packages/transact/src/multisig.mjs +0 -2
- package/packages/transact/src/multisig.mjs.map +1 -1
- package/packages/transact/src/signer.js.map +1 -1
- package/packages/transact/src/signer.mjs.map +1 -1
- package/packages/transact/src/transactions/app-call.js +22 -23
- package/packages/transact/src/transactions/app-call.js.map +1 -1
- package/packages/transact/src/transactions/app-call.mjs +22 -23
- package/packages/transact/src/transactions/app-call.mjs.map +1 -1
- package/packages/transact/src/transactions/asset-config.js +12 -13
- package/packages/transact/src/transactions/asset-config.js.map +1 -1
- package/packages/transact/src/transactions/asset-config.mjs +12 -13
- package/packages/transact/src/transactions/asset-config.mjs.map +1 -1
- package/packages/transact/src/transactions/asset-freeze.js +1 -2
- package/packages/transact/src/transactions/asset-freeze.js.map +1 -1
- package/packages/transact/src/transactions/asset-freeze.mjs +1 -2
- package/packages/transact/src/transactions/asset-freeze.mjs.map +1 -1
- package/packages/transact/src/transactions/asset-transfer.js +1 -2
- package/packages/transact/src/transactions/asset-transfer.js.map +1 -1
- package/packages/transact/src/transactions/asset-transfer.mjs +1 -2
- package/packages/transact/src/transactions/asset-transfer.mjs.map +1 -1
- package/packages/transact/src/transactions/common.js +5 -14
- package/packages/transact/src/transactions/common.js.map +1 -1
- package/packages/transact/src/transactions/common.mjs +6 -14
- package/packages/transact/src/transactions/common.mjs.map +1 -1
- package/packages/transact/src/transactions/key-registration.js +8 -9
- package/packages/transact/src/transactions/key-registration.js.map +1 -1
- package/packages/transact/src/transactions/key-registration.mjs +8 -9
- package/packages/transact/src/transactions/key-registration.mjs.map +1 -1
- package/packages/transact/src/transactions/reference-types-meta.js.map +1 -1
- package/packages/transact/src/transactions/reference-types-meta.mjs.map +1 -1
- package/packages/transact/src/transactions/signed-transaction-meta.js.map +1 -1
- package/packages/transact/src/transactions/signed-transaction-meta.mjs.map +1 -1
- package/packages/transact/src/transactions/signed-transaction.js.map +1 -1
- package/packages/transact/src/transactions/signed-transaction.mjs.map +1 -1
- package/packages/transact/src/transactions/transaction-meta.js +27 -26
- package/packages/transact/src/transactions/transaction-meta.js.map +1 -1
- package/packages/transact/src/transactions/transaction-meta.mjs +27 -26
- package/packages/transact/src/transactions/transaction-meta.mjs.map +1 -1
- package/packages/transact/src/transactions/transaction-type.js.map +1 -1
- package/packages/transact/src/transactions/transaction-type.mjs.map +1 -1
- package/packages/transact/src/transactions/transaction.js +2 -2
- package/packages/transact/src/transactions/transaction.js.map +1 -1
- package/packages/transact/src/transactions/transaction.mjs +2 -2
- package/packages/transact/src/transactions/transaction.mjs.map +1 -1
- package/testing/account.js.map +1 -1
- package/testing/account.mjs.map +1 -1
- package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -1
- package/testing/fixtures/algokit-log-capture-fixture.mjs.map +1 -1
- package/testing/fixtures/algorand-fixture.js.map +1 -1
- package/testing/fixtures/algorand-fixture.mjs.map +1 -1
- package/testing/indexer.js.map +1 -1
- package/testing/indexer.mjs.map +1 -1
- package/testing/test-logger.js.map +1 -1
- package/testing/test-logger.mjs.map +1 -1
- package/testing/transaction-logger.js.map +1 -1
- package/testing/transaction-logger.mjs.map +1 -1
- package/transaction/perform-transaction-composer-simulate.js.map +1 -1
- package/transaction/perform-transaction-composer-simulate.mjs.map +1 -1
- package/transaction/transaction.js.map +1 -1
- package/transaction/transaction.mjs.map +1 -1
- package/transactions/app-call.js +33 -43
- package/transactions/app-call.js.map +1 -1
- package/transactions/app-call.mjs +33 -43
- package/transactions/app-call.mjs.map +1 -1
- package/transactions/asset-config.js +5 -5
- package/transactions/asset-config.js.map +1 -1
- package/transactions/asset-config.mjs +5 -5
- package/transactions/asset-config.mjs.map +1 -1
- package/transactions/asset-transfer.js +4 -4
- package/transactions/asset-transfer.js.map +1 -1
- package/transactions/asset-transfer.mjs +4 -4
- package/transactions/asset-transfer.mjs.map +1 -1
- package/transactions/common.js.map +1 -1
- package/transactions/common.mjs.map +1 -1
- package/transactions/fee-coverage.js +7 -10
- package/transactions/fee-coverage.js.map +1 -1
- package/transactions/fee-coverage.mjs +7 -10
- package/transactions/fee-coverage.mjs.map +1 -1
- package/transactions/key-registration.js +3 -3
- package/transactions/key-registration.js.map +1 -1
- package/transactions/key-registration.mjs +3 -3
- package/transactions/key-registration.mjs.map +1 -1
- package/transactions/method-call.js +8 -8
- package/transactions/method-call.js.map +1 -1
- package/transactions/method-call.mjs +8 -8
- package/transactions/method-call.mjs.map +1 -1
- package/transactions/payment.js +2 -2
- package/transactions/payment.js.map +1 -1
- package/transactions/payment.mjs +2 -2
- package/transactions/payment.mjs.map +1 -1
- package/types/account.js.map +1 -1
- package/types/algorand-client-transaction-creator.js.map +1 -1
- package/types/algorand-client-transaction-sender.js.map +1 -1
- package/types/algorand-client.js.map +1 -1
- package/types/amount.js.map +1 -1
- package/types/app-client.js.map +1 -1
- package/types/app-deployer.js.map +1 -1
- package/types/app-factory.js.map +1 -1
- package/types/app-manager.js.map +1 -1
- package/types/app-spec.js.map +1 -1
- package/types/asset-manager.js.map +1 -1
- package/types/async-event-emitter.js.map +1 -1
- package/types/client-manager.js.map +1 -1
- package/types/composer.js.map +1 -1
- package/types/config.js.map +1 -1
- package/types/dispenser-client.js.map +1 -1
- package/types/kmd-account-manager.js.map +1 -1
- package/types/lifecycle-events.js.map +1 -1
- package/types/logic-error.js.map +1 -1
- package/types/network-client.js.map +1 -1
- package/updatable-config.js.map +1 -1
- package/updatable-config.mjs.map +1 -1
- package/util.js.map +1 -1
- package/util.mjs.map +1 -1
- package/packages/algo25/src/english.js.map +0 -1
- package/packages/algo25/src/english.mjs.map +0 -1
- package/packages/algo25/src/index.js.map +0 -1
- package/packages/algo25/src/index.mjs.map +0 -1
package/network-manager.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-manager.mjs","names":[],"sources":["../src/network-manager.ts"],"sourcesContent":["import { AlgodClient } from '@algorandfoundation/algokit-algod-client'\nimport type { AlgorandClient } from './algorand-client'\nimport { AlgoAmount } from './amount'\n\n/** Options for waiting until a specific timestamp is reached on the blockchain. */\nexport interface WaitUntilTimestampOptions {\n /** Estimated block time in seconds, used to calculate rounds to wait. Should be slightly lower than average to undershoot. Defaults to 2.7. */\n blockTimeSeconds?: number\n /** Polling interval in milliseconds when close to target. Defaults to 1000. */\n pollingIntervalMs?: number\n /** Timeout in milliseconds for the polling loop. Defaults to 5000. */\n pollingTimeoutMs?: number\n}\n\n/**\n * Manager for LocalNet-specific network operations.\n * These methods only work on LocalNet and will throw an error if called on other networks.\n */\nexport class LocalNetManager {\n private _algod: AlgodClient\n private _networkManager: NetworkManager\n private _algorand: AlgorandClient\n\n /** @param algod The algod client to use for LocalNet operations */\n constructor(algod: AlgodClient, networkManager: NetworkManager, algorand: AlgorandClient) {\n this._algod = algod\n this._networkManager = networkManager\n this._algorand = algorand\n }\n\n private async _ensureLocalNet(): Promise<void> {\n if (!(await this._algorand.client.isLocalNet())) {\n throw new Error('LocalNet methods are only available when connected to a LocalNet network')\n }\n }\n\n /**\n * Generates a single block by sending a zero-amount payment transaction from the dispenser to itself.\n * This triggers block creation in LocalNet dev mode.\n */\n private async _generateBlock(): Promise<void> {\n const algorand = this._algorand\n const dispenser = await algorand.account.localNetDispenser()\n await algorand.send.payment({\n sender: dispenser,\n receiver: dispenser,\n amount: AlgoAmount.MicroAlgo(0),\n note: 'algokit-utils:block-generation',\n })\n }\n\n /**\n * Advances the blockchain by generating blocks until the target round is reached.\n * @param targetRound The round number to advance to\n * @throws Error if not connected to LocalNet\n * @example\n * ```typescript\n * // Advance LocalNet to round 100\n * await algorand.network.localNet.blockWarp(100n)\n * ```\n */\n async blockWarp(targetRound: bigint): Promise<void> {\n await this._ensureLocalNet()\n\n // Generate blocks until we reach the target round\n while ((await this._networkManager.getLastRound()) < targetRound) {\n await this._generateBlock()\n }\n }\n\n /**\n * Advances the blockchain timestamp to a target Unix timestamp.\n * @param targetTimestamp The target Unix timestamp in seconds\n * @throws Error if not connected to LocalNet\n * @example\n * ```typescript\n * // Advance LocalNet time by 1 hour\n * const oneHourFromNow = BigInt(Math.floor(Date.now() / 1000)) + 3600n\n * await algorand.network.localNet.timeWarp(oneHourFromNow)\n * ```\n */\n async timeWarp(targetTimestamp: bigint): Promise<void> {\n await this._ensureLocalNet()\n\n const currentTimestamp = await this._networkManager.getLatestTimestamp()\n const offsetSeconds = Number(targetTimestamp - currentTimestamp)\n\n // Set the timestamp offset so the next block will have the target timestamp\n await this._algod.setBlockTimeStampOffset(offsetSeconds)\n // Generate a block with the new timestamp\n await this._generateBlock()\n // Reset the offset to use real clock for subsequent blocks\n await this._algod.setBlockTimeStampOffset(0)\n }\n}\n\n/**\n * Manager for network-related operations.\n * Provides utilities for querying blockchain state and waiting for specific conditions.\n */\nexport class NetworkManager {\n private _algod: AlgodClient\n private _algorand: AlgorandClient\n private _localNet: LocalNetManager | undefined\n\n /**\n * Create a new NetworkManager instance.\n * @param algod The algod client to use for network operations\n * @param algorand The AlgorandClient instance (for LocalNet operations)\n */\n constructor(algod: AlgodClient, algorand: AlgorandClient) {\n this._algod = algod\n this._algorand = algorand\n }\n\n /**\n * Get the last committed round number.\n * @returns The last round number\n * @example\n * ```typescript\n * const lastRound = await algorand.network.getLastRound()\n * console.log(`Current round: ${lastRound}`)\n * ```\n */\n async getLastRound(): Promise<bigint> {\n const status = await this._algod.status()\n return status.lastRound\n }\n\n /**\n * Get the Unix timestamp of the latest block.\n *\n * Note: This method makes two sequential API calls (status then block fetch).\n * The round may advance between these calls, so the returned timestamp may not\n * be from the actual latest timestamp.\n *\n * @returns The UNIX timestamp of the last round\n * @example\n * ```typescript\n * const timestamp = await algorand.network.getLatestTimestamp()\n * console.log(`Latest block time: ${new Date(Number(timestamp) * 1000)}`)\n * ```\n */\n async getLatestTimestamp(): Promise<bigint> {\n const status = await this._algod.status()\n const block = await this._algod.block(status.lastRound)\n return block.block.header.timestamp\n }\n\n /**\n * Wait until a specific round is reached.\n *\n * @param targetRound The round number to wait for\n * @throws Error if timeout is reached before the target round\n * @example\n * ```typescript\n * // Wait for round 1000\n * await algorand.network.waitUntilRound(1000n)\n *\n * // Wait with a 30 second timeout\n * await algorand.network.waitUntilRound(1000n, 30000)\n * ```\n */\n async waitUntilRound(targetRound: bigint): Promise<void> {\n let status = await this._algod.status()\n\n // statusAfterBlock has 1 min timeout, loop if target not reached\n while (status.lastRound < targetRound) {\n status = await this._algod.statusAfterBlock(status.lastRound)\n }\n }\n\n /**\n * Wait until a specific Unix timestamp is reached on the blockchain.\n *\n * @param targetTimestamp The target Unix timestamp in seconds\n * @param options Optional parameters for waiting\n * @example\n * ```typescript\n * // Wait until a specific time\n * const futureTime = BigInt(Math.floor(Date.now() / 1000)) + 60n // 1 minute from now\n * await algorand.network.waitUntilTimestamp(futureTime)\n *\n * // Wait with custom timing parameters\n * await algorand.network.waitUntilTimestamp(futureTime, { blockTimeSeconds: 3.0, pollingIntervalMs: 500 })\n * ```\n */\n async waitUntilTimestamp(targetTimestamp: bigint, options?: WaitUntilTimestampOptions): Promise<void> {\n // Note: this method reduces the number of calls to algod\n // by estimating the number of rounds to wait first\n // then wait for the target round to be committed\n // then poll every second for the right timestamp\n\n // blockTimeSeconds should be slightly lower than the average block time so that it will undershoot\n const blockTimeSeconds = options?.blockTimeSeconds ?? 2.7\n const pollingIntervalMs = options?.pollingIntervalMs ?? 1000\n const pollingTimeoutMs = options?.pollingTimeoutMs ?? 5000\n\n const currentStatus = await this._algod.status()\n const currentRound = currentStatus.lastRound\n const currentBlock = await this._algod.block(currentRound)\n const currentBlockTimestamp = currentBlock.block.header.timestamp\n\n if (currentBlockTimestamp >= targetTimestamp) return\n\n const secondsToWait = Number(targetTimestamp - currentBlockTimestamp)\n const roundsToWait = Math.floor(secondsToWait / blockTimeSeconds)\n\n // Wait for estimated round\n if (roundsToWait > 1) {\n await this.waitUntilRound(currentRound + BigInt(roundsToWait))\n }\n\n const pollingStartTime = Date.now()\n while (true) {\n const latestTimeStamp = await this.getLatestTimestamp()\n if (latestTimeStamp > targetTimestamp) {\n return\n }\n\n if (Date.now() - pollingStartTime >= pollingTimeoutMs) {\n throw new Error(`Timeout waiting for timestamp ${targetTimestamp} (current: ${latestTimeStamp})`)\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingIntervalMs))\n }\n }\n\n /**\n * Get LocalNet-specific network utilities.\n * These methods only work when connected to a LocalNet network and will throw\n * an error if called on other networks.\n *\n * @returns The LocalNetManager instance\n * @example\n * ```typescript\n * // Block warp on LocalNet\n * await algorand.network.localNet.blockWarp(100n)\n *\n * // Time warp on LocalNet\n * await algorand.network.localNet.timeWarp(BigInt(Date.now() / 1000) + 3600n)\n * ```\n */\n get localNet(): LocalNetManager {\n if (!this._localNet) {\n this._localNet = new LocalNetManager(this._algod, this, this._algorand)\n }\n return this._localNet\n }\n}\n"],"mappings":";;;;;;AAkBA,IAAa,kBAAb,MAA6B;CAC3B;CACA;CACA;;CAGA,YAAY,OAAoB,gBAAgC,UAA0B;AACxF,OAAK,SAAS;AACd,OAAK,kBAAkB;AACvB,OAAK,YAAY;;CAGnB,MAAc,kBAAiC;AAC7C,MAAI,CAAE,MAAM,KAAK,UAAU,OAAO,YAAY,CAC5C,OAAM,IAAI,MAAM,2EAA2E;;;;;;CAQ/F,MAAc,iBAAgC;EAC5C,MAAM,WAAW,KAAK;EACtB,MAAM,YAAY,MAAM,SAAS,QAAQ,mBAAmB;AAC5D,QAAM,SAAS,KAAK,QAAQ;GAC1B,QAAQ;GACR,UAAU;GACV,QAAQ,WAAW,UAAU,EAAE;GAC/B,MAAM;GACP,CAAC;;;;;;;;;;;;CAaJ,MAAM,UAAU,aAAoC;AAClD,QAAM,KAAK,iBAAiB;AAG5B,SAAQ,MAAM,KAAK,gBAAgB,cAAc,GAAI,YACnD,OAAM,KAAK,gBAAgB;;;;;;;;;;;;;CAe/B,MAAM,SAAS,iBAAwC;AACrD,QAAM,KAAK,iBAAiB;EAE5B,MAAM,mBAAmB,MAAM,KAAK,gBAAgB,oBAAoB;EACxE,MAAM,gBAAgB,OAAO,kBAAkB,iBAAiB;AAGhE,QAAM,KAAK,OAAO,wBAAwB,cAAc;AAExD,QAAM,KAAK,gBAAgB;AAE3B,QAAM,KAAK,OAAO,wBAAwB,EAAE;;;;;;;AAQhD,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;;;;;;CAOA,YAAY,OAAoB,UAA0B;AACxD,OAAK,SAAS;AACd,OAAK,YAAY;;;;;;;;;;;CAYnB,MAAM,eAAgC;AAEpC,UADe,MAAM,KAAK,OAAO,QAAQ,EAC3B;;;;;;;;;;;;;;;;CAiBhB,MAAM,qBAAsC;EAC1C,MAAM,SAAS,MAAM,KAAK,OAAO,QAAQ;AAEzC,UADc,MAAM,KAAK,OAAO,MAAM,OAAO,UAAU,EAC1C,MAAM,OAAO;;;;;;;;;;;;;;;;CAiB5B,MAAM,eAAe,aAAoC;EACvD,IAAI,SAAS,MAAM,KAAK,OAAO,QAAQ;AAGvC,SAAO,OAAO,YAAY,YACxB,UAAS,MAAM,KAAK,OAAO,iBAAiB,OAAO,UAAU;;;;;;;;;;;;;;;;;CAmBjE,MAAM,mBAAmB,iBAAyB,SAAoD;EAOpG,MAAM,mBAAmB,SAAS,oBAAoB;EACtD,MAAM,oBAAoB,SAAS,qBAAqB;EACxD,MAAM,mBAAmB,SAAS,oBAAoB;EAGtD,MAAM,gBADgB,MAAM,KAAK,OAAO,QAAQ,EACb;EAEnC,MAAM,yBADe,MAAM,KAAK,OAAO,MAAM,aAAa,EACf,MAAM,OAAO;AAExD,MAAI,yBAAyB,gBAAiB;EAE9C,MAAM,gBAAgB,OAAO,kBAAkB,sBAAsB;EACrE,MAAM,eAAe,KAAK,MAAM,gBAAgB,iBAAiB;AAGjE,MAAI,eAAe,EACjB,OAAM,KAAK,eAAe,eAAe,OAAO,aAAa,CAAC;EAGhE,MAAM,mBAAmB,KAAK,KAAK;AACnC,SAAO,MAAM;GACX,MAAM,kBAAkB,MAAM,KAAK,oBAAoB;AACvD,OAAI,kBAAkB,gBACpB;AAGF,OAAI,KAAK,KAAK,GAAG,oBAAoB,iBACnC,OAAM,IAAI,MAAM,iCAAiC,gBAAgB,aAAa,gBAAgB,GAAG;AAGnG,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;CAmB1E,IAAI,WAA4B;AAC9B,MAAI,CAAC,KAAK,UACR,MAAK,YAAY,IAAI,gBAAgB,KAAK,QAAQ,MAAM,KAAK,UAAU;AAEzE,SAAO,KAAK"}
|
|
1
|
+
{"version":3,"file":"network-manager.mjs","names":[],"sources":["../src/network-manager.ts"],"sourcesContent":["import { AlgodClient } from '@algorandfoundation/algokit-algod-client'\nimport type { AlgorandClient } from './algorand-client'\nimport { AlgoAmount } from './amount'\n\n/** Options for waiting until a specific timestamp is reached on the blockchain. */\nexport interface WaitUntilTimestampOptions {\n /** Estimated block time in seconds, used to calculate rounds to wait. Should be slightly lower than average to undershoot. Defaults to 2.7. */\n blockTimeSeconds?: number\n /** Polling interval in milliseconds when close to target. Defaults to 1000. */\n pollingIntervalMs?: number\n /** Timeout in milliseconds for the polling loop. Defaults to 5000. */\n pollingTimeoutMs?: number\n}\n\n/**\n * Manager for LocalNet-specific network operations.\n * These methods only work on LocalNet and will throw an error if called on other networks.\n */\nexport class LocalNetManager {\n private _algod: AlgodClient\n private _networkManager: NetworkManager\n private _algorand: AlgorandClient\n\n /** @param algod The algod client to use for LocalNet operations */\n constructor(algod: AlgodClient, networkManager: NetworkManager, algorand: AlgorandClient) {\n this._algod = algod\n this._networkManager = networkManager\n this._algorand = algorand\n }\n\n private async _ensureLocalNet(): Promise<void> {\n if (!(await this._algorand.client.isLocalNet())) {\n throw new Error('LocalNet methods are only available when connected to a LocalNet network')\n }\n }\n\n /**\n * Generates a single block by sending a zero-amount payment transaction from the dispenser to itself.\n * This triggers block creation in LocalNet dev mode.\n */\n private async _generateBlock(): Promise<void> {\n const algorand = this._algorand\n const dispenser = await algorand.account.localNetDispenser()\n await algorand.send.payment({\n sender: dispenser,\n receiver: dispenser,\n amount: AlgoAmount.MicroAlgo(0),\n note: 'algokit-utils:block-generation',\n })\n }\n\n /**\n * Advances the blockchain by generating blocks until the target round is reached.\n * @param targetRound The round number to advance to\n * @throws Error if not connected to LocalNet\n * @example\n * ```typescript\n * // Advance LocalNet to round 100\n * await algorand.network.localNet.blockWarp(100n)\n * ```\n */\n async blockWarp(targetRound: bigint): Promise<void> {\n await this._ensureLocalNet()\n\n // Generate blocks until we reach the target round\n while ((await this._networkManager.getLastRound()) < targetRound) {\n await this._generateBlock()\n }\n }\n\n /**\n * Advances the blockchain timestamp to a target Unix timestamp.\n * @param targetTimestamp The target Unix timestamp in seconds\n * @throws Error if not connected to LocalNet\n * @example\n * ```typescript\n * // Advance LocalNet time by 1 hour\n * const oneHourFromNow = BigInt(Math.floor(Date.now() / 1000)) + 3600n\n * await algorand.network.localNet.timeWarp(oneHourFromNow)\n * ```\n */\n async timeWarp(targetTimestamp: bigint): Promise<void> {\n await this._ensureLocalNet()\n\n const currentTimestamp = await this._networkManager.getLatestTimestamp()\n const offsetSeconds = Number(targetTimestamp - currentTimestamp)\n\n // Set the timestamp offset so the next block will have the target timestamp\n await this._algod.setBlockTimeStampOffset(offsetSeconds)\n // Generate a block with the new timestamp\n await this._generateBlock()\n // Reset the offset to use real clock for subsequent blocks\n await this._algod.setBlockTimeStampOffset(0)\n }\n}\n\n/**\n * Manager for network-related operations.\n * Provides utilities for querying blockchain state and waiting for specific conditions.\n */\nexport class NetworkManager {\n private _algod: AlgodClient\n private _algorand: AlgorandClient\n private _localNet: LocalNetManager | undefined\n\n /**\n * Create a new NetworkManager instance.\n * @param algod The algod client to use for network operations\n * @param algorand The AlgorandClient instance (for LocalNet operations)\n */\n constructor(algod: AlgodClient, algorand: AlgorandClient) {\n this._algod = algod\n this._algorand = algorand\n }\n\n /**\n * Get the last committed round number.\n * @returns The last round number\n * @example\n * ```typescript\n * const lastRound = await algorand.network.getLastRound()\n * console.log(`Current round: ${lastRound}`)\n * ```\n */\n async getLastRound(): Promise<bigint> {\n const status = await this._algod.status()\n return status.lastRound\n }\n\n /**\n * Get the Unix timestamp of the latest block.\n *\n * Note: This method makes two sequential API calls (status then block fetch).\n * The round may advance between these calls, so the returned timestamp may not\n * be from the actual latest timestamp.\n *\n * @returns The UNIX timestamp of the last round\n * @example\n * ```typescript\n * const timestamp = await algorand.network.getLatestTimestamp()\n * console.log(`Latest block time: ${new Date(Number(timestamp) * 1000)}`)\n * ```\n */\n async getLatestTimestamp(): Promise<bigint> {\n const status = await this._algod.status()\n const block = await this._algod.block(status.lastRound)\n return block.block.header.timestamp\n }\n\n /**\n * Wait until a specific round is reached.\n *\n * @param targetRound The round number to wait for\n * @throws Error if timeout is reached before the target round\n * @example\n * ```typescript\n * // Wait for round 1000\n * await algorand.network.waitUntilRound(1000n)\n *\n * // Wait with a 30 second timeout\n * await algorand.network.waitUntilRound(1000n, 30000)\n * ```\n */\n async waitUntilRound(targetRound: bigint): Promise<void> {\n let status = await this._algod.status()\n\n // statusAfterBlock has 1 min timeout, loop if target not reached\n while (status.lastRound < targetRound) {\n status = await this._algod.statusAfterBlock(status.lastRound)\n }\n }\n\n /**\n * Wait until a specific Unix timestamp is reached on the blockchain.\n *\n * @param targetTimestamp The target Unix timestamp in seconds\n * @param options Optional parameters for waiting\n * @example\n * ```typescript\n * // Wait until a specific time\n * const futureTime = BigInt(Math.floor(Date.now() / 1000)) + 60n // 1 minute from now\n * await algorand.network.waitUntilTimestamp(futureTime)\n *\n * // Wait with custom timing parameters\n * await algorand.network.waitUntilTimestamp(futureTime, { blockTimeSeconds: 3.0, pollingIntervalMs: 500 })\n * ```\n */\n async waitUntilTimestamp(targetTimestamp: bigint, options?: WaitUntilTimestampOptions): Promise<void> {\n // Note: this method reduces the number of calls to algod\n // by estimating the number of rounds to wait first\n // then wait for the target round to be committed\n // then poll every second for the right timestamp\n\n // blockTimeSeconds should be slightly lower than the average block time so that it will undershoot\n const blockTimeSeconds = options?.blockTimeSeconds ?? 2.7\n const pollingIntervalMs = options?.pollingIntervalMs ?? 1000\n const pollingTimeoutMs = options?.pollingTimeoutMs ?? 5000\n\n const currentStatus = await this._algod.status()\n const currentRound = currentStatus.lastRound\n const currentBlock = await this._algod.block(currentRound)\n const currentBlockTimestamp = currentBlock.block.header.timestamp\n\n if (currentBlockTimestamp >= targetTimestamp) return\n\n const secondsToWait = Number(targetTimestamp - currentBlockTimestamp)\n const roundsToWait = Math.floor(secondsToWait / blockTimeSeconds)\n\n // Wait for estimated round\n if (roundsToWait > 1) {\n await this.waitUntilRound(currentRound + BigInt(roundsToWait))\n }\n\n const pollingStartTime = Date.now()\n while (true) {\n const latestTimeStamp = await this.getLatestTimestamp()\n if (latestTimeStamp > targetTimestamp) {\n return\n }\n\n if (Date.now() - pollingStartTime >= pollingTimeoutMs) {\n throw new Error(`Timeout waiting for timestamp ${targetTimestamp} (current: ${latestTimeStamp})`)\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingIntervalMs))\n }\n }\n\n /**\n * Get LocalNet-specific network utilities.\n * These methods only work when connected to a LocalNet network and will throw\n * an error if called on other networks.\n *\n * @returns The LocalNetManager instance\n * @example\n * ```typescript\n * // Block warp on LocalNet\n * await algorand.network.localNet.blockWarp(100n)\n *\n * // Time warp on LocalNet\n * await algorand.network.localNet.timeWarp(BigInt(Date.now() / 1000) + 3600n)\n * ```\n */\n get localNet(): LocalNetManager {\n if (!this._localNet) {\n this._localNet = new LocalNetManager(this._algod, this, this._algorand)\n }\n return this._localNet\n }\n}\n"],"mappings":";;;;;;AAkBA,IAAa,kBAAb,MAA6B;CAC3B;CACA;CACA;;CAGA,YAAY,OAAoB,gBAAgC,UAA0B;EACxF,KAAK,SAAS;EACd,KAAK,kBAAkB;EACvB,KAAK,YAAY;CACnB;CAEA,MAAc,kBAAiC;EAC7C,IAAI,CAAE,MAAM,KAAK,UAAU,OAAO,WAAW,GAC3C,MAAM,IAAI,MAAM,0EAA0E;CAE9F;;;;;CAMA,MAAc,iBAAgC;EAC5C,MAAM,WAAW,KAAK;EACtB,MAAM,YAAY,MAAM,SAAS,QAAQ,kBAAkB;EAC3D,MAAM,SAAS,KAAK,QAAQ;GAC1B,QAAQ;GACR,UAAU;GACV,QAAQ,WAAW,UAAU,CAAC;GAC9B,MAAM;EACR,CAAC;CACH;;;;;;;;;;;CAYA,MAAM,UAAU,aAAoC;EAClD,MAAM,KAAK,gBAAgB;EAG3B,OAAQ,MAAM,KAAK,gBAAgB,aAAa,IAAK,aACnD,MAAM,KAAK,eAAe;CAE9B;;;;;;;;;;;;CAaA,MAAM,SAAS,iBAAwC;EACrD,MAAM,KAAK,gBAAgB;EAE3B,MAAM,mBAAmB,MAAM,KAAK,gBAAgB,mBAAmB;EACvE,MAAM,gBAAgB,OAAO,kBAAkB,gBAAgB;EAG/D,MAAM,KAAK,OAAO,wBAAwB,aAAa;EAEvD,MAAM,KAAK,eAAe;EAE1B,MAAM,KAAK,OAAO,wBAAwB,CAAC;CAC7C;AACF;;;;;AAMA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;;;;;;CAOA,YAAY,OAAoB,UAA0B;EACxD,KAAK,SAAS;EACd,KAAK,YAAY;CACnB;;;;;;;;;;CAWA,MAAM,eAAgC;EAEpC,QAAO,MADc,KAAK,OAAO,OAAO,GAC1B;CAChB;;;;;;;;;;;;;;;CAgBA,MAAM,qBAAsC;EAC1C,MAAM,SAAS,MAAM,KAAK,OAAO,OAAO;EAExC,QAAO,MADa,KAAK,OAAO,MAAM,OAAO,SAAS,GACzC,MAAM,OAAO;CAC5B;;;;;;;;;;;;;;;CAgBA,MAAM,eAAe,aAAoC;EACvD,IAAI,SAAS,MAAM,KAAK,OAAO,OAAO;EAGtC,OAAO,OAAO,YAAY,aACxB,SAAS,MAAM,KAAK,OAAO,iBAAiB,OAAO,SAAS;CAEhE;;;;;;;;;;;;;;;;CAiBA,MAAM,mBAAmB,iBAAyB,SAAoD;EAOpG,MAAM,mBAAmB,SAAS,oBAAoB;EACtD,MAAM,oBAAoB,SAAS,qBAAqB;EACxD,MAAM,mBAAmB,SAAS,oBAAoB;EAGtD,MAAM,gBAAe,MADO,KAAK,OAAO,OAAO,GACZ;EAEnC,MAAM,yBAAwB,MADH,KAAK,OAAO,MAAM,YAAY,GACd,MAAM,OAAO;EAExD,IAAI,yBAAyB,iBAAiB;EAE9C,MAAM,gBAAgB,OAAO,kBAAkB,qBAAqB;EACpE,MAAM,eAAe,KAAK,MAAM,gBAAgB,gBAAgB;EAGhE,IAAI,eAAe,GACjB,MAAM,KAAK,eAAe,eAAe,OAAO,YAAY,CAAC;EAG/D,MAAM,mBAAmB,KAAK,IAAI;EAClC,OAAO,MAAM;GACX,MAAM,kBAAkB,MAAM,KAAK,mBAAmB;GACtD,IAAI,kBAAkB,iBACpB;GAGF,IAAI,KAAK,IAAI,IAAI,oBAAoB,kBACnC,MAAM,IAAI,MAAM,iCAAiC,gBAAgB,aAAa,gBAAgB,EAAE;GAGlG,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,iBAAiB,CAAC;EACvE;CACF;;;;;;;;;;;;;;;;CAiBA,IAAI,WAA4B;EAC9B,IAAI,CAAC,KAAK,WACR,KAAK,YAAY,IAAI,gBAAgB,KAAK,QAAQ,MAAM,KAAK,SAAS;EAExE,OAAO,KAAK;CACd;AACF"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"**"
|
|
7
7
|
],
|
|
8
8
|
"name": "@algorandfoundation/algokit-utils",
|
|
9
|
-
"version": "10.0.0-beta.
|
|
9
|
+
"version": "10.0.0-beta.4",
|
|
10
10
|
"private": false,
|
|
11
11
|
"description": "A set of core Algorand utilities written in TypeScript and released via npm that make it easier to build solutions on Algorand.",
|
|
12
12
|
"author": "Algorand Foundation",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"url": "https://github.com/algorandfoundation/algokit-utils-ts.git"
|
|
17
17
|
},
|
|
18
18
|
"engines": {
|
|
19
|
-
"node": ">=
|
|
19
|
+
"node": ">=22.0"
|
|
20
20
|
},
|
|
21
21
|
"type": "commonjs",
|
|
22
22
|
"module": "index.mjs",
|
|
@@ -100,6 +100,7 @@
|
|
|
100
100
|
"@noble/curves": "^2.0.1",
|
|
101
101
|
"@noble/ed25519": "^3.0.0",
|
|
102
102
|
"@noble/hashes": "^2.0.1",
|
|
103
|
+
"@scure/bip39": "^2.2.0",
|
|
103
104
|
"algorand-msgpack": "^1.1.0",
|
|
104
105
|
"buffer": "^6.0.3",
|
|
105
106
|
"dotenv": "^16.4.5",
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.js");
|
|
2
1
|
const require_abi_type = require("./abi-type.js");
|
|
3
2
|
let _noble_hashes_sha2_js = require("@noble/hashes/sha2.js");
|
|
4
3
|
//#region packages/abi/src/abi-method.ts
|
|
@@ -42,7 +41,8 @@ var ABIMethod = class ABIMethod {
|
|
|
42
41
|
if (argTypeIsTransaction(arg.type) || argTypeIsReference(arg.type)) return arg.type;
|
|
43
42
|
return arg.type.name;
|
|
44
43
|
}).join(",");
|
|
45
|
-
|
|
44
|
+
const returns = this.returns.type === "void" ? "void" : this.returns.type.name;
|
|
45
|
+
return `${this.name}(${args})${returns}`;
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
48
|
* Returns the method selector of this ABI method.
|
|
@@ -149,10 +149,10 @@ function arc56MethodToABIMethod(method, appSpec) {
|
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
function argTypeIsTransaction(type) {
|
|
152
|
-
return typeof type === "string" && (type ===
|
|
152
|
+
return typeof type === "string" && (type === "txn" || type === "pay" || type === "keyreg" || type === "acfg" || type === "axfer" || type === "afrz" || type === "appl");
|
|
153
153
|
}
|
|
154
154
|
function argTypeIsReference(type) {
|
|
155
|
-
return typeof type === "string" && (type ===
|
|
155
|
+
return typeof type === "string" && (type === "account" || type === "application" || type === "asset");
|
|
156
156
|
}
|
|
157
157
|
function argTypeIsAbiType(type) {
|
|
158
158
|
return !argTypeIsTransaction(type) && !argTypeIsReference(type);
|
|
@@ -182,8 +182,8 @@ function isAVMType(type) {
|
|
|
182
182
|
return typeof type === "string" && (type === "AVMString" || type === "AVMBytes" || type === "AVMUint64");
|
|
183
183
|
}
|
|
184
184
|
function getABIDecodedValue(type, bytes) {
|
|
185
|
-
if (type ===
|
|
186
|
-
else if (type ===
|
|
185
|
+
if (type === "asset" || type === "application") return new require_abi_type.ABIUintType(64).decode(bytes);
|
|
186
|
+
else if (type === "account") return new require_abi_type.ABIAddressType().decode(bytes);
|
|
187
187
|
else if (isAVMType(type)) return decodeAVMValue(type, bytes);
|
|
188
188
|
return type.decode(bytes);
|
|
189
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abi-method.js","names":["parseTupleContent","ABIType","ABIStructType","ABIUintType","ABIAddressType"],"sources":["../../../../packages/abi/src/abi-method.ts"],"sourcesContent":["import { sha512_256 } from '@noble/hashes/sha2.js'\nimport { ABIAddressType, ABIStructType, ABIType, ABIUintType, parseTupleContent } from './abi-type'\nimport { ABIValue } from './abi-value'\nimport { ARC28Event } from './arc28-event'\nimport { AVMType, Arc56Contract, Arc56Method } from './arc56-contract'\n\nexport enum ABITransactionType {\n Txn = 'txn',\n Payment = 'pay',\n KeyRegistration = 'keyreg',\n AssetConfig = 'acfg',\n AssetTransfer = 'axfer',\n AssetFreeze = 'afrz',\n AppCall = 'appl',\n}\nexport enum ABIReferenceType {\n Account = 'account',\n Application = 'application',\n Asset = 'asset',\n}\nexport type ABIMethodArgType = ABIType | ABITransactionType | ABIReferenceType\nexport type ABIMethodReturnType = ABIType | 'void'\n\nexport type ABIMethodArg = {\n type: ABIMethodArgType\n name?: string\n description?: string\n defaultValue?: ABIDefaultValue\n}\n\nexport type ABIMethodReturn = {\n type: ABIMethodReturnType\n description?: string\n}\n\nexport type ABIDefaultValue = {\n /** Base64 encoded bytes, base64 ARC4 encoded uint64, or UTF-8 method selector */\n data: string\n /** Where the default value is coming from */\n source: DefaultValueSource\n /** How the data is encoded. This is the encoding for the data provided here, not the arg type */\n type?: ABIType | AVMType\n}\n\nexport enum DefaultValueSource {\n Box = 'box',\n Global = 'global',\n Local = 'local',\n Literal = 'literal',\n Method = 'method',\n}\n\n/** Represents an ABI method return value with parsed data. */\nexport type ABIReturn =\n | {\n /** The method that was called. */\n method: ABIMethod\n /** The raw return value as bytes.\n *\n * This is the value from the last app call log with the first 4 bytes (the ABI return prefix) omitted.\n */\n rawReturnValue: Uint8Array\n /** The parsed ABI return value. */\n returnValue: ABIValue\n decodeError: undefined\n }\n | { rawReturnValue?: undefined; returnValue?: undefined; method: ABIMethod; decodeError?: Error }\n\n/** Decoded ARC-56 struct as a struct rather than a tuple. */\nexport type ABIStruct = {\n [key: string]: ABIStruct | ABIValue\n}\n\nexport class ABIMethod {\n readonly name: string\n readonly description?: string\n readonly args: ABIMethodArg[]\n readonly returns: ABIMethodReturn\n readonly events?: ARC28Event[]\n readonly readonly?: boolean\n\n constructor(params: {\n name: string\n description?: string\n args: ABIMethodArg[]\n returns: ABIMethodReturn\n events?: ARC28Event[]\n readonly?: boolean\n }) {\n this.name = params.name\n this.description = params.description\n this.args = params.args\n this.returns = params.returns\n this.events = params.events\n this.readonly = params.readonly\n }\n\n /**\n * Returns the signature of this ABI method.\n * @returns The signature, e.g. `my_method(unit64,string)bytes`\n */\n getSignature(): string {\n const args = this.args\n .map((arg) => {\n if (argTypeIsTransaction(arg.type) || argTypeIsReference(arg.type)) return arg.type\n return arg.type.name\n })\n .join(',')\n const returns = this.returns.type === 'void' ? 'void' : this.returns.type.name\n return `${this.name}(${args})${returns}`\n }\n\n /**\n * Returns the method selector of this ABI method.\n * @returns The 4-byte method selector\n */\n getSelector(): Uint8Array {\n const hash = sha512_256(new TextEncoder().encode(this.getSignature()))\n return new Uint8Array(hash.slice(0, 4))\n }\n\n /**\n * Returns the ABI method object for a given method signature.\n * @param signature The method signature\n * e.g. `my_method(unit64,string)bytes`\n * @returns The `ABIMethod`\n */\n static fromSignature(signature: string): ABIMethod {\n const argsStart = signature.indexOf('(')\n if (argsStart === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n let argsEnd = -1\n let depth = 0\n for (let i = argsStart; i < signature.length; i++) {\n const char = signature[i]\n\n if (char === '(') {\n depth += 1\n } else if (char === ')') {\n if (depth === 0) {\n // unpaired parenthesis\n break\n }\n\n depth -= 1\n if (depth === 0) {\n argsEnd = i\n break\n }\n }\n }\n\n if (argsEnd === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n const name = signature.slice(0, argsStart)\n const args = parseTupleContent(signature.slice(argsStart + 1, argsEnd)).map((n: string) => {\n if (argTypeIsTransaction(n as ABIMethodArgType) || argTypeIsReference(n as ABIMethodArgType)) {\n return { type: n as ABIMethodArgType } satisfies ABIMethodArg\n }\n return { type: ABIType.from(n) } satisfies ABIMethodArg\n })\n const returnType = signature.slice(argsEnd + 1)\n const returns = { type: returnType === 'void' ? ('void' as const) : ABIType.from(returnType) } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name,\n args,\n returns,\n })\n }\n}\n\n/**\n * Returns the ABI method object for a given method name or signature and ARC-56 app spec.\n * @param methodNameOrSignature The method name or method signature to call if an ABI call is being emitted.\n * e.g. `my_method` or `my_method(unit64,string)bytes`\n * @param appSpec The app spec for the app\n * @returns The `ABIMethod`\n */\nexport function getABIMethod(methodNameOrSignature: string, appSpec: Arc56Contract): ABIMethod {\n if (!methodNameOrSignature.includes('(')) {\n const methods = appSpec.methods.filter((m) => m.name === methodNameOrSignature)\n if (methods.length === 0) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n if (methods.length > 1) {\n throw new Error(\n `Received a call to method ${methodNameOrSignature} in contract ${\n appSpec.name\n }, but this resolved to multiple methods; please pass in an ABI signature instead: ${appSpec.methods\n .map((m) => getArc56MethodSignature(m))\n .join(', ')}`,\n )\n }\n return arc56MethodToABIMethod(methods[0], appSpec)\n } else {\n const method = appSpec.methods.find((m) => getArc56MethodSignature(m) === methodNameOrSignature)\n if (!method) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n return arc56MethodToABIMethod(method, appSpec)\n }\n}\n\nexport function arc56MethodToABIMethod(method: Arc56Method, appSpec: Arc56Contract): ABIMethod {\n if (typeof method.name !== 'string' || typeof method.returns !== 'object' || !Array.isArray(method.args)) {\n throw new Error('Invalid ABIMethod parameters')\n }\n\n const args = method.args.map(({ type, name, desc, struct, defaultValue }) => {\n const convertedDefaultValue: ABIDefaultValue | undefined = defaultValue\n ? {\n data: defaultValue.data,\n source: defaultValue.source as DefaultValueSource,\n type: defaultValue.type ? (isAVMType(defaultValue.type) ? defaultValue.type : ABIType.from(defaultValue.type)) : undefined,\n }\n : undefined\n\n if (argTypeIsTransaction(type as ABIMethodArgType) || argTypeIsReference(type as ABIMethodArgType)) {\n return {\n type: type as ABIMethodArgType,\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n if (struct) {\n return {\n type: ABIStructType.fromStruct(struct, appSpec.structs),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n return {\n type: ABIType.from(type),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n })\n\n const returns = {\n type:\n method.returns.type === ('void' as const)\n ? ('void' as const)\n : method.returns.struct\n ? ABIStructType.fromStruct(method.returns.struct, appSpec.structs)\n : ABIType.from(method.returns.type),\n description: method.returns.desc,\n } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name: method.name,\n description: method.desc,\n args,\n returns,\n events: method.events,\n readonly: method.readonly,\n })\n}\n\nexport function argTypeIsTransaction(type: ABIMethodArgType): type is ABITransactionType {\n return (\n typeof type === 'string' &&\n (type === ABITransactionType.Txn ||\n type === ABITransactionType.Payment ||\n type === ABITransactionType.KeyRegistration ||\n type === ABITransactionType.AssetConfig ||\n type === ABITransactionType.AssetTransfer ||\n type === ABITransactionType.AssetFreeze ||\n type === ABITransactionType.AppCall)\n )\n}\n\nexport function argTypeIsReference(type: ABIMethodArgType): type is ABIReferenceType {\n return (\n typeof type === 'string' &&\n (type === ABIReferenceType.Account || type === ABIReferenceType.Application || type === ABIReferenceType.Asset)\n )\n}\n\nexport function argTypeIsAbiType(type: ABIMethodArgType): type is ABIType {\n return !argTypeIsTransaction(type) && !argTypeIsReference(type)\n}\n\nfunction getArc56MethodSignature(method: Arc56Method): string {\n const args = method.args.map((arg) => arg.type).join(',')\n const returns = method.returns.type\n return `${method.name}(${args})${returns}`\n}\n\nexport function decodeAVMValue(avmType: AVMType, bytes: Uint8Array): ABIValue {\n switch (avmType) {\n case 'AVMString':\n return Buffer.from(bytes).toString('utf-8')\n case 'AVMBytes':\n return bytes\n case 'AVMUint64':\n return ABIType.from('uint64').decode(bytes)\n }\n}\n\nexport function encodeAVMValue(avmType: AVMType, value: ABIValue): Uint8Array {\n switch (avmType) {\n case 'AVMString':\n return ABIType.from('string').encode(value)\n case 'AVMBytes':\n if (typeof value === 'string') return Buffer.from(value, 'utf-8')\n if (typeof value !== 'object' || !(value instanceof Uint8Array))\n throw new Error(`Expected bytes value for AVMBytes, but got ${value}`)\n return value\n case 'AVMUint64':\n return ABIType.from('uint64').encode(value)\n }\n}\n\nexport function isAVMType(type: unknown): type is AVMType {\n return typeof type === 'string' && (type === 'AVMString' || type === 'AVMBytes' || type === 'AVMUint64')\n}\n\nexport function getABIDecodedValue(type: AVMType | ABIType | ABIReferenceType, bytes: Uint8Array): ABIValue {\n if (type === ABIReferenceType.Asset || type === ABIReferenceType.Application) {\n return new ABIUintType(64).decode(bytes)\n } else if (type === ABIReferenceType.Account) {\n return new ABIAddressType().decode(bytes)\n } else if (isAVMType(type)) {\n return decodeAVMValue(type, bytes)\n }\n return type.decode(bytes)\n}\n\nexport function getABIEncodedValue(type: AVMType | ABIType, value: ABIValue): Uint8Array {\n return isAVMType(type) ? encodeAVMValue(type, value) : type.encode(value)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abi-method.js","names":["parseTupleContent","ABIType","ABIStructType","ABIUintType","ABIAddressType"],"sources":["../../../../packages/abi/src/abi-method.ts"],"sourcesContent":["import { sha512_256 } from '@noble/hashes/sha2.js'\nimport { ABIAddressType, ABIStructType, ABIType, ABIUintType, parseTupleContent } from './abi-type'\nimport { ABIValue } from './abi-value'\nimport { ARC28Event } from './arc28-event'\nimport { AVMType, Arc56Contract, Arc56Method } from './arc56-contract'\n\nexport enum ABITransactionType {\n Txn = 'txn',\n Payment = 'pay',\n KeyRegistration = 'keyreg',\n AssetConfig = 'acfg',\n AssetTransfer = 'axfer',\n AssetFreeze = 'afrz',\n AppCall = 'appl',\n}\nexport enum ABIReferenceType {\n Account = 'account',\n Application = 'application',\n Asset = 'asset',\n}\nexport type ABIMethodArgType = ABIType | ABITransactionType | ABIReferenceType\nexport type ABIMethodReturnType = ABIType | 'void'\n\nexport type ABIMethodArg = {\n type: ABIMethodArgType\n name?: string\n description?: string\n defaultValue?: ABIDefaultValue\n}\n\nexport type ABIMethodReturn = {\n type: ABIMethodReturnType\n description?: string\n}\n\nexport type ABIDefaultValue = {\n /** Base64 encoded bytes, base64 ARC4 encoded uint64, or UTF-8 method selector */\n data: string\n /** Where the default value is coming from */\n source: DefaultValueSource\n /** How the data is encoded. This is the encoding for the data provided here, not the arg type */\n type?: ABIType | AVMType\n}\n\nexport enum DefaultValueSource {\n Box = 'box',\n Global = 'global',\n Local = 'local',\n Literal = 'literal',\n Method = 'method',\n}\n\n/** Represents an ABI method return value with parsed data. */\nexport type ABIReturn =\n | {\n /** The method that was called. */\n method: ABIMethod\n /** The raw return value as bytes.\n *\n * This is the value from the last app call log with the first 4 bytes (the ABI return prefix) omitted.\n */\n rawReturnValue: Uint8Array\n /** The parsed ABI return value. */\n returnValue: ABIValue\n decodeError: undefined\n }\n | { rawReturnValue?: undefined; returnValue?: undefined; method: ABIMethod; decodeError?: Error }\n\n/** Decoded ARC-56 struct as a struct rather than a tuple. */\nexport type ABIStruct = {\n [key: string]: ABIStruct | ABIValue\n}\n\nexport class ABIMethod {\n readonly name: string\n readonly description?: string\n readonly args: ABIMethodArg[]\n readonly returns: ABIMethodReturn\n readonly events?: ARC28Event[]\n readonly readonly?: boolean\n\n constructor(params: {\n name: string\n description?: string\n args: ABIMethodArg[]\n returns: ABIMethodReturn\n events?: ARC28Event[]\n readonly?: boolean\n }) {\n this.name = params.name\n this.description = params.description\n this.args = params.args\n this.returns = params.returns\n this.events = params.events\n this.readonly = params.readonly\n }\n\n /**\n * Returns the signature of this ABI method.\n * @returns The signature, e.g. `my_method(unit64,string)bytes`\n */\n getSignature(): string {\n const args = this.args\n .map((arg) => {\n if (argTypeIsTransaction(arg.type) || argTypeIsReference(arg.type)) return arg.type\n return arg.type.name\n })\n .join(',')\n const returns = this.returns.type === 'void' ? 'void' : this.returns.type.name\n return `${this.name}(${args})${returns}`\n }\n\n /**\n * Returns the method selector of this ABI method.\n * @returns The 4-byte method selector\n */\n getSelector(): Uint8Array {\n const hash = sha512_256(new TextEncoder().encode(this.getSignature()))\n return new Uint8Array(hash.slice(0, 4))\n }\n\n /**\n * Returns the ABI method object for a given method signature.\n * @param signature The method signature\n * e.g. `my_method(unit64,string)bytes`\n * @returns The `ABIMethod`\n */\n static fromSignature(signature: string): ABIMethod {\n const argsStart = signature.indexOf('(')\n if (argsStart === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n let argsEnd = -1\n let depth = 0\n for (let i = argsStart; i < signature.length; i++) {\n const char = signature[i]\n\n if (char === '(') {\n depth += 1\n } else if (char === ')') {\n if (depth === 0) {\n // unpaired parenthesis\n break\n }\n\n depth -= 1\n if (depth === 0) {\n argsEnd = i\n break\n }\n }\n }\n\n if (argsEnd === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n const name = signature.slice(0, argsStart)\n const args = parseTupleContent(signature.slice(argsStart + 1, argsEnd)).map((n: string) => {\n if (argTypeIsTransaction(n as ABIMethodArgType) || argTypeIsReference(n as ABIMethodArgType)) {\n return { type: n as ABIMethodArgType } satisfies ABIMethodArg\n }\n return { type: ABIType.from(n) } satisfies ABIMethodArg\n })\n const returnType = signature.slice(argsEnd + 1)\n const returns = { type: returnType === 'void' ? ('void' as const) : ABIType.from(returnType) } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name,\n args,\n returns,\n })\n }\n}\n\n/**\n * Returns the ABI method object for a given method name or signature and ARC-56 app spec.\n * @param methodNameOrSignature The method name or method signature to call if an ABI call is being emitted.\n * e.g. `my_method` or `my_method(unit64,string)bytes`\n * @param appSpec The app spec for the app\n * @returns The `ABIMethod`\n */\nexport function getABIMethod(methodNameOrSignature: string, appSpec: Arc56Contract): ABIMethod {\n if (!methodNameOrSignature.includes('(')) {\n const methods = appSpec.methods.filter((m) => m.name === methodNameOrSignature)\n if (methods.length === 0) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n if (methods.length > 1) {\n throw new Error(\n `Received a call to method ${methodNameOrSignature} in contract ${\n appSpec.name\n }, but this resolved to multiple methods; please pass in an ABI signature instead: ${appSpec.methods\n .map((m) => getArc56MethodSignature(m))\n .join(', ')}`,\n )\n }\n return arc56MethodToABIMethod(methods[0], appSpec)\n } else {\n const method = appSpec.methods.find((m) => getArc56MethodSignature(m) === methodNameOrSignature)\n if (!method) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n return arc56MethodToABIMethod(method, appSpec)\n }\n}\n\nexport function arc56MethodToABIMethod(method: Arc56Method, appSpec: Arc56Contract): ABIMethod {\n if (typeof method.name !== 'string' || typeof method.returns !== 'object' || !Array.isArray(method.args)) {\n throw new Error('Invalid ABIMethod parameters')\n }\n\n const args = method.args.map(({ type, name, desc, struct, defaultValue }) => {\n const convertedDefaultValue: ABIDefaultValue | undefined = defaultValue\n ? {\n data: defaultValue.data,\n source: defaultValue.source as DefaultValueSource,\n type: defaultValue.type ? (isAVMType(defaultValue.type) ? defaultValue.type : ABIType.from(defaultValue.type)) : undefined,\n }\n : undefined\n\n if (argTypeIsTransaction(type as ABIMethodArgType) || argTypeIsReference(type as ABIMethodArgType)) {\n return {\n type: type as ABIMethodArgType,\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n if (struct) {\n return {\n type: ABIStructType.fromStruct(struct, appSpec.structs),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n return {\n type: ABIType.from(type),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n })\n\n const returns = {\n type:\n method.returns.type === ('void' as const)\n ? ('void' as const)\n : method.returns.struct\n ? ABIStructType.fromStruct(method.returns.struct, appSpec.structs)\n : ABIType.from(method.returns.type),\n description: method.returns.desc,\n } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name: method.name,\n description: method.desc,\n args,\n returns,\n events: method.events,\n readonly: method.readonly,\n })\n}\n\nexport function argTypeIsTransaction(type: ABIMethodArgType): type is ABITransactionType {\n return (\n typeof type === 'string' &&\n (type === ABITransactionType.Txn ||\n type === ABITransactionType.Payment ||\n type === ABITransactionType.KeyRegistration ||\n type === ABITransactionType.AssetConfig ||\n type === ABITransactionType.AssetTransfer ||\n type === ABITransactionType.AssetFreeze ||\n type === ABITransactionType.AppCall)\n )\n}\n\nexport function argTypeIsReference(type: ABIMethodArgType): type is ABIReferenceType {\n return (\n typeof type === 'string' &&\n (type === ABIReferenceType.Account || type === ABIReferenceType.Application || type === ABIReferenceType.Asset)\n )\n}\n\nexport function argTypeIsAbiType(type: ABIMethodArgType): type is ABIType {\n return !argTypeIsTransaction(type) && !argTypeIsReference(type)\n}\n\nfunction getArc56MethodSignature(method: Arc56Method): string {\n const args = method.args.map((arg) => arg.type).join(',')\n const returns = method.returns.type\n return `${method.name}(${args})${returns}`\n}\n\nexport function decodeAVMValue(avmType: AVMType, bytes: Uint8Array): ABIValue {\n switch (avmType) {\n case 'AVMString':\n return Buffer.from(bytes).toString('utf-8')\n case 'AVMBytes':\n return bytes\n case 'AVMUint64':\n return ABIType.from('uint64').decode(bytes)\n }\n}\n\nexport function encodeAVMValue(avmType: AVMType, value: ABIValue): Uint8Array {\n switch (avmType) {\n case 'AVMString':\n return ABIType.from('string').encode(value)\n case 'AVMBytes':\n if (typeof value === 'string') return Buffer.from(value, 'utf-8')\n if (typeof value !== 'object' || !(value instanceof Uint8Array))\n throw new Error(`Expected bytes value for AVMBytes, but got ${value}`)\n return value\n case 'AVMUint64':\n return ABIType.from('uint64').encode(value)\n }\n}\n\nexport function isAVMType(type: unknown): type is AVMType {\n return typeof type === 'string' && (type === 'AVMString' || type === 'AVMBytes' || type === 'AVMUint64')\n}\n\nexport function getABIDecodedValue(type: AVMType | ABIType | ABIReferenceType, bytes: Uint8Array): ABIValue {\n if (type === ABIReferenceType.Asset || type === ABIReferenceType.Application) {\n return new ABIUintType(64).decode(bytes)\n } else if (type === ABIReferenceType.Account) {\n return new ABIAddressType().decode(bytes)\n } else if (isAVMType(type)) {\n return decodeAVMValue(type, bytes)\n }\n return type.decode(bytes)\n}\n\nexport function getABIEncodedValue(type: AVMType | ABIType, value: ABIValue): Uint8Array {\n return isAVMType(type) ? encodeAVMValue(type, value) : type.encode(value)\n}\n"],"mappings":"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"}
|
|
@@ -41,7 +41,8 @@ var ABIMethod = class ABIMethod {
|
|
|
41
41
|
if (argTypeIsTransaction(arg.type) || argTypeIsReference(arg.type)) return arg.type;
|
|
42
42
|
return arg.type.name;
|
|
43
43
|
}).join(",");
|
|
44
|
-
|
|
44
|
+
const returns = this.returns.type === "void" ? "void" : this.returns.type.name;
|
|
45
|
+
return `${this.name}(${args})${returns}`;
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
48
|
* Returns the method selector of this ABI method.
|
|
@@ -148,10 +149,10 @@ function arc56MethodToABIMethod(method, appSpec) {
|
|
|
148
149
|
});
|
|
149
150
|
}
|
|
150
151
|
function argTypeIsTransaction(type) {
|
|
151
|
-
return typeof type === "string" && (type ===
|
|
152
|
+
return typeof type === "string" && (type === "txn" || type === "pay" || type === "keyreg" || type === "acfg" || type === "axfer" || type === "afrz" || type === "appl");
|
|
152
153
|
}
|
|
153
154
|
function argTypeIsReference(type) {
|
|
154
|
-
return typeof type === "string" && (type ===
|
|
155
|
+
return typeof type === "string" && (type === "account" || type === "application" || type === "asset");
|
|
155
156
|
}
|
|
156
157
|
function argTypeIsAbiType(type) {
|
|
157
158
|
return !argTypeIsTransaction(type) && !argTypeIsReference(type);
|
|
@@ -181,8 +182,8 @@ function isAVMType(type) {
|
|
|
181
182
|
return typeof type === "string" && (type === "AVMString" || type === "AVMBytes" || type === "AVMUint64");
|
|
182
183
|
}
|
|
183
184
|
function getABIDecodedValue(type, bytes) {
|
|
184
|
-
if (type ===
|
|
185
|
-
else if (type ===
|
|
185
|
+
if (type === "asset" || type === "application") return new ABIUintType(64).decode(bytes);
|
|
186
|
+
else if (type === "account") return new ABIAddressType().decode(bytes);
|
|
186
187
|
else if (isAVMType(type)) return decodeAVMValue(type, bytes);
|
|
187
188
|
return type.decode(bytes);
|
|
188
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abi-method.mjs","names":[],"sources":["../../../../packages/abi/src/abi-method.ts"],"sourcesContent":["import { sha512_256 } from '@noble/hashes/sha2.js'\nimport { ABIAddressType, ABIStructType, ABIType, ABIUintType, parseTupleContent } from './abi-type'\nimport { ABIValue } from './abi-value'\nimport { ARC28Event } from './arc28-event'\nimport { AVMType, Arc56Contract, Arc56Method } from './arc56-contract'\n\nexport enum ABITransactionType {\n Txn = 'txn',\n Payment = 'pay',\n KeyRegistration = 'keyreg',\n AssetConfig = 'acfg',\n AssetTransfer = 'axfer',\n AssetFreeze = 'afrz',\n AppCall = 'appl',\n}\nexport enum ABIReferenceType {\n Account = 'account',\n Application = 'application',\n Asset = 'asset',\n}\nexport type ABIMethodArgType = ABIType | ABITransactionType | ABIReferenceType\nexport type ABIMethodReturnType = ABIType | 'void'\n\nexport type ABIMethodArg = {\n type: ABIMethodArgType\n name?: string\n description?: string\n defaultValue?: ABIDefaultValue\n}\n\nexport type ABIMethodReturn = {\n type: ABIMethodReturnType\n description?: string\n}\n\nexport type ABIDefaultValue = {\n /** Base64 encoded bytes, base64 ARC4 encoded uint64, or UTF-8 method selector */\n data: string\n /** Where the default value is coming from */\n source: DefaultValueSource\n /** How the data is encoded. This is the encoding for the data provided here, not the arg type */\n type?: ABIType | AVMType\n}\n\nexport enum DefaultValueSource {\n Box = 'box',\n Global = 'global',\n Local = 'local',\n Literal = 'literal',\n Method = 'method',\n}\n\n/** Represents an ABI method return value with parsed data. */\nexport type ABIReturn =\n | {\n /** The method that was called. */\n method: ABIMethod\n /** The raw return value as bytes.\n *\n * This is the value from the last app call log with the first 4 bytes (the ABI return prefix) omitted.\n */\n rawReturnValue: Uint8Array\n /** The parsed ABI return value. */\n returnValue: ABIValue\n decodeError: undefined\n }\n | { rawReturnValue?: undefined; returnValue?: undefined; method: ABIMethod; decodeError?: Error }\n\n/** Decoded ARC-56 struct as a struct rather than a tuple. */\nexport type ABIStruct = {\n [key: string]: ABIStruct | ABIValue\n}\n\nexport class ABIMethod {\n readonly name: string\n readonly description?: string\n readonly args: ABIMethodArg[]\n readonly returns: ABIMethodReturn\n readonly events?: ARC28Event[]\n readonly readonly?: boolean\n\n constructor(params: {\n name: string\n description?: string\n args: ABIMethodArg[]\n returns: ABIMethodReturn\n events?: ARC28Event[]\n readonly?: boolean\n }) {\n this.name = params.name\n this.description = params.description\n this.args = params.args\n this.returns = params.returns\n this.events = params.events\n this.readonly = params.readonly\n }\n\n /**\n * Returns the signature of this ABI method.\n * @returns The signature, e.g. `my_method(unit64,string)bytes`\n */\n getSignature(): string {\n const args = this.args\n .map((arg) => {\n if (argTypeIsTransaction(arg.type) || argTypeIsReference(arg.type)) return arg.type\n return arg.type.name\n })\n .join(',')\n const returns = this.returns.type === 'void' ? 'void' : this.returns.type.name\n return `${this.name}(${args})${returns}`\n }\n\n /**\n * Returns the method selector of this ABI method.\n * @returns The 4-byte method selector\n */\n getSelector(): Uint8Array {\n const hash = sha512_256(new TextEncoder().encode(this.getSignature()))\n return new Uint8Array(hash.slice(0, 4))\n }\n\n /**\n * Returns the ABI method object for a given method signature.\n * @param signature The method signature\n * e.g. `my_method(unit64,string)bytes`\n * @returns The `ABIMethod`\n */\n static fromSignature(signature: string): ABIMethod {\n const argsStart = signature.indexOf('(')\n if (argsStart === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n let argsEnd = -1\n let depth = 0\n for (let i = argsStart; i < signature.length; i++) {\n const char = signature[i]\n\n if (char === '(') {\n depth += 1\n } else if (char === ')') {\n if (depth === 0) {\n // unpaired parenthesis\n break\n }\n\n depth -= 1\n if (depth === 0) {\n argsEnd = i\n break\n }\n }\n }\n\n if (argsEnd === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n const name = signature.slice(0, argsStart)\n const args = parseTupleContent(signature.slice(argsStart + 1, argsEnd)).map((n: string) => {\n if (argTypeIsTransaction(n as ABIMethodArgType) || argTypeIsReference(n as ABIMethodArgType)) {\n return { type: n as ABIMethodArgType } satisfies ABIMethodArg\n }\n return { type: ABIType.from(n) } satisfies ABIMethodArg\n })\n const returnType = signature.slice(argsEnd + 1)\n const returns = { type: returnType === 'void' ? ('void' as const) : ABIType.from(returnType) } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name,\n args,\n returns,\n })\n }\n}\n\n/**\n * Returns the ABI method object for a given method name or signature and ARC-56 app spec.\n * @param methodNameOrSignature The method name or method signature to call if an ABI call is being emitted.\n * e.g. `my_method` or `my_method(unit64,string)bytes`\n * @param appSpec The app spec for the app\n * @returns The `ABIMethod`\n */\nexport function getABIMethod(methodNameOrSignature: string, appSpec: Arc56Contract): ABIMethod {\n if (!methodNameOrSignature.includes('(')) {\n const methods = appSpec.methods.filter((m) => m.name === methodNameOrSignature)\n if (methods.length === 0) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n if (methods.length > 1) {\n throw new Error(\n `Received a call to method ${methodNameOrSignature} in contract ${\n appSpec.name\n }, but this resolved to multiple methods; please pass in an ABI signature instead: ${appSpec.methods\n .map((m) => getArc56MethodSignature(m))\n .join(', ')}`,\n )\n }\n return arc56MethodToABIMethod(methods[0], appSpec)\n } else {\n const method = appSpec.methods.find((m) => getArc56MethodSignature(m) === methodNameOrSignature)\n if (!method) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n return arc56MethodToABIMethod(method, appSpec)\n }\n}\n\nexport function arc56MethodToABIMethod(method: Arc56Method, appSpec: Arc56Contract): ABIMethod {\n if (typeof method.name !== 'string' || typeof method.returns !== 'object' || !Array.isArray(method.args)) {\n throw new Error('Invalid ABIMethod parameters')\n }\n\n const args = method.args.map(({ type, name, desc, struct, defaultValue }) => {\n const convertedDefaultValue: ABIDefaultValue | undefined = defaultValue\n ? {\n data: defaultValue.data,\n source: defaultValue.source as DefaultValueSource,\n type: defaultValue.type ? (isAVMType(defaultValue.type) ? defaultValue.type : ABIType.from(defaultValue.type)) : undefined,\n }\n : undefined\n\n if (argTypeIsTransaction(type as ABIMethodArgType) || argTypeIsReference(type as ABIMethodArgType)) {\n return {\n type: type as ABIMethodArgType,\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n if (struct) {\n return {\n type: ABIStructType.fromStruct(struct, appSpec.structs),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n return {\n type: ABIType.from(type),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n })\n\n const returns = {\n type:\n method.returns.type === ('void' as const)\n ? ('void' as const)\n : method.returns.struct\n ? ABIStructType.fromStruct(method.returns.struct, appSpec.structs)\n : ABIType.from(method.returns.type),\n description: method.returns.desc,\n } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name: method.name,\n description: method.desc,\n args,\n returns,\n events: method.events,\n readonly: method.readonly,\n })\n}\n\nexport function argTypeIsTransaction(type: ABIMethodArgType): type is ABITransactionType {\n return (\n typeof type === 'string' &&\n (type === ABITransactionType.Txn ||\n type === ABITransactionType.Payment ||\n type === ABITransactionType.KeyRegistration ||\n type === ABITransactionType.AssetConfig ||\n type === ABITransactionType.AssetTransfer ||\n type === ABITransactionType.AssetFreeze ||\n type === ABITransactionType.AppCall)\n )\n}\n\nexport function argTypeIsReference(type: ABIMethodArgType): type is ABIReferenceType {\n return (\n typeof type === 'string' &&\n (type === ABIReferenceType.Account || type === ABIReferenceType.Application || type === ABIReferenceType.Asset)\n )\n}\n\nexport function argTypeIsAbiType(type: ABIMethodArgType): type is ABIType {\n return !argTypeIsTransaction(type) && !argTypeIsReference(type)\n}\n\nfunction getArc56MethodSignature(method: Arc56Method): string {\n const args = method.args.map((arg) => arg.type).join(',')\n const returns = method.returns.type\n return `${method.name}(${args})${returns}`\n}\n\nexport function decodeAVMValue(avmType: AVMType, bytes: Uint8Array): ABIValue {\n switch (avmType) {\n case 'AVMString':\n return Buffer.from(bytes).toString('utf-8')\n case 'AVMBytes':\n return bytes\n case 'AVMUint64':\n return ABIType.from('uint64').decode(bytes)\n }\n}\n\nexport function encodeAVMValue(avmType: AVMType, value: ABIValue): Uint8Array {\n switch (avmType) {\n case 'AVMString':\n return ABIType.from('string').encode(value)\n case 'AVMBytes':\n if (typeof value === 'string') return Buffer.from(value, 'utf-8')\n if (typeof value !== 'object' || !(value instanceof Uint8Array))\n throw new Error(`Expected bytes value for AVMBytes, but got ${value}`)\n return value\n case 'AVMUint64':\n return ABIType.from('uint64').encode(value)\n }\n}\n\nexport function isAVMType(type: unknown): type is AVMType {\n return typeof type === 'string' && (type === 'AVMString' || type === 'AVMBytes' || type === 'AVMUint64')\n}\n\nexport function getABIDecodedValue(type: AVMType | ABIType | ABIReferenceType, bytes: Uint8Array): ABIValue {\n if (type === ABIReferenceType.Asset || type === ABIReferenceType.Application) {\n return new ABIUintType(64).decode(bytes)\n } else if (type === ABIReferenceType.Account) {\n return new ABIAddressType().decode(bytes)\n } else if (isAVMType(type)) {\n return decodeAVMValue(type, bytes)\n }\n return type.decode(bytes)\n}\n\nexport function getABIEncodedValue(type: AVMType | ABIType, value: ABIValue): Uint8Array {\n return isAVMType(type) ? encodeAVMValue(type, value) : type.encode(value)\n}\n"],"mappings":";;;AAMA,IAAY,qBAAL,yBAAA,oBAAA;AACL,oBAAA,SAAA;AACA,oBAAA,aAAA;AACA,oBAAA,qBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,mBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,aAAA;;KACD;AACD,IAAY,mBAAL,yBAAA,kBAAA;AACL,kBAAA,aAAA;AACA,kBAAA,iBAAA;AACA,kBAAA,WAAA;;KACD;AAsDD,IAAa,YAAb,MAAa,UAAU;CACrB;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,QAOT;AACD,OAAK,OAAO,OAAO;AACnB,OAAK,cAAc,OAAO;AAC1B,OAAK,OAAO,OAAO;AACnB,OAAK,UAAU,OAAO;AACtB,OAAK,SAAS,OAAO;AACrB,OAAK,WAAW,OAAO;;;;;;CAOzB,eAAuB;EACrB,MAAM,OAAO,KAAK,KACf,KAAK,QAAQ;AACZ,OAAI,qBAAqB,IAAI,KAAK,IAAI,mBAAmB,IAAI,KAAK,CAAE,QAAO,IAAI;AAC/E,UAAO,IAAI,KAAK;IAChB,CACD,KAAK,IAAI;AAEZ,SAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GADZ,KAAK,QAAQ,SAAS,SAAS,SAAS,KAAK,QAAQ,KAAK;;;;;;CAQ5E,cAA0B;EACxB,MAAM,OAAO,WAAW,IAAI,aAAa,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC;AACtE,SAAO,IAAI,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC;;;;;;;;CASzC,OAAO,cAAc,WAA8B;EACjD,MAAM,YAAY,UAAU,QAAQ,IAAI;AACxC,MAAI,cAAc,GAChB,OAAM,IAAI,MAAM,6BAA6B,YAAY;EAG3D,IAAI,UAAU;EACd,IAAI,QAAQ;AACZ,OAAK,IAAI,IAAI,WAAW,IAAI,UAAU,QAAQ,KAAK;GACjD,MAAM,OAAO,UAAU;AAEvB,OAAI,SAAS,IACX,UAAS;YACA,SAAS,KAAK;AACvB,QAAI,UAAU,EAEZ;AAGF,aAAS;AACT,QAAI,UAAU,GAAG;AACf,eAAU;AACV;;;;AAKN,MAAI,YAAY,GACd,OAAM,IAAI,MAAM,6BAA6B,YAAY;EAG3D,MAAM,OAAO,UAAU,MAAM,GAAG,UAAU;EAC1C,MAAM,OAAO,kBAAkB,UAAU,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAc;AACzF,OAAI,qBAAqB,EAAsB,IAAI,mBAAmB,EAAsB,CAC1F,QAAO,EAAE,MAAM,GAAuB;AAExC,UAAO,EAAE,MAAM,QAAQ,KAAK,EAAE,EAAE;IAChC;EACF,MAAM,aAAa,UAAU,MAAM,UAAU,EAAE;AAG/C,SAAO,IAAI,UAAU;GACnB;GACA;GACA,SALc,EAAE,MAAM,eAAe,SAAU,SAAmB,QAAQ,KAAK,WAAW,EAAE;GAM7F,CAAC;;;;;;;;;;AAWN,SAAgB,aAAa,uBAA+B,SAAmC;AAC7F,KAAI,CAAC,sBAAsB,SAAS,IAAI,EAAE;EACxC,MAAM,UAAU,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,sBAAsB;AAC/E,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM,yBAAyB,sBAAsB,MAAM,QAAQ,KAAK,OAAO;AACnH,MAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,MACR,6BAA6B,sBAAsB,eACjD,QAAQ,KACT,oFAAoF,QAAQ,QAC1F,KAAK,MAAM,wBAAwB,EAAE,CAAC,CACtC,KAAK,KAAK,GACd;AAEH,SAAO,uBAAuB,QAAQ,IAAI,QAAQ;QAC7C;EACL,MAAM,SAAS,QAAQ,QAAQ,MAAM,MAAM,wBAAwB,EAAE,KAAK,sBAAsB;AAChG,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yBAAyB,sBAAsB,MAAM,QAAQ,KAAK,OAAO;AACtG,SAAO,uBAAuB,QAAQ,QAAQ;;;AAIlD,SAAgB,uBAAuB,QAAqB,SAAmC;AAC7F,KAAI,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,KAAK,CACtG,OAAM,IAAI,MAAM,+BAA+B;CAGjD,MAAM,OAAO,OAAO,KAAK,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,mBAAmB;EAC3E,MAAM,wBAAqD,eACvD;GACE,MAAM,aAAa;GACnB,QAAQ,aAAa;GACrB,MAAM,aAAa,OAAQ,UAAU,aAAa,KAAK,GAAG,aAAa,OAAO,QAAQ,KAAK,aAAa,KAAK,GAAI,KAAA;GAClH,GACD,KAAA;AAEJ,MAAI,qBAAqB,KAAyB,IAAI,mBAAmB,KAAyB,CAChG,QAAO;GACC;GACN;GACA,aAAa;GACb,cAAc;GACf;AAGH,MAAI,OACF,QAAO;GACL,MAAM,cAAc,WAAW,QAAQ,QAAQ,QAAQ;GACvD;GACA,aAAa;GACb,cAAc;GACf;AAGH,SAAO;GACL,MAAM,QAAQ,KAAK,KAAK;GACxB;GACA,aAAa;GACb,cAAc;GACf;GACD;CAEF,MAAM,UAAU;EACd,MACE,OAAO,QAAQ,SAAU,SACpB,SACD,OAAO,QAAQ,SACb,cAAc,WAAW,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,GAChE,QAAQ,KAAK,OAAO,QAAQ,KAAK;EACzC,aAAa,OAAO,QAAQ;EAC7B;AAED,QAAO,IAAI,UAAU;EACnB,MAAM,OAAO;EACb,aAAa,OAAO;EACpB;EACA;EACA,QAAQ,OAAO;EACf,UAAU,OAAO;EAClB,CAAC;;AAGJ,SAAgB,qBAAqB,MAAoD;AACvF,QACE,OAAO,SAAS,aACf,SAAS,mBAAmB,OAC3B,SAAS,mBAAmB,WAC5B,SAAS,mBAAmB,mBAC5B,SAAS,mBAAmB,eAC5B,SAAS,mBAAmB,iBAC5B,SAAS,mBAAmB,eAC5B,SAAS,mBAAmB;;AAIlC,SAAgB,mBAAmB,MAAkD;AACnF,QACE,OAAO,SAAS,aACf,SAAS,iBAAiB,WAAW,SAAS,iBAAiB,eAAe,SAAS,iBAAiB;;AAI7G,SAAgB,iBAAiB,MAAyC;AACxE,QAAO,CAAC,qBAAqB,KAAK,IAAI,CAAC,mBAAmB,KAAK;;AAGjE,SAAS,wBAAwB,QAA6B;CAC5D,MAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,IAAI;AAEzD,QAAO,GAAG,OAAO,KAAK,GAAG,KAAK,GADd,OAAO,QAAQ;;AAIjC,SAAgB,eAAe,SAAkB,OAA6B;AAC5E,SAAQ,SAAR;EACE,KAAK,YACH,QAAO,OAAO,KAAK,MAAM,CAAC,SAAS,QAAQ;EAC7C,KAAK,WACH,QAAO;EACT,KAAK,YACH,QAAO,QAAQ,KAAK,SAAS,CAAC,OAAO,MAAM;;;AAIjD,SAAgB,eAAe,SAAkB,OAA6B;AAC5E,SAAQ,SAAR;EACE,KAAK,YACH,QAAO,QAAQ,KAAK,SAAS,CAAC,OAAO,MAAM;EAC7C,KAAK;AACH,OAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,OAAO,QAAQ;AACjE,OAAI,OAAO,UAAU,YAAY,EAAE,iBAAiB,YAClD,OAAM,IAAI,MAAM,8CAA8C,QAAQ;AACxE,UAAO;EACT,KAAK,YACH,QAAO,QAAQ,KAAK,SAAS,CAAC,OAAO,MAAM;;;AAIjD,SAAgB,UAAU,MAAgC;AACxD,QAAO,OAAO,SAAS,aAAa,SAAS,eAAe,SAAS,cAAc,SAAS;;AAG9F,SAAgB,mBAAmB,MAA4C,OAA6B;AAC1G,KAAI,SAAS,iBAAiB,SAAS,SAAS,iBAAiB,YAC/D,QAAO,IAAI,YAAY,GAAG,CAAC,OAAO,MAAM;UAC/B,SAAS,iBAAiB,QACnC,QAAO,IAAI,gBAAgB,CAAC,OAAO,MAAM;UAChC,UAAU,KAAK,CACxB,QAAO,eAAe,MAAM,MAAM;AAEpC,QAAO,KAAK,OAAO,MAAM;;AAG3B,SAAgB,mBAAmB,MAAyB,OAA6B;AACvF,QAAO,UAAU,KAAK,GAAG,eAAe,MAAM,MAAM,GAAG,KAAK,OAAO,MAAM"}
|
|
1
|
+
{"version":3,"file":"abi-method.mjs","names":[],"sources":["../../../../packages/abi/src/abi-method.ts"],"sourcesContent":["import { sha512_256 } from '@noble/hashes/sha2.js'\nimport { ABIAddressType, ABIStructType, ABIType, ABIUintType, parseTupleContent } from './abi-type'\nimport { ABIValue } from './abi-value'\nimport { ARC28Event } from './arc28-event'\nimport { AVMType, Arc56Contract, Arc56Method } from './arc56-contract'\n\nexport enum ABITransactionType {\n Txn = 'txn',\n Payment = 'pay',\n KeyRegistration = 'keyreg',\n AssetConfig = 'acfg',\n AssetTransfer = 'axfer',\n AssetFreeze = 'afrz',\n AppCall = 'appl',\n}\nexport enum ABIReferenceType {\n Account = 'account',\n Application = 'application',\n Asset = 'asset',\n}\nexport type ABIMethodArgType = ABIType | ABITransactionType | ABIReferenceType\nexport type ABIMethodReturnType = ABIType | 'void'\n\nexport type ABIMethodArg = {\n type: ABIMethodArgType\n name?: string\n description?: string\n defaultValue?: ABIDefaultValue\n}\n\nexport type ABIMethodReturn = {\n type: ABIMethodReturnType\n description?: string\n}\n\nexport type ABIDefaultValue = {\n /** Base64 encoded bytes, base64 ARC4 encoded uint64, or UTF-8 method selector */\n data: string\n /** Where the default value is coming from */\n source: DefaultValueSource\n /** How the data is encoded. This is the encoding for the data provided here, not the arg type */\n type?: ABIType | AVMType\n}\n\nexport enum DefaultValueSource {\n Box = 'box',\n Global = 'global',\n Local = 'local',\n Literal = 'literal',\n Method = 'method',\n}\n\n/** Represents an ABI method return value with parsed data. */\nexport type ABIReturn =\n | {\n /** The method that was called. */\n method: ABIMethod\n /** The raw return value as bytes.\n *\n * This is the value from the last app call log with the first 4 bytes (the ABI return prefix) omitted.\n */\n rawReturnValue: Uint8Array\n /** The parsed ABI return value. */\n returnValue: ABIValue\n decodeError: undefined\n }\n | { rawReturnValue?: undefined; returnValue?: undefined; method: ABIMethod; decodeError?: Error }\n\n/** Decoded ARC-56 struct as a struct rather than a tuple. */\nexport type ABIStruct = {\n [key: string]: ABIStruct | ABIValue\n}\n\nexport class ABIMethod {\n readonly name: string\n readonly description?: string\n readonly args: ABIMethodArg[]\n readonly returns: ABIMethodReturn\n readonly events?: ARC28Event[]\n readonly readonly?: boolean\n\n constructor(params: {\n name: string\n description?: string\n args: ABIMethodArg[]\n returns: ABIMethodReturn\n events?: ARC28Event[]\n readonly?: boolean\n }) {\n this.name = params.name\n this.description = params.description\n this.args = params.args\n this.returns = params.returns\n this.events = params.events\n this.readonly = params.readonly\n }\n\n /**\n * Returns the signature of this ABI method.\n * @returns The signature, e.g. `my_method(unit64,string)bytes`\n */\n getSignature(): string {\n const args = this.args\n .map((arg) => {\n if (argTypeIsTransaction(arg.type) || argTypeIsReference(arg.type)) return arg.type\n return arg.type.name\n })\n .join(',')\n const returns = this.returns.type === 'void' ? 'void' : this.returns.type.name\n return `${this.name}(${args})${returns}`\n }\n\n /**\n * Returns the method selector of this ABI method.\n * @returns The 4-byte method selector\n */\n getSelector(): Uint8Array {\n const hash = sha512_256(new TextEncoder().encode(this.getSignature()))\n return new Uint8Array(hash.slice(0, 4))\n }\n\n /**\n * Returns the ABI method object for a given method signature.\n * @param signature The method signature\n * e.g. `my_method(unit64,string)bytes`\n * @returns The `ABIMethod`\n */\n static fromSignature(signature: string): ABIMethod {\n const argsStart = signature.indexOf('(')\n if (argsStart === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n let argsEnd = -1\n let depth = 0\n for (let i = argsStart; i < signature.length; i++) {\n const char = signature[i]\n\n if (char === '(') {\n depth += 1\n } else if (char === ')') {\n if (depth === 0) {\n // unpaired parenthesis\n break\n }\n\n depth -= 1\n if (depth === 0) {\n argsEnd = i\n break\n }\n }\n }\n\n if (argsEnd === -1) {\n throw new Error(`Invalid method signature: ${signature}`)\n }\n\n const name = signature.slice(0, argsStart)\n const args = parseTupleContent(signature.slice(argsStart + 1, argsEnd)).map((n: string) => {\n if (argTypeIsTransaction(n as ABIMethodArgType) || argTypeIsReference(n as ABIMethodArgType)) {\n return { type: n as ABIMethodArgType } satisfies ABIMethodArg\n }\n return { type: ABIType.from(n) } satisfies ABIMethodArg\n })\n const returnType = signature.slice(argsEnd + 1)\n const returns = { type: returnType === 'void' ? ('void' as const) : ABIType.from(returnType) } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name,\n args,\n returns,\n })\n }\n}\n\n/**\n * Returns the ABI method object for a given method name or signature and ARC-56 app spec.\n * @param methodNameOrSignature The method name or method signature to call if an ABI call is being emitted.\n * e.g. `my_method` or `my_method(unit64,string)bytes`\n * @param appSpec The app spec for the app\n * @returns The `ABIMethod`\n */\nexport function getABIMethod(methodNameOrSignature: string, appSpec: Arc56Contract): ABIMethod {\n if (!methodNameOrSignature.includes('(')) {\n const methods = appSpec.methods.filter((m) => m.name === methodNameOrSignature)\n if (methods.length === 0) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n if (methods.length > 1) {\n throw new Error(\n `Received a call to method ${methodNameOrSignature} in contract ${\n appSpec.name\n }, but this resolved to multiple methods; please pass in an ABI signature instead: ${appSpec.methods\n .map((m) => getArc56MethodSignature(m))\n .join(', ')}`,\n )\n }\n return arc56MethodToABIMethod(methods[0], appSpec)\n } else {\n const method = appSpec.methods.find((m) => getArc56MethodSignature(m) === methodNameOrSignature)\n if (!method) throw new Error(`Unable to find method ${methodNameOrSignature} in ${appSpec.name} app.`)\n return arc56MethodToABIMethod(method, appSpec)\n }\n}\n\nexport function arc56MethodToABIMethod(method: Arc56Method, appSpec: Arc56Contract): ABIMethod {\n if (typeof method.name !== 'string' || typeof method.returns !== 'object' || !Array.isArray(method.args)) {\n throw new Error('Invalid ABIMethod parameters')\n }\n\n const args = method.args.map(({ type, name, desc, struct, defaultValue }) => {\n const convertedDefaultValue: ABIDefaultValue | undefined = defaultValue\n ? {\n data: defaultValue.data,\n source: defaultValue.source as DefaultValueSource,\n type: defaultValue.type ? (isAVMType(defaultValue.type) ? defaultValue.type : ABIType.from(defaultValue.type)) : undefined,\n }\n : undefined\n\n if (argTypeIsTransaction(type as ABIMethodArgType) || argTypeIsReference(type as ABIMethodArgType)) {\n return {\n type: type as ABIMethodArgType,\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n if (struct) {\n return {\n type: ABIStructType.fromStruct(struct, appSpec.structs),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n }\n\n return {\n type: ABIType.from(type),\n name,\n description: desc,\n defaultValue: convertedDefaultValue,\n } satisfies ABIMethodArg\n })\n\n const returns = {\n type:\n method.returns.type === ('void' as const)\n ? ('void' as const)\n : method.returns.struct\n ? ABIStructType.fromStruct(method.returns.struct, appSpec.structs)\n : ABIType.from(method.returns.type),\n description: method.returns.desc,\n } satisfies ABIMethodReturn\n\n return new ABIMethod({\n name: method.name,\n description: method.desc,\n args,\n returns,\n events: method.events,\n readonly: method.readonly,\n })\n}\n\nexport function argTypeIsTransaction(type: ABIMethodArgType): type is ABITransactionType {\n return (\n typeof type === 'string' &&\n (type === ABITransactionType.Txn ||\n type === ABITransactionType.Payment ||\n type === ABITransactionType.KeyRegistration ||\n type === ABITransactionType.AssetConfig ||\n type === ABITransactionType.AssetTransfer ||\n type === ABITransactionType.AssetFreeze ||\n type === ABITransactionType.AppCall)\n )\n}\n\nexport function argTypeIsReference(type: ABIMethodArgType): type is ABIReferenceType {\n return (\n typeof type === 'string' &&\n (type === ABIReferenceType.Account || type === ABIReferenceType.Application || type === ABIReferenceType.Asset)\n )\n}\n\nexport function argTypeIsAbiType(type: ABIMethodArgType): type is ABIType {\n return !argTypeIsTransaction(type) && !argTypeIsReference(type)\n}\n\nfunction getArc56MethodSignature(method: Arc56Method): string {\n const args = method.args.map((arg) => arg.type).join(',')\n const returns = method.returns.type\n return `${method.name}(${args})${returns}`\n}\n\nexport function decodeAVMValue(avmType: AVMType, bytes: Uint8Array): ABIValue {\n switch (avmType) {\n case 'AVMString':\n return Buffer.from(bytes).toString('utf-8')\n case 'AVMBytes':\n return bytes\n case 'AVMUint64':\n return ABIType.from('uint64').decode(bytes)\n }\n}\n\nexport function encodeAVMValue(avmType: AVMType, value: ABIValue): Uint8Array {\n switch (avmType) {\n case 'AVMString':\n return ABIType.from('string').encode(value)\n case 'AVMBytes':\n if (typeof value === 'string') return Buffer.from(value, 'utf-8')\n if (typeof value !== 'object' || !(value instanceof Uint8Array))\n throw new Error(`Expected bytes value for AVMBytes, but got ${value}`)\n return value\n case 'AVMUint64':\n return ABIType.from('uint64').encode(value)\n }\n}\n\nexport function isAVMType(type: unknown): type is AVMType {\n return typeof type === 'string' && (type === 'AVMString' || type === 'AVMBytes' || type === 'AVMUint64')\n}\n\nexport function getABIDecodedValue(type: AVMType | ABIType | ABIReferenceType, bytes: Uint8Array): ABIValue {\n if (type === ABIReferenceType.Asset || type === ABIReferenceType.Application) {\n return new ABIUintType(64).decode(bytes)\n } else if (type === ABIReferenceType.Account) {\n return new ABIAddressType().decode(bytes)\n } else if (isAVMType(type)) {\n return decodeAVMValue(type, bytes)\n }\n return type.decode(bytes)\n}\n\nexport function getABIEncodedValue(type: AVMType | ABIType, value: ABIValue): Uint8Array {\n return isAVMType(type) ? encodeAVMValue(type, value) : type.encode(value)\n}\n"],"mappings":"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"}
|
|
@@ -75,6 +75,7 @@ var ABIType = class ABIType {
|
|
|
75
75
|
* An unsigned integer ABI type of a specific bit size.
|
|
76
76
|
*/
|
|
77
77
|
var ABIUintType = class ABIUintType extends ABIType {
|
|
78
|
+
bitSize;
|
|
78
79
|
/**
|
|
79
80
|
* Creates a new unsigned integer type.
|
|
80
81
|
* @param bitSize The bit size (must be a multiple of 8, between 8 and 512)
|
|
@@ -112,6 +113,8 @@ var ABIUintType = class ABIUintType extends ABIType {
|
|
|
112
113
|
* A fixed-point number ABI type of a specific bit size and precision.
|
|
113
114
|
*/
|
|
114
115
|
var ABIUfixedType = class ABIUfixedType extends ABIType {
|
|
116
|
+
bitSize;
|
|
117
|
+
precision;
|
|
115
118
|
/**
|
|
116
119
|
* Creates a new fixed-point type.
|
|
117
120
|
* @param bitSize The bit size (must be a multiple of 8, between 8 and 512)
|
|
@@ -265,6 +268,7 @@ var ABIStringType = class ABIStringType extends ABIType {
|
|
|
265
268
|
* A tuple ABI type containing other ABI types.
|
|
266
269
|
*/
|
|
267
270
|
var ABITupleType = class ABITupleType extends ABIType {
|
|
271
|
+
childTypes;
|
|
268
272
|
/**
|
|
269
273
|
* Creates a new tuple type.
|
|
270
274
|
* @param childTypes The types of the tuple elements
|
|
@@ -367,6 +371,8 @@ var ABITupleType = class ABITupleType extends ABIType {
|
|
|
367
371
|
* A static-length array ABI type.
|
|
368
372
|
*/
|
|
369
373
|
var ABIArrayStaticType = class ABIArrayStaticType extends ABIType {
|
|
374
|
+
childType;
|
|
375
|
+
length;
|
|
370
376
|
/**
|
|
371
377
|
* Creates a new static array type.
|
|
372
378
|
* @param childType The type of the array elements
|
|
@@ -413,6 +419,7 @@ var ABIArrayStaticType = class ABIArrayStaticType extends ABIType {
|
|
|
413
419
|
* A dynamic-length array ABI type.
|
|
414
420
|
*/
|
|
415
421
|
var ABIArrayDynamicType = class ABIArrayDynamicType extends ABIType {
|
|
422
|
+
childType;
|
|
416
423
|
/**
|
|
417
424
|
* Creates a new dynamic array type.
|
|
418
425
|
* @param childType The type of the array elements
|
|
@@ -458,6 +465,8 @@ var ABIArrayDynamicType = class ABIArrayDynamicType extends ABIType {
|
|
|
458
465
|
* A struct ABI type with named fields.
|
|
459
466
|
*/
|
|
460
467
|
var ABIStructType = class ABIStructType extends ABIType {
|
|
468
|
+
structName;
|
|
469
|
+
structFields;
|
|
461
470
|
/**
|
|
462
471
|
* Creates a new struct type.
|
|
463
472
|
* @param structName The name of the struct
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abi-type.js","names":["bigIntToBytes","bytesToBigInt","Address","concatArrays","getTupleValueFromStructValue","getStructValueFromTupleValue"],"sources":["../../../../packages/abi/src/abi-type.ts"],"sourcesContent":["import {\n Address,\n BOOL_FALSE_BYTE,\n BOOL_TRUE_BYTE,\n LENGTH_ENCODE_BYTE_SIZE,\n PUBLIC_KEY_BYTE_LENGTH,\n concatArrays,\n} from '@algorandfoundation/algokit-common'\nimport type { ABIStructValue, ABIValue } from './abi-value'\nimport { StructField } from './arc56-contract'\nimport { bigIntToBytes, bytesToBigInt } from './bigint'\nimport { getStructValueFromTupleValue, getTupleValueFromStructValue } from './utils'\n\nconst STATIC_ARRAY_REGEX = /^([a-z\\d[\\](),]+)\\[(0|[1-9][\\d]*)]$/\nconst UFIXED_REGEX = /^ufixed([1-9][\\d]*)x([1-9][\\d]*)$/\nconst MAX_LEN = 2 ** 16 - 1\n\n/**\n * Information about a single field in a struct\n */\nexport type ABIStructField = {\n /** The name of the struct field */\n name: string\n /** The type of the struct field's value */\n type: ABIType | ABIStructField[]\n}\n\ninterface Segment {\n left: number\n right: number\n}\n\n/**\n * Represents an Algorand ABI type for encoding and decoding values as defined in [ARC-0004](https://arc.algorand.foundation/ARCs/arc-0004#types).\n *\n * This is the abstract base class for all ABI types.\n */\nexport abstract class ABIType {\n /**\n * Returns the ARC-4 type name string representation.\n * @returns The ARC-4 type string\n */\n abstract get name(): string\n\n /**\n * Returns a user-friendly display name for this type.\n * @returns The display name for this type\n */\n get displayName(): string {\n return this.name\n }\n\n /**\n * Returns the ARC-4 type name string representation.\n * @returns The ARC-4 type string\n */\n toString(): string {\n return this.name\n }\n\n /**\n * Checks if this ABI type is equal to another.\n * @param other The other ABI type to compare with\n * @returns True if the types are equal, false otherwise\n */\n abstract equals(other: ABIType): boolean\n\n /**\n * Checks if this ABI type is dynamic (variable-length).\n * @returns True if the type is dynamic, false otherwise\n */\n abstract isDynamic(): boolean\n\n /**\n * Gets the byte length of the encoded type for static types.\n * @returns The number of bytes needed to encode this type\n * @throws Error if the type is dynamic\n */\n abstract byteLen(): number\n\n /**\n * Encodes a value according to this ABI type.\n * @param value The value to encode\n * @returns The encoded bytes\n */\n abstract encode(value: ABIValue): Uint8Array\n\n /**\n * Decodes bytes according to this ABI type.\n * @param bytes The bytes to decode\n * @returns The decoded value\n */\n abstract decode(bytes: Uint8Array): ABIValue\n\n /**\n * Creates an ABI type from an ARC-4 type string.\n * @param str The ARC-4 type string (e.g., \"uint256\", \"bool\", \"(uint8,address)\")\n * @returns The corresponding ABI type\n */\n static from(str: string): ABIType {\n if (str.endsWith('[]')) {\n const childType = ABIType.from(str.slice(0, str.length - 2))\n return new ABIArrayDynamicType(childType)\n }\n if (str.endsWith(']')) {\n const stringMatches = str.match(STATIC_ARRAY_REGEX)\n if (!stringMatches || stringMatches.length !== 3) {\n throw new Error(`Malformed static array string: ${str}`)\n }\n const arrayLengthStr = stringMatches[2]\n const arrayLength = parseInt(arrayLengthStr, 10)\n if (arrayLength > MAX_LEN) {\n throw new Error(`Array length exceeds limit ${MAX_LEN}`)\n }\n const childType = ABIType.from(stringMatches[1])\n return new ABIArrayStaticType(childType, arrayLength)\n }\n if (str.startsWith('uint')) {\n const digitsOnly = (s: string) => [...s].every((c) => '0123456789'.includes(c))\n const typeSizeStr = str.slice(4, str.length)\n if (!digitsOnly(typeSizeStr)) {\n throw new Error(`Malformed uint string: ${typeSizeStr}`)\n }\n const bitSize = parseInt(typeSizeStr, 10)\n if (bitSize > MAX_LEN) {\n throw new Error(`Malformed uint string: ${bitSize}`)\n }\n return new ABIUintType(bitSize)\n }\n if (str === 'byte') {\n return new ABIByteType()\n }\n if (str.startsWith('ufixed')) {\n const stringMatches = str.match(UFIXED_REGEX)\n if (!stringMatches || stringMatches.length !== 3) {\n throw new Error(`Malformed ufixed type: ${str}`)\n }\n const bitSize = parseInt(stringMatches[1], 10)\n const precision = parseInt(stringMatches[2], 10)\n return new ABIUfixedType(bitSize, precision)\n }\n if (str === 'bool') {\n return new ABIBoolType()\n }\n if (str === 'address') {\n return new ABIAddressType()\n }\n if (str === 'string') {\n return new ABIStringType()\n }\n if (str.length >= 2 && str[0] === '(' && str[str.length - 1] === ')') {\n const tupleContent = parseTupleContent(str.slice(1, str.length - 1))\n const childTypes: ABIType[] = []\n for (let i = 0; i < tupleContent.length; i++) {\n const ti = ABIType.from(tupleContent[i])\n childTypes.push(ti)\n }\n return new ABITupleType(childTypes)\n }\n throw new Error(`Cannot convert a string ${str} to an ABI type`)\n }\n}\n\n// ============================================================================\n// Primitive Types\n// ============================================================================\n\n/**\n * An unsigned integer ABI type of a specific bit size.\n */\nexport class ABIUintType extends ABIType {\n /**\n * Creates a new unsigned integer type.\n * @param bitSize The bit size (must be a multiple of 8, between 8 and 512)\n */\n constructor(public readonly bitSize: number) {\n super()\n if (bitSize % 8 !== 0 || bitSize < 8 || bitSize > 512) {\n throw new Error(`Unsupported uint type bitSize: ${bitSize}`)\n }\n }\n\n get name(): string {\n return `uint${this.bitSize}`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIUintType && this.bitSize === other.bitSize\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return this.bitSize / 8\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'bigint' && typeof value !== 'number') {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n\n if (value >= BigInt(2 ** this.bitSize) || value < BigInt(0)) {\n throw new Error(`${value} is not a non-negative int or too big to fit in size ${this.name}`)\n }\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n throw new Error(`${value} should be converted into a BigInt before it is encoded`)\n }\n return bigIntToBytes(value, this.bitSize / 8)\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== this.bitSize / 8) {\n throw new Error(`Byte string must correspond to a ${this.name}`)\n }\n const value = bytesToBigInt(bytes)\n return this.bitSize < 53 ? Number(value) : value\n }\n}\n\n/**\n * A fixed-point number ABI type of a specific bit size and precision.\n */\nexport class ABIUfixedType extends ABIType {\n /**\n * Creates a new fixed-point type.\n * @param bitSize The bit size (must be a multiple of 8, between 8 and 512)\n * @param precision The decimal precision (must be between 1 and 160)\n */\n constructor(\n public readonly bitSize: number,\n public readonly precision: number,\n ) {\n super()\n if (bitSize % 8 !== 0 || bitSize < 8 || bitSize > 512) {\n throw new Error(`Unsupported ufixed type bitSize: ${bitSize}`)\n }\n if (precision > 160 || precision < 1) {\n throw new Error(`Unsupported ufixed type precision: ${precision}`)\n }\n }\n\n get name(): string {\n return `ufixed${this.bitSize}x${this.precision}`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIUfixedType && this.bitSize === other.bitSize && this.precision === other.precision\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return this.bitSize / 8\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'bigint' && typeof value !== 'number') {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n if (value >= BigInt(2 ** this.bitSize) || value < BigInt(0)) {\n throw new Error(`${value} is not a non-negative int or too big to fit in size ${this.name}`)\n }\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n throw new Error(`${value} should be converted into a BigInt before it is encoded`)\n }\n return bigIntToBytes(value, this.bitSize / 8)\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== this.bitSize / 8) {\n throw new Error(`Byte string must correspond to a ${this.name}`)\n }\n const value = bytesToBigInt(bytes)\n return this.bitSize < 53 ? Number(value) : value\n }\n}\n\n/**\n * An Algorand address ABI type.\n */\nexport class ABIAddressType extends ABIType {\n get name(): string {\n return 'address'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIAddressType\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return PUBLIC_KEY_BYTE_LENGTH\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value === 'string') {\n return Address.fromString(value).publicKey\n }\n\n if (value instanceof Address) {\n return value.publicKey\n }\n\n if (value instanceof Uint8Array && value.length === 32) {\n return value\n }\n\n throw new Error(`Cannot encode value as address: ${value}`)\n }\n\n decode(bytes: Uint8Array): string {\n return new Address(bytes).toString()\n }\n}\n\n/**\n * A boolean ABI type.\n */\nexport class ABIBoolType extends ABIType {\n get name(): string {\n return 'bool'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIBoolType\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return 1\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'boolean') {\n throw new Error(`Cannot encode value as bool: ${value}`)\n }\n\n return value ? new Uint8Array([0x80]) : new Uint8Array([0x00])\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== 1) {\n throw new Error(`Expected 1 byte for bool, got ${bytes.length}`)\n }\n\n return (bytes[0] & 0x80) !== 0\n }\n}\n\n/**\n * A single byte ABI type.\n */\nexport class ABIByteType extends ABIType {\n get name(): string {\n return 'byte'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIByteType\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return 1\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'number' && typeof value !== 'bigint') {\n throw new Error(`Cannot encode value as byte: ${value}`)\n }\n const numberValue = typeof value === 'bigint' ? Number(value) : value\n if (value < 0 || value > 255) {\n throw new Error(`Byte value must be between 0 and 255, got ${numberValue}`)\n }\n\n return new Uint8Array([numberValue])\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== 1) {\n throw new Error(`Expected 1 byte for byte type, got ${bytes.length}`)\n }\n\n return bytes[0]\n }\n}\n\n/**\n * A dynamic-length string ABI type.\n */\nexport class ABIStringType extends ABIType {\n get name(): string {\n return 'string'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIStringType\n }\n\n isDynamic(): boolean {\n return true\n }\n\n byteLen(): number {\n throw new Error(`Failed to get size, string is a dynamic type`)\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'string' && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as string: ${value}`)\n }\n\n let encodedBytes: Uint8Array\n if (typeof value === 'string') {\n encodedBytes = new TextEncoder().encode(value)\n } else {\n encodedBytes = value\n }\n const encodedLength = bigIntToBytes(encodedBytes.length, LENGTH_ENCODE_BYTE_SIZE)\n const mergedBytes = new Uint8Array(encodedBytes.length + LENGTH_ENCODE_BYTE_SIZE)\n mergedBytes.set(encodedLength)\n mergedBytes.set(encodedBytes, LENGTH_ENCODE_BYTE_SIZE)\n return mergedBytes\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length < LENGTH_ENCODE_BYTE_SIZE) {\n throw new Error(\n `Byte string is too short to be decoded. Actual length is ${bytes.length}, but expected at least ${LENGTH_ENCODE_BYTE_SIZE}`,\n )\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, LENGTH_ENCODE_BYTE_SIZE)\n const byteLength = view.getUint16(0)\n const byteValue = bytes.slice(LENGTH_ENCODE_BYTE_SIZE, bytes.length)\n if (byteLength !== byteValue.length) {\n throw new Error(`String length bytes do not match the actual length of string. Expected ${byteLength}, got ${byteValue.length}`)\n }\n return new TextDecoder('utf-8').decode(byteValue)\n }\n}\n\n// ============================================================================\n// Collection Types\n// ============================================================================\n\n/**\n * A tuple ABI type containing other ABI types.\n */\nexport class ABITupleType extends ABIType {\n /**\n * Creates a new tuple type.\n * @param childTypes The types of the tuple elements\n */\n constructor(public readonly childTypes: ABIType[]) {\n super()\n if (childTypes.length > MAX_LEN) {\n throw new Error(`Tuple has too many child types: ${childTypes.length}`)\n }\n }\n\n get name(): string {\n const typeStrings: string[] = []\n for (let i = 0; i < this.childTypes.length; i++) {\n typeStrings[i] = this.childTypes[i].name\n }\n return `(${typeStrings.join(',')})`\n }\n\n equals(other: ABIType): boolean {\n if (!(other instanceof ABITupleType)) return false\n if (this.childTypes.length !== other.childTypes.length) return false\n return this.childTypes.every((t, i) => t.equals(other.childTypes[i]))\n }\n\n isDynamic(): boolean {\n return this.childTypes.some((c) => c.isDynamic())\n }\n\n byteLen(): number {\n let size = 0\n let i = 0\n while (i < this.childTypes.length) {\n const childType = this.childTypes[i]\n if (childType instanceof ABIBoolType) {\n const sequenceEndIndex = findBoolSequenceEnd(this.childTypes, i)\n const boolCount = sequenceEndIndex - i + 1\n size += Math.ceil(boolCount / 8)\n i = sequenceEndIndex + 1\n } else {\n size += childType.byteLen()\n i++\n }\n }\n return size\n }\n\n encode(value: ABIValue): Uint8Array {\n if (!Array.isArray(value) && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as ${this.toString()}: ${value}`)\n }\n\n const values = Array.from(value)\n\n if (this.childTypes.length !== values.length) {\n throw new Error('Mismatch lengths between the values and types')\n }\n\n const heads: Uint8Array[] = []\n const tails: Uint8Array[] = []\n const isDynamicIndex = new Map<number, boolean>()\n let abiTypesCursor = 0\n\n while (abiTypesCursor < this.childTypes.length) {\n const childType = this.childTypes[abiTypesCursor]\n\n if (childType.isDynamic()) {\n isDynamicIndex.set(heads.length, true)\n heads.push(new Uint8Array(2)) // Placeholder for dynamic offset\n tails.push(childType.encode(values[abiTypesCursor]))\n } else {\n if (childType instanceof ABIBoolType) {\n const boolSequenceEndIndex = findBoolSequenceEnd(this.childTypes, abiTypesCursor)\n const boolValues = values.slice(abiTypesCursor, boolSequenceEndIndex + 1)\n const compressedBool = compressBools(boolValues)\n heads.push(new Uint8Array([compressedBool]))\n abiTypesCursor = boolSequenceEndIndex\n } else {\n heads.push(childType.encode(values[abiTypesCursor]))\n }\n isDynamicIndex.set(abiTypesCursor, false)\n tails.push(new Uint8Array(0))\n }\n abiTypesCursor += 1\n }\n\n const headLength = heads.reduce((sum, head) => sum + head.length, 0)\n let tailLength = 0\n\n for (let i = 0; i < heads.length; i++) {\n if (isDynamicIndex.get(i)) {\n const headValue = headLength + tailLength\n if (headValue > 0xffff) {\n throw new Error(`Value ${headValue} cannot fit in u16`)\n }\n heads[i] = new Uint8Array([(headValue >> 8) & 0xff, headValue & 0xff])\n }\n tailLength += tails[i].length\n }\n\n const totalLength = heads.reduce((sum, head) => sum + head.length, 0) + tails.reduce((sum, tail) => sum + tail.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n\n for (const head of heads) {\n result.set(head, offset)\n offset += head.length\n }\n\n for (const tail of tails) {\n result.set(tail, offset)\n offset += tail.length\n }\n\n return result\n }\n\n decode(bytes: Uint8Array): ABIValue[] {\n const valuePartitions = extractValues(this.childTypes, bytes)\n const values: ABIValue[] = []\n\n for (let i = 0; i < this.childTypes.length; i++) {\n const childType = this.childTypes[i]\n const valuePartition = valuePartitions[i]\n const childValue = childType.decode(valuePartition)\n values.push(childValue)\n }\n\n return values\n }\n}\n\n/**\n * A static-length array ABI type.\n */\nexport class ABIArrayStaticType extends ABIType {\n /**\n * Creates a new static array type.\n * @param childType The type of the array elements\n * @param length The fixed length of the array\n */\n constructor(\n public readonly childType: ABIType,\n public readonly length: number,\n ) {\n super()\n if (length < 0 || length > MAX_LEN) {\n throw new Error(`Invalid static array length: ${length}`)\n }\n }\n\n get name(): string {\n return `${this.childType.name}[${this.length}]`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIArrayStaticType && this.childType.equals(other.childType) && this.length === other.length\n }\n\n isDynamic(): boolean {\n return this.childType.isDynamic()\n }\n\n byteLen(): number {\n if (this.childType instanceof ABIBoolType) {\n return Math.ceil(this.length / 8)\n }\n return this.childType.byteLen() * this.length\n }\n\n /**\n * Converts this static array type to an equivalent tuple type.\n * @returns The equivalent tuple type\n */\n toABITupleType(): ABITupleType {\n return new ABITupleType(Array(this.length).fill(this.childType))\n }\n\n encode(value: ABIValue): Uint8Array {\n if (!Array.isArray(value) && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n if (value.length !== this.length) {\n throw new Error(`Value array does not match static array length. Expected ${this.length}, got ${value.length}`)\n }\n const convertedTuple = this.toABITupleType()\n return convertedTuple.encode(value)\n }\n\n decode(bytes: Uint8Array): ABIValue[] | Uint8Array {\n const convertedTuple = this.toABITupleType()\n const decoded = convertedTuple.decode(bytes)\n\n // Convert byte arrays to Uint8Array\n if (this.childType instanceof ABIByteType && Array.isArray(decoded)) {\n return new Uint8Array(decoded as number[])\n }\n\n return decoded\n }\n}\n\n/**\n * A dynamic-length array ABI type.\n */\nexport class ABIArrayDynamicType extends ABIType {\n /**\n * Creates a new dynamic array type.\n * @param childType The type of the array elements\n */\n constructor(public readonly childType: ABIType) {\n super()\n }\n\n get name(): string {\n return `${this.childType.name}[]`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIArrayDynamicType && this.childType.equals(other.childType)\n }\n\n isDynamic(): boolean {\n return true\n }\n\n byteLen(): number {\n throw new Error(`Failed to get size, dynamic array is a dynamic type`)\n }\n\n /**\n * Converts this dynamic array type to an equivalent tuple type of a given length.\n * @param length The number of elements\n * @returns The equivalent tuple type\n */\n toABITupleType(length: number): ABITupleType {\n return new ABITupleType(Array(length).fill(this.childType))\n }\n\n encode(value: ABIValue): Uint8Array {\n if (!Array.isArray(value) && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n const convertedTuple = this.toABITupleType(value.length)\n const encodedTuple = convertedTuple.encode(value)\n const encodedLength = bigIntToBytes(convertedTuple.childTypes.length, LENGTH_ENCODE_BYTE_SIZE)\n return concatArrays(encodedLength, encodedTuple)\n }\n\n decode(bytes: Uint8Array): ABIValue[] | Uint8Array {\n const view = new DataView(bytes.buffer, 0, LENGTH_ENCODE_BYTE_SIZE)\n const byteLength = view.getUint16(0)\n const convertedTuple = this.toABITupleType(byteLength)\n const decoded = convertedTuple.decode(bytes.slice(LENGTH_ENCODE_BYTE_SIZE, bytes.length))\n\n // Convert byte arrays to Uint8Array\n if (this.childType instanceof ABIByteType && Array.isArray(decoded)) {\n return new Uint8Array(decoded as number[])\n }\n\n return decoded\n }\n}\n\n/**\n * A struct ABI type with named fields.\n */\nexport class ABIStructType extends ABIType {\n /**\n * Creates a new struct type.\n * @param structName The name of the struct\n * @param structFields The fields of the struct\n */\n constructor(\n public readonly structName: string,\n public readonly structFields: ABIStructField[],\n ) {\n super()\n }\n\n get name(): string {\n const tupleType = this.toABITupleType()\n return tupleType.name\n }\n\n get displayName(): string {\n return this.structName\n }\n\n equals(other: ABIType): boolean {\n if (!(other instanceof ABIStructType)) return false\n if (this.structName !== other.structName) return false\n if (this.structFields.length !== other.structFields.length) return false\n return this.structFields.every((f, i) => {\n const otherField = other.structFields[i]\n if (f.name !== otherField.name) return false\n if (Array.isArray(f.type) && Array.isArray(otherField.type)) {\n return JSON.stringify(f.type) === JSON.stringify(otherField.type)\n }\n if (f.type instanceof ABIType && otherField.type instanceof ABIType) {\n return f.type.equals(otherField.type)\n }\n return false\n })\n }\n\n isDynamic(): boolean {\n const tupleType = this.toABITupleType()\n return tupleType.isDynamic()\n }\n\n byteLen(): number {\n const tupleType = this.toABITupleType()\n return tupleType.byteLen()\n }\n\n /**\n * Converts this struct type to an equivalent tuple type.\n * @returns The equivalent tuple type\n */\n toABITupleType(): ABITupleType {\n const getABITupleTypeFromABIStructFields = (fields: ABIStructField[]): ABITupleType => {\n const childTypes = fields.map((field) =>\n Array.isArray(field.type)\n ? getABITupleTypeFromABIStructFields(field.type)\n : field.type instanceof ABIStructType\n ? field.type.toABITupleType()\n : field.type,\n )\n return new ABITupleType(childTypes)\n }\n\n return getABITupleTypeFromABIStructFields(this.structFields)\n }\n\n /**\n * Creates an ABIStructType from struct name and struct definitions.\n * @param structName The name of the struct\n * @param structs A record of struct definitions\n * @returns The struct type\n */\n static fromStruct(structName: string, structs: Record<string, StructField[]>): ABIStructType {\n const getStructFieldType = (structFieldType: string | StructField[]): ABIType | ABIStructField[] => {\n // When the input is an array of struct fields\n if (Array.isArray(structFieldType)) {\n return structFieldType.map((structField) => ({\n name: structField.name,\n type: getStructFieldType(structField.type),\n }))\n }\n\n // When the input is a name of another struct\n if (structs[structFieldType]) {\n return ABIStructType.fromStruct(structFieldType, structs)\n }\n\n // When the input in an ABI type name\n return ABIType.from(structFieldType)\n }\n\n if (!structs[structName]) throw new Error('Struct not found')\n\n const fields = structs[structName]\n return new ABIStructType(\n structName,\n fields.map((f) => ({\n name: f.name,\n type: getStructFieldType(f.type),\n })),\n )\n }\n\n encode(value: ABIValue): Uint8Array {\n if (value instanceof Uint8Array || value instanceof Address || typeof value !== 'object') {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n\n const tupleType = this.toABITupleType()\n if (Array.isArray(value)) {\n return tupleType.encode(value)\n }\n\n const tupleValue = getTupleValueFromStructValue(this, value)\n return tupleType.encode(tupleValue)\n }\n\n decode(bytes: Uint8Array): ABIStructValue {\n const tupleType = this.toABITupleType()\n const tupleValue = tupleType.decode(bytes)\n return getStructValueFromTupleValue(this, tupleValue)\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction compressBools(values: ABIValue[]): number {\n if (values.length > 8) {\n throw new Error(`Expected no more than 8 bool values, received ${values.length}`)\n }\n\n let result = 0\n for (let i = 0; i < values.length; i++) {\n if (typeof values[i] !== 'boolean') {\n throw new Error('Expected all values to be boolean')\n }\n if (values[i]) {\n result |= 1 << (7 - i)\n }\n }\n\n return result\n}\n\nfunction findBoolSequenceEnd(abiTypes: ABIType[], currentIndex: number): number {\n let cursor = currentIndex\n while (cursor < abiTypes.length) {\n if (abiTypes[cursor] instanceof ABIBoolType) {\n if (cursor - currentIndex + 1 === 8 || cursor === abiTypes.length - 1) {\n return cursor\n }\n cursor++\n } else {\n return cursor - 1\n }\n }\n return cursor - 1\n}\n\nfunction extractValues(abiTypes: ABIType[], bytes: Uint8Array): Uint8Array[] {\n const dynamicSegments: Segment[] = []\n const valuePartitions: (Uint8Array | null)[] = []\n let bytesCursor = 0\n let abiTypesCursor = 0\n\n while (abiTypesCursor < abiTypes.length) {\n const childType = abiTypes[abiTypesCursor]\n\n if (childType.isDynamic()) {\n if (bytes.length - bytesCursor < LENGTH_ENCODE_BYTE_SIZE) {\n throw new Error('Byte array is too short to be decoded')\n }\n\n const dynamicIndex = (bytes[bytesCursor] << 8) | bytes[bytesCursor + 1]\n\n if (dynamicSegments.length > 0) {\n const lastSegment = dynamicSegments[dynamicSegments.length - 1]\n if (dynamicIndex < lastSegment.left) {\n throw new Error('Dynamic index segment miscalculation: left is greater than right index')\n }\n lastSegment.right = dynamicIndex\n }\n\n dynamicSegments.push({ left: dynamicIndex, right: 0 })\n valuePartitions.push(null)\n bytesCursor += LENGTH_ENCODE_BYTE_SIZE\n } else {\n if (childType instanceof ABIBoolType) {\n const boolSequenceEndIndex = findBoolSequenceEnd(abiTypes, abiTypesCursor)\n for (let j = 0; j <= boolSequenceEndIndex - abiTypesCursor; j++) {\n const boolMask = BOOL_TRUE_BYTE >> j\n if ((bytes[bytesCursor] & boolMask) > 0) {\n valuePartitions.push(new Uint8Array([BOOL_TRUE_BYTE]))\n } else {\n valuePartitions.push(new Uint8Array([BOOL_FALSE_BYTE]))\n }\n }\n abiTypesCursor = boolSequenceEndIndex\n bytesCursor += 1\n } else {\n const childTypeSize = childType.byteLen()\n if (bytesCursor + childTypeSize > bytes.length) {\n throw new Error(\n `Index out of bounds, trying to access bytes[${bytesCursor}..${bytesCursor + childTypeSize}] but slice has length ${bytes.length}`,\n )\n }\n valuePartitions.push(bytes.slice(bytesCursor, bytesCursor + childTypeSize))\n bytesCursor += childTypeSize\n }\n }\n\n if (abiTypesCursor !== abiTypes.length - 1 && bytesCursor >= bytes.length) {\n throw new Error('Input bytes not enough to decode')\n }\n abiTypesCursor += 1\n }\n\n if (dynamicSegments.length > 0) {\n const lastSegment = dynamicSegments[dynamicSegments.length - 1]\n lastSegment.right = bytes.length\n } else if (bytesCursor < bytes.length) {\n throw new Error('Input bytes not fully consumed')\n }\n\n for (let i = 0; i < dynamicSegments.length; i++) {\n const segment = dynamicSegments[i]\n if (segment.left > segment.right) {\n throw new Error('Dynamic segment should display a [l, r] space with l <= r')\n }\n if (i !== dynamicSegments.length - 1 && segment.right !== dynamicSegments[i + 1].left) {\n throw new Error('Dynamic segments should be consecutive')\n }\n }\n\n let segmentIndex = 0\n for (let i = 0; i < abiTypes.length; i++) {\n const childType = abiTypes[i]\n if (childType.isDynamic()) {\n valuePartitions[i] = bytes.slice(dynamicSegments[segmentIndex].left, dynamicSegments[segmentIndex].right)\n segmentIndex += 1\n }\n }\n\n const result: Uint8Array[] = []\n for (let i = 0; i < valuePartitions.length; i++) {\n const partition = valuePartitions[i]\n if (partition === null) {\n throw new Error(`Value partition at index ${i} is None`)\n }\n result.push(partition)\n }\n\n return result\n}\n\nexport function parseTupleContent(content: string): string[] {\n if (content === '') {\n return []\n }\n\n if (content.startsWith(',')) {\n throw new Error('The content should not start with comma')\n }\n if (content.endsWith(',')) {\n throw new Error('The content should not end with comma')\n }\n if (content.includes(',,')) {\n throw new Error('The content should not have consecutive commas')\n }\n\n const tupleStrings: string[] = []\n let depth = 0\n let word = ''\n\n for (const ch of content) {\n word += ch\n if (ch === '(') {\n depth += 1\n } else if (ch === ')') {\n depth -= 1\n } else if (ch === ',' && depth === 0) {\n word = word.slice(0, -1) // Remove the comma\n tupleStrings.push(word)\n word = ''\n }\n }\n\n if (word !== '') {\n tupleStrings.push(word)\n }\n\n if (depth !== 0) {\n throw new Error('The content has mismatched parentheses')\n }\n\n return tupleStrings\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abi-type.js","names":["bigIntToBytes","bytesToBigInt","Address","concatArrays","getTupleValueFromStructValue","getStructValueFromTupleValue"],"sources":["../../../../packages/abi/src/abi-type.ts"],"sourcesContent":["import {\n Address,\n BOOL_FALSE_BYTE,\n BOOL_TRUE_BYTE,\n LENGTH_ENCODE_BYTE_SIZE,\n PUBLIC_KEY_BYTE_LENGTH,\n concatArrays,\n} from '@algorandfoundation/algokit-common'\nimport type { ABIStructValue, ABIValue } from './abi-value'\nimport { StructField } from './arc56-contract'\nimport { bigIntToBytes, bytesToBigInt } from './bigint'\nimport { getStructValueFromTupleValue, getTupleValueFromStructValue } from './utils'\n\nconst STATIC_ARRAY_REGEX = /^([a-z\\d[\\](),]+)\\[(0|[1-9][\\d]*)]$/\nconst UFIXED_REGEX = /^ufixed([1-9][\\d]*)x([1-9][\\d]*)$/\nconst MAX_LEN = 2 ** 16 - 1\n\n/**\n * Information about a single field in a struct\n */\nexport type ABIStructField = {\n /** The name of the struct field */\n name: string\n /** The type of the struct field's value */\n type: ABIType | ABIStructField[]\n}\n\ninterface Segment {\n left: number\n right: number\n}\n\n/**\n * Represents an Algorand ABI type for encoding and decoding values as defined in [ARC-0004](https://arc.algorand.foundation/ARCs/arc-0004#types).\n *\n * This is the abstract base class for all ABI types.\n */\nexport abstract class ABIType {\n /**\n * Returns the ARC-4 type name string representation.\n * @returns The ARC-4 type string\n */\n abstract get name(): string\n\n /**\n * Returns a user-friendly display name for this type.\n * @returns The display name for this type\n */\n get displayName(): string {\n return this.name\n }\n\n /**\n * Returns the ARC-4 type name string representation.\n * @returns The ARC-4 type string\n */\n toString(): string {\n return this.name\n }\n\n /**\n * Checks if this ABI type is equal to another.\n * @param other The other ABI type to compare with\n * @returns True if the types are equal, false otherwise\n */\n abstract equals(other: ABIType): boolean\n\n /**\n * Checks if this ABI type is dynamic (variable-length).\n * @returns True if the type is dynamic, false otherwise\n */\n abstract isDynamic(): boolean\n\n /**\n * Gets the byte length of the encoded type for static types.\n * @returns The number of bytes needed to encode this type\n * @throws Error if the type is dynamic\n */\n abstract byteLen(): number\n\n /**\n * Encodes a value according to this ABI type.\n * @param value The value to encode\n * @returns The encoded bytes\n */\n abstract encode(value: ABIValue): Uint8Array\n\n /**\n * Decodes bytes according to this ABI type.\n * @param bytes The bytes to decode\n * @returns The decoded value\n */\n abstract decode(bytes: Uint8Array): ABIValue\n\n /**\n * Creates an ABI type from an ARC-4 type string.\n * @param str The ARC-4 type string (e.g., \"uint256\", \"bool\", \"(uint8,address)\")\n * @returns The corresponding ABI type\n */\n static from(str: string): ABIType {\n if (str.endsWith('[]')) {\n const childType = ABIType.from(str.slice(0, str.length - 2))\n return new ABIArrayDynamicType(childType)\n }\n if (str.endsWith(']')) {\n const stringMatches = str.match(STATIC_ARRAY_REGEX)\n if (!stringMatches || stringMatches.length !== 3) {\n throw new Error(`Malformed static array string: ${str}`)\n }\n const arrayLengthStr = stringMatches[2]\n const arrayLength = parseInt(arrayLengthStr, 10)\n if (arrayLength > MAX_LEN) {\n throw new Error(`Array length exceeds limit ${MAX_LEN}`)\n }\n const childType = ABIType.from(stringMatches[1])\n return new ABIArrayStaticType(childType, arrayLength)\n }\n if (str.startsWith('uint')) {\n const digitsOnly = (s: string) => [...s].every((c) => '0123456789'.includes(c))\n const typeSizeStr = str.slice(4, str.length)\n if (!digitsOnly(typeSizeStr)) {\n throw new Error(`Malformed uint string: ${typeSizeStr}`)\n }\n const bitSize = parseInt(typeSizeStr, 10)\n if (bitSize > MAX_LEN) {\n throw new Error(`Malformed uint string: ${bitSize}`)\n }\n return new ABIUintType(bitSize)\n }\n if (str === 'byte') {\n return new ABIByteType()\n }\n if (str.startsWith('ufixed')) {\n const stringMatches = str.match(UFIXED_REGEX)\n if (!stringMatches || stringMatches.length !== 3) {\n throw new Error(`Malformed ufixed type: ${str}`)\n }\n const bitSize = parseInt(stringMatches[1], 10)\n const precision = parseInt(stringMatches[2], 10)\n return new ABIUfixedType(bitSize, precision)\n }\n if (str === 'bool') {\n return new ABIBoolType()\n }\n if (str === 'address') {\n return new ABIAddressType()\n }\n if (str === 'string') {\n return new ABIStringType()\n }\n if (str.length >= 2 && str[0] === '(' && str[str.length - 1] === ')') {\n const tupleContent = parseTupleContent(str.slice(1, str.length - 1))\n const childTypes: ABIType[] = []\n for (let i = 0; i < tupleContent.length; i++) {\n const ti = ABIType.from(tupleContent[i])\n childTypes.push(ti)\n }\n return new ABITupleType(childTypes)\n }\n throw new Error(`Cannot convert a string ${str} to an ABI type`)\n }\n}\n\n// ============================================================================\n// Primitive Types\n// ============================================================================\n\n/**\n * An unsigned integer ABI type of a specific bit size.\n */\nexport class ABIUintType extends ABIType {\n /**\n * Creates a new unsigned integer type.\n * @param bitSize The bit size (must be a multiple of 8, between 8 and 512)\n */\n constructor(public readonly bitSize: number) {\n super()\n if (bitSize % 8 !== 0 || bitSize < 8 || bitSize > 512) {\n throw new Error(`Unsupported uint type bitSize: ${bitSize}`)\n }\n }\n\n get name(): string {\n return `uint${this.bitSize}`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIUintType && this.bitSize === other.bitSize\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return this.bitSize / 8\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'bigint' && typeof value !== 'number') {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n\n if (value >= BigInt(2 ** this.bitSize) || value < BigInt(0)) {\n throw new Error(`${value} is not a non-negative int or too big to fit in size ${this.name}`)\n }\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n throw new Error(`${value} should be converted into a BigInt before it is encoded`)\n }\n return bigIntToBytes(value, this.bitSize / 8)\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== this.bitSize / 8) {\n throw new Error(`Byte string must correspond to a ${this.name}`)\n }\n const value = bytesToBigInt(bytes)\n return this.bitSize < 53 ? Number(value) : value\n }\n}\n\n/**\n * A fixed-point number ABI type of a specific bit size and precision.\n */\nexport class ABIUfixedType extends ABIType {\n /**\n * Creates a new fixed-point type.\n * @param bitSize The bit size (must be a multiple of 8, between 8 and 512)\n * @param precision The decimal precision (must be between 1 and 160)\n */\n constructor(\n public readonly bitSize: number,\n public readonly precision: number,\n ) {\n super()\n if (bitSize % 8 !== 0 || bitSize < 8 || bitSize > 512) {\n throw new Error(`Unsupported ufixed type bitSize: ${bitSize}`)\n }\n if (precision > 160 || precision < 1) {\n throw new Error(`Unsupported ufixed type precision: ${precision}`)\n }\n }\n\n get name(): string {\n return `ufixed${this.bitSize}x${this.precision}`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIUfixedType && this.bitSize === other.bitSize && this.precision === other.precision\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return this.bitSize / 8\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'bigint' && typeof value !== 'number') {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n if (value >= BigInt(2 ** this.bitSize) || value < BigInt(0)) {\n throw new Error(`${value} is not a non-negative int or too big to fit in size ${this.name}`)\n }\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n throw new Error(`${value} should be converted into a BigInt before it is encoded`)\n }\n return bigIntToBytes(value, this.bitSize / 8)\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== this.bitSize / 8) {\n throw new Error(`Byte string must correspond to a ${this.name}`)\n }\n const value = bytesToBigInt(bytes)\n return this.bitSize < 53 ? Number(value) : value\n }\n}\n\n/**\n * An Algorand address ABI type.\n */\nexport class ABIAddressType extends ABIType {\n get name(): string {\n return 'address'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIAddressType\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return PUBLIC_KEY_BYTE_LENGTH\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value === 'string') {\n return Address.fromString(value).publicKey\n }\n\n if (value instanceof Address) {\n return value.publicKey\n }\n\n if (value instanceof Uint8Array && value.length === 32) {\n return value\n }\n\n throw new Error(`Cannot encode value as address: ${value}`)\n }\n\n decode(bytes: Uint8Array): string {\n return new Address(bytes).toString()\n }\n}\n\n/**\n * A boolean ABI type.\n */\nexport class ABIBoolType extends ABIType {\n get name(): string {\n return 'bool'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIBoolType\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return 1\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'boolean') {\n throw new Error(`Cannot encode value as bool: ${value}`)\n }\n\n return value ? new Uint8Array([0x80]) : new Uint8Array([0x00])\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== 1) {\n throw new Error(`Expected 1 byte for bool, got ${bytes.length}`)\n }\n\n return (bytes[0] & 0x80) !== 0\n }\n}\n\n/**\n * A single byte ABI type.\n */\nexport class ABIByteType extends ABIType {\n get name(): string {\n return 'byte'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIByteType\n }\n\n isDynamic(): boolean {\n return false\n }\n\n byteLen(): number {\n return 1\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'number' && typeof value !== 'bigint') {\n throw new Error(`Cannot encode value as byte: ${value}`)\n }\n const numberValue = typeof value === 'bigint' ? Number(value) : value\n if (value < 0 || value > 255) {\n throw new Error(`Byte value must be between 0 and 255, got ${numberValue}`)\n }\n\n return new Uint8Array([numberValue])\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length !== 1) {\n throw new Error(`Expected 1 byte for byte type, got ${bytes.length}`)\n }\n\n return bytes[0]\n }\n}\n\n/**\n * A dynamic-length string ABI type.\n */\nexport class ABIStringType extends ABIType {\n get name(): string {\n return 'string'\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIStringType\n }\n\n isDynamic(): boolean {\n return true\n }\n\n byteLen(): number {\n throw new Error(`Failed to get size, string is a dynamic type`)\n }\n\n encode(value: ABIValue): Uint8Array {\n if (typeof value !== 'string' && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as string: ${value}`)\n }\n\n let encodedBytes: Uint8Array\n if (typeof value === 'string') {\n encodedBytes = new TextEncoder().encode(value)\n } else {\n encodedBytes = value\n }\n const encodedLength = bigIntToBytes(encodedBytes.length, LENGTH_ENCODE_BYTE_SIZE)\n const mergedBytes = new Uint8Array(encodedBytes.length + LENGTH_ENCODE_BYTE_SIZE)\n mergedBytes.set(encodedLength)\n mergedBytes.set(encodedBytes, LENGTH_ENCODE_BYTE_SIZE)\n return mergedBytes\n }\n\n decode(bytes: Uint8Array): ABIValue {\n if (bytes.length < LENGTH_ENCODE_BYTE_SIZE) {\n throw new Error(\n `Byte string is too short to be decoded. Actual length is ${bytes.length}, but expected at least ${LENGTH_ENCODE_BYTE_SIZE}`,\n )\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, LENGTH_ENCODE_BYTE_SIZE)\n const byteLength = view.getUint16(0)\n const byteValue = bytes.slice(LENGTH_ENCODE_BYTE_SIZE, bytes.length)\n if (byteLength !== byteValue.length) {\n throw new Error(`String length bytes do not match the actual length of string. Expected ${byteLength}, got ${byteValue.length}`)\n }\n return new TextDecoder('utf-8').decode(byteValue)\n }\n}\n\n// ============================================================================\n// Collection Types\n// ============================================================================\n\n/**\n * A tuple ABI type containing other ABI types.\n */\nexport class ABITupleType extends ABIType {\n /**\n * Creates a new tuple type.\n * @param childTypes The types of the tuple elements\n */\n constructor(public readonly childTypes: ABIType[]) {\n super()\n if (childTypes.length > MAX_LEN) {\n throw new Error(`Tuple has too many child types: ${childTypes.length}`)\n }\n }\n\n get name(): string {\n const typeStrings: string[] = []\n for (let i = 0; i < this.childTypes.length; i++) {\n typeStrings[i] = this.childTypes[i].name\n }\n return `(${typeStrings.join(',')})`\n }\n\n equals(other: ABIType): boolean {\n if (!(other instanceof ABITupleType)) return false\n if (this.childTypes.length !== other.childTypes.length) return false\n return this.childTypes.every((t, i) => t.equals(other.childTypes[i]))\n }\n\n isDynamic(): boolean {\n return this.childTypes.some((c) => c.isDynamic())\n }\n\n byteLen(): number {\n let size = 0\n let i = 0\n while (i < this.childTypes.length) {\n const childType = this.childTypes[i]\n if (childType instanceof ABIBoolType) {\n const sequenceEndIndex = findBoolSequenceEnd(this.childTypes, i)\n const boolCount = sequenceEndIndex - i + 1\n size += Math.ceil(boolCount / 8)\n i = sequenceEndIndex + 1\n } else {\n size += childType.byteLen()\n i++\n }\n }\n return size\n }\n\n encode(value: ABIValue): Uint8Array {\n if (!Array.isArray(value) && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as ${this.toString()}: ${value}`)\n }\n\n const values = Array.from(value)\n\n if (this.childTypes.length !== values.length) {\n throw new Error('Mismatch lengths between the values and types')\n }\n\n const heads: Uint8Array[] = []\n const tails: Uint8Array[] = []\n const isDynamicIndex = new Map<number, boolean>()\n let abiTypesCursor = 0\n\n while (abiTypesCursor < this.childTypes.length) {\n const childType = this.childTypes[abiTypesCursor]\n\n if (childType.isDynamic()) {\n isDynamicIndex.set(heads.length, true)\n heads.push(new Uint8Array(2)) // Placeholder for dynamic offset\n tails.push(childType.encode(values[abiTypesCursor]))\n } else {\n if (childType instanceof ABIBoolType) {\n const boolSequenceEndIndex = findBoolSequenceEnd(this.childTypes, abiTypesCursor)\n const boolValues = values.slice(abiTypesCursor, boolSequenceEndIndex + 1)\n const compressedBool = compressBools(boolValues)\n heads.push(new Uint8Array([compressedBool]))\n abiTypesCursor = boolSequenceEndIndex\n } else {\n heads.push(childType.encode(values[abiTypesCursor]))\n }\n isDynamicIndex.set(abiTypesCursor, false)\n tails.push(new Uint8Array(0))\n }\n abiTypesCursor += 1\n }\n\n const headLength = heads.reduce((sum, head) => sum + head.length, 0)\n let tailLength = 0\n\n for (let i = 0; i < heads.length; i++) {\n if (isDynamicIndex.get(i)) {\n const headValue = headLength + tailLength\n if (headValue > 0xffff) {\n throw new Error(`Value ${headValue} cannot fit in u16`)\n }\n heads[i] = new Uint8Array([(headValue >> 8) & 0xff, headValue & 0xff])\n }\n tailLength += tails[i].length\n }\n\n const totalLength = heads.reduce((sum, head) => sum + head.length, 0) + tails.reduce((sum, tail) => sum + tail.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n\n for (const head of heads) {\n result.set(head, offset)\n offset += head.length\n }\n\n for (const tail of tails) {\n result.set(tail, offset)\n offset += tail.length\n }\n\n return result\n }\n\n decode(bytes: Uint8Array): ABIValue[] {\n const valuePartitions = extractValues(this.childTypes, bytes)\n const values: ABIValue[] = []\n\n for (let i = 0; i < this.childTypes.length; i++) {\n const childType = this.childTypes[i]\n const valuePartition = valuePartitions[i]\n const childValue = childType.decode(valuePartition)\n values.push(childValue)\n }\n\n return values\n }\n}\n\n/**\n * A static-length array ABI type.\n */\nexport class ABIArrayStaticType extends ABIType {\n /**\n * Creates a new static array type.\n * @param childType The type of the array elements\n * @param length The fixed length of the array\n */\n constructor(\n public readonly childType: ABIType,\n public readonly length: number,\n ) {\n super()\n if (length < 0 || length > MAX_LEN) {\n throw new Error(`Invalid static array length: ${length}`)\n }\n }\n\n get name(): string {\n return `${this.childType.name}[${this.length}]`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIArrayStaticType && this.childType.equals(other.childType) && this.length === other.length\n }\n\n isDynamic(): boolean {\n return this.childType.isDynamic()\n }\n\n byteLen(): number {\n if (this.childType instanceof ABIBoolType) {\n return Math.ceil(this.length / 8)\n }\n return this.childType.byteLen() * this.length\n }\n\n /**\n * Converts this static array type to an equivalent tuple type.\n * @returns The equivalent tuple type\n */\n toABITupleType(): ABITupleType {\n return new ABITupleType(Array(this.length).fill(this.childType))\n }\n\n encode(value: ABIValue): Uint8Array {\n if (!Array.isArray(value) && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n if (value.length !== this.length) {\n throw new Error(`Value array does not match static array length. Expected ${this.length}, got ${value.length}`)\n }\n const convertedTuple = this.toABITupleType()\n return convertedTuple.encode(value)\n }\n\n decode(bytes: Uint8Array): ABIValue[] | Uint8Array {\n const convertedTuple = this.toABITupleType()\n const decoded = convertedTuple.decode(bytes)\n\n // Convert byte arrays to Uint8Array\n if (this.childType instanceof ABIByteType && Array.isArray(decoded)) {\n return new Uint8Array(decoded as number[])\n }\n\n return decoded\n }\n}\n\n/**\n * A dynamic-length array ABI type.\n */\nexport class ABIArrayDynamicType extends ABIType {\n /**\n * Creates a new dynamic array type.\n * @param childType The type of the array elements\n */\n constructor(public readonly childType: ABIType) {\n super()\n }\n\n get name(): string {\n return `${this.childType.name}[]`\n }\n\n equals(other: ABIType): boolean {\n return other instanceof ABIArrayDynamicType && this.childType.equals(other.childType)\n }\n\n isDynamic(): boolean {\n return true\n }\n\n byteLen(): number {\n throw new Error(`Failed to get size, dynamic array is a dynamic type`)\n }\n\n /**\n * Converts this dynamic array type to an equivalent tuple type of a given length.\n * @param length The number of elements\n * @returns The equivalent tuple type\n */\n toABITupleType(length: number): ABITupleType {\n return new ABITupleType(Array(length).fill(this.childType))\n }\n\n encode(value: ABIValue): Uint8Array {\n if (!Array.isArray(value) && !(value instanceof Uint8Array)) {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n const convertedTuple = this.toABITupleType(value.length)\n const encodedTuple = convertedTuple.encode(value)\n const encodedLength = bigIntToBytes(convertedTuple.childTypes.length, LENGTH_ENCODE_BYTE_SIZE)\n return concatArrays(encodedLength, encodedTuple)\n }\n\n decode(bytes: Uint8Array): ABIValue[] | Uint8Array {\n const view = new DataView(bytes.buffer, 0, LENGTH_ENCODE_BYTE_SIZE)\n const byteLength = view.getUint16(0)\n const convertedTuple = this.toABITupleType(byteLength)\n const decoded = convertedTuple.decode(bytes.slice(LENGTH_ENCODE_BYTE_SIZE, bytes.length))\n\n // Convert byte arrays to Uint8Array\n if (this.childType instanceof ABIByteType && Array.isArray(decoded)) {\n return new Uint8Array(decoded as number[])\n }\n\n return decoded\n }\n}\n\n/**\n * A struct ABI type with named fields.\n */\nexport class ABIStructType extends ABIType {\n /**\n * Creates a new struct type.\n * @param structName The name of the struct\n * @param structFields The fields of the struct\n */\n constructor(\n public readonly structName: string,\n public readonly structFields: ABIStructField[],\n ) {\n super()\n }\n\n get name(): string {\n const tupleType = this.toABITupleType()\n return tupleType.name\n }\n\n get displayName(): string {\n return this.structName\n }\n\n equals(other: ABIType): boolean {\n if (!(other instanceof ABIStructType)) return false\n if (this.structName !== other.structName) return false\n if (this.structFields.length !== other.structFields.length) return false\n return this.structFields.every((f, i) => {\n const otherField = other.structFields[i]\n if (f.name !== otherField.name) return false\n if (Array.isArray(f.type) && Array.isArray(otherField.type)) {\n return JSON.stringify(f.type) === JSON.stringify(otherField.type)\n }\n if (f.type instanceof ABIType && otherField.type instanceof ABIType) {\n return f.type.equals(otherField.type)\n }\n return false\n })\n }\n\n isDynamic(): boolean {\n const tupleType = this.toABITupleType()\n return tupleType.isDynamic()\n }\n\n byteLen(): number {\n const tupleType = this.toABITupleType()\n return tupleType.byteLen()\n }\n\n /**\n * Converts this struct type to an equivalent tuple type.\n * @returns The equivalent tuple type\n */\n toABITupleType(): ABITupleType {\n const getABITupleTypeFromABIStructFields = (fields: ABIStructField[]): ABITupleType => {\n const childTypes = fields.map((field) =>\n Array.isArray(field.type)\n ? getABITupleTypeFromABIStructFields(field.type)\n : field.type instanceof ABIStructType\n ? field.type.toABITupleType()\n : field.type,\n )\n return new ABITupleType(childTypes)\n }\n\n return getABITupleTypeFromABIStructFields(this.structFields)\n }\n\n /**\n * Creates an ABIStructType from struct name and struct definitions.\n * @param structName The name of the struct\n * @param structs A record of struct definitions\n * @returns The struct type\n */\n static fromStruct(structName: string, structs: Record<string, StructField[]>): ABIStructType {\n const getStructFieldType = (structFieldType: string | StructField[]): ABIType | ABIStructField[] => {\n // When the input is an array of struct fields\n if (Array.isArray(structFieldType)) {\n return structFieldType.map((structField) => ({\n name: structField.name,\n type: getStructFieldType(structField.type),\n }))\n }\n\n // When the input is a name of another struct\n if (structs[structFieldType]) {\n return ABIStructType.fromStruct(structFieldType, structs)\n }\n\n // When the input in an ABI type name\n return ABIType.from(structFieldType)\n }\n\n if (!structs[structName]) throw new Error('Struct not found')\n\n const fields = structs[structName]\n return new ABIStructType(\n structName,\n fields.map((f) => ({\n name: f.name,\n type: getStructFieldType(f.type),\n })),\n )\n }\n\n encode(value: ABIValue): Uint8Array {\n if (value instanceof Uint8Array || value instanceof Address || typeof value !== 'object') {\n throw new Error(`Cannot encode value as ${this.name}: ${value}`)\n }\n\n const tupleType = this.toABITupleType()\n if (Array.isArray(value)) {\n return tupleType.encode(value)\n }\n\n const tupleValue = getTupleValueFromStructValue(this, value)\n return tupleType.encode(tupleValue)\n }\n\n decode(bytes: Uint8Array): ABIStructValue {\n const tupleType = this.toABITupleType()\n const tupleValue = tupleType.decode(bytes)\n return getStructValueFromTupleValue(this, tupleValue)\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction compressBools(values: ABIValue[]): number {\n if (values.length > 8) {\n throw new Error(`Expected no more than 8 bool values, received ${values.length}`)\n }\n\n let result = 0\n for (let i = 0; i < values.length; i++) {\n if (typeof values[i] !== 'boolean') {\n throw new Error('Expected all values to be boolean')\n }\n if (values[i]) {\n result |= 1 << (7 - i)\n }\n }\n\n return result\n}\n\nfunction findBoolSequenceEnd(abiTypes: ABIType[], currentIndex: number): number {\n let cursor = currentIndex\n while (cursor < abiTypes.length) {\n if (abiTypes[cursor] instanceof ABIBoolType) {\n if (cursor - currentIndex + 1 === 8 || cursor === abiTypes.length - 1) {\n return cursor\n }\n cursor++\n } else {\n return cursor - 1\n }\n }\n return cursor - 1\n}\n\nfunction extractValues(abiTypes: ABIType[], bytes: Uint8Array): Uint8Array[] {\n const dynamicSegments: Segment[] = []\n const valuePartitions: (Uint8Array | null)[] = []\n let bytesCursor = 0\n let abiTypesCursor = 0\n\n while (abiTypesCursor < abiTypes.length) {\n const childType = abiTypes[abiTypesCursor]\n\n if (childType.isDynamic()) {\n if (bytes.length - bytesCursor < LENGTH_ENCODE_BYTE_SIZE) {\n throw new Error('Byte array is too short to be decoded')\n }\n\n const dynamicIndex = (bytes[bytesCursor] << 8) | bytes[bytesCursor + 1]\n\n if (dynamicSegments.length > 0) {\n const lastSegment = dynamicSegments[dynamicSegments.length - 1]\n if (dynamicIndex < lastSegment.left) {\n throw new Error('Dynamic index segment miscalculation: left is greater than right index')\n }\n lastSegment.right = dynamicIndex\n }\n\n dynamicSegments.push({ left: dynamicIndex, right: 0 })\n valuePartitions.push(null)\n bytesCursor += LENGTH_ENCODE_BYTE_SIZE\n } else {\n if (childType instanceof ABIBoolType) {\n const boolSequenceEndIndex = findBoolSequenceEnd(abiTypes, abiTypesCursor)\n for (let j = 0; j <= boolSequenceEndIndex - abiTypesCursor; j++) {\n const boolMask = BOOL_TRUE_BYTE >> j\n if ((bytes[bytesCursor] & boolMask) > 0) {\n valuePartitions.push(new Uint8Array([BOOL_TRUE_BYTE]))\n } else {\n valuePartitions.push(new Uint8Array([BOOL_FALSE_BYTE]))\n }\n }\n abiTypesCursor = boolSequenceEndIndex\n bytesCursor += 1\n } else {\n const childTypeSize = childType.byteLen()\n if (bytesCursor + childTypeSize > bytes.length) {\n throw new Error(\n `Index out of bounds, trying to access bytes[${bytesCursor}..${bytesCursor + childTypeSize}] but slice has length ${bytes.length}`,\n )\n }\n valuePartitions.push(bytes.slice(bytesCursor, bytesCursor + childTypeSize))\n bytesCursor += childTypeSize\n }\n }\n\n if (abiTypesCursor !== abiTypes.length - 1 && bytesCursor >= bytes.length) {\n throw new Error('Input bytes not enough to decode')\n }\n abiTypesCursor += 1\n }\n\n if (dynamicSegments.length > 0) {\n const lastSegment = dynamicSegments[dynamicSegments.length - 1]\n lastSegment.right = bytes.length\n } else if (bytesCursor < bytes.length) {\n throw new Error('Input bytes not fully consumed')\n }\n\n for (let i = 0; i < dynamicSegments.length; i++) {\n const segment = dynamicSegments[i]\n if (segment.left > segment.right) {\n throw new Error('Dynamic segment should display a [l, r] space with l <= r')\n }\n if (i !== dynamicSegments.length - 1 && segment.right !== dynamicSegments[i + 1].left) {\n throw new Error('Dynamic segments should be consecutive')\n }\n }\n\n let segmentIndex = 0\n for (let i = 0; i < abiTypes.length; i++) {\n const childType = abiTypes[i]\n if (childType.isDynamic()) {\n valuePartitions[i] = bytes.slice(dynamicSegments[segmentIndex].left, dynamicSegments[segmentIndex].right)\n segmentIndex += 1\n }\n }\n\n const result: Uint8Array[] = []\n for (let i = 0; i < valuePartitions.length; i++) {\n const partition = valuePartitions[i]\n if (partition === null) {\n throw new Error(`Value partition at index ${i} is None`)\n }\n result.push(partition)\n }\n\n return result\n}\n\nexport function parseTupleContent(content: string): string[] {\n if (content === '') {\n return []\n }\n\n if (content.startsWith(',')) {\n throw new Error('The content should not start with comma')\n }\n if (content.endsWith(',')) {\n throw new Error('The content should not end with comma')\n }\n if (content.includes(',,')) {\n throw new Error('The content should not have consecutive commas')\n }\n\n const tupleStrings: string[] = []\n let depth = 0\n let word = ''\n\n for (const ch of content) {\n word += ch\n if (ch === '(') {\n depth += 1\n } else if (ch === ')') {\n depth -= 1\n } else if (ch === ',' && depth === 0) {\n word = word.slice(0, -1) // Remove the comma\n tupleStrings.push(word)\n word = ''\n }\n }\n\n if (word !== '') {\n tupleStrings.push(word)\n }\n\n if (depth !== 0) {\n throw new Error('The content has mismatched parentheses')\n }\n\n return tupleStrings\n}\n"],"mappings":"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"}
|