@algorandfoundation/algokit-utils 10.0.0-alpha.3 → 10.0.0-alpha.32
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/_virtual/rolldown_runtime.js +10 -15
- package/abi/index.d.ts +2 -1
- package/abi/index.js +3 -0
- package/abi/index.mjs +2 -1
- package/account-manager.d.ts +448 -0
- package/account-manager.js +623 -0
- package/account-manager.js.map +1 -0
- package/account-manager.mjs +620 -0
- package/account-manager.mjs.map +1 -0
- package/account.d.ts +156 -0
- package/account.js +10 -0
- package/account.js.map +1 -0
- package/account.mjs +9 -0
- package/account.mjs.map +1 -0
- package/algod-client/index.d.ts +3 -7
- package/algod-client/index.js +2 -5
- package/algod-client/index.mjs +2 -2
- package/algorand-client-transaction-creator.d.ts +1103 -0
- package/algorand-client-transaction-creator.js +735 -0
- package/algorand-client-transaction-creator.js.map +1 -0
- package/algorand-client-transaction-creator.mjs +734 -0
- package/algorand-client-transaction-creator.mjs.map +1 -0
- package/algorand-client-transaction-sender.d.ts +1317 -0
- package/algorand-client-transaction-sender.js +933 -0
- package/algorand-client-transaction-sender.js.map +1 -0
- package/algorand-client-transaction-sender.mjs +932 -0
- package/algorand-client-transaction-sender.mjs.map +1 -0
- package/algorand-client.d.ts +246 -0
- package/algorand-client.js +325 -0
- package/algorand-client.js.map +1 -0
- package/algorand-client.mjs +325 -0
- package/algorand-client.mjs.map +1 -0
- package/amount.d.ts +46 -3
- package/amount.js +92 -13
- package/amount.js.map +1 -1
- package/amount.mjs +80 -3
- package/amount.mjs.map +1 -1
- package/app-client.d.ts +2130 -0
- package/app-client.js +909 -0
- package/app-client.js.map +1 -0
- package/app-client.mjs +908 -0
- package/app-client.mjs.map +1 -0
- package/app-deployer.d.ts +166 -0
- package/app-deployer.js +353 -0
- package/app-deployer.js.map +1 -0
- package/app-deployer.mjs +353 -0
- package/app-deployer.mjs.map +1 -0
- package/app-factory.d.ts +965 -0
- package/app-factory.js +448 -0
- package/app-factory.js.map +1 -0
- package/app-factory.mjs +448 -0
- package/app-factory.mjs.map +1 -0
- package/app-manager.d.ts +323 -0
- package/app-manager.js +468 -0
- package/app-manager.js.map +1 -0
- package/app-manager.mjs +468 -0
- package/app-manager.mjs.map +1 -0
- package/app-spec.d.ts +203 -0
- package/app-spec.js +137 -0
- package/app-spec.js.map +1 -0
- package/app-spec.mjs +137 -0
- package/app-spec.mjs.map +1 -0
- package/app.d.ts +257 -0
- package/app.js +49 -0
- package/app.js.map +1 -0
- package/app.mjs +42 -0
- package/app.mjs.map +1 -0
- package/asset-manager.d.ts +212 -0
- package/asset-manager.js +166 -0
- package/asset-manager.js.map +1 -0
- package/asset-manager.mjs +166 -0
- package/asset-manager.mjs.map +1 -0
- package/async-event-emitter.d.ts +16 -0
- package/async-event-emitter.js +38 -0
- package/async-event-emitter.js.map +1 -0
- package/async-event-emitter.mjs +37 -0
- package/async-event-emitter.mjs.map +1 -0
- package/client-manager.d.ts +475 -0
- package/client-manager.js +616 -0
- package/client-manager.js.map +1 -0
- package/client-manager.mjs +616 -0
- package/client-manager.mjs.map +1 -0
- package/composer.d.ts +947 -0
- package/composer.js +1584 -0
- package/composer.js.map +1 -0
- package/composer.mjs +1583 -0
- package/composer.mjs.map +1 -0
- package/config.d.ts +1 -1
- package/config.js +2 -2
- package/config.js.map +1 -1
- package/config.mjs +1 -1
- package/config.mjs.map +1 -1
- package/debugging.d.ts +47 -0
- package/debugging.js +20 -0
- package/debugging.js.map +1 -0
- package/debugging.mjs +15 -0
- package/debugging.mjs.map +1 -0
- package/dispenser-client.d.ts +90 -0
- package/dispenser-client.js +127 -0
- package/dispenser-client.js.map +1 -0
- package/dispenser-client.mjs +127 -0
- package/dispenser-client.mjs.map +1 -0
- package/expand.d.ts +2 -0
- package/expand.js +0 -0
- package/expand.mjs +0 -0
- package/index.d.ts +6 -6
- package/index.js +4 -10
- package/index.mjs +5 -6
- package/indexer-client/index.d.ts +2 -2
- package/indexer-client/index.js +6 -6
- package/indexer-client/index.mjs +2 -2
- package/{indexer-lookup.d.ts → indexer-client/indexer-lookup.d.ts} +8 -11
- package/{indexer-lookup.mjs → indexer-client/indexer-lookup.js} +6 -10
- package/indexer-client/indexer-lookup.js.map +1 -0
- package/{indexer-lookup.js → indexer-client/indexer-lookup.mjs} +3 -18
- package/indexer-client/indexer-lookup.mjs.map +1 -0
- package/indexer.d.ts +40 -0
- package/indexer.js +38 -0
- package/indexer.js.map +1 -0
- package/indexer.mjs +35 -0
- package/indexer.mjs.map +1 -0
- package/instance-of.d.ts +8 -0
- package/kmd-account-manager.d.ts +74 -0
- package/kmd-account-manager.js +167 -0
- package/kmd-account-manager.js.map +1 -0
- package/kmd-account-manager.mjs +165 -0
- package/kmd-account-manager.mjs.map +1 -0
- package/kmd-client/index.d.ts +1 -2
- package/kmd-client/index.js +0 -5
- package/kmd-client/index.mjs +1 -2
- package/lifecycle-events.d.ts +14 -0
- package/lifecycle-events.js +11 -0
- package/lifecycle-events.js.map +1 -0
- package/lifecycle-events.mjs +10 -0
- package/lifecycle-events.mjs.map +1 -0
- package/logging.d.ts +13 -0
- package/logging.js +47 -0
- package/logging.js.map +1 -0
- package/logging.mjs +42 -0
- package/logging.mjs.map +1 -0
- package/logic-error.d.ts +39 -0
- package/logic-error.js +54 -0
- package/logic-error.js.map +1 -0
- package/logic-error.mjs +53 -0
- package/logic-error.mjs.map +1 -0
- package/network-client.d.ts +43 -0
- package/network-client.js +14 -0
- package/network-client.js.map +1 -0
- package/network-client.mjs +13 -0
- package/network-client.mjs.map +1 -0
- package/package.json +14 -5
- package/packages/abi/src/abi-method.d.ts +1 -1
- package/packages/abi/src/abi-method.js +1 -1
- package/packages/abi/src/abi-method.js.map +1 -1
- package/packages/abi/src/abi-method.mjs +1 -1
- package/packages/abi/src/abi-method.mjs.map +1 -1
- package/packages/abi/src/abi-type.d.ts +1 -3
- package/packages/abi/src/abi-type.js +7 -36
- package/packages/abi/src/abi-type.js.map +1 -1
- package/packages/abi/src/abi-type.mjs +7 -36
- package/packages/abi/src/abi-type.mjs.map +1 -1
- package/packages/abi/src/arc56-contract.js +1 -0
- package/packages/abi/src/arc56-contract.js.map +1 -1
- package/packages/abi/src/arc56-contract.mjs +1 -0
- package/packages/abi/src/arc56-contract.mjs.map +1 -1
- package/packages/abi/src/utils.d.ts +22 -0
- package/packages/abi/src/utils.js +57 -0
- package/packages/abi/src/utils.js.map +1 -0
- package/packages/abi/src/utils.mjs +55 -0
- package/packages/abi/src/utils.mjs.map +1 -0
- package/packages/algo25/src/index.js +1 -1
- package/packages/algo25/src/index.mjs +1 -1
- package/packages/algod_client/src/apis/api-service.d.ts +44 -44
- package/packages/algod_client/src/apis/api-service.js +155 -155
- package/packages/algod_client/src/apis/api-service.js.map +1 -1
- package/packages/algod_client/src/apis/api-service.mjs +155 -155
- package/packages/algod_client/src/apis/api-service.mjs.map +1 -1
- package/packages/algod_client/src/core/api-error.js +3 -1
- package/packages/algod_client/src/core/api-error.js.map +1 -1
- package/packages/algod_client/src/core/api-error.mjs +3 -1
- package/packages/algod_client/src/core/api-error.mjs.map +1 -1
- package/packages/algod_client/src/core/model-runtime.js +6 -6
- package/packages/algod_client/src/core/model-runtime.js.map +1 -1
- package/packages/algod_client/src/core/model-runtime.mjs +8 -8
- package/packages/algod_client/src/core/model-runtime.mjs.map +1 -1
- package/packages/algod_client/src/models/account-participation.js +4 -4
- package/packages/algod_client/src/models/account-participation.js.map +1 -1
- package/packages/algod_client/src/models/account-participation.mjs +4 -4
- package/packages/algod_client/src/models/account-participation.mjs.map +1 -1
- package/packages/algod_client/src/models/application-state-schema.d.ts +2 -2
- package/packages/algod_client/src/models/application-state-schema.js +2 -2
- package/packages/algod_client/src/models/application-state-schema.js.map +1 -1
- package/packages/algod_client/src/models/application-state-schema.mjs +2 -2
- package/packages/algod_client/src/models/application-state-schema.mjs.map +1 -1
- package/packages/algod_client/src/models/asset-params.js +2 -1
- package/packages/algod_client/src/models/asset-params.js.map +1 -1
- package/packages/algod_client/src/models/asset-params.mjs +2 -1
- package/packages/algod_client/src/models/asset-params.mjs.map +1 -1
- package/packages/algod_client/src/models/block-response.js +1 -2
- package/packages/algod_client/src/models/block-response.js.map +1 -1
- package/packages/algod_client/src/models/block-response.mjs +2 -3
- package/packages/algod_client/src/models/block-response.mjs.map +1 -1
- package/packages/algod_client/src/models/block.d.ts +60 -40
- package/packages/algod_client/src/models/block.js +184 -108
- package/packages/algod_client/src/models/block.js.map +1 -1
- package/packages/algod_client/src/models/block.mjs +184 -108
- package/packages/algod_client/src/models/block.mjs.map +1 -1
- package/packages/algod_client/src/models/eval-delta-key-value.js +2 -2
- 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 +2 -2
- package/packages/algod_client/src/models/eval-delta-key-value.mjs.map +1 -1
- package/packages/algod_client/src/models/eval-delta.js +2 -2
- package/packages/algod_client/src/models/eval-delta.js.map +1 -1
- package/packages/algod_client/src/models/eval-delta.mjs +2 -2
- package/packages/algod_client/src/models/eval-delta.mjs.map +1 -1
- package/packages/algod_client/src/models/ledger-state-delta.js +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 +2 -2
- package/packages/algod_client/src/models/ledger-state-delta.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-request.js +1 -1
- package/packages/algod_client/src/models/simulate-request.mjs +1 -1
- package/packages/algod_client/src/models/simulate-response.d.ts +2 -1
- package/packages/algod_client/src/models/simulate-response.js +6 -1
- package/packages/algod_client/src/models/simulate-response.js.map +1 -1
- package/packages/algod_client/src/models/simulate-response.mjs +6 -2
- package/packages/algod_client/src/models/simulate-response.mjs.map +1 -1
- package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.d.ts +3 -5
- package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js +4 -6
- 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 +3 -5
- package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs.map +1 -1
- package/packages/algod_client/src/models/transaction-parameters-response.js +2 -2
- package/packages/algod_client/src/models/transaction-parameters-response.js.map +1 -1
- package/packages/algod_client/src/models/transaction-parameters-response.mjs +2 -2
- package/packages/algod_client/src/models/transaction-parameters-response.mjs.map +1 -1
- package/packages/common/src/address.d.ts +0 -1
- package/packages/common/src/address.js +4 -17
- package/packages/common/src/address.js.map +1 -1
- package/packages/common/src/address.mjs +5 -17
- package/packages/common/src/address.mjs.map +1 -1
- package/packages/common/src/codecs/composite/map.js +7 -4
- package/packages/common/src/codecs/composite/map.js.map +1 -1
- package/packages/common/src/codecs/composite/map.mjs +7 -4
- package/packages/common/src/codecs/composite/map.mjs.map +1 -1
- package/packages/common/src/codecs/composite/record.js +0 -1
- package/packages/common/src/codecs/composite/record.js.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/bytes-base64.js +26 -0
- package/packages/common/src/codecs/primitives/bytes-base64.js.map +1 -0
- package/packages/common/src/codecs/primitives/bytes-base64.mjs +25 -0
- package/packages/common/src/codecs/primitives/bytes-base64.mjs.map +1 -0
- 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/fixed-bytes.js +0 -1
- package/packages/common/src/codecs/primitives/fixed-bytes.js.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/json.mjs +2 -2
- 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/{sdk/src/logic → common/src}/sourcemap.d.ts +2 -2
- package/packages/{sdk/src/logic → common/src}/sourcemap.js +2 -2
- package/packages/{sdk/src/logic → common/src}/sourcemap.js.map +1 -1
- package/packages/{sdk/src/logic → common/src}/sourcemap.mjs +1 -1
- package/packages/{sdk/src/logic → common/src}/sourcemap.mjs.map +1 -1
- package/packages/indexer_client/src/apis/api-service.d.ts +1 -1
- package/packages/indexer_client/src/apis/api-service.js +12 -12
- package/packages/indexer_client/src/apis/api-service.js.map +1 -1
- package/packages/indexer_client/src/apis/api-service.mjs +12 -12
- package/packages/indexer_client/src/apis/api-service.mjs.map +1 -1
- package/packages/indexer_client/src/core/api-error.js +3 -1
- package/packages/indexer_client/src/core/api-error.js.map +1 -1
- package/packages/indexer_client/src/core/api-error.mjs +3 -1
- package/packages/indexer_client/src/core/api-error.mjs.map +1 -1
- package/packages/indexer_client/src/core/model-runtime.js +0 -15
- package/packages/indexer_client/src/core/model-runtime.js.map +1 -1
- package/packages/indexer_client/src/core/model-runtime.mjs +1 -13
- package/packages/indexer_client/src/core/model-runtime.mjs.map +1 -1
- package/packages/indexer_client/src/models/account-participation.js +4 -4
- package/packages/indexer_client/src/models/account-participation.js.map +1 -1
- package/packages/indexer_client/src/models/account-participation.mjs +4 -4
- package/packages/indexer_client/src/models/account-participation.mjs.map +1 -1
- package/packages/indexer_client/src/models/application-state-schema.d.ts +2 -2
- package/packages/indexer_client/src/models/application-state-schema.js +2 -2
- package/packages/indexer_client/src/models/application-state-schema.js.map +1 -1
- package/packages/indexer_client/src/models/application-state-schema.mjs +2 -2
- package/packages/indexer_client/src/models/application-state-schema.mjs.map +1 -1
- package/packages/indexer_client/src/models/asset-params.js +2 -1
- package/packages/indexer_client/src/models/asset-params.js.map +1 -1
- package/packages/indexer_client/src/models/asset-params.mjs +2 -1
- package/packages/indexer_client/src/models/asset-params.mjs.map +1 -1
- package/packages/indexer_client/src/models/block.d.ts +5 -5
- package/packages/indexer_client/src/models/block.js +13 -13
- package/packages/indexer_client/src/models/block.js.map +1 -1
- package/packages/indexer_client/src/models/block.mjs +13 -13
- package/packages/indexer_client/src/models/block.mjs.map +1 -1
- package/packages/indexer_client/src/models/eval-delta-key-value.d.ts +1 -1
- package/packages/indexer_client/src/models/eval-delta-key-value.js +2 -2
- 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 +2 -2
- package/packages/indexer_client/src/models/eval-delta-key-value.mjs.map +1 -1
- package/packages/indexer_client/src/models/eval-delta.d.ts +1 -1
- package/packages/indexer_client/src/models/eval-delta.js +2 -2
- package/packages/indexer_client/src/models/eval-delta.js.map +1 -1
- package/packages/indexer_client/src/models/eval-delta.mjs +2 -2
- package/packages/indexer_client/src/models/eval-delta.mjs.map +1 -1
- package/packages/indexer_client/src/models/hb-proof-fields.js +6 -6
- package/packages/indexer_client/src/models/hb-proof-fields.js.map +1 -1
- package/packages/indexer_client/src/models/hb-proof-fields.mjs +6 -6
- package/packages/indexer_client/src/models/hb-proof-fields.mjs.map +1 -1
- package/packages/indexer_client/src/models/participation-updates.d.ts +2 -2
- package/packages/indexer_client/src/models/participation-updates.js +2 -2
- package/packages/indexer_client/src/models/participation-updates.js.map +1 -1
- package/packages/indexer_client/src/models/participation-updates.mjs +2 -2
- package/packages/indexer_client/src/models/participation-updates.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-proof-verifier.js +2 -2
- package/packages/indexer_client/src/models/state-proof-verifier.js.map +1 -1
- package/packages/indexer_client/src/models/state-proof-verifier.mjs +2 -2
- package/packages/indexer_client/src/models/state-proof-verifier.mjs.map +1 -1
- package/packages/indexer_client/src/models/state-schema.d.ts +2 -2
- package/packages/indexer_client/src/models/state-schema.js +2 -2
- package/packages/indexer_client/src/models/state-schema.js.map +1 -1
- package/packages/indexer_client/src/models/state-schema.mjs +2 -2
- package/packages/indexer_client/src/models/state-schema.mjs.map +1 -1
- package/packages/indexer_client/src/models/teal-key-value.d.ts +1 -1
- package/packages/indexer_client/src/models/teal-key-value.js +2 -2
- package/packages/indexer_client/src/models/teal-key-value.js.map +1 -1
- package/packages/indexer_client/src/models/teal-key-value.mjs +2 -2
- package/packages/indexer_client/src/models/teal-key-value.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-heartbeat.js +2 -1
- package/packages/indexer_client/src/models/transaction-heartbeat.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-heartbeat.mjs +2 -1
- package/packages/indexer_client/src/models/transaction-heartbeat.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-keyreg.js +4 -4
- package/packages/indexer_client/src/models/transaction-keyreg.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-keyreg.mjs +4 -4
- package/packages/indexer_client/src/models/transaction-keyreg.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-logicsig.js +2 -1
- package/packages/indexer_client/src/models/transaction-signature-logicsig.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-signature-logicsig.mjs +2 -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 +3 -3
- 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 +3 -3
- package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction-state-proof.d.ts +1 -1
- package/packages/indexer_client/src/models/transaction-state-proof.js +2 -2
- package/packages/indexer_client/src/models/transaction-state-proof.js.map +1 -1
- package/packages/indexer_client/src/models/transaction-state-proof.mjs +2 -2
- package/packages/indexer_client/src/models/transaction-state-proof.mjs.map +1 -1
- package/packages/indexer_client/src/models/transaction.d.ts +2 -2
- package/packages/indexer_client/src/models/transaction.js +6 -5
- package/packages/indexer_client/src/models/transaction.js.map +1 -1
- package/packages/indexer_client/src/models/transaction.mjs +6 -5
- package/packages/indexer_client/src/models/transaction.mjs.map +1 -1
- package/packages/kmd_client/src/apis/api-service.d.ts +5 -5
- package/packages/kmd_client/src/apis/api-service.js +32 -32
- package/packages/kmd_client/src/apis/api-service.js.map +1 -1
- package/packages/kmd_client/src/apis/api-service.mjs +32 -32
- package/packages/kmd_client/src/apis/api-service.mjs.map +1 -1
- package/packages/kmd_client/src/core/api-error.js +3 -1
- package/packages/kmd_client/src/core/api-error.js.map +1 -1
- package/packages/kmd_client/src/core/api-error.mjs +3 -1
- package/packages/kmd_client/src/core/api-error.mjs.map +1 -1
- package/packages/kmd_client/src/core/model-runtime.js +2 -12
- package/packages/kmd_client/src/core/model-runtime.js.map +1 -1
- package/packages/kmd_client/src/core/model-runtime.mjs +3 -11
- package/packages/kmd_client/src/core/model-runtime.mjs.map +1 -1
- package/packages/transact/src/logicsig.d.ts +35 -33
- package/packages/transact/src/logicsig.js +74 -76
- package/packages/transact/src/logicsig.js.map +1 -1
- package/packages/transact/src/logicsig.mjs +77 -78
- package/packages/transact/src/logicsig.mjs.map +1 -1
- package/packages/transact/src/multisig.d.ts +11 -116
- package/packages/transact/src/multisig.js +106 -136
- package/packages/transact/src/multisig.js.map +1 -1
- package/packages/transact/src/multisig.mjs +108 -118
- package/packages/transact/src/multisig.mjs.map +1 -1
- package/packages/transact/src/signer.js +9 -2
- package/packages/transact/src/signer.js.map +1 -1
- package/packages/transact/src/signer.mjs +10 -3
- package/packages/transact/src/signer.mjs.map +1 -1
- package/packages/transact/src/transactions/app-call.d.ts +10 -15
- package/packages/transact/src/transactions/app-call.js.map +1 -1
- package/packages/transact/src/transactions/app-call.mjs.map +1 -1
- package/packages/transact/src/transactions/asset-config.d.ts +1 -6
- package/packages/transact/src/transactions/asset-config.js.map +1 -1
- package/packages/transact/src/transactions/asset-config.mjs.map +1 -1
- package/packages/transact/src/transactions/asset-freeze.d.ts +1 -6
- package/packages/transact/src/transactions/asset-transfer.d.ts +1 -6
- package/packages/transact/src/transactions/key-registration.d.ts +1 -8
- package/packages/transact/src/transactions/reference-types-meta.d.ts +26 -0
- package/packages/transact/src/transactions/reference-types-meta.js +71 -0
- package/packages/transact/src/transactions/reference-types-meta.js.map +1 -0
- package/packages/transact/src/transactions/reference-types-meta.mjs +69 -0
- package/packages/transact/src/transactions/reference-types-meta.mjs.map +1 -0
- package/packages/transact/src/transactions/signed-transaction-meta.js +8 -9
- package/packages/transact/src/transactions/signed-transaction-meta.js.map +1 -1
- package/packages/transact/src/transactions/signed-transaction-meta.mjs +8 -8
- package/packages/transact/src/transactions/signed-transaction-meta.mjs.map +1 -1
- package/packages/transact/src/transactions/signed-transaction.d.ts +10 -6
- package/packages/transact/src/transactions/signed-transaction.js +1 -1
- package/packages/transact/src/transactions/signed-transaction.js.map +1 -1
- package/packages/transact/src/transactions/signed-transaction.mjs +1 -2
- package/packages/transact/src/transactions/signed-transaction.mjs.map +1 -1
- package/packages/transact/src/transactions/state-proof.d.ts +1 -1
- package/packages/transact/src/transactions/transaction-meta.js +29 -23
- package/packages/transact/src/transactions/transaction-meta.js.map +1 -1
- package/packages/transact/src/transactions/transaction-meta.mjs +29 -23
- package/packages/transact/src/transactions/transaction-meta.mjs.map +1 -1
- package/packages/transact/src/transactions/transaction.d.ts +5 -2
- package/packages/transact/src/transactions/transaction.js +5 -4
- package/packages/transact/src/transactions/transaction.js.map +1 -1
- package/packages/transact/src/transactions/transaction.mjs +5 -4
- package/packages/transact/src/transactions/transaction.mjs.map +1 -1
- package/testing/account.d.ts +2 -2
- package/testing/account.js +2 -3
- package/testing/account.js.map +1 -1
- package/testing/account.mjs +2 -3
- package/testing/account.mjs.map +1 -1
- package/testing/fixtures/algokit-log-capture-fixture.d.ts +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.d.ts +5 -5
- package/testing/fixtures/algorand-fixture.js +2 -2
- package/testing/fixtures/algorand-fixture.js.map +1 -1
- package/testing/fixtures/algorand-fixture.mjs +2 -2
- package/testing/fixtures/algorand-fixture.mjs.map +1 -1
- package/testing/index.d.ts +2 -1
- package/testing/test-logger.d.ts +1 -1
- package/testing/test-logger.js.map +1 -1
- package/testing/test-logger.mjs.map +1 -1
- package/testing/transaction-logger.js +1 -1
- package/testing/transaction-logger.mjs +1 -1
- package/testing/types.d.ts +156 -0
- package/transact/index.d.ts +11 -10
- package/transact/index.js +7 -31
- package/transact/index.mjs +7 -10
- package/transaction/index.d.ts +4 -0
- package/transaction/index.js +9 -0
- package/transaction/index.mjs +4 -0
- package/transaction/perform-transaction-composer-simulate.d.ts +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.d.ts +2 -2
- package/transaction/transaction.js +2 -2
- package/transaction/transaction.js.map +1 -1
- package/transaction/transaction.mjs +2 -2
- package/transaction/transaction.mjs.map +1 -1
- package/transaction/types.d.ts +133 -0
- package/transactions/app-call.d.ts +6 -5
- package/transactions/app-call.js +17 -17
- package/transactions/app-call.js.map +1 -1
- package/transactions/app-call.mjs +17 -17
- package/transactions/app-call.mjs.map +1 -1
- package/transactions/asset-config.d.ts +1 -1
- package/transactions/asset-config.js +1 -1
- package/transactions/asset-config.js.map +1 -1
- package/transactions/asset-config.mjs +1 -1
- package/transactions/asset-config.mjs.map +1 -1
- package/transactions/common.d.ts +1 -1
- package/transactions/common.js.map +1 -1
- package/transactions/common.mjs.map +1 -1
- package/transactions/key-registration.d.ts +1 -1
- package/transactions/key-registration.js.map +1 -1
- package/transactions/key-registration.mjs.map +1 -1
- package/transactions/method-call.d.ts +2 -2
- package/transactions/method-call.js +78 -85
- package/transactions/method-call.js.map +1 -1
- package/transactions/method-call.mjs +78 -85
- package/transactions/method-call.mjs.map +1 -1
- package/transactions/payment.d.ts +1 -1
- package/transactions/payment.js.map +1 -1
- package/transactions/payment.mjs.map +1 -1
- package/types/account-manager.d.ts +11 -444
- package/types/account-manager.js +5 -606
- package/types/account-manager.js.map +1 -1
- package/types/account-manager.mjs +5 -604
- package/types/account-manager.mjs.map +1 -1
- package/types/account.d.ts +8 -150
- package/types/account.js +3 -4
- package/types/account.js.map +1 -1
- package/types/account.mjs +4 -4
- package/types/account.mjs.map +1 -1
- package/types/algorand-client-transaction-creator.d.ts +5 -1084
- package/types/algorand-client-transaction-creator.js +3 -721
- package/types/algorand-client-transaction-creator.js.map +1 -1
- package/types/algorand-client-transaction-creator.mjs +4 -721
- package/types/algorand-client-transaction-creator.mjs.map +1 -1
- package/types/algorand-client-transaction-sender.d.ts +5 -1298
- package/types/algorand-client-transaction-sender.js +3 -920
- package/types/algorand-client-transaction-sender.js.map +1 -1
- package/types/algorand-client-transaction-sender.mjs +3 -918
- package/types/algorand-client-transaction-sender.mjs.map +1 -1
- package/types/algorand-client.d.ts +5 -241
- package/types/algorand-client.js +3 -319
- package/types/algorand-client.js.map +1 -1
- package/types/algorand-client.mjs +3 -319
- package/types/algorand-client.mjs.map +1 -1
- package/types/amount.d.ts +6 -45
- package/types/amount.js +3 -60
- package/types/amount.js.map +1 -1
- package/types/amount.mjs +3 -60
- package/types/amount.mjs.map +1 -1
- package/types/app-client.d.ts +75 -2120
- package/types/app-client.js +3 -904
- package/types/app-client.js.map +1 -1
- package/types/app-client.mjs +3 -902
- package/types/app-client.mjs.map +1 -1
- package/types/app-deployer.d.ts +21 -161
- package/types/app-deployer.js +3 -347
- package/types/app-deployer.js.map +1 -1
- package/types/app-deployer.mjs +3 -347
- package/types/app-deployer.mjs.map +1 -1
- package/types/app-factory.d.ts +21 -957
- package/types/app-factory.js +3 -442
- package/types/app-factory.js.map +1 -1
- package/types/app-factory.mjs +3 -442
- package/types/app-factory.mjs.map +1 -1
- package/types/app-manager.d.ts +15 -316
- package/types/app-manager.js +3 -456
- package/types/app-manager.js.map +1 -1
- package/types/app-manager.mjs +3 -456
- package/types/app-manager.mjs.map +1 -1
- package/types/app-spec.d.ts +39 -198
- package/types/app-spec.js +3 -124
- package/types/app-spec.js.map +1 -1
- package/types/app-spec.mjs +3 -124
- package/types/app-spec.mjs.map +1 -1
- package/types/app.d.ts +62 -247
- package/types/app.js +15 -37
- package/types/app.js.map +1 -1
- package/types/app.mjs +16 -37
- package/types/app.mjs.map +1 -1
- package/types/asset-manager.d.ts +9 -207
- package/types/asset-manager.js +3 -160
- package/types/asset-manager.js.map +1 -1
- package/types/asset-manager.mjs +3 -160
- package/types/asset-manager.mjs.map +1 -1
- package/types/async-event-emitter.d.ts +7 -14
- package/types/async-event-emitter.js +3 -32
- package/types/async-event-emitter.js.map +1 -1
- package/types/async-event-emitter.mjs +4 -32
- package/types/async-event-emitter.mjs.map +1 -1
- package/types/client-manager.d.ts +27 -470
- package/types/client-manager.js +3 -610
- package/types/client-manager.js.map +1 -1
- package/types/client-manager.mjs +3 -610
- package/types/client-manager.mjs.map +1 -1
- package/types/composer.d.ts +79 -935
- package/types/composer.js +3 -1569
- package/types/composer.js.map +1 -1
- package/types/composer.mjs +3 -1567
- package/types/composer.mjs.map +1 -1
- package/types/config.d.ts +7 -52
- package/types/config.js +3 -74
- package/types/config.js.map +1 -1
- package/types/config.mjs +3 -74
- package/types/config.mjs.map +1 -1
- package/types/debugging.d.ts +12 -33
- package/types/debugging.js +11 -10
- package/types/debugging.js.map +1 -1
- package/types/debugging.mjs +12 -10
- package/types/debugging.mjs.map +1 -1
- package/types/dispenser-client.d.ts +11 -85
- package/types/dispenser-client.js +3 -121
- package/types/dispenser-client.js.map +1 -1
- package/types/dispenser-client.mjs +3 -121
- package/types/dispenser-client.mjs.map +1 -1
- package/types/expand.d.ts +4 -5
- package/types/indexer.d.ts +16 -36
- package/types/indexer.js +7 -30
- package/types/indexer.js.map +1 -1
- package/types/indexer.mjs +8 -30
- package/types/indexer.mjs.map +1 -1
- package/types/instance-of.d.ts +4 -4
- package/types/kmd-account-manager.d.ts +5 -68
- package/types/kmd-account-manager.js +3 -150
- package/types/kmd-account-manager.js.map +1 -1
- package/types/kmd-account-manager.mjs +3 -148
- package/types/kmd-account-manager.mjs.map +1 -1
- package/types/lifecycle-events.d.ts +7 -10
- package/types/lifecycle-events.js +3 -5
- package/types/lifecycle-events.js.map +1 -1
- package/types/lifecycle-events.mjs +4 -5
- package/types/lifecycle-events.mjs.map +1 -1
- package/types/logging.d.ts +14 -9
- package/types/logging.js +11 -37
- package/types/logging.js.map +1 -1
- package/types/logging.mjs +12 -37
- package/types/logging.mjs.map +1 -1
- package/types/logic-error.d.ts +8 -35
- package/types/logic-error.js +3 -48
- package/types/logic-error.js.map +1 -1
- package/types/logic-error.mjs +4 -48
- package/types/logic-error.mjs.map +1 -1
- package/types/network-client.d.ts +10 -39
- package/types/network-client.js +3 -8
- package/types/network-client.js.map +1 -1
- package/types/network-client.mjs +4 -8
- package/types/network-client.mjs.map +1 -1
- package/types/testing.d.ts +13 -151
- package/types/transaction.d.ts +33 -128
- package/updatable-config.d.ts +57 -0
- package/updatable-config.js +80 -0
- package/updatable-config.js.map +1 -0
- package/updatable-config.mjs +80 -0
- package/updatable-config.mjs.map +1 -0
- package/util.js +1 -1
- package/util.js.map +1 -1
- package/util.mjs +1 -1
- package/util.mjs.map +1 -1
- package/_virtual/rolldown_runtime.mjs +0 -13
- package/indexer-lookup.js.map +0 -1
- package/indexer-lookup.mjs.map +0 -1
- package/packages/algod_client/src/core/model-runtime.d.ts +0 -10
- package/packages/algod_client/src/models/application-local-reference.d.ts +0 -20
- package/packages/algod_client/src/models/application-local-reference.js +0 -23
- package/packages/algod_client/src/models/application-local-reference.js.map +0 -1
- package/packages/algod_client/src/models/application-local-reference.mjs +0 -23
- package/packages/algod_client/src/models/application-local-reference.mjs.map +0 -1
- package/packages/algod_client/src/models/asset-holding-reference.d.ts +0 -20
- package/packages/algod_client/src/models/asset-holding-reference.js +0 -23
- package/packages/algod_client/src/models/asset-holding-reference.js.map +0 -1
- package/packages/algod_client/src/models/asset-holding-reference.mjs +0 -23
- package/packages/algod_client/src/models/asset-holding-reference.mjs.map +0 -1
- package/packages/algod_client/src/models/box-reference.d.ts +0 -17
- package/packages/algod_client/src/models/box-reference.js +0 -23
- package/packages/algod_client/src/models/box-reference.js.map +0 -1
- package/packages/algod_client/src/models/box-reference.mjs +0 -23
- package/packages/algod_client/src/models/box-reference.mjs.map +0 -1
- package/packages/indexer_client/src/core/model-runtime.d.ts +0 -10
- package/packages/kmd_client/src/core/model-runtime.d.ts +0 -10
- package/packages/sdk/src/convert.d.ts +0 -17
- package/packages/sdk/src/convert.js +0 -28
- package/packages/sdk/src/convert.js.map +0 -1
- package/packages/sdk/src/convert.mjs +0 -25
- package/packages/sdk/src/convert.mjs.map +0 -1
- package/packages/sdk/src/encoding/binarydata.d.ts +0 -34
- package/packages/sdk/src/encoding/binarydata.js +0 -65
- package/packages/sdk/src/encoding/binarydata.js.map +0 -1
- package/packages/sdk/src/encoding/binarydata.mjs +0 -60
- package/packages/sdk/src/encoding/binarydata.mjs.map +0 -1
- package/packages/sdk/src/encoding/encoding.d.ts +0 -237
- package/packages/sdk/src/encoding/encoding.js +0 -302
- package/packages/sdk/src/encoding/encoding.js.map +0 -1
- package/packages/sdk/src/encoding/encoding.mjs +0 -287
- package/packages/sdk/src/encoding/encoding.mjs.map +0 -1
- package/packages/sdk/src/encoding/schema/array.js +0 -35
- package/packages/sdk/src/encoding/schema/array.js.map +0 -1
- package/packages/sdk/src/encoding/schema/array.mjs +0 -35
- package/packages/sdk/src/encoding/schema/array.mjs.map +0 -1
- package/packages/sdk/src/encoding/schema/bytearray.js +0 -49
- package/packages/sdk/src/encoding/schema/bytearray.js.map +0 -1
- package/packages/sdk/src/encoding/schema/bytearray.mjs +0 -49
- package/packages/sdk/src/encoding/schema/bytearray.mjs.map +0 -1
- package/packages/sdk/src/encoding/schema/map.d.ts +0 -58
- package/packages/sdk/src/encoding/schema/map.js +0 -110
- package/packages/sdk/src/encoding/schema/map.js.map +0 -1
- package/packages/sdk/src/encoding/schema/map.mjs +0 -107
- package/packages/sdk/src/encoding/schema/map.mjs.map +0 -1
- package/packages/sdk/src/encoding/schema/optional.js +0 -46
- package/packages/sdk/src/encoding/schema/optional.js.map +0 -1
- package/packages/sdk/src/encoding/schema/optional.mjs +0 -46
- package/packages/sdk/src/encoding/schema/optional.mjs.map +0 -1
- package/packages/sdk/src/encoding/schema/uint64.js +0 -30
- package/packages/sdk/src/encoding/schema/uint64.js.map +0 -1
- package/packages/sdk/src/encoding/schema/uint64.mjs +0 -30
- package/packages/sdk/src/encoding/schema/uint64.mjs.map +0 -1
- package/packages/sdk/src/encoding/uint64.d.ts +0 -34
- package/packages/sdk/src/encoding/uint64.js +0 -34
- package/packages/sdk/src/encoding/uint64.js.map +0 -1
- package/packages/sdk/src/encoding/uint64.mjs +0 -33
- package/packages/sdk/src/encoding/uint64.mjs.map +0 -1
- package/packages/sdk/src/index.d.ts +0 -44
- package/packages/sdk/src/index.js +0 -62
- package/packages/sdk/src/index.js.map +0 -1
- package/packages/sdk/src/index.mjs +0 -58
- package/packages/sdk/src/index.mjs.map +0 -1
- package/packages/sdk/src/nacl/naclWrappers.js +0 -14
- package/packages/sdk/src/nacl/naclWrappers.js.map +0 -1
- package/packages/sdk/src/nacl/naclWrappers.mjs +0 -11
- package/packages/sdk/src/nacl/naclWrappers.mjs.map +0 -1
- package/packages/sdk/src/types/intDecoding.d.ts +0 -28
- package/packages/sdk/src/types/intDecoding.js +0 -32
- package/packages/sdk/src/types/intDecoding.js.map +0 -1
- package/packages/sdk/src/types/intDecoding.mjs +0 -31
- package/packages/sdk/src/types/intDecoding.mjs.map +0 -1
- package/packages/sdk/src/types/transactions/encoded.d.ts +0 -40
- package/packages/sdk/src/types/transactions/encoded.js +0 -64
- package/packages/sdk/src/types/transactions/encoded.js.map +0 -1
- package/packages/sdk/src/types/transactions/encoded.mjs +0 -59
- package/packages/sdk/src/types/transactions/encoded.mjs.map +0 -1
- package/packages/sdk/src/utils/utils.d.ts +0 -64
- package/packages/sdk/src/utils/utils.js +0 -140
- package/packages/sdk/src/utils/utils.js.map +0 -1
- package/packages/sdk/src/utils/utils.mjs +0 -128
- package/packages/sdk/src/utils/utils.mjs.map +0 -1
- package/packages/transact/src/transactions/common.d.ts +0 -37
- package/sdk/index.d.ts +0 -10
- package/sdk/index.js +0 -59
- package/sdk/index.mjs +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-meta.mjs","names":["transactionType: TransactionType","result: Record<string, unknown>","accessList: WireAccessReference[]","result: AccessReference[]","appId: bigint","PaymentTransactionFieldsMeta: ObjectModelMetadata<PaymentTransactionFields>","AssetTransferTransactionFieldsMeta: ObjectModelMetadata<AssetTransferTransactionFields>","AssetFreezeTransactionFieldsMeta: ObjectModelMetadata<AssetFreezeTransactionFields>","KeyRegistrationTransactionFieldsMeta: ObjectModelMetadata<KeyRegistrationTransactionFields>","AssetParamsMeta: ObjectModelMetadata<Omit<AssetConfigTransactionFields, 'assetId'>>","StateSchemaMeta: ObjectModelMetadata<StateSchema>","AppCallTransactionFieldsMeta: ObjectModelMetadata<AppCallTransactionFields>","MerkleArrayProofMeta: ObjectModelMetadata<MerkleArrayProof>","FalconVerifierMeta: ObjectModelMetadata<FalconVerifier>","SigslotCommitMeta: ObjectModelMetadata<SigslotCommit>","ParticipantMeta: ObjectModelMetadata<Participant>","RevealMeta: ObjectModelMetadata<Reveal>","StateProofMeta: ObjectModelMetadata<StateProof>","StateProofMessageMeta: ObjectModelMetadata<StateProofMessage>","StateProofTransactionFieldsMeta: ObjectModelMetadata<StateProofTransactionFields>","HeartbeatTransactionFieldsMeta: ObjectModelMetadata<HeartbeatTransactionFields>","TransactionParamsMeta: ObjectModelMetadata<TransactionParams>"],"sources":["../../../../../packages/transact/src/transactions/transaction-meta.ts"],"sourcesContent":["import type { EncodingFormat, ObjectModelMetadata, WireBigInt, WireObject, WireString } from '@algorandfoundation/algokit-common'\nimport {\n Address,\n Codec,\n MapCodec,\n ObjectModelCodec,\n addressArrayCodec,\n addressCodec,\n bigIntArrayCodec,\n bigIntCodec,\n booleanCodec,\n bytesArrayCodec,\n bytesCodec,\n fixedBytes1793Codec,\n fixedBytes32Codec,\n fixedBytes64Codec,\n normalizeWireObject,\n normalizeWireString,\n numberCodec,\n stringCodec,\n} from '@algorandfoundation/algokit-common'\nimport { AccessReference, AppCallTransactionFields, BoxReference, StateSchema } from './app-call'\nimport { AssetConfigTransactionFields } from './asset-config'\nimport { AssetFreezeTransactionFields } from './asset-freeze'\nimport { AssetTransferTransactionFields } from './asset-transfer'\nimport { HeartbeatProof, HeartbeatTransactionFields } from './heartbeat'\nimport { KeyRegistrationTransactionFields } from './key-registration'\nimport { PaymentTransactionFields } from './payment'\nimport {\n FalconSignatureStruct,\n FalconVerifier,\n HashFactory,\n MerkleArrayProof,\n MerkleSignatureVerifier,\n Participant,\n Reveal,\n SigslotCommit,\n StateProof,\n StateProofMessage,\n StateProofTransactionFields,\n} from './state-proof'\nimport type { TransactionParams } from './transaction'\nimport { TransactionType } from './transaction-type'\n\ntype WireBoxReference = {\n /** App index (0 or index into access list) */\n i?: number\n /** Box name */\n n?: WireString\n}\n\ntype WireAccessReference = {\n /** Account address */\n d?: WireString\n\n /** App index */\n p?: WireBigInt\n\n /** Asset index */\n s?: WireBigInt\n\n /** Box reference */\n b?: WireBoxReference\n\n /** Holding reference (1-based indices into access list) */\n h?: {\n /** Address index */\n d?: number\n /** Asset index (1-based index into access list) */\n s?: number\n }\n\n /** Local state reference (1-based indices into access list) */\n l?: {\n /** Address index */\n d?: number\n /** App index (0 means current app, or 1-based index into access list) */\n p?: number\n }\n}\n\nclass TransactionTypeCodec extends Codec<TransactionType, string, WireString> {\n public defaultValue(): TransactionType {\n // This ensure that we never omit the transaction type, as a transaction should never be created with this value\n return TransactionType.Unknown\n }\n\n protected toEncoded(value: TransactionType, _format: EncodingFormat): string {\n switch (value) {\n case TransactionType.Payment:\n return 'pay'\n case TransactionType.AssetTransfer:\n return 'axfer'\n case TransactionType.AssetFreeze:\n return 'afrz'\n case TransactionType.AssetConfig:\n return 'acfg'\n case TransactionType.KeyRegistration:\n return 'keyreg'\n case TransactionType.AppCall:\n return 'appl'\n case TransactionType.StateProof:\n return 'stpf'\n case TransactionType.Heartbeat:\n return 'hb'\n default:\n return 'unknown'\n }\n }\n\n protected fromEncoded(value: WireString, _format: EncodingFormat): TransactionType {\n // Convert Uint8Array to string if needed (msgpack may return transaction type as bytes)\n const typeString = normalizeWireString(value)\n\n switch (typeString) {\n case 'pay':\n return TransactionType.Payment\n case 'axfer':\n return TransactionType.AssetTransfer\n case 'afrz':\n return TransactionType.AssetFreeze\n case 'acfg':\n return TransactionType.AssetConfig\n case 'keyreg':\n return TransactionType.KeyRegistration\n case 'appl':\n return TransactionType.AppCall\n case 'stpf':\n return TransactionType.StateProof\n case 'hb':\n return TransactionType.Heartbeat\n default:\n return TransactionType.Unknown\n }\n }\n}\n\nclass TransactionDataCodec<\n T extends\n | PaymentTransactionFields\n | AssetTransferTransactionFields\n | AssetFreezeTransactionFields\n | KeyRegistrationTransactionFields\n | StateProofTransactionFields,\n> extends Codec<T | undefined, Record<string, unknown>> {\n private transactionDataCodec: ObjectModelCodec<T>\n\n constructor(\n private readonly transactionType: TransactionType,\n transactionTypeDataMetadata: ObjectModelMetadata<T>,\n ) {\n super()\n this.transactionDataCodec = new ObjectModelCodec<T>(transactionTypeDataMetadata)\n }\n\n public defaultValue(): T | undefined {\n return undefined\n }\n\n protected toEncoded(value: T | undefined, format: EncodingFormat): Record<string, unknown> {\n if (!value) {\n throw new Error('Transaction data is missing')\n }\n return this.transactionDataCodec.encode(value, format)\n }\n\n protected fromEncoded(value: Record<string, unknown>, format: EncodingFormat): T | undefined {\n if (value.type === undefined) {\n throw new Error('Transaction is missing type field')\n }\n const type = normalizeWireString(value.type as WireString)\n if (type === this.transactionType.toString()) {\n return this.transactionDataCodec.decode(value, format)\n }\n\n return undefined\n }\n}\n\nclass AssetConfigDataCodec extends Codec<AssetConfigTransactionFields | undefined, Record<string, unknown>> {\n private assetParamsCodec = new ObjectModelCodec<Omit<AssetConfigTransactionFields, 'assetId'>>(AssetParamsMeta)\n\n public defaultValue(): AssetConfigTransactionFields | undefined {\n return undefined\n }\n\n protected toEncoded(value: AssetConfigTransactionFields | undefined, format: EncodingFormat): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n if (!value) {\n throw new Error('Transaction is not an asset config')\n }\n\n const { assetId, ...assetParams } = value\n\n const encodedAssetId = bigIntCodec.encodeOptional(assetId, format)\n if (encodedAssetId !== undefined) {\n result.caid = encodedAssetId\n }\n\n const encodedParams = this.assetParamsCodec.encodeOptional(assetParams, format)\n if (encodedParams && Object.keys(encodedParams).length > 0) {\n result.apar = encodedParams\n }\n\n return result\n }\n\n protected fromEncoded(value: Record<string, unknown>, format: EncodingFormat): AssetConfigTransactionFields | undefined {\n if (value.type === undefined) {\n throw new Error('Transaction is missing type field')\n }\n const type = normalizeWireString(value.type as WireString)\n const caid = value.caid as WireBigInt | undefined\n const apar = value.apar as WireObject | undefined\n\n if (type !== TransactionType.AssetConfig || (caid === undefined && !apar)) {\n return undefined\n }\n\n return {\n assetId: bigIntCodec.decode(caid, format),\n ...this.assetParamsCodec.decode(apar, format),\n } satisfies AssetConfigTransactionFields\n }\n\n public isDefaultValue(value: AssetConfigTransactionFields | undefined): boolean {\n return value === undefined\n }\n}\n\nclass AppCallDataCodec extends Codec<AppCallTransactionFields | undefined, Record<string, unknown>> {\n private appCallFieldsCodec = new ObjectModelCodec<Omit<AppCallTransactionFields, 'accessReferences' | 'boxReferences'>>(\n AppCallTransactionFieldsMeta,\n )\n\n public defaultValue(): AppCallTransactionFields | undefined {\n return undefined\n }\n\n private encodeAccessReferences(\n appId: bigint,\n accessReferences: AccessReference[] | undefined,\n format: EncodingFormat,\n ): WireAccessReference[] | undefined {\n if (!accessReferences || accessReferences.length === 0) return undefined\n\n const accessList: WireAccessReference[] = []\n\n // Helper to find or add a simple reference and return its 1-based index\n const ensure = (target: Pick<AccessReference, 'address' | 'assetId' | 'appId'>): number => {\n // Search for existing entry\n for (let idx = 0; idx < accessList.length; idx++) {\n const entry = accessList[idx]\n const matchesAddress =\n (!entry.d && !target.address) || (entry.d && target.address && addressCodec.decode(entry.d, format).equals(target.address))\n const matchesAssetId =\n (entry.s === undefined && target.assetId === undefined) ||\n (entry.s !== undefined && target.assetId !== undefined && bigIntCodec.decode(entry.s, format) === target.assetId)\n const matchesAppId =\n (entry.p === undefined && target.appId === undefined) ||\n (entry.p !== undefined && target.appId !== undefined && bigIntCodec.decode(entry.p, format) === target.appId)\n\n if (matchesAddress && matchesAssetId && matchesAppId) {\n return idx + 1 // Return 1-based index\n }\n }\n\n // Add new entries for each field\n if (target.address && !target.address.equals(Address.zeroAddress())) {\n accessList.push({ d: addressCodec.encodeOptional(target.address, format)! })\n }\n if (target.assetId !== undefined) {\n accessList.push({ s: bigIntCodec.encodeOptional(target.assetId, format)! })\n }\n if (target.appId !== undefined) {\n accessList.push({ p: bigIntCodec.encodeOptional(target.appId, format)! })\n }\n\n return accessList.length // Return 1-based index of last added\n }\n\n // Process each access reference\n for (const accessRef of accessReferences) {\n // Simple references (address, assetId, or appId)\n if (accessRef.address || accessRef.assetId !== undefined || accessRef.appId !== undefined) {\n ensure(accessRef)\n continue\n }\n\n // Holding reference\n if (accessRef.holding) {\n const holding = accessRef.holding\n let addressIndex = 0\n if (holding.address && !holding.address.equals(Address.zeroAddress())) {\n addressIndex = ensure({ address: holding.address })\n }\n const assetIndex = ensure({ assetId: holding.assetId })\n accessList.push({\n h: {\n d: numberCodec.encodeOptional(addressIndex, format),\n s: numberCodec.encodeOptional(assetIndex, format),\n },\n })\n continue\n }\n\n // Locals reference\n if (accessRef.locals) {\n const locals = accessRef.locals\n let addressIndex = 0\n if (locals.address && !locals.address.equals(Address.zeroAddress())) {\n addressIndex = ensure({ address: locals.address })\n }\n\n let appIndex = 0\n if (locals.appId && locals.appId !== appId) {\n appIndex = ensure({ appId: locals.appId })\n }\n if (addressIndex !== 0 || appIndex !== 0) {\n accessList.push({\n l: {\n d: numberCodec.encodeOptional(addressIndex, format),\n p: numberCodec.encodeOptional(appIndex, format),\n },\n })\n }\n continue\n }\n\n // Box reference\n if (accessRef.box) {\n const box = accessRef.box\n // Only add appId to access list if it's different from the calling app's ID\n // Use appIndex = 0 when box is for the current app\n let appIndex = 0\n if (box.appId && box.appId !== appId) {\n appIndex = ensure({ appId: box.appId })\n }\n accessList.push({\n b: {\n i: numberCodec.encodeOptional(appIndex, format),\n n: bytesCodec.encodeOptional(box.name, format),\n },\n })\n continue\n }\n }\n\n return accessList.length > 0 ? accessList : undefined\n }\n\n private decodeAccessReferences(_wireAccessReferences: WireAccessReference[] | undefined, format: EncodingFormat): AccessReference[] {\n if (!_wireAccessReferences || _wireAccessReferences.length === 0) return []\n\n const result: AccessReference[] = []\n\n // Process each entry in the access list\n\n const wireAccessReferences = _wireAccessReferences.map((ref) => normalizeWireObject(ref))\n for (const ref of wireAccessReferences) {\n const d = ref.d as WireString | undefined\n const s = ref.s as WireBigInt | undefined\n const p = ref.p as WireBigInt | undefined\n const _h = ref.h as WireObject | undefined\n const h = _h ? normalizeWireObject(_h) : undefined\n const _l = ref.l as WireObject | undefined\n const l = _l ? normalizeWireObject(_l) : undefined\n const _b = ref.b as WireObject | undefined\n const b = _b ? normalizeWireObject(_b) : undefined\n\n // Simple address reference\n if (d) {\n result.push({ address: addressCodec.decode(d, format) })\n continue\n }\n\n // Simple asset ID reference\n if (s !== undefined) {\n result.push({ assetId: bigIntCodec.decode(s, format) })\n continue\n }\n\n // Simple app ID reference\n if (p !== undefined) {\n result.push({ appId: bigIntCodec.decode(p, format) })\n continue\n }\n\n // Holding reference (h)\n if (h) {\n const addrIdx = (h.d ?? 0) as number\n const assetIdx = h.s as number | undefined\n\n if (assetIdx === undefined) {\n throw new Error('Access list holding reference is missing asset index')\n }\n\n const holdingAddress =\n addrIdx === 0 ? Address.zeroAddress() : addressCodec.decode(wireAccessReferences[addrIdx - 1].d! as WireString, format)\n const holdingAssetId = wireAccessReferences[assetIdx - 1].s! as WireBigInt\n\n result.push({\n holding: {\n assetId: bigIntCodec.decode(holdingAssetId, format),\n address: holdingAddress,\n },\n })\n continue\n }\n\n // Locals reference (l)\n if (l) {\n const addrIdx = (l.d ?? 0) as number\n const appIdx = (l.p ?? 0) as number\n\n const localsAddress =\n addrIdx === 0 ? Address.zeroAddress() : addressCodec.decode(wireAccessReferences[addrIdx - 1].d! as WireString, format)\n const localsAppId = appIdx === 0 ? 0n : (wireAccessReferences[appIdx - 1].p! as WireBigInt)\n\n result.push({\n locals: {\n appId: bigIntCodec.decode(localsAppId, format),\n address: localsAddress,\n },\n })\n continue\n }\n\n // Box reference (b)\n if (b) {\n const boxAppIdx = (b.i ?? 0) as number\n const name = b.n as WireString | undefined\n\n if (!name) {\n throw new Error('Access list box reference is missing name')\n }\n\n const boxAppId = boxAppIdx === 0 ? 0n : (wireAccessReferences[boxAppIdx - 1].p! as WireBigInt)\n\n result.push({\n box: {\n appId: bigIntCodec.decode(boxAppId, format),\n name: bytesCodec.decode(name, format),\n },\n })\n continue\n }\n }\n\n return result\n }\n\n private encodeBoxReferences(\n appId: bigint,\n appReferences: bigint[] | undefined,\n boxReferences: BoxReference[] | undefined,\n format: EncodingFormat,\n ): WireBoxReference[] | undefined {\n if (!boxReferences || boxReferences.length === 0) return undefined\n\n const appRefs = appReferences ?? []\n\n return boxReferences.map((box) => {\n const isCurrentApp = box.appId === 0n || box.appId === appId\n // Index 0 means current app, index > 0 references foreign apps array (1-indexed)\n const index = isCurrentApp ? 0 : appRefs.indexOf(box.appId) + 1\n\n if (index === 0 && !isCurrentApp) {\n throw new Error(`Box ref with appId ${box.appId} not in appReferences`)\n }\n\n return {\n i: numberCodec.encodeOptional(index, format), // This returns undefined when index is 0, which omits the field\n n: bytesCodec.encodeOptional(box.name, format),\n }\n })\n }\n\n private decodeBoxReferences(\n appReferences: bigint[] | undefined,\n wireBoxReferences: WireBoxReference[] | undefined,\n format: EncodingFormat,\n ): BoxReference[] {\n if (!wireBoxReferences || wireBoxReferences.length === 0) return []\n\n return wireBoxReferences.map((_box) => {\n const box = normalizeWireObject(_box)\n const boxIndex = box.i as number | undefined\n const boxName = box.n as WireString | undefined\n\n const index = boxIndex ?? 0\n\n let appId: bigint\n if (index === 0) {\n // 0 means current app\n appId = 0n\n } else {\n // 1-based index into foreignApps array\n const foreignAppId = appReferences?.[index - 1]\n if (foreignAppId === undefined) {\n throw new Error(`Failed to find the app reference at index ${index - 1}`)\n }\n appId = bigIntCodec.decode(foreignAppId, format)\n }\n\n return {\n appId,\n name: bytesCodec.decode(boxName, format),\n }\n })\n }\n\n protected toEncoded(value: AppCallTransactionFields | undefined, format: EncodingFormat): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n if (!value) {\n throw new Error('Transaction is not an app call')\n }\n\n const encodedParams = this.appCallFieldsCodec.encodeOptional(value, format)\n if (encodedParams && Object.keys(encodedParams).length > 0) {\n Object.assign(result, encodedParams)\n }\n\n const wireBoxReferences = this.encodeBoxReferences(value.appId, value.appReferences, value.boxReferences, format)\n if (wireBoxReferences) {\n result.apbx = wireBoxReferences\n }\n\n const wireAccessReferences = this.encodeAccessReferences(value.appId, value.accessReferences, format)\n if (wireAccessReferences) {\n result.al = wireAccessReferences\n }\n\n return result\n }\n\n protected fromEncoded(value: Record<string, unknown>, format: EncodingFormat): AppCallTransactionFields | undefined {\n if (value.type === undefined) {\n throw new Error('Transaction is missing type field')\n }\n const type = normalizeWireString(value.type as WireString)\n if (type !== TransactionType.AppCall) {\n return undefined\n }\n\n const appReferences = value.apfa as WireBigInt[] | undefined\n const wireBoxReferences = value.apbx as WireBoxReference[] | undefined\n const wireAccessReferences = value.al as WireAccessReference[] | undefined\n const boxReferences = this.decodeBoxReferences(\n appReferences?.map((ar) => bigIntCodec.decode(ar, format)),\n wireBoxReferences,\n format,\n )\n const accessReferences = this.decodeAccessReferences(wireAccessReferences, format)\n\n return {\n ...this.appCallFieldsCodec.decode(value, format),\n ...(accessReferences.length > 0 && { accessReferences }),\n ...(boxReferences.length > 0 && { boxReferences }),\n } satisfies AppCallTransactionFields\n }\n\n public isDefaultValue(value: AppCallTransactionFields | undefined): boolean {\n return value === undefined\n }\n}\n\nconst PaymentTransactionFieldsMeta: ObjectModelMetadata<PaymentTransactionFields> = {\n name: 'PaymentTransactionFields',\n kind: 'object',\n fields: [\n { name: 'amount', wireKey: 'amt', optional: false, codec: bigIntCodec },\n { name: 'receiver', wireKey: 'rcv', optional: false, codec: addressCodec },\n { name: 'closeRemainderTo', wireKey: 'close', optional: true, codec: addressCodec },\n ],\n}\n\nconst AssetTransferTransactionFieldsMeta: ObjectModelMetadata<AssetTransferTransactionFields> = {\n name: 'AssetTransferTransactionFields',\n kind: 'object',\n fields: [\n { name: 'assetId', wireKey: 'xaid', optional: false, codec: bigIntCodec },\n { name: 'amount', wireKey: 'aamt', optional: false, codec: bigIntCodec },\n { name: 'receiver', wireKey: 'arcv', optional: false, codec: addressCodec },\n { name: 'assetSender', wireKey: 'asnd', optional: true, codec: addressCodec },\n { name: 'closeRemainderTo', wireKey: 'aclose', optional: true, codec: addressCodec },\n ],\n}\n\nconst AssetFreezeTransactionFieldsMeta: ObjectModelMetadata<AssetFreezeTransactionFields> = {\n name: 'AssetFreezeTransactionFields',\n kind: 'object',\n fields: [\n { name: 'assetId', wireKey: 'faid', optional: false, codec: bigIntCodec },\n { name: 'freezeTarget', wireKey: 'fadd', optional: false, codec: addressCodec },\n { name: 'frozen', wireKey: 'afrz', optional: false, codec: booleanCodec },\n ],\n}\n\nconst KeyRegistrationTransactionFieldsMeta: ObjectModelMetadata<KeyRegistrationTransactionFields> = {\n name: 'KeyRegistrationTransactionFields',\n kind: 'object',\n fields: [\n { name: 'voteKey', wireKey: 'votekey', optional: true, codec: fixedBytes32Codec },\n { name: 'selectionKey', wireKey: 'selkey', optional: true, codec: fixedBytes32Codec },\n { name: 'stateProofKey', wireKey: 'sprfkey', optional: true, codec: fixedBytes64Codec },\n { name: 'voteFirst', wireKey: 'votefst', optional: true, codec: bigIntCodec },\n { name: 'voteLast', wireKey: 'votelst', optional: true, codec: bigIntCodec },\n { name: 'voteKeyDilution', wireKey: 'votekd', optional: true, codec: bigIntCodec },\n { name: 'nonParticipation', wireKey: 'nonpart', optional: true, codec: booleanCodec },\n ],\n}\n\nconst AssetParamsMeta: ObjectModelMetadata<Omit<AssetConfigTransactionFields, 'assetId'>> = {\n name: 'AssetParams',\n kind: 'object',\n fields: [\n { name: 'total', wireKey: 't', optional: true, codec: bigIntCodec },\n { name: 'decimals', wireKey: 'dc', optional: true, codec: numberCodec },\n { name: 'defaultFrozen', wireKey: 'df', optional: true, codec: booleanCodec },\n { name: 'unitName', wireKey: 'un', optional: true, codec: stringCodec },\n { name: 'assetName', wireKey: 'an', optional: true, codec: stringCodec },\n { name: 'url', wireKey: 'au', optional: true, codec: stringCodec },\n { name: 'metadataHash', wireKey: 'am', optional: true, codec: fixedBytes32Codec },\n { name: 'manager', wireKey: 'm', optional: true, codec: addressCodec },\n { name: 'reserve', wireKey: 'r', optional: true, codec: addressCodec },\n { name: 'freeze', wireKey: 'f', optional: true, codec: addressCodec },\n { name: 'clawback', wireKey: 'c', optional: true, codec: addressCodec },\n ],\n}\n\nconst StateSchemaMeta: ObjectModelMetadata<StateSchema> = {\n name: 'StateSchema',\n kind: 'object',\n fields: [\n { name: 'numUints', wireKey: 'nui', optional: false, codec: numberCodec },\n { name: 'numByteSlices', wireKey: 'nbs', optional: false, codec: numberCodec },\n ],\n}\n\nconst AppCallTransactionFieldsMeta: ObjectModelMetadata<AppCallTransactionFields> = {\n name: 'AppCallTransactionFields',\n kind: 'object',\n fields: [\n { name: 'appId', wireKey: 'apid', optional: false, codec: bigIntCodec },\n { name: 'onComplete', wireKey: 'apan', optional: false, codec: numberCodec },\n { name: 'approvalProgram', wireKey: 'apap', optional: true, codec: bytesCodec },\n { name: 'clearStateProgram', wireKey: 'apsu', optional: true, codec: bytesCodec },\n {\n name: 'globalStateSchema',\n wireKey: 'apgs',\n optional: true,\n codec: new ObjectModelCodec(StateSchemaMeta),\n },\n {\n name: 'localStateSchema',\n wireKey: 'apls',\n optional: true,\n codec: new ObjectModelCodec(StateSchemaMeta),\n },\n { name: 'extraProgramPages', wireKey: 'apep', optional: true, codec: numberCodec },\n { name: 'args', wireKey: 'apaa', optional: true, codec: bytesArrayCodec },\n { name: 'accountReferences', wireKey: 'apat', optional: true, codec: addressArrayCodec },\n { name: 'appReferences', wireKey: 'apfa', optional: true, codec: bigIntArrayCodec },\n { name: 'assetReferences', wireKey: 'apas', optional: true, codec: bigIntArrayCodec },\n // boxReferences and accessReferences are handled by the parent codec, as they require more complex mappings\n ],\n}\n\nconst HashFactoryMeta: ObjectModelMetadata<HashFactory> = {\n name: 'HashFactory',\n kind: 'object',\n fields: [{ name: 'hashType', wireKey: 't', optional: false, codec: numberCodec }],\n}\n\nconst MerkleArrayProofMeta: ObjectModelMetadata<MerkleArrayProof> = {\n name: 'MerkleArrayProof',\n kind: 'object',\n fields: [\n { name: 'path', wireKey: 'pth', optional: false, codec: bytesArrayCodec },\n { name: 'hashFactory', wireKey: 'hsh', optional: false, codec: new ObjectModelCodec(HashFactoryMeta) },\n { name: 'treeDepth', wireKey: 'td', optional: false, codec: numberCodec },\n ],\n}\n\nconst FalconVerifierMeta: ObjectModelMetadata<FalconVerifier> = {\n name: 'FalconVerifier',\n kind: 'object',\n fields: [{ name: 'publicKey', wireKey: 'k', optional: false, codec: fixedBytes1793Codec }],\n}\n\nconst FalconSignatureStructMeta: ObjectModelMetadata<FalconSignatureStruct> = {\n name: 'FalconSignatureStruct',\n kind: 'object',\n fields: [\n { name: 'signature', wireKey: 'sig', optional: false, codec: bytesCodec },\n { name: 'vectorCommitmentIndex', wireKey: 'idx', optional: false, codec: bigIntCodec },\n { name: 'proof', wireKey: 'prf', optional: false, codec: new ObjectModelCodec(MerkleArrayProofMeta) },\n { name: 'verifyingKey', wireKey: 'vkey', optional: false, codec: new ObjectModelCodec(FalconVerifierMeta) },\n ],\n}\n\nconst SigslotCommitMeta: ObjectModelMetadata<SigslotCommit> = {\n name: 'SigslotCommit',\n kind: 'object',\n fields: [\n { name: 'sig', wireKey: 's', optional: false, codec: new ObjectModelCodec(FalconSignatureStructMeta) },\n { name: 'lowerSigWeight', wireKey: 'l', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst MerkleSignatureVerifierMeta: ObjectModelMetadata<MerkleSignatureVerifier> = {\n name: 'MerkleSignatureVerifier',\n kind: 'object',\n fields: [\n { name: 'commitment', wireKey: 'cmt', optional: false, codec: fixedBytes64Codec },\n { name: 'keyLifetime', wireKey: 'lf', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst ParticipantMeta: ObjectModelMetadata<Participant> = {\n name: 'Participant',\n kind: 'object',\n fields: [\n { name: 'verifier', wireKey: 'p', optional: false, codec: new ObjectModelCodec(MerkleSignatureVerifierMeta) },\n { name: 'weight', wireKey: 'w', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst RevealMeta: ObjectModelMetadata<Reveal> = {\n name: 'Reveal',\n kind: 'object',\n fields: [\n { name: 'sigslot', wireKey: 's', optional: false, codec: new ObjectModelCodec(SigslotCommitMeta) },\n { name: 'participant', wireKey: 'p', optional: false, codec: new ObjectModelCodec(ParticipantMeta) },\n ],\n}\n\nconst StateProofMeta: ObjectModelMetadata<StateProof> = {\n name: 'StateProof',\n kind: 'object',\n fields: [\n { name: 'sigCommit', wireKey: 'c', optional: false, codec: bytesCodec },\n { name: 'signedWeight', wireKey: 'w', optional: false, codec: bigIntCodec },\n { name: 'sigProofs', wireKey: 'S', optional: false, codec: new ObjectModelCodec(MerkleArrayProofMeta) },\n { name: 'partProofs', wireKey: 'P', optional: false, codec: new ObjectModelCodec(MerkleArrayProofMeta) },\n { name: 'merkleSignatureSaltVersion', wireKey: 'v', optional: false, codec: numberCodec },\n {\n name: 'reveals',\n wireKey: 'r',\n optional: false,\n codec: new MapCodec(bigIntCodec, new ObjectModelCodec(RevealMeta)),\n },\n { name: 'positionsToReveal', wireKey: 'pr', optional: false, codec: bigIntArrayCodec },\n ],\n}\n\nconst StateProofMessageMeta: ObjectModelMetadata<StateProofMessage> = {\n name: 'StateProofMessage',\n kind: 'object',\n fields: [\n { name: 'blockHeadersCommitment', wireKey: 'b', optional: false, codec: bytesCodec },\n { name: 'votersCommitment', wireKey: 'v', optional: false, codec: bytesCodec },\n { name: 'lnProvenWeight', wireKey: 'P', optional: false, codec: bigIntCodec },\n { name: 'firstAttestedRound', wireKey: 'f', optional: false, codec: bigIntCodec },\n { name: 'lastAttestedRound', wireKey: 'l', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst StateProofTransactionFieldsMeta: ObjectModelMetadata<StateProofTransactionFields> = {\n name: 'StateProofTransactionFields',\n kind: 'object',\n fields: [\n { name: 'stateProofType', wireKey: 'sptype', optional: false, codec: numberCodec },\n { name: 'stateProof', wireKey: 'sp', optional: true, codec: new ObjectModelCodec(StateProofMeta) },\n { name: 'message', wireKey: 'spmsg', optional: true, codec: new ObjectModelCodec(StateProofMessageMeta) },\n ],\n}\n\nconst HeartbeatProofMeta: ObjectModelMetadata<HeartbeatProof> = {\n name: 'HeartbeatProof',\n kind: 'object',\n fields: [\n { name: 'sig', wireKey: 's', optional: false, codec: fixedBytes64Codec },\n { name: 'pk', wireKey: 'p', optional: false, codec: fixedBytes32Codec },\n { name: 'pk2', wireKey: 'p2', optional: false, codec: fixedBytes32Codec },\n { name: 'pk1Sig', wireKey: 'p1s', optional: false, codec: fixedBytes64Codec },\n { name: 'pk2Sig', wireKey: 'p2s', optional: false, codec: fixedBytes64Codec },\n ],\n}\n\nconst HeartbeatTransactionFieldsMeta: ObjectModelMetadata<HeartbeatTransactionFields> = {\n name: 'HeartbeatTransactionFields',\n kind: 'object',\n fields: [\n { name: 'address', wireKey: 'a', optional: false, codec: addressCodec },\n { name: 'proof', wireKey: 'prf', optional: false, codec: new ObjectModelCodec(HeartbeatProofMeta) },\n { name: 'seed', wireKey: 'sd', optional: false, codec: bytesCodec },\n { name: 'voteId', wireKey: 'vid', optional: false, codec: fixedBytes32Codec },\n { name: 'keyDilution', wireKey: 'kd', optional: false, codec: bigIntCodec },\n ],\n}\n\n/**\n * Metadata for TransactionParams\n */\nexport const TransactionParamsMeta: ObjectModelMetadata<TransactionParams> = {\n name: 'TransactionParams',\n kind: 'object',\n fields: [\n // Common transaction fields\n { name: 'type', wireKey: 'type', optional: false, codec: new TransactionTypeCodec() },\n { name: 'sender', wireKey: 'snd', optional: false, codec: addressCodec },\n { name: 'fee', wireKey: 'fee', optional: true, codec: bigIntCodec },\n { name: 'firstValid', wireKey: 'fv', optional: false, codec: bigIntCodec },\n { name: 'lastValid', wireKey: 'lv', optional: false, codec: bigIntCodec },\n { name: 'genesisHash', wireKey: 'gh', optional: true, codec: fixedBytes32Codec },\n { name: 'genesisId', wireKey: 'gen', optional: true, codec: stringCodec },\n { name: 'note', wireKey: 'note', optional: true, codec: bytesCodec },\n { name: 'rekeyTo', wireKey: 'rekey', optional: true, codec: addressCodec },\n { name: 'lease', wireKey: 'lx', optional: true, codec: fixedBytes32Codec },\n { name: 'group', wireKey: 'grp', optional: true, codec: fixedBytes32Codec },\n // Transaction type-specific fields (flattened)\n {\n name: 'payment',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.Payment, PaymentTransactionFieldsMeta),\n },\n {\n name: 'assetTransfer',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.AssetTransfer, AssetTransferTransactionFieldsMeta),\n },\n {\n name: 'assetFreeze',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.AssetFreeze, AssetFreezeTransactionFieldsMeta),\n },\n {\n name: 'keyRegistration',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.KeyRegistration, KeyRegistrationTransactionFieldsMeta),\n },\n {\n name: 'assetConfig',\n flattened: true,\n optional: true,\n codec: new AssetConfigDataCodec(),\n },\n {\n name: 'heartbeat',\n wireKey: 'hb',\n optional: true,\n // Heartbeat is not flattened and therefore does not need the type check for conditional decoding\n codec: new ObjectModelCodec(HeartbeatTransactionFieldsMeta),\n },\n {\n name: 'appCall',\n flattened: true,\n optional: true,\n codec: new AppCallDataCodec(),\n },\n {\n name: 'stateProof',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.StateProof, StateProofTransactionFieldsMeta),\n },\n ],\n}\n\nexport const transactionParamsCodec = new ObjectModelCodec<TransactionParams>(TransactionParamsMeta)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transaction-meta.mjs","names":["transactionType: TransactionType","result: Record<string, unknown>","accessList: WireResourceReference[]","result: ResourceReference[]","appId: bigint","PaymentTransactionFieldsMeta: ObjectModelMetadata<PaymentTransactionFields>","AssetTransferTransactionFieldsMeta: ObjectModelMetadata<AssetTransferTransactionFields>","AssetFreezeTransactionFieldsMeta: ObjectModelMetadata<AssetFreezeTransactionFields>","KeyRegistrationTransactionFieldsMeta: ObjectModelMetadata<KeyRegistrationTransactionFields>","AssetParamsMeta: ObjectModelMetadata<Omit<AssetConfigTransactionFields, 'assetId'>>","StateSchemaMeta: ObjectModelMetadata<StateSchema>","AppCallTransactionFieldsMeta: ObjectModelMetadata<AppCallTransactionFields>","MerkleArrayProofMeta: ObjectModelMetadata<MerkleArrayProof>","FalconVerifierMeta: ObjectModelMetadata<FalconVerifier>","SigslotCommitMeta: ObjectModelMetadata<SigslotCommit>","ParticipantMeta: ObjectModelMetadata<Participant>","RevealMeta: ObjectModelMetadata<Reveal>","StateProofMeta: ObjectModelMetadata<StateProof>","StateProofMessageMeta: ObjectModelMetadata<StateProofMessage>","StateProofTransactionFieldsMeta: ObjectModelMetadata<StateProofTransactionFields>","HeartbeatTransactionFieldsMeta: ObjectModelMetadata<HeartbeatTransactionFields>","TransactionParamsMeta: ObjectModelMetadata<TransactionParams>"],"sources":["../../../../../packages/transact/src/transactions/transaction-meta.ts"],"sourcesContent":["import type { EncodingFormat, ObjectModelMetadata, WireBigInt, WireObject, WireString } from '@algorandfoundation/algokit-common'\nimport {\n Address,\n Codec,\n MapCodec,\n ObjectModelCodec,\n addressArrayCodec,\n addressCodec,\n bigIntArrayCodec,\n bigIntCodec,\n booleanCodec,\n bytesArrayCodec,\n bytesCodec,\n fixedBytes1793Codec,\n fixedBytes32Codec,\n fixedBytes64Codec,\n normalizeWireObject,\n normalizeWireString,\n numberCodec,\n stringCodec,\n} from '@algorandfoundation/algokit-common'\nimport { AppCallTransactionFields, BoxReference, ResourceReference, StateSchema } from './app-call'\nimport { AssetConfigTransactionFields } from './asset-config'\nimport { AssetFreezeTransactionFields } from './asset-freeze'\nimport { AssetTransferTransactionFields } from './asset-transfer'\nimport { HeartbeatProof, HeartbeatTransactionFields } from './heartbeat'\nimport { KeyRegistrationTransactionFields } from './key-registration'\nimport { PaymentTransactionFields } from './payment'\nimport {\n FalconSignatureStruct,\n FalconVerifier,\n HashFactory,\n MerkleArrayProof,\n MerkleSignatureVerifier,\n Participant,\n Reveal,\n SigslotCommit,\n StateProof,\n StateProofMessage,\n StateProofTransactionFields,\n} from './state-proof'\nimport type { TransactionParams } from './transaction'\nimport { TransactionType } from './transaction-type'\n\ntype WireBoxReference = {\n /** App index (0 or index into access list) */\n i?: number\n /** Box name */\n n?: WireString\n}\n\ntype WireResourceReference = {\n /** Account address */\n d?: WireString\n\n /** App index */\n p?: WireBigInt\n\n /** Asset index */\n s?: WireBigInt\n\n /** Box reference */\n b?: WireBoxReference\n\n /** Holding reference (1-based indices into access list) */\n h?: {\n /** Address index */\n d?: number\n /** Asset index (1-based index into access list) */\n s?: number\n }\n\n /** Local state reference (1-based indices into access list) */\n l?: {\n /** Address index */\n d?: number\n /** App index (0 means current app, or 1-based index into access list) */\n p?: number\n }\n}\n\nclass TransactionTypeCodec extends Codec<TransactionType, string, WireString> {\n public defaultValue(): TransactionType {\n // This ensure that we never omit the transaction type, as a transaction should never be created with this value\n return TransactionType.Unknown\n }\n\n protected toEncoded(value: TransactionType, _format: EncodingFormat): string {\n switch (value) {\n case TransactionType.Payment:\n return 'pay'\n case TransactionType.AssetTransfer:\n return 'axfer'\n case TransactionType.AssetFreeze:\n return 'afrz'\n case TransactionType.AssetConfig:\n return 'acfg'\n case TransactionType.KeyRegistration:\n return 'keyreg'\n case TransactionType.AppCall:\n return 'appl'\n case TransactionType.StateProof:\n return 'stpf'\n case TransactionType.Heartbeat:\n return 'hb'\n default:\n return 'unknown'\n }\n }\n\n protected fromEncoded(value: WireString, _format: EncodingFormat): TransactionType {\n // Convert Uint8Array to string if needed (msgpack may return transaction type as bytes)\n const typeString = normalizeWireString(value)\n\n switch (typeString) {\n case 'pay':\n return TransactionType.Payment\n case 'axfer':\n return TransactionType.AssetTransfer\n case 'afrz':\n return TransactionType.AssetFreeze\n case 'acfg':\n return TransactionType.AssetConfig\n case 'keyreg':\n return TransactionType.KeyRegistration\n case 'appl':\n return TransactionType.AppCall\n case 'stpf':\n return TransactionType.StateProof\n case 'hb':\n return TransactionType.Heartbeat\n default:\n return TransactionType.Unknown\n }\n }\n}\n\nclass TransactionDataCodec<\n T extends\n | PaymentTransactionFields\n | AssetTransferTransactionFields\n | AssetFreezeTransactionFields\n | KeyRegistrationTransactionFields\n | StateProofTransactionFields,\n> extends Codec<T | undefined, Record<string, unknown>> {\n private transactionDataCodec: ObjectModelCodec<T>\n\n constructor(\n private readonly transactionType: TransactionType,\n transactionTypeDataMetadata: ObjectModelMetadata<T>,\n ) {\n super()\n this.transactionDataCodec = new ObjectModelCodec<T>(transactionTypeDataMetadata)\n }\n\n public defaultValue(): T | undefined {\n return undefined\n }\n\n protected toEncoded(value: T | undefined, format: EncodingFormat): Record<string, unknown> {\n if (!value) {\n throw new Error('Transaction data is missing')\n }\n return this.transactionDataCodec.encode(value, format)\n }\n\n protected fromEncoded(value: Record<string, unknown>, format: EncodingFormat): T | undefined {\n if (value.type === undefined) {\n throw new Error('Transaction is missing type field')\n }\n const type = normalizeWireString(value.type as WireString)\n if (type === this.transactionType.toString()) {\n return this.transactionDataCodec.decode(value, format)\n }\n\n return undefined\n }\n}\n\nclass AssetConfigDataCodec extends Codec<AssetConfigTransactionFields | undefined, Record<string, unknown>> {\n private assetParamsCodec = new ObjectModelCodec<Omit<AssetConfigTransactionFields, 'assetId'>>(AssetParamsMeta)\n\n public defaultValue(): AssetConfigTransactionFields | undefined {\n return undefined\n }\n\n protected toEncoded(value: AssetConfigTransactionFields | undefined, format: EncodingFormat): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n if (!value) {\n throw new Error('Transaction is not an asset config')\n }\n\n const { assetId, ...assetParams } = value\n\n const encodedAssetId = bigIntCodec.encodeOptional(assetId, format)\n if (encodedAssetId !== undefined) {\n result.caid = encodedAssetId\n }\n\n const encodedParams = this.assetParamsCodec.encodeOptional(assetParams, format)\n if (encodedParams && Object.keys(encodedParams).length > 0) {\n result.apar = encodedParams\n }\n\n return result\n }\n\n protected fromEncoded(value: Record<string, unknown>, format: EncodingFormat): AssetConfigTransactionFields | undefined {\n if (value.type === undefined) {\n throw new Error('Transaction is missing type field')\n }\n const type = normalizeWireString(value.type as WireString)\n const caid = value.caid as WireBigInt | undefined\n const apar = value.apar as WireObject | undefined\n\n if (type !== TransactionType.AssetConfig || (caid === undefined && !apar)) {\n return undefined\n }\n\n return {\n assetId: bigIntCodec.decode(caid, format),\n ...this.assetParamsCodec.decode(apar, format),\n } satisfies AssetConfigTransactionFields\n }\n\n public isDefaultValue(value: AssetConfigTransactionFields | undefined): boolean {\n return value === undefined\n }\n}\n\nclass AppCallDataCodec extends Codec<AppCallTransactionFields | undefined, Record<string, unknown>> {\n private appCallFieldsCodec = new ObjectModelCodec<Omit<AppCallTransactionFields, 'accessReferences' | 'boxReferences'>>(\n AppCallTransactionFieldsMeta,\n )\n\n public defaultValue(): AppCallTransactionFields | undefined {\n return undefined\n }\n\n private encodeResourceReferences(\n appId: bigint,\n resourceReferences: ResourceReference[] | undefined,\n format: EncodingFormat,\n ): WireResourceReference[] | undefined {\n if (!resourceReferences || resourceReferences.length === 0) return undefined\n\n const accessList: WireResourceReference[] = []\n\n // Helper to find or add a simple reference and return its 1-based index\n const ensure = (target: Pick<ResourceReference, 'address' | 'assetId' | 'appId'>): number => {\n // Search for existing entry\n for (let idx = 0; idx < accessList.length; idx++) {\n const entry = accessList[idx]\n const matchesAddress =\n (!entry.d && !target.address) || (entry.d && target.address && addressCodec.decode(entry.d, format).equals(target.address))\n const matchesAssetId =\n (entry.s === undefined && target.assetId === undefined) ||\n (entry.s !== undefined && target.assetId !== undefined && bigIntCodec.decode(entry.s, format) === target.assetId)\n const matchesAppId =\n (entry.p === undefined && target.appId === undefined) ||\n (entry.p !== undefined && target.appId !== undefined && bigIntCodec.decode(entry.p, format) === target.appId)\n\n if (matchesAddress && matchesAssetId && matchesAppId) {\n return idx + 1 // Return 1-based index\n }\n }\n\n // Add new entries for each field\n if (target.address && !target.address.equals(Address.zeroAddress())) {\n accessList.push({ d: addressCodec.encodeOptional(target.address, format)! })\n }\n if (target.assetId !== undefined) {\n accessList.push({ s: bigIntCodec.encodeOptional(target.assetId, format)! })\n }\n if (target.appId !== undefined) {\n accessList.push({ p: bigIntCodec.encodeOptional(target.appId, format)! })\n }\n\n return accessList.length // Return 1-based index of last added\n }\n\n // Process each access reference\n for (const resourceRef of resourceReferences) {\n // Simple references (address, assetId, or appId)\n if (resourceRef.address || resourceRef.assetId !== undefined || resourceRef.appId !== undefined) {\n ensure(resourceRef)\n continue\n }\n\n // Holding reference\n if (resourceRef.holding) {\n const holding = resourceRef.holding\n let addressIndex = 0\n if (holding.address && !holding.address.equals(Address.zeroAddress())) {\n addressIndex = ensure({ address: holding.address })\n }\n const assetIndex = ensure({ assetId: holding.assetId })\n accessList.push({\n h: {\n d: numberCodec.encodeOptional(addressIndex, format),\n s: numberCodec.encodeOptional(assetIndex, format),\n },\n })\n continue\n }\n\n // Locals reference\n if (resourceRef.locals) {\n const locals = resourceRef.locals\n let addressIndex = 0\n if (locals.address && !locals.address.equals(Address.zeroAddress())) {\n addressIndex = ensure({ address: locals.address })\n }\n\n let appIndex = 0\n if (locals.appId && locals.appId !== appId) {\n appIndex = ensure({ appId: locals.appId })\n }\n if (addressIndex !== 0 || appIndex !== 0) {\n accessList.push({\n l: {\n d: numberCodec.encodeOptional(addressIndex, format),\n p: numberCodec.encodeOptional(appIndex, format),\n },\n })\n }\n continue\n }\n\n // Box reference\n if (resourceRef.box) {\n const box = resourceRef.box\n // Only add appId to access list if it's different from the calling app's ID\n // Use appIndex = 0 when box is for the current app\n let appIndex = 0\n if (box.appId && box.appId !== appId) {\n appIndex = ensure({ appId: box.appId })\n }\n accessList.push({\n b: {\n i: numberCodec.encodeOptional(appIndex, format),\n n: bytesCodec.encodeOptional(box.name, format),\n },\n })\n continue\n }\n }\n\n return accessList.length > 0 ? accessList : undefined\n }\n\n private decodeResourceReferences(\n _wireResourceReferences: WireResourceReference[] | undefined,\n format: EncodingFormat,\n ): ResourceReference[] {\n if (!_wireResourceReferences || _wireResourceReferences.length === 0) return []\n\n const result: ResourceReference[] = []\n\n // Process each entry in the access list\n\n const wireResourceReferences = _wireResourceReferences.map((ref) => normalizeWireObject(ref))\n for (const ref of wireResourceReferences) {\n const d = ref.d as WireString | undefined\n const s = ref.s as WireBigInt | undefined\n const p = ref.p as WireBigInt | undefined\n const _h = ref.h as WireObject | undefined\n const h = _h ? normalizeWireObject(_h) : undefined\n const _l = ref.l as WireObject | undefined\n const l = _l ? normalizeWireObject(_l) : undefined\n const _b = ref.b as WireObject | undefined\n const b = _b ? normalizeWireObject(_b) : undefined\n\n // Simple address reference\n if (d) {\n result.push({ address: addressCodec.decode(d, format) })\n continue\n }\n\n // Simple asset ID reference\n if (s !== undefined) {\n result.push({ assetId: bigIntCodec.decode(s, format) })\n continue\n }\n\n // Simple app ID reference\n if (p !== undefined) {\n result.push({ appId: bigIntCodec.decode(p, format) })\n continue\n }\n\n // Holding reference (h)\n if (h) {\n const addrIdx = (h.d ?? 0) as number\n const assetIdx = h.s as number | undefined\n\n if (assetIdx === undefined) {\n throw new Error('Access list holding reference is missing asset index')\n }\n\n const holdingAddress =\n addrIdx === 0 ? Address.zeroAddress() : addressCodec.decode(wireResourceReferences[addrIdx - 1].d! as WireString, format)\n const holdingAssetId = wireResourceReferences[assetIdx - 1].s! as WireBigInt\n\n result.push({\n holding: {\n assetId: bigIntCodec.decode(holdingAssetId, format),\n address: holdingAddress,\n },\n })\n continue\n }\n\n // Locals reference (l)\n if (l) {\n const addrIdx = (l.d ?? 0) as number\n const appIdx = (l.p ?? 0) as number\n\n const localsAddress =\n addrIdx === 0 ? Address.zeroAddress() : addressCodec.decode(wireResourceReferences[addrIdx - 1].d! as WireString, format)\n const localsAppId = appIdx === 0 ? 0n : (wireResourceReferences[appIdx - 1].p! as WireBigInt)\n\n result.push({\n locals: {\n appId: bigIntCodec.decode(localsAppId, format),\n address: localsAddress,\n },\n })\n continue\n }\n\n // Box reference (b)\n if (b) {\n const boxAppIdx = (b.i ?? 0) as number\n const name = b.n as WireString | undefined\n\n if (!name) {\n throw new Error('Access list box reference is missing name')\n }\n\n const boxAppId = boxAppIdx === 0 ? 0n : (wireResourceReferences[boxAppIdx - 1].p! as WireBigInt)\n\n result.push({\n box: {\n appId: bigIntCodec.decode(boxAppId, format),\n name: bytesCodec.decode(name, format),\n },\n })\n continue\n }\n }\n\n return result\n }\n\n private encodeBoxReferences(\n appId: bigint,\n appReferences: bigint[] | undefined,\n boxReferences: BoxReference[] | undefined,\n format: EncodingFormat,\n ): WireBoxReference[] | undefined {\n if (!boxReferences || boxReferences.length === 0) return undefined\n\n const appRefs = appReferences ?? []\n\n return boxReferences.map((box) => {\n const isCurrentApp = box.appId === 0n || box.appId === appId\n // Index 0 means current app, index > 0 references foreign apps array (1-indexed)\n const index = isCurrentApp ? 0 : appRefs.indexOf(box.appId) + 1\n\n if (index === 0 && !isCurrentApp) {\n throw new Error(`Box ref with appId ${box.appId} not in appReferences`)\n }\n\n return {\n i: numberCodec.encodeOptional(index, format), // This returns undefined when index is 0, which omits the field\n n: bytesCodec.encodeOptional(box.name, format),\n }\n })\n }\n\n private decodeBoxReferences(\n appReferences: bigint[] | undefined,\n wireBoxReferences: WireBoxReference[] | undefined,\n format: EncodingFormat,\n ): BoxReference[] {\n if (!wireBoxReferences || wireBoxReferences.length === 0) return []\n\n return wireBoxReferences.map((_box) => {\n const box = normalizeWireObject(_box)\n const boxIndex = box.i as number | undefined\n const boxName = box.n as WireString | undefined\n\n const index = boxIndex ?? 0\n\n let appId: bigint\n if (index === 0) {\n // 0 means current app\n appId = 0n\n } else {\n // 1-based index into foreignApps array\n const foreignAppId = appReferences?.[index - 1]\n if (foreignAppId === undefined) {\n throw new Error(`Failed to find the app reference at index ${index - 1}`)\n }\n appId = bigIntCodec.decode(foreignAppId, format)\n }\n\n return {\n appId,\n name: bytesCodec.decode(boxName, format),\n }\n })\n }\n\n protected toEncoded(value: AppCallTransactionFields | undefined, format: EncodingFormat): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n if (!value) {\n throw new Error('Transaction is not an app call')\n }\n\n const encodedParams = this.appCallFieldsCodec.encodeOptional(value, format)\n if (encodedParams && Object.keys(encodedParams).length > 0) {\n Object.assign(result, encodedParams)\n }\n\n const wireBoxReferences = this.encodeBoxReferences(value.appId, value.appReferences, value.boxReferences, format)\n if (wireBoxReferences) {\n result.apbx = wireBoxReferences\n }\n\n const wireAccessReferences = this.encodeResourceReferences(value.appId, value.accessReferences, format)\n if (wireAccessReferences) {\n result.al = wireAccessReferences\n }\n\n return result\n }\n\n protected fromEncoded(value: Record<string, unknown>, format: EncodingFormat): AppCallTransactionFields | undefined {\n if (value.type === undefined) {\n throw new Error('Transaction is missing type field')\n }\n const type = normalizeWireString(value.type as WireString)\n if (type !== TransactionType.AppCall) {\n return undefined\n }\n\n const appReferences = value.apfa as WireBigInt[] | undefined\n const wireBoxReferences = value.apbx as WireBoxReference[] | undefined\n const wireAccessReferences = value.al as WireResourceReference[] | undefined\n const boxReferences = this.decodeBoxReferences(\n appReferences?.map((ar) => bigIntCodec.decode(ar, format)),\n wireBoxReferences,\n format,\n )\n const accessReferences = this.decodeResourceReferences(wireAccessReferences, format)\n\n return {\n ...this.appCallFieldsCodec.decode(value, format),\n ...(accessReferences.length > 0 && { accessReferences }),\n ...(boxReferences.length > 0 && { boxReferences }),\n } satisfies AppCallTransactionFields\n }\n\n public isDefaultValue(value: AppCallTransactionFields | undefined): boolean {\n return value === undefined\n }\n}\n\nconst PaymentTransactionFieldsMeta: ObjectModelMetadata<PaymentTransactionFields> = {\n name: 'PaymentTransactionFields',\n kind: 'object',\n fields: [\n { name: 'amount', wireKey: 'amt', optional: false, codec: bigIntCodec },\n { name: 'receiver', wireKey: 'rcv', optional: false, codec: addressCodec },\n { name: 'closeRemainderTo', wireKey: 'close', optional: true, codec: addressCodec },\n ],\n}\n\nconst AssetTransferTransactionFieldsMeta: ObjectModelMetadata<AssetTransferTransactionFields> = {\n name: 'AssetTransferTransactionFields',\n kind: 'object',\n fields: [\n { name: 'assetId', wireKey: 'xaid', optional: false, codec: bigIntCodec },\n { name: 'amount', wireKey: 'aamt', optional: false, codec: bigIntCodec },\n { name: 'receiver', wireKey: 'arcv', optional: false, codec: addressCodec },\n { name: 'assetSender', wireKey: 'asnd', optional: true, codec: addressCodec },\n { name: 'closeRemainderTo', wireKey: 'aclose', optional: true, codec: addressCodec },\n ],\n}\n\nconst AssetFreezeTransactionFieldsMeta: ObjectModelMetadata<AssetFreezeTransactionFields> = {\n name: 'AssetFreezeTransactionFields',\n kind: 'object',\n fields: [\n { name: 'assetId', wireKey: 'faid', optional: false, codec: bigIntCodec },\n { name: 'freezeTarget', wireKey: 'fadd', optional: false, codec: addressCodec },\n { name: 'frozen', wireKey: 'afrz', optional: false, codec: booleanCodec },\n ],\n}\n\nconst KeyRegistrationTransactionFieldsMeta: ObjectModelMetadata<KeyRegistrationTransactionFields> = {\n name: 'KeyRegistrationTransactionFields',\n kind: 'object',\n fields: [\n { name: 'voteKey', wireKey: 'votekey', optional: true, codec: fixedBytes32Codec },\n { name: 'selectionKey', wireKey: 'selkey', optional: true, codec: fixedBytes32Codec },\n { name: 'stateProofKey', wireKey: 'sprfkey', optional: true, codec: fixedBytes64Codec },\n { name: 'voteFirst', wireKey: 'votefst', optional: true, codec: bigIntCodec },\n { name: 'voteLast', wireKey: 'votelst', optional: true, codec: bigIntCodec },\n { name: 'voteKeyDilution', wireKey: 'votekd', optional: true, codec: bigIntCodec },\n { name: 'nonParticipation', wireKey: 'nonpart', optional: true, codec: booleanCodec },\n ],\n}\n\nconst AssetParamsMeta: ObjectModelMetadata<Omit<AssetConfigTransactionFields, 'assetId'>> = {\n name: 'AssetParams',\n kind: 'object',\n fields: [\n { name: 'total', wireKey: 't', optional: true, codec: bigIntCodec },\n { name: 'decimals', wireKey: 'dc', optional: true, codec: numberCodec },\n { name: 'defaultFrozen', wireKey: 'df', optional: true, codec: booleanCodec },\n { name: 'unitName', wireKey: 'un', optional: true, codec: stringCodec },\n { name: 'assetName', wireKey: 'an', optional: true, codec: stringCodec },\n { name: 'url', wireKey: 'au', optional: true, codec: stringCodec },\n { name: 'metadataHash', wireKey: 'am', optional: true, codec: fixedBytes32Codec },\n { name: 'manager', wireKey: 'm', optional: true, codec: addressCodec },\n { name: 'reserve', wireKey: 'r', optional: true, codec: addressCodec },\n { name: 'freeze', wireKey: 'f', optional: true, codec: addressCodec },\n { name: 'clawback', wireKey: 'c', optional: true, codec: addressCodec },\n ],\n}\n\nconst StateSchemaMeta: ObjectModelMetadata<StateSchema> = {\n name: 'StateSchema',\n kind: 'object',\n fields: [\n { name: 'numUints', wireKey: 'nui', optional: false, codec: numberCodec },\n { name: 'numByteSlices', wireKey: 'nbs', optional: false, codec: numberCodec },\n ],\n}\n\nconst AppCallTransactionFieldsMeta: ObjectModelMetadata<AppCallTransactionFields> = {\n name: 'AppCallTransactionFields',\n kind: 'object',\n fields: [\n { name: 'appId', wireKey: 'apid', optional: false, codec: bigIntCodec },\n { name: 'onComplete', wireKey: 'apan', optional: false, codec: numberCodec },\n { name: 'approvalProgram', wireKey: 'apap', optional: true, codec: bytesCodec },\n { name: 'clearStateProgram', wireKey: 'apsu', optional: true, codec: bytesCodec },\n {\n name: 'globalStateSchema',\n wireKey: 'apgs',\n optional: true,\n codec: new ObjectModelCodec(StateSchemaMeta),\n },\n {\n name: 'localStateSchema',\n wireKey: 'apls',\n optional: true,\n codec: new ObjectModelCodec(StateSchemaMeta),\n },\n { name: 'extraProgramPages', wireKey: 'apep', optional: true, codec: numberCodec },\n { name: 'args', wireKey: 'apaa', optional: true, codec: bytesArrayCodec },\n { name: 'accountReferences', wireKey: 'apat', optional: true, codec: addressArrayCodec },\n { name: 'appReferences', wireKey: 'apfa', optional: true, codec: bigIntArrayCodec },\n { name: 'assetReferences', wireKey: 'apas', optional: true, codec: bigIntArrayCodec },\n { name: 'rejectVersion', wireKey: 'aprv', optional: true, codec: numberCodec },\n // boxReferences and accessReferences are handled by the parent codec, as they require more complex mappings\n ],\n}\n\nconst HashFactoryMeta: ObjectModelMetadata<HashFactory> = {\n name: 'HashFactory',\n kind: 'object',\n fields: [{ name: 'hashType', wireKey: 't', optional: false, codec: numberCodec }],\n}\n\nconst MerkleArrayProofMeta: ObjectModelMetadata<MerkleArrayProof> = {\n name: 'MerkleArrayProof',\n kind: 'object',\n fields: [\n { name: 'path', wireKey: 'pth', optional: false, codec: bytesArrayCodec },\n { name: 'hashFactory', wireKey: 'hsh', optional: false, codec: new ObjectModelCodec(HashFactoryMeta) },\n { name: 'treeDepth', wireKey: 'td', optional: false, codec: numberCodec },\n ],\n}\n\nconst FalconVerifierMeta: ObjectModelMetadata<FalconVerifier> = {\n name: 'FalconVerifier',\n kind: 'object',\n fields: [{ name: 'publicKey', wireKey: 'k', optional: false, codec: fixedBytes1793Codec }],\n}\n\nconst FalconSignatureStructMeta: ObjectModelMetadata<FalconSignatureStruct> = {\n name: 'FalconSignatureStruct',\n kind: 'object',\n fields: [\n { name: 'signature', wireKey: 'sig', optional: false, codec: bytesCodec },\n { name: 'vectorCommitmentIndex', wireKey: 'idx', optional: false, codec: bigIntCodec },\n { name: 'proof', wireKey: 'prf', optional: false, codec: new ObjectModelCodec(MerkleArrayProofMeta) },\n { name: 'verifyingKey', wireKey: 'vkey', optional: false, codec: new ObjectModelCodec(FalconVerifierMeta) },\n ],\n}\n\nconst SigslotCommitMeta: ObjectModelMetadata<SigslotCommit> = {\n name: 'SigslotCommit',\n kind: 'object',\n fields: [\n { name: 'sig', wireKey: 's', optional: false, codec: new ObjectModelCodec(FalconSignatureStructMeta) },\n { name: 'lowerSigWeight', wireKey: 'l', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst MerkleSignatureVerifierMeta: ObjectModelMetadata<MerkleSignatureVerifier> = {\n name: 'MerkleSignatureVerifier',\n kind: 'object',\n fields: [\n { name: 'commitment', wireKey: 'cmt', optional: false, codec: fixedBytes64Codec },\n { name: 'keyLifetime', wireKey: 'lf', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst ParticipantMeta: ObjectModelMetadata<Participant> = {\n name: 'Participant',\n kind: 'object',\n fields: [\n { name: 'verifier', wireKey: 'p', optional: false, codec: new ObjectModelCodec(MerkleSignatureVerifierMeta) },\n { name: 'weight', wireKey: 'w', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst RevealMeta: ObjectModelMetadata<Reveal> = {\n name: 'Reveal',\n kind: 'object',\n fields: [\n { name: 'sigslot', wireKey: 's', optional: false, codec: new ObjectModelCodec(SigslotCommitMeta) },\n { name: 'participant', wireKey: 'p', optional: false, codec: new ObjectModelCodec(ParticipantMeta) },\n ],\n}\n\nconst StateProofMeta: ObjectModelMetadata<StateProof> = {\n name: 'StateProof',\n kind: 'object',\n fields: [\n { name: 'sigCommit', wireKey: 'c', optional: false, codec: bytesCodec },\n { name: 'signedWeight', wireKey: 'w', optional: false, codec: bigIntCodec },\n { name: 'sigProofs', wireKey: 'S', optional: false, codec: new ObjectModelCodec(MerkleArrayProofMeta) },\n { name: 'partProofs', wireKey: 'P', optional: false, codec: new ObjectModelCodec(MerkleArrayProofMeta) },\n { name: 'merkleSignatureSaltVersion', wireKey: 'v', optional: false, codec: numberCodec },\n {\n name: 'reveals',\n wireKey: 'r',\n optional: false,\n codec: new MapCodec(bigIntCodec, new ObjectModelCodec(RevealMeta)),\n },\n { name: 'positionsToReveal', wireKey: 'pr', optional: false, codec: bigIntArrayCodec },\n ],\n}\n\nconst StateProofMessageMeta: ObjectModelMetadata<StateProofMessage> = {\n name: 'StateProofMessage',\n kind: 'object',\n fields: [\n { name: 'blockHeadersCommitment', wireKey: 'b', optional: false, codec: bytesCodec },\n { name: 'votersCommitment', wireKey: 'v', optional: false, codec: bytesCodec },\n { name: 'lnProvenWeight', wireKey: 'P', optional: false, codec: bigIntCodec },\n { name: 'firstAttestedRound', wireKey: 'f', optional: false, codec: bigIntCodec },\n { name: 'lastAttestedRound', wireKey: 'l', optional: false, codec: bigIntCodec },\n ],\n}\n\nconst StateProofTransactionFieldsMeta: ObjectModelMetadata<StateProofTransactionFields> = {\n name: 'StateProofTransactionFields',\n kind: 'object',\n fields: [\n { name: 'stateProofType', wireKey: 'sptype', optional: false, codec: numberCodec },\n { name: 'stateProof', wireKey: 'sp', optional: true, codec: new ObjectModelCodec(StateProofMeta) },\n { name: 'message', wireKey: 'spmsg', optional: true, codec: new ObjectModelCodec(StateProofMessageMeta) },\n ],\n}\n\nconst HeartbeatProofMeta: ObjectModelMetadata<HeartbeatProof> = {\n name: 'HeartbeatProof',\n kind: 'object',\n fields: [\n { name: 'sig', wireKey: 's', optional: false, codec: fixedBytes64Codec },\n { name: 'pk', wireKey: 'p', optional: false, codec: fixedBytes32Codec },\n { name: 'pk2', wireKey: 'p2', optional: false, codec: fixedBytes32Codec },\n { name: 'pk1Sig', wireKey: 'p1s', optional: false, codec: fixedBytes64Codec },\n { name: 'pk2Sig', wireKey: 'p2s', optional: false, codec: fixedBytes64Codec },\n ],\n}\n\nconst HeartbeatTransactionFieldsMeta: ObjectModelMetadata<HeartbeatTransactionFields> = {\n name: 'HeartbeatTransactionFields',\n kind: 'object',\n fields: [\n { name: 'address', wireKey: 'a', optional: false, codec: addressCodec },\n { name: 'proof', wireKey: 'prf', optional: false, codec: new ObjectModelCodec(HeartbeatProofMeta) },\n { name: 'seed', wireKey: 'sd', optional: false, codec: bytesCodec },\n { name: 'voteId', wireKey: 'vid', optional: false, codec: fixedBytes32Codec },\n { name: 'keyDilution', wireKey: 'kd', optional: false, codec: bigIntCodec },\n ],\n}\n\n/**\n * Metadata for TransactionParams\n */\nexport const TransactionParamsMeta: ObjectModelMetadata<TransactionParams> = {\n name: 'TransactionParams',\n kind: 'object',\n fields: [\n // Common transaction fields\n { name: 'type', wireKey: 'type', optional: false, codec: new TransactionTypeCodec() },\n { name: 'sender', wireKey: 'snd', optional: false, codec: addressCodec },\n { name: 'fee', wireKey: 'fee', optional: true, codec: bigIntCodec },\n { name: 'firstValid', wireKey: 'fv', optional: false, codec: bigIntCodec },\n { name: 'lastValid', wireKey: 'lv', optional: false, codec: bigIntCodec },\n { name: 'genesisHash', wireKey: 'gh', optional: true, codec: fixedBytes32Codec },\n { name: 'genesisId', wireKey: 'gen', optional: true, codec: stringCodec },\n { name: 'note', wireKey: 'note', optional: true, codec: bytesCodec },\n { name: 'rekeyTo', wireKey: 'rekey', optional: true, codec: addressCodec },\n { name: 'lease', wireKey: 'lx', optional: true, codec: fixedBytes32Codec },\n { name: 'group', wireKey: 'grp', optional: true, codec: fixedBytes32Codec },\n // Transaction type-specific fields (flattened)\n {\n name: 'payment',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.Payment, PaymentTransactionFieldsMeta),\n },\n {\n name: 'assetTransfer',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.AssetTransfer, AssetTransferTransactionFieldsMeta),\n },\n {\n name: 'assetFreeze',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.AssetFreeze, AssetFreezeTransactionFieldsMeta),\n },\n {\n name: 'keyRegistration',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.KeyRegistration, KeyRegistrationTransactionFieldsMeta),\n },\n {\n name: 'assetConfig',\n flattened: true,\n optional: true,\n codec: new AssetConfigDataCodec(),\n },\n {\n name: 'heartbeat',\n wireKey: 'hb',\n optional: true,\n // Heartbeat is not flattened and therefore does not need the type check for conditional decoding\n codec: new ObjectModelCodec(HeartbeatTransactionFieldsMeta),\n },\n {\n name: 'appCall',\n flattened: true,\n optional: true,\n codec: new AppCallDataCodec(),\n },\n {\n name: 'stateProof',\n flattened: true,\n optional: true,\n codec: new TransactionDataCodec(TransactionType.StateProof, StateProofTransactionFieldsMeta),\n },\n ],\n}\n\nexport const transactionParamsCodec = new ObjectModelCodec<TransactionParams>(TransactionParamsMeta)\n"],"mappings":";;;;;;;;;;;;;;;;AAiFA,IAAM,uBAAN,cAAmC,MAA2C;CAC5E,AAAO,eAAgC;AAErC,SAAO,gBAAgB;;CAGzB,AAAU,UAAU,OAAwB,SAAiC;AAC3E,UAAQ,OAAR;GACE,KAAK,gBAAgB,QACnB,QAAO;GACT,KAAK,gBAAgB,cACnB,QAAO;GACT,KAAK,gBAAgB,YACnB,QAAO;GACT,KAAK,gBAAgB,YACnB,QAAO;GACT,KAAK,gBAAgB,gBACnB,QAAO;GACT,KAAK,gBAAgB,QACnB,QAAO;GACT,KAAK,gBAAgB,WACnB,QAAO;GACT,KAAK,gBAAgB,UACnB,QAAO;GACT,QACE,QAAO;;;CAIb,AAAU,YAAY,OAAmB,SAA0C;AAIjF,UAFmB,oBAAoB,MAAM,EAE7C;GACE,KAAK,MACH,QAAO,gBAAgB;GACzB,KAAK,QACH,QAAO,gBAAgB;GACzB,KAAK,OACH,QAAO,gBAAgB;GACzB,KAAK,OACH,QAAO,gBAAgB;GACzB,KAAK,SACH,QAAO,gBAAgB;GACzB,KAAK,OACH,QAAO,gBAAgB;GACzB,KAAK,OACH,QAAO,gBAAgB;GACzB,KAAK,KACH,QAAO,gBAAgB;GACzB,QACE,QAAO,gBAAgB;;;;AAK/B,IAAM,uBAAN,cAOU,MAA8C;CACtD,AAAQ;CAER,YACE,AAAiBA,iBACjB,6BACA;AACA,SAAO;EAHU;AAIjB,OAAK,uBAAuB,IAAI,iBAAoB,4BAA4B;;CAGlF,AAAO,eAA8B;CAIrC,AAAU,UAAU,OAAsB,QAAiD;AACzF,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,8BAA8B;AAEhD,SAAO,KAAK,qBAAqB,OAAO,OAAO,OAAO;;CAGxD,AAAU,YAAY,OAAgC,QAAuC;AAC3F,MAAI,MAAM,SAAS,OACjB,OAAM,IAAI,MAAM,oCAAoC;AAGtD,MADa,oBAAoB,MAAM,KAAmB,KAC7C,KAAK,gBAAgB,UAAU,CAC1C,QAAO,KAAK,qBAAqB,OAAO,OAAO,OAAO;;;AAO5D,IAAM,uBAAN,cAAmC,MAAyE;CAC1G,AAAQ,mBAAmB,IAAI,iBAAgE,gBAAgB;CAE/G,AAAO,eAAyD;CAIhE,AAAU,UAAU,OAAiD,QAAiD;EACpH,MAAMC,SAAkC,EAAE;AAE1C,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,qCAAqC;EAGvD,MAAM,EAAE,SAAS,GAAG,gBAAgB;EAEpC,MAAM,iBAAiB,YAAY,eAAe,SAAS,OAAO;AAClE,MAAI,mBAAmB,OACrB,QAAO,OAAO;EAGhB,MAAM,gBAAgB,KAAK,iBAAiB,eAAe,aAAa,OAAO;AAC/E,MAAI,iBAAiB,OAAO,KAAK,cAAc,CAAC,SAAS,EACvD,QAAO,OAAO;AAGhB,SAAO;;CAGT,AAAU,YAAY,OAAgC,QAAkE;AACtH,MAAI,MAAM,SAAS,OACjB,OAAM,IAAI,MAAM,oCAAoC;EAEtD,MAAM,OAAO,oBAAoB,MAAM,KAAmB;EAC1D,MAAM,OAAO,MAAM;EACnB,MAAM,OAAO,MAAM;AAEnB,MAAI,SAAS,gBAAgB,eAAgB,SAAS,UAAa,CAAC,KAClE;AAGF,SAAO;GACL,SAAS,YAAY,OAAO,MAAM,OAAO;GACzC,GAAG,KAAK,iBAAiB,OAAO,MAAM,OAAO;GAC9C;;CAGH,AAAO,eAAe,OAA0D;AAC9E,SAAO,UAAU;;;AAIrB,IAAM,mBAAN,cAA+B,MAAqE;CAClG,AAAQ,qBAAqB,IAAI,iBAC/B,6BACD;CAED,AAAO,eAAqD;CAI5D,AAAQ,yBACN,OACA,oBACA,QACqC;AACrC,MAAI,CAAC,sBAAsB,mBAAmB,WAAW,EAAG,QAAO;EAEnE,MAAMC,aAAsC,EAAE;EAG9C,MAAM,UAAU,WAA6E;AAE3F,QAAK,IAAI,MAAM,GAAG,MAAM,WAAW,QAAQ,OAAO;IAChD,MAAM,QAAQ,WAAW;IACzB,MAAM,iBACH,CAAC,MAAM,KAAK,CAAC,OAAO,WAAa,MAAM,KAAK,OAAO,WAAW,aAAa,OAAO,MAAM,GAAG,OAAO,CAAC,OAAO,OAAO,QAAQ;IAC5H,MAAM,iBACH,MAAM,MAAM,UAAa,OAAO,YAAY,UAC5C,MAAM,MAAM,UAAa,OAAO,YAAY,UAAa,YAAY,OAAO,MAAM,GAAG,OAAO,KAAK,OAAO;IAC3G,MAAM,eACH,MAAM,MAAM,UAAa,OAAO,UAAU,UAC1C,MAAM,MAAM,UAAa,OAAO,UAAU,UAAa,YAAY,OAAO,MAAM,GAAG,OAAO,KAAK,OAAO;AAEzG,QAAI,kBAAkB,kBAAkB,aACtC,QAAO,MAAM;;AAKjB,OAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ,aAAa,CAAC,CACjE,YAAW,KAAK,EAAE,GAAG,aAAa,eAAe,OAAO,SAAS,OAAO,EAAG,CAAC;AAE9E,OAAI,OAAO,YAAY,OACrB,YAAW,KAAK,EAAE,GAAG,YAAY,eAAe,OAAO,SAAS,OAAO,EAAG,CAAC;AAE7E,OAAI,OAAO,UAAU,OACnB,YAAW,KAAK,EAAE,GAAG,YAAY,eAAe,OAAO,OAAO,OAAO,EAAG,CAAC;AAG3E,UAAO,WAAW;;AAIpB,OAAK,MAAM,eAAe,oBAAoB;AAE5C,OAAI,YAAY,WAAW,YAAY,YAAY,UAAa,YAAY,UAAU,QAAW;AAC/F,WAAO,YAAY;AACnB;;AAIF,OAAI,YAAY,SAAS;IACvB,MAAM,UAAU,YAAY;IAC5B,IAAI,eAAe;AACnB,QAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,OAAO,QAAQ,aAAa,CAAC,CACnE,gBAAe,OAAO,EAAE,SAAS,QAAQ,SAAS,CAAC;IAErD,MAAM,aAAa,OAAO,EAAE,SAAS,QAAQ,SAAS,CAAC;AACvD,eAAW,KAAK,EACd,GAAG;KACD,GAAG,YAAY,eAAe,cAAc,OAAO;KACnD,GAAG,YAAY,eAAe,YAAY,OAAO;KAClD,EACF,CAAC;AACF;;AAIF,OAAI,YAAY,QAAQ;IACtB,MAAM,SAAS,YAAY;IAC3B,IAAI,eAAe;AACnB,QAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ,aAAa,CAAC,CACjE,gBAAe,OAAO,EAAE,SAAS,OAAO,SAAS,CAAC;IAGpD,IAAI,WAAW;AACf,QAAI,OAAO,SAAS,OAAO,UAAU,MACnC,YAAW,OAAO,EAAE,OAAO,OAAO,OAAO,CAAC;AAE5C,QAAI,iBAAiB,KAAK,aAAa,EACrC,YAAW,KAAK,EACd,GAAG;KACD,GAAG,YAAY,eAAe,cAAc,OAAO;KACnD,GAAG,YAAY,eAAe,UAAU,OAAO;KAChD,EACF,CAAC;AAEJ;;AAIF,OAAI,YAAY,KAAK;IACnB,MAAM,MAAM,YAAY;IAGxB,IAAI,WAAW;AACf,QAAI,IAAI,SAAS,IAAI,UAAU,MAC7B,YAAW,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC;AAEzC,eAAW,KAAK,EACd,GAAG;KACD,GAAG,YAAY,eAAe,UAAU,OAAO;KAC/C,GAAG,WAAW,eAAe,IAAI,MAAM,OAAO;KAC/C,EACF,CAAC;AACF;;;AAIJ,SAAO,WAAW,SAAS,IAAI,aAAa;;CAG9C,AAAQ,yBACN,yBACA,QACqB;AACrB,MAAI,CAAC,2BAA2B,wBAAwB,WAAW,EAAG,QAAO,EAAE;EAE/E,MAAMC,SAA8B,EAAE;EAItC,MAAM,yBAAyB,wBAAwB,KAAK,QAAQ,oBAAoB,IAAI,CAAC;AAC7F,OAAK,MAAM,OAAO,wBAAwB;GACxC,MAAM,IAAI,IAAI;GACd,MAAM,IAAI,IAAI;GACd,MAAM,IAAI,IAAI;GACd,MAAM,KAAK,IAAI;GACf,MAAM,IAAI,KAAK,oBAAoB,GAAG,GAAG;GACzC,MAAM,KAAK,IAAI;GACf,MAAM,IAAI,KAAK,oBAAoB,GAAG,GAAG;GACzC,MAAM,KAAK,IAAI;GACf,MAAM,IAAI,KAAK,oBAAoB,GAAG,GAAG;AAGzC,OAAI,GAAG;AACL,WAAO,KAAK,EAAE,SAAS,aAAa,OAAO,GAAG,OAAO,EAAE,CAAC;AACxD;;AAIF,OAAI,MAAM,QAAW;AACnB,WAAO,KAAK,EAAE,SAAS,YAAY,OAAO,GAAG,OAAO,EAAE,CAAC;AACvD;;AAIF,OAAI,MAAM,QAAW;AACnB,WAAO,KAAK,EAAE,OAAO,YAAY,OAAO,GAAG,OAAO,EAAE,CAAC;AACrD;;AAIF,OAAI,GAAG;IACL,MAAM,UAAW,EAAE,KAAK;IACxB,MAAM,WAAW,EAAE;AAEnB,QAAI,aAAa,OACf,OAAM,IAAI,MAAM,uDAAuD;IAGzE,MAAM,iBACJ,YAAY,IAAI,QAAQ,aAAa,GAAG,aAAa,OAAO,uBAAuB,UAAU,GAAG,GAAkB,OAAO;IAC3H,MAAM,iBAAiB,uBAAuB,WAAW,GAAG;AAE5D,WAAO,KAAK,EACV,SAAS;KACP,SAAS,YAAY,OAAO,gBAAgB,OAAO;KACnD,SAAS;KACV,EACF,CAAC;AACF;;AAIF,OAAI,GAAG;IACL,MAAM,UAAW,EAAE,KAAK;IACxB,MAAM,SAAU,EAAE,KAAK;IAEvB,MAAM,gBACJ,YAAY,IAAI,QAAQ,aAAa,GAAG,aAAa,OAAO,uBAAuB,UAAU,GAAG,GAAkB,OAAO;IAC3H,MAAM,cAAc,WAAW,IAAI,KAAM,uBAAuB,SAAS,GAAG;AAE5E,WAAO,KAAK,EACV,QAAQ;KACN,OAAO,YAAY,OAAO,aAAa,OAAO;KAC9C,SAAS;KACV,EACF,CAAC;AACF;;AAIF,OAAI,GAAG;IACL,MAAM,YAAa,EAAE,KAAK;IAC1B,MAAM,OAAO,EAAE;AAEf,QAAI,CAAC,KACH,OAAM,IAAI,MAAM,4CAA4C;IAG9D,MAAM,WAAW,cAAc,IAAI,KAAM,uBAAuB,YAAY,GAAG;AAE/E,WAAO,KAAK,EACV,KAAK;KACH,OAAO,YAAY,OAAO,UAAU,OAAO;KAC3C,MAAM,WAAW,OAAO,MAAM,OAAO;KACtC,EACF,CAAC;AACF;;;AAIJ,SAAO;;CAGT,AAAQ,oBACN,OACA,eACA,eACA,QACgC;AAChC,MAAI,CAAC,iBAAiB,cAAc,WAAW,EAAG,QAAO;EAEzD,MAAM,UAAU,iBAAiB,EAAE;AAEnC,SAAO,cAAc,KAAK,QAAQ;GAChC,MAAM,eAAe,IAAI,UAAU,MAAM,IAAI,UAAU;GAEvD,MAAM,QAAQ,eAAe,IAAI,QAAQ,QAAQ,IAAI,MAAM,GAAG;AAE9D,OAAI,UAAU,KAAK,CAAC,aAClB,OAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,uBAAuB;AAGzE,UAAO;IACL,GAAG,YAAY,eAAe,OAAO,OAAO;IAC5C,GAAG,WAAW,eAAe,IAAI,MAAM,OAAO;IAC/C;IACD;;CAGJ,AAAQ,oBACN,eACA,mBACA,QACgB;AAChB,MAAI,CAAC,qBAAqB,kBAAkB,WAAW,EAAG,QAAO,EAAE;AAEnE,SAAO,kBAAkB,KAAK,SAAS;GACrC,MAAM,MAAM,oBAAoB,KAAK;GACrC,MAAM,WAAW,IAAI;GACrB,MAAM,UAAU,IAAI;GAEpB,MAAM,QAAQ,YAAY;GAE1B,IAAIC;AACJ,OAAI,UAAU,EAEZ,SAAQ;QACH;IAEL,MAAM,eAAe,gBAAgB,QAAQ;AAC7C,QAAI,iBAAiB,OACnB,OAAM,IAAI,MAAM,6CAA6C,QAAQ,IAAI;AAE3E,YAAQ,YAAY,OAAO,cAAc,OAAO;;AAGlD,UAAO;IACL;IACA,MAAM,WAAW,OAAO,SAAS,OAAO;IACzC;IACD;;CAGJ,AAAU,UAAU,OAA6C,QAAiD;EAChH,MAAMH,SAAkC,EAAE;AAE1C,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,iCAAiC;EAGnD,MAAM,gBAAgB,KAAK,mBAAmB,eAAe,OAAO,OAAO;AAC3E,MAAI,iBAAiB,OAAO,KAAK,cAAc,CAAC,SAAS,EACvD,QAAO,OAAO,QAAQ,cAAc;EAGtC,MAAM,oBAAoB,KAAK,oBAAoB,MAAM,OAAO,MAAM,eAAe,MAAM,eAAe,OAAO;AACjH,MAAI,kBACF,QAAO,OAAO;EAGhB,MAAM,uBAAuB,KAAK,yBAAyB,MAAM,OAAO,MAAM,kBAAkB,OAAO;AACvG,MAAI,qBACF,QAAO,KAAK;AAGd,SAAO;;CAGT,AAAU,YAAY,OAAgC,QAA8D;AAClH,MAAI,MAAM,SAAS,OACjB,OAAM,IAAI,MAAM,oCAAoC;AAGtD,MADa,oBAAoB,MAAM,KAAmB,KAC7C,gBAAgB,QAC3B;EAGF,MAAM,gBAAgB,MAAM;EAC5B,MAAM,oBAAoB,MAAM;EAChC,MAAM,uBAAuB,MAAM;EACnC,MAAM,gBAAgB,KAAK,oBACzB,eAAe,KAAK,OAAO,YAAY,OAAO,IAAI,OAAO,CAAC,EAC1D,mBACA,OACD;EACD,MAAM,mBAAmB,KAAK,yBAAyB,sBAAsB,OAAO;AAEpF,SAAO;GACL,GAAG,KAAK,mBAAmB,OAAO,OAAO,OAAO;GAChD,GAAI,iBAAiB,SAAS,KAAK,EAAE,kBAAkB;GACvD,GAAI,cAAc,SAAS,KAAK,EAAE,eAAe;GAClD;;CAGH,AAAO,eAAe,OAAsD;AAC1E,SAAO,UAAU;;;AAIrB,MAAMI,+BAA8E;CAClF,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAU,SAAS;GAAO,UAAU;GAAO,OAAO;GAAa;EACvE;GAAE,MAAM;GAAY,SAAS;GAAO,UAAU;GAAO,OAAO;GAAc;EAC1E;GAAE,MAAM;GAAoB,SAAS;GAAS,UAAU;GAAM,OAAO;GAAc;EACpF;CACF;AAED,MAAMC,qCAA0F;CAC9F,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAW,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAa;EACzE;GAAE,MAAM;GAAU,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAa;EACxE;GAAE,MAAM;GAAY,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAc;EAC3E;GAAE,MAAM;GAAe,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAc;EAC7E;GAAE,MAAM;GAAoB,SAAS;GAAU,UAAU;GAAM,OAAO;GAAc;EACrF;CACF;AAED,MAAMC,mCAAsF;CAC1F,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAW,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAa;EACzE;GAAE,MAAM;GAAgB,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAc;EAC/E;GAAE,MAAM;GAAU,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAc;EAC1E;CACF;AAED,MAAMC,uCAA8F;CAClG,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAW,SAAS;GAAW,UAAU;GAAM,OAAO;GAAmB;EACjF;GAAE,MAAM;GAAgB,SAAS;GAAU,UAAU;GAAM,OAAO;GAAmB;EACrF;GAAE,MAAM;GAAiB,SAAS;GAAW,UAAU;GAAM,OAAO;GAAmB;EACvF;GAAE,MAAM;GAAa,SAAS;GAAW,UAAU;GAAM,OAAO;GAAa;EAC7E;GAAE,MAAM;GAAY,SAAS;GAAW,UAAU;GAAM,OAAO;GAAa;EAC5E;GAAE,MAAM;GAAmB,SAAS;GAAU,UAAU;GAAM,OAAO;GAAa;EAClF;GAAE,MAAM;GAAoB,SAAS;GAAW,UAAU;GAAM,OAAO;GAAc;EACtF;CACF;AAED,MAAMC,kBAAsF;CAC1F,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAS,SAAS;GAAK,UAAU;GAAM,OAAO;GAAa;EACnE;GAAE,MAAM;GAAY,SAAS;GAAM,UAAU;GAAM,OAAO;GAAa;EACvE;GAAE,MAAM;GAAiB,SAAS;GAAM,UAAU;GAAM,OAAO;GAAc;EAC7E;GAAE,MAAM;GAAY,SAAS;GAAM,UAAU;GAAM,OAAO;GAAa;EACvE;GAAE,MAAM;GAAa,SAAS;GAAM,UAAU;GAAM,OAAO;GAAa;EACxE;GAAE,MAAM;GAAO,SAAS;GAAM,UAAU;GAAM,OAAO;GAAa;EAClE;GAAE,MAAM;GAAgB,SAAS;GAAM,UAAU;GAAM,OAAO;GAAmB;EACjF;GAAE,MAAM;GAAW,SAAS;GAAK,UAAU;GAAM,OAAO;GAAc;EACtE;GAAE,MAAM;GAAW,SAAS;GAAK,UAAU;GAAM,OAAO;GAAc;EACtE;GAAE,MAAM;GAAU,SAAS;GAAK,UAAU;GAAM,OAAO;GAAc;EACrE;GAAE,MAAM;GAAY,SAAS;GAAK,UAAU;GAAM,OAAO;GAAc;EACxE;CACF;AAED,MAAMC,kBAAoD;CACxD,MAAM;CACN,MAAM;CACN,QAAQ,CACN;EAAE,MAAM;EAAY,SAAS;EAAO,UAAU;EAAO,OAAO;EAAa,EACzE;EAAE,MAAM;EAAiB,SAAS;EAAO,UAAU;EAAO,OAAO;EAAa,CAC/E;CACF;AAED,MAAMC,+BAA8E;CAClF,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAS,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAa;EACvE;GAAE,MAAM;GAAc,SAAS;GAAQ,UAAU;GAAO,OAAO;GAAa;EAC5E;GAAE,MAAM;GAAmB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAY;EAC/E;GAAE,MAAM;GAAqB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAY;EACjF;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,iBAAiB,gBAAgB;GAC7C;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,iBAAiB,gBAAgB;GAC7C;EACD;GAAE,MAAM;GAAqB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAa;EAClF;GAAE,MAAM;GAAQ,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAiB;EACzE;GAAE,MAAM;GAAqB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAmB;EACxF;GAAE,MAAM;GAAiB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAkB;EACnF;GAAE,MAAM;GAAmB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAkB;EACrF;GAAE,MAAM;GAAiB,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAa;EAE/E;CACF;AAQD,MAAMC,uBAA8D;CAClE,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAQ,SAAS;GAAO,UAAU;GAAO,OAAO;GAAiB;EACzE;GAAE,MAAM;GAAe,SAAS;GAAO,UAAU;GAAO,OAAO,IAAI,iBAXb;IACxD,MAAM;IACN,MAAM;IACN,QAAQ,CAAC;KAAE,MAAM;KAAY,SAAS;KAAK,UAAU;KAAO,OAAO;KAAa,CAAC;IAClF,CAOuG;GAAE;EACtG;GAAE,MAAM;GAAa,SAAS;GAAM,UAAU;GAAO,OAAO;GAAa;EAC1E;CACF;AAED,MAAMC,qBAA0D;CAC9D,MAAM;CACN,MAAM;CACN,QAAQ,CAAC;EAAE,MAAM;EAAa,SAAS;EAAK,UAAU;EAAO,OAAO;EAAqB,CAAC;CAC3F;AAaD,MAAMC,oBAAwD;CAC5D,MAAM;CACN,MAAM;CACN,QAAQ,CACN;EAAE,MAAM;EAAO,SAAS;EAAK,UAAU;EAAO,OAAO,IAAI,iBAfiB;GAC5E,MAAM;GACN,MAAM;GACN,QAAQ;IACN;KAAE,MAAM;KAAa,SAAS;KAAO,UAAU;KAAO,OAAO;KAAY;IACzE;KAAE,MAAM;KAAyB,SAAS;KAAO,UAAU;KAAO,OAAO;KAAa;IACtF;KAAE,MAAM;KAAS,SAAS;KAAO,UAAU;KAAO,OAAO,IAAI,iBAAiB,qBAAqB;KAAE;IACrG;KAAE,MAAM;KAAgB,SAAS;KAAQ,UAAU;KAAO,OAAO,IAAI,iBAAiB,mBAAmB;KAAE;IAC5G;GACF,CAMuG;EAAE,EACtG;EAAE,MAAM;EAAkB,SAAS;EAAK,UAAU;EAAO,OAAO;EAAa,CAC9E;CACF;AAWD,MAAMC,kBAAoD;CACxD,MAAM;CACN,MAAM;CACN,QAAQ,CACN;EAAE,MAAM;EAAY,SAAS;EAAK,UAAU;EAAO,OAAO,IAAI,iBAbgB;GAChF,MAAM;GACN,MAAM;GACN,QAAQ,CACN;IAAE,MAAM;IAAc,SAAS;IAAO,UAAU;IAAO,OAAO;IAAmB,EACjF;IAAE,MAAM;IAAe,SAAS;IAAM,UAAU;IAAO,OAAO;IAAa,CAC5E;GACF,CAM8G;EAAE,EAC7G;EAAE,MAAM;EAAU,SAAS;EAAK,UAAU;EAAO,OAAO;EAAa,CACtE;CACF;AAED,MAAMC,aAA0C;CAC9C,MAAM;CACN,MAAM;CACN,QAAQ,CACN;EAAE,MAAM;EAAW,SAAS;EAAK,UAAU;EAAO,OAAO,IAAI,iBAAiB,kBAAkB;EAAE,EAClG;EAAE,MAAM;EAAe,SAAS;EAAK,UAAU;EAAO,OAAO,IAAI,iBAAiB,gBAAgB;EAAE,CACrG;CACF;AAED,MAAMC,iBAAkD;CACtD,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAa,SAAS;GAAK,UAAU;GAAO,OAAO;GAAY;EACvE;GAAE,MAAM;GAAgB,SAAS;GAAK,UAAU;GAAO,OAAO;GAAa;EAC3E;GAAE,MAAM;GAAa,SAAS;GAAK,UAAU;GAAO,OAAO,IAAI,iBAAiB,qBAAqB;GAAE;EACvG;GAAE,MAAM;GAAc,SAAS;GAAK,UAAU;GAAO,OAAO,IAAI,iBAAiB,qBAAqB;GAAE;EACxG;GAAE,MAAM;GAA8B,SAAS;GAAK,UAAU;GAAO,OAAO;GAAa;EACzF;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,SAAS,aAAa,IAAI,iBAAiB,WAAW,CAAC;GACnE;EACD;GAAE,MAAM;GAAqB,SAAS;GAAM,UAAU;GAAO,OAAO;GAAkB;EACvF;CACF;AAED,MAAMC,wBAAgE;CACpE,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAA0B,SAAS;GAAK,UAAU;GAAO,OAAO;GAAY;EACpF;GAAE,MAAM;GAAoB,SAAS;GAAK,UAAU;GAAO,OAAO;GAAY;EAC9E;GAAE,MAAM;GAAkB,SAAS;GAAK,UAAU;GAAO,OAAO;GAAa;EAC7E;GAAE,MAAM;GAAsB,SAAS;GAAK,UAAU;GAAO,OAAO;GAAa;EACjF;GAAE,MAAM;GAAqB,SAAS;GAAK,UAAU;GAAO,OAAO;GAAa;EACjF;CACF;AAED,MAAMC,kCAAoF;CACxF,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAkB,SAAS;GAAU,UAAU;GAAO,OAAO;GAAa;EAClF;GAAE,MAAM;GAAc,SAAS;GAAM,UAAU;GAAM,OAAO,IAAI,iBAAiB,eAAe;GAAE;EAClG;GAAE,MAAM;GAAW,SAAS;GAAS,UAAU;GAAM,OAAO,IAAI,iBAAiB,sBAAsB;GAAE;EAC1G;CACF;AAcD,MAAMC,iCAAkF;CACtF,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAW,SAAS;GAAK,UAAU;GAAO,OAAO;GAAc;EACvE;GAAE,MAAM;GAAS,SAAS;GAAO,UAAU;GAAO,OAAO,IAAI,iBAjBD;IAC9D,MAAM;IACN,MAAM;IACN,QAAQ;KACN;MAAE,MAAM;MAAO,SAAS;MAAK,UAAU;MAAO,OAAO;MAAmB;KACxE;MAAE,MAAM;MAAM,SAAS;MAAK,UAAU;MAAO,OAAO;MAAmB;KACvE;MAAE,MAAM;MAAO,SAAS;MAAM,UAAU;MAAO,OAAO;MAAmB;KACzE;MAAE,MAAM;MAAU,SAAS;MAAO,UAAU;MAAO,OAAO;MAAmB;KAC7E;MAAE,MAAM;MAAU,SAAS;MAAO,UAAU;MAAO,OAAO;MAAmB;KAC9E;IACF,CAOoG;GAAE;EACnG;GAAE,MAAM;GAAQ,SAAS;GAAM,UAAU;GAAO,OAAO;GAAY;EACnE;GAAE,MAAM;GAAU,SAAS;GAAO,UAAU;GAAO,OAAO;GAAmB;EAC7E;GAAE,MAAM;GAAe,SAAS;GAAM,UAAU;GAAO,OAAO;GAAa;EAC5E;CACF;;;;AAKD,MAAaC,wBAAgE;CAC3E,MAAM;CACN,MAAM;CACN,QAAQ;EAEN;GAAE,MAAM;GAAQ,SAAS;GAAQ,UAAU;GAAO,OAAO,IAAI,sBAAsB;GAAE;EACrF;GAAE,MAAM;GAAU,SAAS;GAAO,UAAU;GAAO,OAAO;GAAc;EACxE;GAAE,MAAM;GAAO,SAAS;GAAO,UAAU;GAAM,OAAO;GAAa;EACnE;GAAE,MAAM;GAAc,SAAS;GAAM,UAAU;GAAO,OAAO;GAAa;EAC1E;GAAE,MAAM;GAAa,SAAS;GAAM,UAAU;GAAO,OAAO;GAAa;EACzE;GAAE,MAAM;GAAe,SAAS;GAAM,UAAU;GAAM,OAAO;GAAmB;EAChF;GAAE,MAAM;GAAa,SAAS;GAAO,UAAU;GAAM,OAAO;GAAa;EACzE;GAAE,MAAM;GAAQ,SAAS;GAAQ,UAAU;GAAM,OAAO;GAAY;EACpE;GAAE,MAAM;GAAW,SAAS;GAAS,UAAU;GAAM,OAAO;GAAc;EAC1E;GAAE,MAAM;GAAS,SAAS;GAAM,UAAU;GAAM,OAAO;GAAmB;EAC1E;GAAE,MAAM;GAAS,SAAS;GAAO,UAAU;GAAM,OAAO;GAAmB;EAE3E;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,qBAAqB,gBAAgB,SAAS,6BAA6B;GACvF;EACD;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,qBAAqB,gBAAgB,eAAe,mCAAmC;GACnG;EACD;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,qBAAqB,gBAAgB,aAAa,iCAAiC;GAC/F;EACD;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,qBAAqB,gBAAgB,iBAAiB,qCAAqC;GACvG;EACD;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,sBAAsB;GAClC;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GAEV,OAAO,IAAI,iBAAiB,+BAA+B;GAC5D;EACD;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,kBAAkB;GAC9B;EACD;GACE,MAAM;GACN,WAAW;GACX,UAAU;GACV,OAAO,IAAI,qBAAqB,gBAAgB,YAAY,gCAAgC;GAC7F;EACF;CACF;AAED,MAAa,yBAAyB,IAAI,iBAAoC,sBAAsB"}
|
|
@@ -233,7 +233,6 @@ declare class Transaction implements TransactionParams {
|
|
|
233
233
|
* Get the transaction ID as a base32-encoded string.
|
|
234
234
|
*/
|
|
235
235
|
txId(): string;
|
|
236
|
-
static [Symbol.hasInstance](obj: unknown): boolean;
|
|
237
236
|
}
|
|
238
237
|
/**
|
|
239
238
|
* Codec for Transaction class.
|
|
@@ -271,6 +270,10 @@ declare function encodeTransaction(transaction: Transaction): Uint8Array;
|
|
|
271
270
|
* @returns A collection of MsgPack encoded bytes or an error if encoding fails.
|
|
272
271
|
*/
|
|
273
272
|
declare function encodeTransactions(transactions: Transaction[]): Uint8Array[];
|
|
273
|
+
/**
|
|
274
|
+
* Validate a transaction
|
|
275
|
+
*/
|
|
276
|
+
declare function validateTransaction(transaction: Transaction): void;
|
|
274
277
|
/**
|
|
275
278
|
* Encode the transaction without the domain separation (e.g. "TX") prefix
|
|
276
279
|
* This is useful for encoding the transaction for signing with tools that automatically add "TX" prefix to the transaction bytes.
|
|
@@ -308,5 +311,5 @@ declare function groupTransactions(transactions: Transaction[]): Transaction[];
|
|
|
308
311
|
declare function assignFee(transaction: Transaction, feeParams: FeeParams): Transaction;
|
|
309
312
|
declare function calculateFee(transaction: Transaction, feeParams: FeeParams): bigint;
|
|
310
313
|
//#endregion
|
|
311
|
-
export { Transaction, TransactionParams, assignFee, calculateFee, decodeTransaction, decodeTransactions, encodeTransaction, encodeTransactionRaw, encodeTransactions, estimateTransactionSize, getEncodedTransactionType, groupTransactions, transactionCodec };
|
|
314
|
+
export { Transaction, TransactionParams, assignFee, calculateFee, decodeTransaction, decodeTransactions, encodeTransaction, encodeTransactionRaw, encodeTransactions, estimateTransactionSize, getEncodedTransactionType, groupTransactions, transactionCodec, validateTransaction };
|
|
312
315
|
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -147,6 +147,7 @@ var Transaction = class {
|
|
|
147
147
|
this.stateProof = params.stateProof;
|
|
148
148
|
}
|
|
149
149
|
rawTxId() {
|
|
150
|
+
if (this.genesisHash === void 0) throw new Error("Cannot compute transaction id without genesis hash");
|
|
150
151
|
return require_crypto.hash(encodeTransaction(this));
|
|
151
152
|
}
|
|
152
153
|
/**
|
|
@@ -156,10 +157,11 @@ var Transaction = class {
|
|
|
156
157
|
const rawTxId = this.rawTxId();
|
|
157
158
|
return hi_base32.default.encode(rawTxId).slice(0, require_constants.TRANSACTION_ID_LENGTH);
|
|
158
159
|
}
|
|
159
|
-
static [Symbol.hasInstance](obj) {
|
|
160
|
-
return Boolean(obj && typeof obj === "object" && TXN_SYMBOL in obj && obj[TXN_SYMBOL]);
|
|
161
|
-
}
|
|
162
160
|
};
|
|
161
|
+
Object.defineProperty(Transaction, Symbol.hasInstance, { value: function(obj) {
|
|
162
|
+
if (obj instanceof Object && Object.getPrototypeOf(obj) === Transaction.prototype) return true;
|
|
163
|
+
return Boolean(obj && typeof obj === "object" && TXN_SYMBOL in obj && obj[TXN_SYMBOL]);
|
|
164
|
+
} });
|
|
163
165
|
/**
|
|
164
166
|
* Codec for Transaction class.
|
|
165
167
|
* Handles encoding/decoding between Transaction class instances and wire format.
|
|
@@ -252,7 +254,6 @@ function validateTransaction(transaction) {
|
|
|
252
254
|
* This is useful for encoding the transaction for signing with tools that automatically add "TX" prefix to the transaction bytes.
|
|
253
255
|
*/
|
|
254
256
|
function encodeTransactionRaw(transaction) {
|
|
255
|
-
validateTransaction(transaction);
|
|
256
257
|
return require_msgpack.encodeMsgpack(transactionCodec.encode(transaction, "msgpack"));
|
|
257
258
|
}
|
|
258
259
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","names":["hash","base32","TRANSACTION_ID_LENGTH","Codec","TransactionType","Address","transactionParamsCodec","concatArrays","TRANSACTION_DOMAIN_SEPARATOR","validateAssetTransferTransaction","validateAssetConfigTransaction","validateAppCallTransaction","validateKeyRegistrationTransaction","validateAssetFreezeTransaction","getValidationErrorMessage","encodeMsgpack","decodeMsgpack","SIGNATURE_ENCODING_INCR","MAX_TRANSACTION_GROUP_SIZE","TRANSACTION_GROUP_DOMAIN_SEPARATOR"],"sources":["../../../../../packages/transact/src/transactions/transaction.ts"],"sourcesContent":["import type { EncodingFormat, WireObject } from '@algorandfoundation/algokit-common'\nimport {\n Address,\n Codec,\n MAX_TRANSACTION_GROUP_SIZE,\n SIGNATURE_ENCODING_INCR,\n TRANSACTION_DOMAIN_SEPARATOR,\n TRANSACTION_GROUP_DOMAIN_SEPARATOR,\n TRANSACTION_ID_LENGTH,\n concatArrays,\n decodeMsgpack,\n encodeMsgpack,\n hash,\n} from '@algorandfoundation/algokit-common'\nimport base32 from 'hi-base32'\nimport { AppCallTransactionFields, validateAppCallTransaction } from './app-call'\nimport { AssetConfigTransactionFields, validateAssetConfigTransaction } from './asset-config'\nimport { AssetFreezeTransactionFields, validateAssetFreezeTransaction } from './asset-freeze'\nimport { AssetTransferTransactionFields, validateAssetTransferTransaction } from './asset-transfer'\nimport { TransactionValidationError, getValidationErrorMessage } from './common'\nimport { HeartbeatTransactionFields } from './heartbeat'\nimport { KeyRegistrationTransactionFields, validateKeyRegistrationTransaction } from './key-registration'\nimport { PaymentTransactionFields } from './payment'\nimport { StateProofTransactionFields } from './state-proof'\nimport { transactionParamsCodec } from './transaction-meta'\nimport { TransactionType } from './transaction-type'\n\n/** Symbol used for instanceof checks across packages (CJS/ESM) */\nexport const TXN_SYMBOL = Symbol.for('algokit_transact:Transaction')\n\n/**\n * Represents the parameters for a complete Algorand transaction.\n *\n * This structure contains the fields that are present in every transaction,\n * regardless of transaction type, plus transaction-type-specific fields.\n */\nexport type TransactionParams = {\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n}\n\n/**\n * Represents a complete Algorand transaction.\n */\nexport class Transaction implements TransactionParams {\n /** @internal */\n [TXN_SYMBOL]: boolean\n\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n\n constructor(params: TransactionParams) {\n this[TXN_SYMBOL] = true\n this.type = params.type\n this.sender = params.sender\n this.fee = params.fee\n this.firstValid = params.firstValid\n this.lastValid = params.lastValid\n this.genesisHash = params.genesisHash\n this.genesisId = params.genesisId\n this.note = params.note\n this.rekeyTo = params.rekeyTo\n this.lease = params.lease\n this.group = params.group\n this.payment = params.payment\n this.assetTransfer = params.assetTransfer\n this.assetConfig = params.assetConfig\n this.appCall = params.appCall\n this.keyRegistration = params.keyRegistration\n this.assetFreeze = params.assetFreeze\n this.heartbeat = params.heartbeat\n this.stateProof = params.stateProof\n }\n\n private rawTxId(): Uint8Array {\n const encodedBytes = encodeTransaction(this)\n return hash(encodedBytes)\n }\n\n /**\n * Get the transaction ID as a base32-encoded string.\n */\n txId(): string {\n const rawTxId = this.rawTxId()\n\n return base32.encode(rawTxId).slice(0, TRANSACTION_ID_LENGTH)\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return Boolean(obj && typeof obj === 'object' && TXN_SYMBOL in obj && obj[TXN_SYMBOL as keyof typeof obj])\n }\n}\n\n/**\n * Codec for Transaction class.\n * Handles encoding/decoding between Transaction class instances and wire format.\n */\nclass TransactionCodec extends Codec<Transaction, Record<string, unknown>, WireObject> {\n public defaultValue(): Transaction {\n return new Transaction({\n type: TransactionType.Unknown,\n sender: Address.zeroAddress(),\n firstValid: 0n,\n lastValid: 0n,\n })\n }\n\n protected toEncoded(value: Transaction, format: EncodingFormat): Record<string, unknown> {\n return transactionParamsCodec.encode({ ...value }, format)\n }\n\n protected fromEncoded(value: WireObject, format: EncodingFormat): Transaction {\n const params = transactionParamsCodec.decode(value, format)\n return new Transaction(params)\n }\n\n public isDefaultValue(_: Transaction): boolean {\n return false\n }\n}\n\nexport const transactionCodec = new TransactionCodec()\n\nexport type FeeParams = {\n feePerByte: bigint\n minFee: bigint\n extraFee?: bigint\n maxFee?: bigint\n}\n\n/**\n * Get the transaction type from the encoded transaction.\n * This is particularly useful when decoding a transaction that has an unknown type\n */\nexport function getEncodedTransactionType(encoded_transaction: Uint8Array): TransactionType {\n const decoded = decodeTransaction(encoded_transaction)\n return decoded.type\n}\n\n/**\n * Encode the transaction with the domain separation (e.g. \"TX\") prefix\n *\n * @param transaction - The transaction to encode\n * @returns The MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransaction(transaction: Transaction): Uint8Array {\n const rawBytes = encodeTransactionRaw(transaction)\n\n // Add domain separation prefix\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n return concatArrays(prefixBytes, rawBytes)\n}\n\n/**\n * Encode transactions with the domain separation (e.g. \"TX\") prefix\n *\n * @param transactions - A collection of transactions to encode\n * @returns A collection of MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransactions(transactions: Transaction[]): Uint8Array[] {\n return transactions.map((tx) => encodeTransaction(tx))\n}\n\n/**\n * Validate a transaction\n */\nexport function validateTransaction(transaction: Transaction): void {\n // Validate that only one transaction type specific field is set\n const typeFields = [\n transaction.payment,\n transaction.assetTransfer,\n transaction.assetConfig,\n transaction.appCall,\n transaction.keyRegistration,\n transaction.assetFreeze,\n transaction.heartbeat,\n transaction.stateProof,\n ]\n\n const setFieldsCount = typeFields.filter((field) => field !== undefined).length\n\n if (setFieldsCount > 1) {\n throw new Error('Multiple transaction type specific fields set')\n }\n\n // Perform type-specific validation where applicable\n let typeName = 'Transaction'\n const errors = new Array<TransactionValidationError>()\n if (transaction.assetTransfer) {\n typeName = 'Asset transfer'\n errors.push(...validateAssetTransferTransaction(transaction.assetTransfer))\n } else if (transaction.assetConfig) {\n typeName = 'Asset config'\n errors.push(...validateAssetConfigTransaction(transaction.assetConfig))\n } else if (transaction.appCall) {\n typeName = 'App call'\n errors.push(...validateAppCallTransaction(transaction.appCall))\n } else if (transaction.keyRegistration) {\n typeName = 'Key registration'\n errors.push(...validateKeyRegistrationTransaction(transaction.keyRegistration))\n } else if (transaction.assetFreeze) {\n typeName = 'Asset freeze'\n errors.push(...validateAssetFreezeTransaction(transaction.assetFreeze))\n }\n\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => getValidationErrorMessage(e))\n throw new Error(`${typeName} validation failed: ${errorMessages.join('\\n')}`)\n }\n}\n\n/**\n * Encode the transaction without the domain separation (e.g. \"TX\") prefix\n * This is useful for encoding the transaction for signing with tools that automatically add \"TX\" prefix to the transaction bytes.\n */\nexport function encodeTransactionRaw(transaction: Transaction): Uint8Array {\n validateTransaction(transaction)\n const encodingData = transactionCodec.encode(transaction, 'msgpack')\n return encodeMsgpack(encodingData)\n}\n\n/**\n * Decodes MsgPack bytes into a transaction.\n *\n * # Parameters\n * * `encoded_transaction` - MsgPack encoded bytes representing a transaction.\n *\n * # Returns\n * A decoded transaction or an error if decoding fails.\n */\nexport function decodeTransaction(encoded_transaction: Uint8Array): Transaction {\n if (encoded_transaction.length === 0) {\n throw new Error('attempted to decode 0 bytes')\n }\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n // Check if the transaction has the domain separation prefix\n let hasPrefix = true\n if (encoded_transaction.length < prefixBytes.length) {\n hasPrefix = false\n } else {\n for (let i = 0; i < prefixBytes.length; i++) {\n if (encoded_transaction[i] !== prefixBytes[i]) {\n hasPrefix = false\n break\n }\n }\n }\n\n const decodedData = decodeMsgpack(hasPrefix ? encoded_transaction.slice(prefixBytes.length) : encoded_transaction)\n return transactionCodec.decode(decodedData, 'msgpack')\n}\n\n/**\n * Decodes a collection of MsgPack bytes into a transaction collection.\n *\n * # Parameters\n * * `encoded_transaction` - A collection of MsgPack encoded bytes, each representing a transaction.\n *\n * # Returns\n * A collection of decoded transactions or an error if decoding fails.\n */\nexport function decodeTransactions(encoded_transactions: Uint8Array[]): Transaction[] {\n return encoded_transactions.map((et) => decodeTransaction(et))\n}\n\n/**\n * Return the size of the transaction in bytes as if it was already signed and encoded.\n * This is useful for estimating the fee for the transaction.\n */\nexport function estimateTransactionSize(transaction: Transaction): bigint {\n const encoded = encodeTransactionRaw(transaction)\n return BigInt(encoded.length + SIGNATURE_ENCODING_INCR)\n}\n\n/**\n * Groups a collection of transactions by calculating and assigning the group to each transaction.\n */\nexport function groupTransactions(transactions: Transaction[]): Transaction[] {\n const group = computeGroup(transactions)\n return transactions.map(\n (tx) =>\n new Transaction({\n ...tx,\n group,\n }),\n )\n}\n\nexport function assignFee(transaction: Transaction, feeParams: FeeParams): Transaction {\n const fee = calculateFee(transaction, feeParams)\n return new Transaction({\n ...transaction,\n fee,\n })\n}\n\nfunction computeGroup(transactions: Transaction[]): Uint8Array {\n if (transactions.length === 0) {\n throw new Error('Transaction group size cannot be 0')\n }\n\n if (transactions.length > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(`Transaction group size exceeds the max limit of ${MAX_TRANSACTION_GROUP_SIZE}`)\n }\n\n const txHashes = transactions.map((tx) => {\n if (tx.group) {\n throw new Error('Transactions must not already be grouped')\n }\n\n const encodedBytes = encodeTransaction(tx)\n return hash(encodedBytes)\n })\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_GROUP_DOMAIN_SEPARATOR)\n const encodedBytes = encodeMsgpack({\n txlist: txHashes,\n })\n\n const prefixedBytes = concatArrays(prefixBytes, encodedBytes)\n return hash(prefixedBytes)\n}\n\nexport function calculateFee(transaction: Transaction, feeParams: FeeParams): bigint {\n let calculatedFee = 0n\n\n if (feeParams.feePerByte > 0n) {\n const estimatedSize = estimateTransactionSize(transaction)\n calculatedFee = feeParams.feePerByte * BigInt(estimatedSize)\n }\n\n if (calculatedFee < feeParams.minFee) {\n calculatedFee = feeParams.minFee\n }\n\n if (feeParams.extraFee) {\n calculatedFee += feeParams.extraFee\n }\n\n if (feeParams.maxFee && calculatedFee > feeParams.maxFee) {\n throw new Error(`Transaction fee ${calculatedFee} µALGO is greater than maxFee ${feeParams.maxFee} µALGO`)\n }\n\n return calculatedFee\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transaction.js","names":["hash","base32","TRANSACTION_ID_LENGTH","Codec","TransactionType","Address","transactionParamsCodec","concatArrays","TRANSACTION_DOMAIN_SEPARATOR","validateAssetTransferTransaction","validateAssetConfigTransaction","validateAppCallTransaction","validateKeyRegistrationTransaction","validateAssetFreezeTransaction","getValidationErrorMessage","encodeMsgpack","decodeMsgpack","SIGNATURE_ENCODING_INCR","MAX_TRANSACTION_GROUP_SIZE","TRANSACTION_GROUP_DOMAIN_SEPARATOR"],"sources":["../../../../../packages/transact/src/transactions/transaction.ts"],"sourcesContent":["import type { EncodingFormat, WireObject } from '@algorandfoundation/algokit-common'\nimport {\n Address,\n Codec,\n MAX_TRANSACTION_GROUP_SIZE,\n SIGNATURE_ENCODING_INCR,\n TRANSACTION_DOMAIN_SEPARATOR,\n TRANSACTION_GROUP_DOMAIN_SEPARATOR,\n TRANSACTION_ID_LENGTH,\n concatArrays,\n decodeMsgpack,\n encodeMsgpack,\n hash,\n} from '@algorandfoundation/algokit-common'\nimport base32 from 'hi-base32'\nimport { AppCallTransactionFields, validateAppCallTransaction } from './app-call'\nimport { AssetConfigTransactionFields, validateAssetConfigTransaction } from './asset-config'\nimport { AssetFreezeTransactionFields, validateAssetFreezeTransaction } from './asset-freeze'\nimport { AssetTransferTransactionFields, validateAssetTransferTransaction } from './asset-transfer'\nimport { TransactionValidationError, getValidationErrorMessage } from './common'\nimport { HeartbeatTransactionFields } from './heartbeat'\nimport { KeyRegistrationTransactionFields, validateKeyRegistrationTransaction } from './key-registration'\nimport { PaymentTransactionFields } from './payment'\nimport { StateProofTransactionFields } from './state-proof'\nimport { transactionParamsCodec } from './transaction-meta'\nimport { TransactionType } from './transaction-type'\n\n/** Symbol used for instanceof checks across packages (CJS/ESM) */\nexport const TXN_SYMBOL = Symbol.for('algokit_transact:Transaction')\n\n/**\n * Represents the parameters for a complete Algorand transaction.\n *\n * This structure contains the fields that are present in every transaction,\n * regardless of transaction type, plus transaction-type-specific fields.\n */\nexport type TransactionParams = {\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n}\n\n/**\n * Represents a complete Algorand transaction.\n */\nexport class Transaction implements TransactionParams {\n /** @internal */\n [TXN_SYMBOL]: boolean\n\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n\n constructor(params: TransactionParams) {\n this[TXN_SYMBOL] = true\n this.type = params.type\n this.sender = params.sender\n this.fee = params.fee\n this.firstValid = params.firstValid\n this.lastValid = params.lastValid\n this.genesisHash = params.genesisHash\n this.genesisId = params.genesisId\n this.note = params.note\n this.rekeyTo = params.rekeyTo\n this.lease = params.lease\n this.group = params.group\n this.payment = params.payment\n this.assetTransfer = params.assetTransfer\n this.assetConfig = params.assetConfig\n this.appCall = params.appCall\n this.keyRegistration = params.keyRegistration\n this.assetFreeze = params.assetFreeze\n this.heartbeat = params.heartbeat\n this.stateProof = params.stateProof\n }\n\n private rawTxId(): Uint8Array {\n if (this.genesisHash === undefined) {\n throw new Error('Cannot compute transaction id without genesis hash')\n }\n\n const encodedBytes = encodeTransaction(this)\n return hash(encodedBytes)\n }\n\n /**\n * Get the transaction ID as a base32-encoded string.\n */\n txId(): string {\n const rawTxId = this.rawTxId()\n\n return base32.encode(rawTxId).slice(0, TRANSACTION_ID_LENGTH)\n }\n}\n\n// Define Symbol.hasInstance outside the class to avoid Metro/Hermes parser issues\n// with static computed property names like `static [Symbol.hasInstance]()`\n// Also must handle Babel's _classCallCheck which uses instanceof before TXN_SYMBOL is set\nObject.defineProperty(Transaction, Symbol.hasInstance, {\n value: function (obj: unknown): boolean {\n // First check prototype chain (handles Babel's _classCallCheck and normal instances)\n if (obj instanceof Object && Object.getPrototypeOf(obj) === Transaction.prototype) {\n return true\n }\n // Then check for the brand symbol (handles cross-realm/serialized instances)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Boolean(obj && typeof obj === 'object' && TXN_SYMBOL in obj && (obj as any)[TXN_SYMBOL])\n },\n})\n\n/**\n * Codec for Transaction class.\n * Handles encoding/decoding between Transaction class instances and wire format.\n */\nclass TransactionCodec extends Codec<Transaction, Record<string, unknown>, WireObject> {\n public defaultValue(): Transaction {\n return new Transaction({\n type: TransactionType.Unknown,\n sender: Address.zeroAddress(),\n firstValid: 0n,\n lastValid: 0n,\n })\n }\n\n protected toEncoded(value: Transaction, format: EncodingFormat): Record<string, unknown> {\n return transactionParamsCodec.encode({ ...value }, format)\n }\n\n protected fromEncoded(value: WireObject, format: EncodingFormat): Transaction {\n const params = transactionParamsCodec.decode(value, format)\n return new Transaction(params)\n }\n\n public isDefaultValue(_: Transaction): boolean {\n return false\n }\n}\n\nexport const transactionCodec = new TransactionCodec()\n\nexport type FeeParams = {\n feePerByte: bigint\n minFee: bigint\n extraFee?: bigint\n maxFee?: bigint\n}\n\n/**\n * Get the transaction type from the encoded transaction.\n * This is particularly useful when decoding a transaction that has an unknown type\n */\nexport function getEncodedTransactionType(encoded_transaction: Uint8Array): TransactionType {\n const decoded = decodeTransaction(encoded_transaction)\n return decoded.type\n}\n\n/**\n * Encode the transaction with the domain separation (e.g. \"TX\") prefix\n *\n * @param transaction - The transaction to encode\n * @returns The MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransaction(transaction: Transaction): Uint8Array {\n const rawBytes = encodeTransactionRaw(transaction)\n\n // Add domain separation prefix\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n return concatArrays(prefixBytes, rawBytes)\n}\n\n/**\n * Encode transactions with the domain separation (e.g. \"TX\") prefix\n *\n * @param transactions - A collection of transactions to encode\n * @returns A collection of MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransactions(transactions: Transaction[]): Uint8Array[] {\n return transactions.map((tx) => encodeTransaction(tx))\n}\n\n/**\n * Validate a transaction\n */\nexport function validateTransaction(transaction: Transaction): void {\n // Validate that only one transaction type specific field is set\n const typeFields = [\n transaction.payment,\n transaction.assetTransfer,\n transaction.assetConfig,\n transaction.appCall,\n transaction.keyRegistration,\n transaction.assetFreeze,\n transaction.heartbeat,\n transaction.stateProof,\n ]\n\n const setFieldsCount = typeFields.filter((field) => field !== undefined).length\n\n if (setFieldsCount > 1) {\n throw new Error('Multiple transaction type specific fields set')\n }\n\n // Perform type-specific validation where applicable\n let typeName = 'Transaction'\n const errors = new Array<TransactionValidationError>()\n if (transaction.assetTransfer) {\n typeName = 'Asset transfer'\n errors.push(...validateAssetTransferTransaction(transaction.assetTransfer))\n } else if (transaction.assetConfig) {\n typeName = 'Asset config'\n errors.push(...validateAssetConfigTransaction(transaction.assetConfig))\n } else if (transaction.appCall) {\n typeName = 'App call'\n errors.push(...validateAppCallTransaction(transaction.appCall))\n } else if (transaction.keyRegistration) {\n typeName = 'Key registration'\n errors.push(...validateKeyRegistrationTransaction(transaction.keyRegistration))\n } else if (transaction.assetFreeze) {\n typeName = 'Asset freeze'\n errors.push(...validateAssetFreezeTransaction(transaction.assetFreeze))\n }\n\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => getValidationErrorMessage(e))\n throw new Error(`${typeName} validation failed: ${errorMessages.join('\\n')}`)\n }\n}\n\n/**\n * Encode the transaction without the domain separation (e.g. \"TX\") prefix\n * This is useful for encoding the transaction for signing with tools that automatically add \"TX\" prefix to the transaction bytes.\n */\nexport function encodeTransactionRaw(transaction: Transaction): Uint8Array {\n const encodingData = transactionCodec.encode(transaction, 'msgpack')\n return encodeMsgpack(encodingData)\n}\n\n/**\n * Decodes MsgPack bytes into a transaction.\n *\n * # Parameters\n * * `encoded_transaction` - MsgPack encoded bytes representing a transaction.\n *\n * # Returns\n * A decoded transaction or an error if decoding fails.\n */\nexport function decodeTransaction(encoded_transaction: Uint8Array): Transaction {\n if (encoded_transaction.length === 0) {\n throw new Error('attempted to decode 0 bytes')\n }\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n // Check if the transaction has the domain separation prefix\n let hasPrefix = true\n if (encoded_transaction.length < prefixBytes.length) {\n hasPrefix = false\n } else {\n for (let i = 0; i < prefixBytes.length; i++) {\n if (encoded_transaction[i] !== prefixBytes[i]) {\n hasPrefix = false\n break\n }\n }\n }\n\n const decodedData = decodeMsgpack(hasPrefix ? encoded_transaction.slice(prefixBytes.length) : encoded_transaction)\n return transactionCodec.decode(decodedData, 'msgpack')\n}\n\n/**\n * Decodes a collection of MsgPack bytes into a transaction collection.\n *\n * # Parameters\n * * `encoded_transaction` - A collection of MsgPack encoded bytes, each representing a transaction.\n *\n * # Returns\n * A collection of decoded transactions or an error if decoding fails.\n */\nexport function decodeTransactions(encoded_transactions: Uint8Array[]): Transaction[] {\n return encoded_transactions.map((et) => decodeTransaction(et))\n}\n\n/**\n * Return the size of the transaction in bytes as if it was already signed and encoded.\n * This is useful for estimating the fee for the transaction.\n */\nexport function estimateTransactionSize(transaction: Transaction): bigint {\n const encoded = encodeTransactionRaw(transaction)\n return BigInt(encoded.length + SIGNATURE_ENCODING_INCR)\n}\n\n/**\n * Groups a collection of transactions by calculating and assigning the group to each transaction.\n */\nexport function groupTransactions(transactions: Transaction[]): Transaction[] {\n const group = computeGroup(transactions)\n return transactions.map(\n (tx) =>\n new Transaction({\n ...tx,\n group,\n }),\n )\n}\n\nexport function assignFee(transaction: Transaction, feeParams: FeeParams): Transaction {\n const fee = calculateFee(transaction, feeParams)\n return new Transaction({\n ...transaction,\n fee,\n })\n}\n\nfunction computeGroup(transactions: Transaction[]): Uint8Array {\n if (transactions.length === 0) {\n throw new Error('Transaction group size cannot be 0')\n }\n\n if (transactions.length > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(`Transaction group size exceeds the max limit of ${MAX_TRANSACTION_GROUP_SIZE}`)\n }\n\n const txHashes = transactions.map((tx) => {\n if (tx.group) {\n throw new Error('Transactions must not already be grouped')\n }\n\n const encodedBytes = encodeTransaction(tx)\n return hash(encodedBytes)\n })\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_GROUP_DOMAIN_SEPARATOR)\n const encodedBytes = encodeMsgpack({\n txlist: txHashes,\n })\n\n const prefixedBytes = concatArrays(prefixBytes, encodedBytes)\n return hash(prefixedBytes)\n}\n\nexport function calculateFee(transaction: Transaction, feeParams: FeeParams): bigint {\n let calculatedFee = 0n\n\n if (feeParams.feePerByte > 0n) {\n const estimatedSize = estimateTransactionSize(transaction)\n calculatedFee = feeParams.feePerByte * BigInt(estimatedSize)\n }\n\n if (calculatedFee < feeParams.minFee) {\n calculatedFee = feeParams.minFee\n }\n\n if (feeParams.extraFee) {\n calculatedFee += feeParams.extraFee\n }\n\n if (feeParams.maxFee && calculatedFee > feeParams.maxFee) {\n throw new Error(`Transaction fee ${calculatedFee} µALGO is greater than maxFee ${feeParams.maxFee} µALGO`)\n }\n\n return calculatedFee\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA4BA,MAAa,aAAa,OAAO,IAAI,+BAA+B;;;;AAmIpE,IAAa,cAAb,MAAsD;;CAEpD,CAAC;;;;CAKD;;;;;;CAOA;;;;;;CAOA;;;;CAKA;;;;;;CAOA;;;;;;CAOA;;;;;;CAOA;;;;;;CAOA;;;;;;;;CASA;;;;;;;;;CAUA;;;;;;CAOA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;CAEA,YAAY,QAA2B;AACrC,OAAK,cAAc;AACnB,OAAK,OAAO,OAAO;AACnB,OAAK,SAAS,OAAO;AACrB,OAAK,MAAM,OAAO;AAClB,OAAK,aAAa,OAAO;AACzB,OAAK,YAAY,OAAO;AACxB,OAAK,cAAc,OAAO;AAC1B,OAAK,YAAY,OAAO;AACxB,OAAK,OAAO,OAAO;AACnB,OAAK,UAAU,OAAO;AACtB,OAAK,QAAQ,OAAO;AACpB,OAAK,QAAQ,OAAO;AACpB,OAAK,UAAU,OAAO;AACtB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,cAAc,OAAO;AAC1B,OAAK,UAAU,OAAO;AACtB,OAAK,kBAAkB,OAAO;AAC9B,OAAK,cAAc,OAAO;AAC1B,OAAK,YAAY,OAAO;AACxB,OAAK,aAAa,OAAO;;CAG3B,AAAQ,UAAsB;AAC5B,MAAI,KAAK,gBAAgB,OACvB,OAAM,IAAI,MAAM,qDAAqD;AAIvE,SAAOA,oBADc,kBAAkB,KAAK,CACnB;;;;;CAM3B,OAAe;EACb,MAAM,UAAU,KAAK,SAAS;AAE9B,SAAOC,kBAAO,OAAO,QAAQ,CAAC,MAAM,GAAGC,wCAAsB;;;AAOjE,OAAO,eAAe,aAAa,OAAO,aAAa,EACrD,OAAO,SAAU,KAAuB;AAEtC,KAAI,eAAe,UAAU,OAAO,eAAe,IAAI,KAAK,YAAY,UACtE,QAAO;AAIT,QAAO,QAAQ,OAAO,OAAO,QAAQ,YAAY,cAAc,OAAQ,IAAY,YAAY;GAElG,CAAC;;;;;AAMF,IAAM,mBAAN,cAA+BC,oBAAwD;CACrF,AAAO,eAA4B;AACjC,SAAO,IAAI,YAAY;GACrB,MAAMC,yCAAgB;GACtB,QAAQC,wBAAQ,aAAa;GAC7B,YAAY;GACZ,WAAW;GACZ,CAAC;;CAGJ,AAAU,UAAU,OAAoB,QAAiD;AACvF,SAAOC,gDAAuB,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO;;CAG5D,AAAU,YAAY,OAAmB,QAAqC;AAE5E,SAAO,IAAI,YADIA,gDAAuB,OAAO,OAAO,OAAO,CAC7B;;CAGhC,AAAO,eAAe,GAAyB;AAC7C,SAAO;;;AAIX,MAAa,mBAAmB,IAAI,kBAAkB;;;;;AAatD,SAAgB,0BAA0B,qBAAkD;AAE1F,QADgB,kBAAkB,oBAAoB,CACvC;;;;;;;;AASjB,SAAgB,kBAAkB,aAAsC;CACtE,MAAM,WAAW,qBAAqB,YAAY;AAIlD,QAAOC,2BADa,IAAI,aAAa,CAAC,OAAOC,+CAA6B,EACzC,SAAS;;;;;;;;AAS5C,SAAgB,mBAAmB,cAA2C;AAC5E,QAAO,aAAa,KAAK,OAAO,kBAAkB,GAAG,CAAC;;;;;AAMxD,SAAgB,oBAAoB,aAAgC;AAelE,KAbmB;EACjB,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACb,CAEiC,QAAQ,UAAU,UAAU,OAAU,CAAC,SAEpD,EACnB,OAAM,IAAI,MAAM,gDAAgD;CAIlE,IAAI,WAAW;CACf,MAAM,SAAS,IAAI,OAAmC;AACtD,KAAI,YAAY,eAAe;AAC7B,aAAW;AACX,SAAO,KAAK,GAAGC,wDAAiC,YAAY,cAAc,CAAC;YAClE,YAAY,aAAa;AAClC,aAAW;AACX,SAAO,KAAK,GAAGC,oDAA+B,YAAY,YAAY,CAAC;YAC9D,YAAY,SAAS;AAC9B,aAAW;AACX,SAAO,KAAK,GAAGC,4CAA2B,YAAY,QAAQ,CAAC;YACtD,YAAY,iBAAiB;AACtC,aAAW;AACX,SAAO,KAAK,GAAGC,4DAAmC,YAAY,gBAAgB,CAAC;YACtE,YAAY,aAAa;AAClC,aAAW;AACX,SAAO,KAAK,GAAGC,oDAA+B,YAAY,YAAY,CAAC;;AAGzE,KAAI,OAAO,SAAS,GAAG;EACrB,MAAM,gBAAgB,OAAO,KAAK,MAAMC,yCAA0B,EAAE,CAAC;AACrE,QAAM,IAAI,MAAM,GAAG,SAAS,sBAAsB,cAAc,KAAK,KAAK,GAAG;;;;;;;AAQjF,SAAgB,qBAAqB,aAAsC;AAEzE,QAAOC,8BADc,iBAAiB,OAAO,aAAa,UAAU,CAClC;;;;;;;;;;;AAYpC,SAAgB,kBAAkB,qBAA8C;AAC9E,KAAI,oBAAoB,WAAW,EACjC,OAAM,IAAI,MAAM,8BAA8B;CAGhD,MAAM,cAAc,IAAI,aAAa,CAAC,OAAOP,+CAA6B;CAE1E,IAAI,YAAY;AAChB,KAAI,oBAAoB,SAAS,YAAY,OAC3C,aAAY;KAEZ,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,IACtC,KAAI,oBAAoB,OAAO,YAAY,IAAI;AAC7C,cAAY;AACZ;;CAKN,MAAM,cAAcQ,8BAAc,YAAY,oBAAoB,MAAM,YAAY,OAAO,GAAG,oBAAoB;AAClH,QAAO,iBAAiB,OAAO,aAAa,UAAU;;;;;;;;;;;AAYxD,SAAgB,mBAAmB,sBAAmD;AACpF,QAAO,qBAAqB,KAAK,OAAO,kBAAkB,GAAG,CAAC;;;;;;AAOhE,SAAgB,wBAAwB,aAAkC;CACxE,MAAM,UAAU,qBAAqB,YAAY;AACjD,QAAO,OAAO,QAAQ,SAASC,0CAAwB;;;;;AAMzD,SAAgB,kBAAkB,cAA4C;CAC5E,MAAM,QAAQ,aAAa,aAAa;AACxC,QAAO,aAAa,KACjB,OACC,IAAI,YAAY;EACd,GAAG;EACH;EACD,CAAC,CACL;;AAGH,SAAgB,UAAU,aAA0B,WAAmC;CACrF,MAAM,MAAM,aAAa,aAAa,UAAU;AAChD,QAAO,IAAI,YAAY;EACrB,GAAG;EACH;EACD,CAAC;;AAGJ,SAAS,aAAa,cAAyC;AAC7D,KAAI,aAAa,WAAW,EAC1B,OAAM,IAAI,MAAM,qCAAqC;AAGvD,KAAI,aAAa,SAASC,6CACxB,OAAM,IAAI,MAAM,mDAAmDA,+CAA6B;CAGlG,MAAM,WAAW,aAAa,KAAK,OAAO;AACxC,MAAI,GAAG,MACL,OAAM,IAAI,MAAM,2CAA2C;AAI7D,SAAOlB,oBADc,kBAAkB,GAAG,CACjB;GACzB;AAQF,QAAOA,oBADeO,2BALF,IAAI,aAAa,CAAC,OAAOY,qDAAmC,EAC3DJ,8BAAc,EACjC,QAAQ,UACT,CAAC,CAE2D,CACnC;;AAG5B,SAAgB,aAAa,aAA0B,WAA8B;CACnF,IAAI,gBAAgB;AAEpB,KAAI,UAAU,aAAa,IAAI;EAC7B,MAAM,gBAAgB,wBAAwB,YAAY;AAC1D,kBAAgB,UAAU,aAAa,OAAO,cAAc;;AAG9D,KAAI,gBAAgB,UAAU,OAC5B,iBAAgB,UAAU;AAG5B,KAAI,UAAU,SACZ,kBAAiB,UAAU;AAG7B,KAAI,UAAU,UAAU,gBAAgB,UAAU,OAChD,OAAM,IAAI,MAAM,mBAAmB,cAAc,gCAAgC,UAAU,OAAO,QAAQ;AAG5G,QAAO"}
|
|
@@ -145,6 +145,7 @@ var Transaction = class {
|
|
|
145
145
|
this.stateProof = params.stateProof;
|
|
146
146
|
}
|
|
147
147
|
rawTxId() {
|
|
148
|
+
if (this.genesisHash === void 0) throw new Error("Cannot compute transaction id without genesis hash");
|
|
148
149
|
return hash(encodeTransaction(this));
|
|
149
150
|
}
|
|
150
151
|
/**
|
|
@@ -154,10 +155,11 @@ var Transaction = class {
|
|
|
154
155
|
const rawTxId = this.rawTxId();
|
|
155
156
|
return base32.encode(rawTxId).slice(0, TRANSACTION_ID_LENGTH);
|
|
156
157
|
}
|
|
157
|
-
static [Symbol.hasInstance](obj) {
|
|
158
|
-
return Boolean(obj && typeof obj === "object" && TXN_SYMBOL in obj && obj[TXN_SYMBOL]);
|
|
159
|
-
}
|
|
160
158
|
};
|
|
159
|
+
Object.defineProperty(Transaction, Symbol.hasInstance, { value: function(obj) {
|
|
160
|
+
if (obj instanceof Object && Object.getPrototypeOf(obj) === Transaction.prototype) return true;
|
|
161
|
+
return Boolean(obj && typeof obj === "object" && TXN_SYMBOL in obj && obj[TXN_SYMBOL]);
|
|
162
|
+
} });
|
|
161
163
|
/**
|
|
162
164
|
* Codec for Transaction class.
|
|
163
165
|
* Handles encoding/decoding between Transaction class instances and wire format.
|
|
@@ -250,7 +252,6 @@ function validateTransaction(transaction) {
|
|
|
250
252
|
* This is useful for encoding the transaction for signing with tools that automatically add "TX" prefix to the transaction bytes.
|
|
251
253
|
*/
|
|
252
254
|
function encodeTransactionRaw(transaction) {
|
|
253
|
-
validateTransaction(transaction);
|
|
254
255
|
return encodeMsgpack(transactionCodec.encode(transaction, "msgpack"));
|
|
255
256
|
}
|
|
256
257
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.mjs","names":[],"sources":["../../../../../packages/transact/src/transactions/transaction.ts"],"sourcesContent":["import type { EncodingFormat, WireObject } from '@algorandfoundation/algokit-common'\nimport {\n Address,\n Codec,\n MAX_TRANSACTION_GROUP_SIZE,\n SIGNATURE_ENCODING_INCR,\n TRANSACTION_DOMAIN_SEPARATOR,\n TRANSACTION_GROUP_DOMAIN_SEPARATOR,\n TRANSACTION_ID_LENGTH,\n concatArrays,\n decodeMsgpack,\n encodeMsgpack,\n hash,\n} from '@algorandfoundation/algokit-common'\nimport base32 from 'hi-base32'\nimport { AppCallTransactionFields, validateAppCallTransaction } from './app-call'\nimport { AssetConfigTransactionFields, validateAssetConfigTransaction } from './asset-config'\nimport { AssetFreezeTransactionFields, validateAssetFreezeTransaction } from './asset-freeze'\nimport { AssetTransferTransactionFields, validateAssetTransferTransaction } from './asset-transfer'\nimport { TransactionValidationError, getValidationErrorMessage } from './common'\nimport { HeartbeatTransactionFields } from './heartbeat'\nimport { KeyRegistrationTransactionFields, validateKeyRegistrationTransaction } from './key-registration'\nimport { PaymentTransactionFields } from './payment'\nimport { StateProofTransactionFields } from './state-proof'\nimport { transactionParamsCodec } from './transaction-meta'\nimport { TransactionType } from './transaction-type'\n\n/** Symbol used for instanceof checks across packages (CJS/ESM) */\nexport const TXN_SYMBOL = Symbol.for('algokit_transact:Transaction')\n\n/**\n * Represents the parameters for a complete Algorand transaction.\n *\n * This structure contains the fields that are present in every transaction,\n * regardless of transaction type, plus transaction-type-specific fields.\n */\nexport type TransactionParams = {\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n}\n\n/**\n * Represents a complete Algorand transaction.\n */\nexport class Transaction implements TransactionParams {\n /** @internal */\n [TXN_SYMBOL]: boolean\n\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n\n constructor(params: TransactionParams) {\n this[TXN_SYMBOL] = true\n this.type = params.type\n this.sender = params.sender\n this.fee = params.fee\n this.firstValid = params.firstValid\n this.lastValid = params.lastValid\n this.genesisHash = params.genesisHash\n this.genesisId = params.genesisId\n this.note = params.note\n this.rekeyTo = params.rekeyTo\n this.lease = params.lease\n this.group = params.group\n this.payment = params.payment\n this.assetTransfer = params.assetTransfer\n this.assetConfig = params.assetConfig\n this.appCall = params.appCall\n this.keyRegistration = params.keyRegistration\n this.assetFreeze = params.assetFreeze\n this.heartbeat = params.heartbeat\n this.stateProof = params.stateProof\n }\n\n private rawTxId(): Uint8Array {\n const encodedBytes = encodeTransaction(this)\n return hash(encodedBytes)\n }\n\n /**\n * Get the transaction ID as a base32-encoded string.\n */\n txId(): string {\n const rawTxId = this.rawTxId()\n\n return base32.encode(rawTxId).slice(0, TRANSACTION_ID_LENGTH)\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return Boolean(obj && typeof obj === 'object' && TXN_SYMBOL in obj && obj[TXN_SYMBOL as keyof typeof obj])\n }\n}\n\n/**\n * Codec for Transaction class.\n * Handles encoding/decoding between Transaction class instances and wire format.\n */\nclass TransactionCodec extends Codec<Transaction, Record<string, unknown>, WireObject> {\n public defaultValue(): Transaction {\n return new Transaction({\n type: TransactionType.Unknown,\n sender: Address.zeroAddress(),\n firstValid: 0n,\n lastValid: 0n,\n })\n }\n\n protected toEncoded(value: Transaction, format: EncodingFormat): Record<string, unknown> {\n return transactionParamsCodec.encode({ ...value }, format)\n }\n\n protected fromEncoded(value: WireObject, format: EncodingFormat): Transaction {\n const params = transactionParamsCodec.decode(value, format)\n return new Transaction(params)\n }\n\n public isDefaultValue(_: Transaction): boolean {\n return false\n }\n}\n\nexport const transactionCodec = new TransactionCodec()\n\nexport type FeeParams = {\n feePerByte: bigint\n minFee: bigint\n extraFee?: bigint\n maxFee?: bigint\n}\n\n/**\n * Get the transaction type from the encoded transaction.\n * This is particularly useful when decoding a transaction that has an unknown type\n */\nexport function getEncodedTransactionType(encoded_transaction: Uint8Array): TransactionType {\n const decoded = decodeTransaction(encoded_transaction)\n return decoded.type\n}\n\n/**\n * Encode the transaction with the domain separation (e.g. \"TX\") prefix\n *\n * @param transaction - The transaction to encode\n * @returns The MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransaction(transaction: Transaction): Uint8Array {\n const rawBytes = encodeTransactionRaw(transaction)\n\n // Add domain separation prefix\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n return concatArrays(prefixBytes, rawBytes)\n}\n\n/**\n * Encode transactions with the domain separation (e.g. \"TX\") prefix\n *\n * @param transactions - A collection of transactions to encode\n * @returns A collection of MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransactions(transactions: Transaction[]): Uint8Array[] {\n return transactions.map((tx) => encodeTransaction(tx))\n}\n\n/**\n * Validate a transaction\n */\nexport function validateTransaction(transaction: Transaction): void {\n // Validate that only one transaction type specific field is set\n const typeFields = [\n transaction.payment,\n transaction.assetTransfer,\n transaction.assetConfig,\n transaction.appCall,\n transaction.keyRegistration,\n transaction.assetFreeze,\n transaction.heartbeat,\n transaction.stateProof,\n ]\n\n const setFieldsCount = typeFields.filter((field) => field !== undefined).length\n\n if (setFieldsCount > 1) {\n throw new Error('Multiple transaction type specific fields set')\n }\n\n // Perform type-specific validation where applicable\n let typeName = 'Transaction'\n const errors = new Array<TransactionValidationError>()\n if (transaction.assetTransfer) {\n typeName = 'Asset transfer'\n errors.push(...validateAssetTransferTransaction(transaction.assetTransfer))\n } else if (transaction.assetConfig) {\n typeName = 'Asset config'\n errors.push(...validateAssetConfigTransaction(transaction.assetConfig))\n } else if (transaction.appCall) {\n typeName = 'App call'\n errors.push(...validateAppCallTransaction(transaction.appCall))\n } else if (transaction.keyRegistration) {\n typeName = 'Key registration'\n errors.push(...validateKeyRegistrationTransaction(transaction.keyRegistration))\n } else if (transaction.assetFreeze) {\n typeName = 'Asset freeze'\n errors.push(...validateAssetFreezeTransaction(transaction.assetFreeze))\n }\n\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => getValidationErrorMessage(e))\n throw new Error(`${typeName} validation failed: ${errorMessages.join('\\n')}`)\n }\n}\n\n/**\n * Encode the transaction without the domain separation (e.g. \"TX\") prefix\n * This is useful for encoding the transaction for signing with tools that automatically add \"TX\" prefix to the transaction bytes.\n */\nexport function encodeTransactionRaw(transaction: Transaction): Uint8Array {\n validateTransaction(transaction)\n const encodingData = transactionCodec.encode(transaction, 'msgpack')\n return encodeMsgpack(encodingData)\n}\n\n/**\n * Decodes MsgPack bytes into a transaction.\n *\n * # Parameters\n * * `encoded_transaction` - MsgPack encoded bytes representing a transaction.\n *\n * # Returns\n * A decoded transaction or an error if decoding fails.\n */\nexport function decodeTransaction(encoded_transaction: Uint8Array): Transaction {\n if (encoded_transaction.length === 0) {\n throw new Error('attempted to decode 0 bytes')\n }\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n // Check if the transaction has the domain separation prefix\n let hasPrefix = true\n if (encoded_transaction.length < prefixBytes.length) {\n hasPrefix = false\n } else {\n for (let i = 0; i < prefixBytes.length; i++) {\n if (encoded_transaction[i] !== prefixBytes[i]) {\n hasPrefix = false\n break\n }\n }\n }\n\n const decodedData = decodeMsgpack(hasPrefix ? encoded_transaction.slice(prefixBytes.length) : encoded_transaction)\n return transactionCodec.decode(decodedData, 'msgpack')\n}\n\n/**\n * Decodes a collection of MsgPack bytes into a transaction collection.\n *\n * # Parameters\n * * `encoded_transaction` - A collection of MsgPack encoded bytes, each representing a transaction.\n *\n * # Returns\n * A collection of decoded transactions or an error if decoding fails.\n */\nexport function decodeTransactions(encoded_transactions: Uint8Array[]): Transaction[] {\n return encoded_transactions.map((et) => decodeTransaction(et))\n}\n\n/**\n * Return the size of the transaction in bytes as if it was already signed and encoded.\n * This is useful for estimating the fee for the transaction.\n */\nexport function estimateTransactionSize(transaction: Transaction): bigint {\n const encoded = encodeTransactionRaw(transaction)\n return BigInt(encoded.length + SIGNATURE_ENCODING_INCR)\n}\n\n/**\n * Groups a collection of transactions by calculating and assigning the group to each transaction.\n */\nexport function groupTransactions(transactions: Transaction[]): Transaction[] {\n const group = computeGroup(transactions)\n return transactions.map(\n (tx) =>\n new Transaction({\n ...tx,\n group,\n }),\n )\n}\n\nexport function assignFee(transaction: Transaction, feeParams: FeeParams): Transaction {\n const fee = calculateFee(transaction, feeParams)\n return new Transaction({\n ...transaction,\n fee,\n })\n}\n\nfunction computeGroup(transactions: Transaction[]): Uint8Array {\n if (transactions.length === 0) {\n throw new Error('Transaction group size cannot be 0')\n }\n\n if (transactions.length > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(`Transaction group size exceeds the max limit of ${MAX_TRANSACTION_GROUP_SIZE}`)\n }\n\n const txHashes = transactions.map((tx) => {\n if (tx.group) {\n throw new Error('Transactions must not already be grouped')\n }\n\n const encodedBytes = encodeTransaction(tx)\n return hash(encodedBytes)\n })\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_GROUP_DOMAIN_SEPARATOR)\n const encodedBytes = encodeMsgpack({\n txlist: txHashes,\n })\n\n const prefixedBytes = concatArrays(prefixBytes, encodedBytes)\n return hash(prefixedBytes)\n}\n\nexport function calculateFee(transaction: Transaction, feeParams: FeeParams): bigint {\n let calculatedFee = 0n\n\n if (feeParams.feePerByte > 0n) {\n const estimatedSize = estimateTransactionSize(transaction)\n calculatedFee = feeParams.feePerByte * BigInt(estimatedSize)\n }\n\n if (calculatedFee < feeParams.minFee) {\n calculatedFee = feeParams.minFee\n }\n\n if (feeParams.extraFee) {\n calculatedFee += feeParams.extraFee\n }\n\n if (feeParams.maxFee && calculatedFee > feeParams.maxFee) {\n throw new Error(`Transaction fee ${calculatedFee} µALGO is greater than maxFee ${feeParams.maxFee} µALGO`)\n }\n\n return calculatedFee\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transaction.mjs","names":[],"sources":["../../../../../packages/transact/src/transactions/transaction.ts"],"sourcesContent":["import type { EncodingFormat, WireObject } from '@algorandfoundation/algokit-common'\nimport {\n Address,\n Codec,\n MAX_TRANSACTION_GROUP_SIZE,\n SIGNATURE_ENCODING_INCR,\n TRANSACTION_DOMAIN_SEPARATOR,\n TRANSACTION_GROUP_DOMAIN_SEPARATOR,\n TRANSACTION_ID_LENGTH,\n concatArrays,\n decodeMsgpack,\n encodeMsgpack,\n hash,\n} from '@algorandfoundation/algokit-common'\nimport base32 from 'hi-base32'\nimport { AppCallTransactionFields, validateAppCallTransaction } from './app-call'\nimport { AssetConfigTransactionFields, validateAssetConfigTransaction } from './asset-config'\nimport { AssetFreezeTransactionFields, validateAssetFreezeTransaction } from './asset-freeze'\nimport { AssetTransferTransactionFields, validateAssetTransferTransaction } from './asset-transfer'\nimport { TransactionValidationError, getValidationErrorMessage } from './common'\nimport { HeartbeatTransactionFields } from './heartbeat'\nimport { KeyRegistrationTransactionFields, validateKeyRegistrationTransaction } from './key-registration'\nimport { PaymentTransactionFields } from './payment'\nimport { StateProofTransactionFields } from './state-proof'\nimport { transactionParamsCodec } from './transaction-meta'\nimport { TransactionType } from './transaction-type'\n\n/** Symbol used for instanceof checks across packages (CJS/ESM) */\nexport const TXN_SYMBOL = Symbol.for('algokit_transact:Transaction')\n\n/**\n * Represents the parameters for a complete Algorand transaction.\n *\n * This structure contains the fields that are present in every transaction,\n * regardless of transaction type, plus transaction-type-specific fields.\n */\nexport type TransactionParams = {\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n}\n\n/**\n * Represents a complete Algorand transaction.\n */\nexport class Transaction implements TransactionParams {\n /** @internal */\n [TXN_SYMBOL]: boolean\n\n /**\n * The type of transaction\n */\n type: TransactionType\n\n /**\n * The account that authorized the transaction.\n *\n * Fees are deducted from this account.\n */\n sender: Address\n\n /**\n * Optional transaction fee in microALGO.\n *\n * When not set, the fee will be interpreted as 0 by the network.\n */\n fee?: bigint\n\n /**\n * First round for when the transaction is valid.\n */\n firstValid: bigint\n\n /**\n * Last round for when the transaction is valid.\n *\n * After this round, the transaction will be expired.\n */\n lastValid: bigint\n\n /**\n * Hash of the genesis block of the network.\n *\n * Used to identify which network the transaction is for.\n */\n genesisHash?: Uint8Array\n\n /**\n * Genesis ID of the network.\n *\n * A human-readable string used alongside genesis hash to identify the network.\n */\n genesisId?: string\n\n /**\n * Optional user-defined note field.\n *\n * Can contain arbitrary data up to 1KB in size.\n */\n note?: Uint8Array\n\n /**\n * Optional authorized account for future transactions.\n *\n * If set, only this account will be used for transaction authorization going forward.\n * Reverting back control to the original address must be done by setting this field to\n * the original address.\n */\n rekeyTo?: Address\n\n /**\n * Optional lease value to enforce mutual transaction exclusion.\n *\n * When a transaction with a non-empty lease field is confirmed, the lease is acquired.\n * A lease X is acquired by the sender, generating the (sender, X) lease.\n * The lease is kept active until the last_valid round of the transaction has elapsed.\n * No other transaction sent by the same sender can be confirmed until the lease expires.\n */\n lease?: Uint8Array\n\n /**\n * Optional group ID for atomic transaction grouping.\n *\n * Transactions with the same group ID must execute together or not at all.\n */\n group?: Uint8Array\n\n /**\n * Payment specific fields\n */\n payment?: PaymentTransactionFields\n\n /**\n * Asset transfer specific fields\n */\n assetTransfer?: AssetTransferTransactionFields\n\n /**\n * Asset config specific fields\n */\n assetConfig?: AssetConfigTransactionFields\n\n /**\n * App call specific fields\n */\n appCall?: AppCallTransactionFields\n\n /**\n * Key registration specific fields\n */\n keyRegistration?: KeyRegistrationTransactionFields\n\n /**\n * Asset freeze specific fields\n */\n assetFreeze?: AssetFreezeTransactionFields\n\n /**\n * Heartbeat specific fields\n */\n heartbeat?: HeartbeatTransactionFields\n\n /**\n * State proof specific fields\n */\n stateProof?: StateProofTransactionFields\n\n constructor(params: TransactionParams) {\n this[TXN_SYMBOL] = true\n this.type = params.type\n this.sender = params.sender\n this.fee = params.fee\n this.firstValid = params.firstValid\n this.lastValid = params.lastValid\n this.genesisHash = params.genesisHash\n this.genesisId = params.genesisId\n this.note = params.note\n this.rekeyTo = params.rekeyTo\n this.lease = params.lease\n this.group = params.group\n this.payment = params.payment\n this.assetTransfer = params.assetTransfer\n this.assetConfig = params.assetConfig\n this.appCall = params.appCall\n this.keyRegistration = params.keyRegistration\n this.assetFreeze = params.assetFreeze\n this.heartbeat = params.heartbeat\n this.stateProof = params.stateProof\n }\n\n private rawTxId(): Uint8Array {\n if (this.genesisHash === undefined) {\n throw new Error('Cannot compute transaction id without genesis hash')\n }\n\n const encodedBytes = encodeTransaction(this)\n return hash(encodedBytes)\n }\n\n /**\n * Get the transaction ID as a base32-encoded string.\n */\n txId(): string {\n const rawTxId = this.rawTxId()\n\n return base32.encode(rawTxId).slice(0, TRANSACTION_ID_LENGTH)\n }\n}\n\n// Define Symbol.hasInstance outside the class to avoid Metro/Hermes parser issues\n// with static computed property names like `static [Symbol.hasInstance]()`\n// Also must handle Babel's _classCallCheck which uses instanceof before TXN_SYMBOL is set\nObject.defineProperty(Transaction, Symbol.hasInstance, {\n value: function (obj: unknown): boolean {\n // First check prototype chain (handles Babel's _classCallCheck and normal instances)\n if (obj instanceof Object && Object.getPrototypeOf(obj) === Transaction.prototype) {\n return true\n }\n // Then check for the brand symbol (handles cross-realm/serialized instances)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Boolean(obj && typeof obj === 'object' && TXN_SYMBOL in obj && (obj as any)[TXN_SYMBOL])\n },\n})\n\n/**\n * Codec for Transaction class.\n * Handles encoding/decoding between Transaction class instances and wire format.\n */\nclass TransactionCodec extends Codec<Transaction, Record<string, unknown>, WireObject> {\n public defaultValue(): Transaction {\n return new Transaction({\n type: TransactionType.Unknown,\n sender: Address.zeroAddress(),\n firstValid: 0n,\n lastValid: 0n,\n })\n }\n\n protected toEncoded(value: Transaction, format: EncodingFormat): Record<string, unknown> {\n return transactionParamsCodec.encode({ ...value }, format)\n }\n\n protected fromEncoded(value: WireObject, format: EncodingFormat): Transaction {\n const params = transactionParamsCodec.decode(value, format)\n return new Transaction(params)\n }\n\n public isDefaultValue(_: Transaction): boolean {\n return false\n }\n}\n\nexport const transactionCodec = new TransactionCodec()\n\nexport type FeeParams = {\n feePerByte: bigint\n minFee: bigint\n extraFee?: bigint\n maxFee?: bigint\n}\n\n/**\n * Get the transaction type from the encoded transaction.\n * This is particularly useful when decoding a transaction that has an unknown type\n */\nexport function getEncodedTransactionType(encoded_transaction: Uint8Array): TransactionType {\n const decoded = decodeTransaction(encoded_transaction)\n return decoded.type\n}\n\n/**\n * Encode the transaction with the domain separation (e.g. \"TX\") prefix\n *\n * @param transaction - The transaction to encode\n * @returns The MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransaction(transaction: Transaction): Uint8Array {\n const rawBytes = encodeTransactionRaw(transaction)\n\n // Add domain separation prefix\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n return concatArrays(prefixBytes, rawBytes)\n}\n\n/**\n * Encode transactions with the domain separation (e.g. \"TX\") prefix\n *\n * @param transactions - A collection of transactions to encode\n * @returns A collection of MsgPack encoded bytes or an error if encoding fails.\n */\nexport function encodeTransactions(transactions: Transaction[]): Uint8Array[] {\n return transactions.map((tx) => encodeTransaction(tx))\n}\n\n/**\n * Validate a transaction\n */\nexport function validateTransaction(transaction: Transaction): void {\n // Validate that only one transaction type specific field is set\n const typeFields = [\n transaction.payment,\n transaction.assetTransfer,\n transaction.assetConfig,\n transaction.appCall,\n transaction.keyRegistration,\n transaction.assetFreeze,\n transaction.heartbeat,\n transaction.stateProof,\n ]\n\n const setFieldsCount = typeFields.filter((field) => field !== undefined).length\n\n if (setFieldsCount > 1) {\n throw new Error('Multiple transaction type specific fields set')\n }\n\n // Perform type-specific validation where applicable\n let typeName = 'Transaction'\n const errors = new Array<TransactionValidationError>()\n if (transaction.assetTransfer) {\n typeName = 'Asset transfer'\n errors.push(...validateAssetTransferTransaction(transaction.assetTransfer))\n } else if (transaction.assetConfig) {\n typeName = 'Asset config'\n errors.push(...validateAssetConfigTransaction(transaction.assetConfig))\n } else if (transaction.appCall) {\n typeName = 'App call'\n errors.push(...validateAppCallTransaction(transaction.appCall))\n } else if (transaction.keyRegistration) {\n typeName = 'Key registration'\n errors.push(...validateKeyRegistrationTransaction(transaction.keyRegistration))\n } else if (transaction.assetFreeze) {\n typeName = 'Asset freeze'\n errors.push(...validateAssetFreezeTransaction(transaction.assetFreeze))\n }\n\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => getValidationErrorMessage(e))\n throw new Error(`${typeName} validation failed: ${errorMessages.join('\\n')}`)\n }\n}\n\n/**\n * Encode the transaction without the domain separation (e.g. \"TX\") prefix\n * This is useful for encoding the transaction for signing with tools that automatically add \"TX\" prefix to the transaction bytes.\n */\nexport function encodeTransactionRaw(transaction: Transaction): Uint8Array {\n const encodingData = transactionCodec.encode(transaction, 'msgpack')\n return encodeMsgpack(encodingData)\n}\n\n/**\n * Decodes MsgPack bytes into a transaction.\n *\n * # Parameters\n * * `encoded_transaction` - MsgPack encoded bytes representing a transaction.\n *\n * # Returns\n * A decoded transaction or an error if decoding fails.\n */\nexport function decodeTransaction(encoded_transaction: Uint8Array): Transaction {\n if (encoded_transaction.length === 0) {\n throw new Error('attempted to decode 0 bytes')\n }\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_DOMAIN_SEPARATOR)\n // Check if the transaction has the domain separation prefix\n let hasPrefix = true\n if (encoded_transaction.length < prefixBytes.length) {\n hasPrefix = false\n } else {\n for (let i = 0; i < prefixBytes.length; i++) {\n if (encoded_transaction[i] !== prefixBytes[i]) {\n hasPrefix = false\n break\n }\n }\n }\n\n const decodedData = decodeMsgpack(hasPrefix ? encoded_transaction.slice(prefixBytes.length) : encoded_transaction)\n return transactionCodec.decode(decodedData, 'msgpack')\n}\n\n/**\n * Decodes a collection of MsgPack bytes into a transaction collection.\n *\n * # Parameters\n * * `encoded_transaction` - A collection of MsgPack encoded bytes, each representing a transaction.\n *\n * # Returns\n * A collection of decoded transactions or an error if decoding fails.\n */\nexport function decodeTransactions(encoded_transactions: Uint8Array[]): Transaction[] {\n return encoded_transactions.map((et) => decodeTransaction(et))\n}\n\n/**\n * Return the size of the transaction in bytes as if it was already signed and encoded.\n * This is useful for estimating the fee for the transaction.\n */\nexport function estimateTransactionSize(transaction: Transaction): bigint {\n const encoded = encodeTransactionRaw(transaction)\n return BigInt(encoded.length + SIGNATURE_ENCODING_INCR)\n}\n\n/**\n * Groups a collection of transactions by calculating and assigning the group to each transaction.\n */\nexport function groupTransactions(transactions: Transaction[]): Transaction[] {\n const group = computeGroup(transactions)\n return transactions.map(\n (tx) =>\n new Transaction({\n ...tx,\n group,\n }),\n )\n}\n\nexport function assignFee(transaction: Transaction, feeParams: FeeParams): Transaction {\n const fee = calculateFee(transaction, feeParams)\n return new Transaction({\n ...transaction,\n fee,\n })\n}\n\nfunction computeGroup(transactions: Transaction[]): Uint8Array {\n if (transactions.length === 0) {\n throw new Error('Transaction group size cannot be 0')\n }\n\n if (transactions.length > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(`Transaction group size exceeds the max limit of ${MAX_TRANSACTION_GROUP_SIZE}`)\n }\n\n const txHashes = transactions.map((tx) => {\n if (tx.group) {\n throw new Error('Transactions must not already be grouped')\n }\n\n const encodedBytes = encodeTransaction(tx)\n return hash(encodedBytes)\n })\n\n const prefixBytes = new TextEncoder().encode(TRANSACTION_GROUP_DOMAIN_SEPARATOR)\n const encodedBytes = encodeMsgpack({\n txlist: txHashes,\n })\n\n const prefixedBytes = concatArrays(prefixBytes, encodedBytes)\n return hash(prefixedBytes)\n}\n\nexport function calculateFee(transaction: Transaction, feeParams: FeeParams): bigint {\n let calculatedFee = 0n\n\n if (feeParams.feePerByte > 0n) {\n const estimatedSize = estimateTransactionSize(transaction)\n calculatedFee = feeParams.feePerByte * BigInt(estimatedSize)\n }\n\n if (calculatedFee < feeParams.minFee) {\n calculatedFee = feeParams.minFee\n }\n\n if (feeParams.extraFee) {\n calculatedFee += feeParams.extraFee\n }\n\n if (feeParams.maxFee && calculatedFee > feeParams.maxFee) {\n throw new Error(`Transaction fee ${calculatedFee} µALGO is greater than maxFee ${feeParams.maxFee} µALGO`)\n }\n\n return calculatedFee\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA4BA,MAAa,aAAa,OAAO,IAAI,+BAA+B;;;;AAmIpE,IAAa,cAAb,MAAsD;;CAEpD,CAAC;;;;CAKD;;;;;;CAOA;;;;;;CAOA;;;;CAKA;;;;;;CAOA;;;;;;CAOA;;;;;;CAOA;;;;;;CAOA;;;;;;;;CASA;;;;;;;;;CAUA;;;;;;CAOA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;CAEA,YAAY,QAA2B;AACrC,OAAK,cAAc;AACnB,OAAK,OAAO,OAAO;AACnB,OAAK,SAAS,OAAO;AACrB,OAAK,MAAM,OAAO;AAClB,OAAK,aAAa,OAAO;AACzB,OAAK,YAAY,OAAO;AACxB,OAAK,cAAc,OAAO;AAC1B,OAAK,YAAY,OAAO;AACxB,OAAK,OAAO,OAAO;AACnB,OAAK,UAAU,OAAO;AACtB,OAAK,QAAQ,OAAO;AACpB,OAAK,QAAQ,OAAO;AACpB,OAAK,UAAU,OAAO;AACtB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,cAAc,OAAO;AAC1B,OAAK,UAAU,OAAO;AACtB,OAAK,kBAAkB,OAAO;AAC9B,OAAK,cAAc,OAAO;AAC1B,OAAK,YAAY,OAAO;AACxB,OAAK,aAAa,OAAO;;CAG3B,AAAQ,UAAsB;AAC5B,MAAI,KAAK,gBAAgB,OACvB,OAAM,IAAI,MAAM,qDAAqD;AAIvE,SAAO,KADc,kBAAkB,KAAK,CACnB;;;;;CAM3B,OAAe;EACb,MAAM,UAAU,KAAK,SAAS;AAE9B,SAAO,OAAO,OAAO,QAAQ,CAAC,MAAM,GAAG,sBAAsB;;;AAOjE,OAAO,eAAe,aAAa,OAAO,aAAa,EACrD,OAAO,SAAU,KAAuB;AAEtC,KAAI,eAAe,UAAU,OAAO,eAAe,IAAI,KAAK,YAAY,UACtE,QAAO;AAIT,QAAO,QAAQ,OAAO,OAAO,QAAQ,YAAY,cAAc,OAAQ,IAAY,YAAY;GAElG,CAAC;;;;;AAMF,IAAM,mBAAN,cAA+B,MAAwD;CACrF,AAAO,eAA4B;AACjC,SAAO,IAAI,YAAY;GACrB,MAAM,gBAAgB;GACtB,QAAQ,QAAQ,aAAa;GAC7B,YAAY;GACZ,WAAW;GACZ,CAAC;;CAGJ,AAAU,UAAU,OAAoB,QAAiD;AACvF,SAAO,uBAAuB,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO;;CAG5D,AAAU,YAAY,OAAmB,QAAqC;AAE5E,SAAO,IAAI,YADI,uBAAuB,OAAO,OAAO,OAAO,CAC7B;;CAGhC,AAAO,eAAe,GAAyB;AAC7C,SAAO;;;AAIX,MAAa,mBAAmB,IAAI,kBAAkB;;;;;AAatD,SAAgB,0BAA0B,qBAAkD;AAE1F,QADgB,kBAAkB,oBAAoB,CACvC;;;;;;;;AASjB,SAAgB,kBAAkB,aAAsC;CACtE,MAAM,WAAW,qBAAqB,YAAY;AAIlD,QAAO,aADa,IAAI,aAAa,CAAC,OAAO,6BAA6B,EACzC,SAAS;;;;;;;;AAS5C,SAAgB,mBAAmB,cAA2C;AAC5E,QAAO,aAAa,KAAK,OAAO,kBAAkB,GAAG,CAAC;;;;;AAMxD,SAAgB,oBAAoB,aAAgC;AAelE,KAbmB;EACjB,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACb,CAEiC,QAAQ,UAAU,UAAU,OAAU,CAAC,SAEpD,EACnB,OAAM,IAAI,MAAM,gDAAgD;CAIlE,IAAI,WAAW;CACf,MAAM,SAAS,IAAI,OAAmC;AACtD,KAAI,YAAY,eAAe;AAC7B,aAAW;AACX,SAAO,KAAK,GAAG,iCAAiC,YAAY,cAAc,CAAC;YAClE,YAAY,aAAa;AAClC,aAAW;AACX,SAAO,KAAK,GAAG,+BAA+B,YAAY,YAAY,CAAC;YAC9D,YAAY,SAAS;AAC9B,aAAW;AACX,SAAO,KAAK,GAAG,2BAA2B,YAAY,QAAQ,CAAC;YACtD,YAAY,iBAAiB;AACtC,aAAW;AACX,SAAO,KAAK,GAAG,mCAAmC,YAAY,gBAAgB,CAAC;YACtE,YAAY,aAAa;AAClC,aAAW;AACX,SAAO,KAAK,GAAG,+BAA+B,YAAY,YAAY,CAAC;;AAGzE,KAAI,OAAO,SAAS,GAAG;EACrB,MAAM,gBAAgB,OAAO,KAAK,MAAM,0BAA0B,EAAE,CAAC;AACrE,QAAM,IAAI,MAAM,GAAG,SAAS,sBAAsB,cAAc,KAAK,KAAK,GAAG;;;;;;;AAQjF,SAAgB,qBAAqB,aAAsC;AAEzE,QAAO,cADc,iBAAiB,OAAO,aAAa,UAAU,CAClC;;;;;;;;;;;AAYpC,SAAgB,kBAAkB,qBAA8C;AAC9E,KAAI,oBAAoB,WAAW,EACjC,OAAM,IAAI,MAAM,8BAA8B;CAGhD,MAAM,cAAc,IAAI,aAAa,CAAC,OAAO,6BAA6B;CAE1E,IAAI,YAAY;AAChB,KAAI,oBAAoB,SAAS,YAAY,OAC3C,aAAY;KAEZ,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,IACtC,KAAI,oBAAoB,OAAO,YAAY,IAAI;AAC7C,cAAY;AACZ;;CAKN,MAAM,cAAc,cAAc,YAAY,oBAAoB,MAAM,YAAY,OAAO,GAAG,oBAAoB;AAClH,QAAO,iBAAiB,OAAO,aAAa,UAAU;;;;;;;;;;;AAYxD,SAAgB,mBAAmB,sBAAmD;AACpF,QAAO,qBAAqB,KAAK,OAAO,kBAAkB,GAAG,CAAC;;;;;;AAOhE,SAAgB,wBAAwB,aAAkC;CACxE,MAAM,UAAU,qBAAqB,YAAY;AACjD,QAAO,OAAO,QAAQ,SAAS,wBAAwB;;;;;AAMzD,SAAgB,kBAAkB,cAA4C;CAC5E,MAAM,QAAQ,aAAa,aAAa;AACxC,QAAO,aAAa,KACjB,OACC,IAAI,YAAY;EACd,GAAG;EACH;EACD,CAAC,CACL;;AAGH,SAAgB,UAAU,aAA0B,WAAmC;CACrF,MAAM,MAAM,aAAa,aAAa,UAAU;AAChD,QAAO,IAAI,YAAY;EACrB,GAAG;EACH;EACD,CAAC;;AAGJ,SAAS,aAAa,cAAyC;AAC7D,KAAI,aAAa,WAAW,EAC1B,OAAM,IAAI,MAAM,qCAAqC;AAGvD,KAAI,aAAa,SAAS,2BACxB,OAAM,IAAI,MAAM,mDAAmD,6BAA6B;CAGlG,MAAM,WAAW,aAAa,KAAK,OAAO;AACxC,MAAI,GAAG,MACL,OAAM,IAAI,MAAM,2CAA2C;AAI7D,SAAO,KADc,kBAAkB,GAAG,CACjB;GACzB;AAQF,QAAO,KADe,aALF,IAAI,aAAa,CAAC,OAAO,mCAAmC,EAC3D,cAAc,EACjC,QAAQ,UACT,CAAC,CAE2D,CACnC;;AAG5B,SAAgB,aAAa,aAA0B,WAA8B;CACnF,IAAI,gBAAgB;AAEpB,KAAI,UAAU,aAAa,IAAI;EAC7B,MAAM,gBAAgB,wBAAwB,YAAY;AAC1D,kBAAgB,UAAU,aAAa,OAAO,cAAc;;AAG9D,KAAI,gBAAgB,UAAU,OAC5B,iBAAgB,UAAU;AAG5B,KAAI,UAAU,SACZ,kBAAiB,UAAU;AAG7B,KAAI,UAAU,UAAU,gBAAgB,UAAU,OAChD,OAAM,IAAI,MAAM,mBAAmB,cAAc,gCAAgC,UAAU,OAAO,QAAQ;AAG5G,QAAO"}
|
package/testing/account.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { Address } from "../packages/common/src/address.js";
|
|
|
2
2
|
import { AddressWithSigners, AddressWithTransactionSigner } from "../packages/transact/src/signer.js";
|
|
3
3
|
import { AlgodClient } from "../packages/algod_client/src/client.js";
|
|
4
4
|
import { KmdClient } from "../packages/kmd_client/src/client.js";
|
|
5
|
-
import { AlgorandClient } from "../
|
|
6
|
-
import { GetTestAccountParams } from "
|
|
5
|
+
import { AlgorandClient } from "../algorand-client.js";
|
|
6
|
+
import { GetTestAccountParams } from "./types.js";
|
|
7
7
|
|
|
8
8
|
//#region src/testing/account.d.ts
|
|
9
9
|
|
package/testing/account.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_address = require('../packages/common/src/address.js');
|
|
2
2
|
const require_config = require('../config.js');
|
|
3
|
-
const require_algorand_client = require('../
|
|
3
|
+
const require_algorand_client = require('../algorand-client.js');
|
|
4
4
|
|
|
5
5
|
//#region src/testing/account.ts
|
|
6
6
|
async function getTestAccount({ suppressLog, initialFunds, accountGetter }, algodOrAlgorandClient, kmd) {
|
|
@@ -22,8 +22,7 @@ async function getTestAccount({ suppressLog, initialFunds, accountGetter }, algo
|
|
|
22
22
|
require_config.Config.getLogger(suppressLog).info("Test account funded; account balance: %d µALGO", accountInfo.balance.microAlgo);
|
|
23
23
|
algorand.setSignerFromAccount(account);
|
|
24
24
|
const address = require_address.Address.fromString(account.addr.toString());
|
|
25
|
-
|
|
26
|
-
address.signer = algorand.account.getSigner(address);
|
|
25
|
+
for (const key of Object.keys(account)) if (!(key in address)) address[key] = account[key];
|
|
27
26
|
return address;
|
|
28
27
|
}
|
|
29
28
|
|