@algorandfoundation/algokit-utils 10.0.0-alpha.3 → 10.0.0-alpha.31
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/algod-client/index.d.ts +3 -7
- package/algod-client/index.js +2 -5
- package/algod-client/index.mjs +2 -2
- package/index.d.ts +1 -2
- package/index.js +0 -7
- package/index.mjs +1 -2
- 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/kmd-client/index.d.ts +1 -2
- package/kmd-client/index.js +0 -5
- package/kmd-client/index.mjs +1 -2
- package/package.json +5 -6
- 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.js +1 -2
- package/testing/account.js.map +1 -1
- package/testing/account.mjs +1 -2
- package/testing/account.mjs.map +1 -1
- package/testing/fixtures/algorand-fixture.d.ts +3 -3
- package/testing/fixtures/algorand-fixture.js.map +1 -1
- package/testing/fixtures/algorand-fixture.mjs.map +1 -1
- package/testing/transaction-logger.js +1 -1
- package/testing/transaction-logger.mjs +1 -1
- package/transact/index.d.ts +11 -10
- package/transact/index.js +7 -31
- package/transact/index.mjs +7 -10
- 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/transactions/app-call.d.ts +5 -4
- package/transactions/app-call.js +16 -16
- package/transactions/app-call.js.map +1 -1
- package/transactions/app-call.mjs +16 -16
- 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/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 +1 -1
- package/transactions/method-call.js +77 -84
- package/transactions/method-call.js.map +1 -1
- package/transactions/method-call.mjs +77 -84
- package/transactions/method-call.mjs.map +1 -1
- package/types/account-manager.d.ts +7 -9
- package/types/account-manager.js +17 -7
- package/types/account-manager.js.map +1 -1
- package/types/account-manager.mjs +17 -7
- package/types/account-manager.mjs.map +1 -1
- package/types/algorand-client-transaction-creator.d.ts +53 -39
- package/types/algorand-client-transaction-creator.js +8 -0
- package/types/algorand-client-transaction-creator.js.map +1 -1
- package/types/algorand-client-transaction-creator.mjs +8 -0
- package/types/algorand-client-transaction-creator.mjs.map +1 -1
- package/types/algorand-client-transaction-sender.d.ts +58 -44
- package/types/algorand-client-transaction-sender.js +8 -1
- package/types/algorand-client-transaction-sender.js.map +1 -1
- package/types/algorand-client-transaction-sender.mjs +8 -0
- package/types/algorand-client-transaction-sender.mjs.map +1 -1
- package/types/amount.js +23 -4
- package/types/amount.js.map +1 -1
- package/types/amount.mjs +20 -2
- package/types/amount.mjs.map +1 -1
- package/types/app-client.d.ts +111 -106
- package/types/app-client.js +2 -3
- package/types/app-client.js.map +1 -1
- package/types/app-client.mjs +2 -2
- package/types/app-client.mjs.map +1 -1
- package/types/app-deployer.d.ts +1 -1
- package/types/app-deployer.js +3 -3
- package/types/app-deployer.js.map +1 -1
- package/types/app-deployer.mjs +3 -3
- package/types/app-deployer.mjs.map +1 -1
- package/types/app-factory.d.ts +44 -41
- package/types/app-factory.js +2 -2
- package/types/app-factory.js.map +1 -1
- package/types/app-factory.mjs +2 -2
- package/types/app-factory.mjs.map +1 -1
- package/types/app-manager.d.ts +3 -1
- package/types/app-manager.js +17 -11
- package/types/app-manager.js.map +1 -1
- package/types/app-manager.mjs +17 -11
- package/types/app-manager.mjs.map +1 -1
- package/types/app-spec.js +12 -5
- package/types/app-spec.js.map +1 -1
- package/types/app-spec.mjs +12 -5
- package/types/app-spec.mjs.map +1 -1
- package/types/app.d.ts +2 -2
- package/types/app.js.map +1 -1
- package/types/app.mjs.map +1 -1
- package/types/asset-manager.js +1 -1
- package/types/asset-manager.js.map +1 -1
- package/types/asset-manager.mjs +1 -1
- package/types/asset-manager.mjs.map +1 -1
- package/types/async-event-emitter.d.ts +3 -6
- package/types/async-event-emitter.js.map +1 -1
- package/types/async-event-emitter.mjs.map +1 -1
- package/types/client-manager.d.ts +1 -1
- package/types/client-manager.js.map +1 -1
- package/types/client-manager.mjs.map +1 -1
- package/types/composer.d.ts +11 -3
- package/types/composer.js +55 -46
- package/types/composer.js.map +1 -1
- package/types/composer.mjs +46 -36
- package/types/composer.mjs.map +1 -1
- package/types/debugging.d.ts +13 -9
- package/types/debugging.js.map +1 -1
- package/types/debugging.mjs.map +1 -1
- package/types/expand.d.ts +2 -9
- package/types/kmd-account-manager.d.ts +1 -0
- package/types/kmd-account-manager.js +22 -11
- package/types/kmd-account-manager.js.map +1 -1
- package/types/kmd-account-manager.mjs +23 -12
- package/types/kmd-account-manager.mjs.map +1 -1
- package/types/lifecycle-events.d.ts +0 -1
- package/types/lifecycle-events.js.map +1 -1
- package/types/lifecycle-events.mjs.map +1 -1
- package/types/testing.d.ts +4 -4
- package/types/transaction.d.ts +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
package/types/composer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.js","names":["AppManager","decodeTransaction","encodeTransactionRaw","MAX_TRANSACTION_GROUP_SIZE","OnApplicationComplete","extractComposerTransactionsFromAppMethodCallParams","processAppMethodCallArgs","TransactionType","genesisIdIsLocalNet","transaction: Transaction","buildPayment","buildAssetCreate","buildAssetConfig","buildAssetFreeze","buildAssetDestroy","buildAssetTransfer","buildAssetOptIn","buildAssetOptOut","buildAppCreate","buildAppUpdate","buildAppCall","buildKeyReg","buildAppCreateMethodCall","buildAppUpdateMethodCall","buildAppCallMethodCall","assignFee","transactionAnalysis: Array<{\n groupIndex: number\n requiredFeeDelta?: FeeDelta\n priority: FeePriority\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n }>","FeeDelta","FeePriority","indexesWithAccessReferences: number[]","additionalFeeDelta: FeeDelta | undefined","groupTransactions","appCallIndexesWithoutMaxFees: number[]","Transaction","simulateRequest: SimulateRequest","EMPTY_SIGNATURE","txnAnalysisResults: TransactionAnalysis[]","requiredFeeDelta: FeeDelta | undefined","calculateFee","calculateInnerFeeDelta","Buffer","Config","encodeSignedTransactions","waitForConfirmation","originalError: any","sentTransactions: Transaction[] | undefined","transactionsWithEmptySigners: TransactionWithSigner[]","makeEmptyTransactionSigner","EventType","transactionsWithSigner: TransactionWithSigner[]","asJson","decodeSignedTransaction","AlgoAmount"],"sources":["../../src/types/composer.ts"],"sourcesContent":["import { ABIMethod, ABIReturn } from '@algorandfoundation/algokit-abi'\nimport {\n AlgodClient,\n PendingTransactionResponse,\n SimulateRequest,\n SimulateResponse,\n SimulateUnnamedResourcesAccessed,\n SuggestedParams,\n} from '@algorandfoundation/algokit-algod-client'\nimport { EMPTY_SIGNATURE } from '@algorandfoundation/algokit-common'\nimport {\n OnApplicationComplete,\n SignedTransaction,\n Transaction,\n TransactionSigner,\n TransactionType,\n assignFee,\n calculateFee,\n decodeSignedTransaction,\n decodeTransaction,\n encodeSignedTransactions,\n encodeTransactionRaw,\n groupTransactions,\n makeEmptyTransactionSigner,\n} from '@algorandfoundation/algokit-transact'\nimport { Buffer } from 'buffer'\nimport { Config } from '../config'\nimport { TransactionWithSigner, waitForConfirmation } from '../transaction'\nimport {\n buildAppCall,\n buildAppCreate,\n buildAppUpdate,\n populateGroupResources,\n populateTransactionResources,\n type AppCallParams,\n type AppCreateParams,\n type AppDeleteParams,\n type AppUpdateParams,\n type CommonAppCallParams,\n} from '../transactions/app-call'\nimport {\n buildAssetOptIn,\n buildAssetOptOut,\n buildAssetTransfer,\n type AssetOptInParams,\n type AssetOptOutParams,\n type AssetTransferParams,\n} from '../transactions/asset-transfer'\n\nimport { MAX_TRANSACTION_GROUP_SIZE, ReadableAddress } from '@algorandfoundation/algokit-common'\nimport {\n buildAssetConfig,\n buildAssetCreate,\n buildAssetDestroy,\n buildAssetFreeze,\n type AssetConfigParams,\n type AssetCreateParams,\n type AssetDestroyParams,\n type AssetFreezeParams,\n} from '../transactions/asset-config'\nimport { FeeDelta, FeePriority, calculateInnerFeeDelta } from '../transactions/fee-coverage'\nimport { buildKeyReg, type OfflineKeyRegistrationParams, type OnlineKeyRegistrationParams } from '../transactions/key-registration'\nimport {\n AsyncTransactionParams,\n ProcessedAppCallMethodCall,\n ProcessedAppCreateMethodCall,\n ProcessedAppUpdateMethodCall,\n TransactionParams,\n buildAppCallMethodCall,\n buildAppCreateMethodCall,\n buildAppUpdateMethodCall,\n extractComposerTransactionsFromAppMethodCallParams,\n processAppMethodCallArgs,\n type AppCallMethodCall,\n type AppCreateMethodCall,\n type AppDeleteMethodCall,\n type AppUpdateMethodCall,\n} from '../transactions/method-call'\nimport { buildPayment, type PaymentParams } from '../transactions/payment'\nimport { asJson } from '../util'\nimport { AlgoAmount } from './amount'\nimport { AppManager } from './app-manager'\nimport { Expand } from './expand'\nimport { EventType } from './lifecycle-events'\nimport { genesisIdIsLocalNet } from './network-client'\nimport { Arc2TransactionNote, SendParams, SendTransactionComposerResults } from './transaction'\n\n// Re-export transaction parameter types\nexport type {\n AppCallParams,\n AppCreateParams,\n AppDeleteParams,\n AppMethodCallParams,\n AppUpdateParams,\n CommonAppCallParams,\n} from '../transactions/app-call'\nexport type { AssetConfigParams, AssetCreateParams, AssetDestroyParams, AssetFreezeParams } from '../transactions/asset-config'\nexport type { AssetOptInParams, AssetOptOutParams, AssetTransferParams } from '../transactions/asset-transfer'\nexport type { CommonTransactionParams } from '../transactions/common'\nexport type { OfflineKeyRegistrationParams, OnlineKeyRegistrationParams } from '../transactions/key-registration'\nexport type {\n AppCallMethodCall,\n AppCreateMethodCall,\n AppDeleteMethodCall,\n AppMethodCall,\n AppMethodCallTransactionArgument,\n AppUpdateMethodCall,\n ProcessedAppCallMethodCall,\n ProcessedAppCreateMethodCall,\n ProcessedAppUpdateMethodCall,\n} from '../transactions/method-call'\nexport type { PaymentParams } from '../transactions/payment'\n\n/** Options to control a simulate request, that does not require transaction signing */\nexport type SkipSignaturesSimulateOptions = Expand<\n Omit<RawSimulateOptions, 'fixSigners' | 'allowEmptySignatures'> & {\n /** Whether or not to skip signatures for all built transactions and use an empty signer instead.\n * This will set `fixSigners` and `allowEmptySignatures` when sending the request to the algod API.\n */\n skipSignatures: boolean\n }\n>\n\n/** The raw API options to control a simulate request.\n * See algod API docs for more information: https://dev.algorand.co/reference/rest-apis/algod/#simulatetransaction\n */\nexport type RawSimulateOptions = Expand<Omit<SimulateRequest, 'txnGroups'>> & {\n /** Whether or not to return the result on simulation failure instead of throwing an error */\n resultOnFailure?: boolean\n}\n\n/** All options to control a simulate request */\nexport type SimulateOptions = Expand<Partial<SkipSignaturesSimulateOptions> & RawSimulateOptions>\n\ntype Txn =\n | { data: PaymentParams; type: 'pay' }\n | { data: AssetCreateParams; type: 'assetCreate' }\n | { data: AssetConfigParams; type: 'assetConfig' }\n | { data: AssetFreezeParams; type: 'assetFreeze' }\n | { data: AssetDestroyParams; type: 'assetDestroy' }\n | { data: AssetTransferParams; type: 'assetTransfer' }\n | { data: AssetOptInParams; type: 'assetOptIn' }\n | { data: AssetOptOutParams; type: 'assetOptOut' }\n | { data: AppCallParams | AppCreateParams | AppUpdateParams; type: 'appCall' }\n | { data: OnlineKeyRegistrationParams | OfflineKeyRegistrationParams; type: 'keyReg' }\n | { data: TransactionParams; type: 'txn' }\n | { data: AsyncTransactionParams; type: 'asyncTxn' }\n | { data: ProcessedAppCallMethodCall | ProcessedAppCreateMethodCall | ProcessedAppUpdateMethodCall; type: 'methodCall' }\n\n/**\n * A function that transforms an error into a new error.\n *\n * In most cases, an ErrorTransformer should first check if it can or should transform the error\n * and return the input error if it cannot or should not transform it.\n */\nexport type ErrorTransformer = (error: Error) => Promise<Error>\n\nclass InvalidErrorTransformerValue extends Error {\n constructor(originalError: unknown, value: unknown) {\n super(`An error transformer returned a non-error value: ${value}. The original error before any transformation: ${originalError}`)\n }\n}\n\nclass ErrorTransformerError extends Error {\n constructor(originalError: Error, cause: unknown) {\n super(`An error transformer threw an error: ${cause}. The original error before any transformation: ${originalError} `, { cause })\n }\n}\n\nexport type TransactionComposerConfig = {\n coverAppCallInnerTransactionFees: boolean\n populateAppCallResources: boolean\n}\n\ntype TransactionAnalysis = {\n /** The fee difference required for this transaction */\n requiredFeeDelta?: FeeDelta\n /** Resources accessed by this transaction but not declared */\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n}\n\ntype GroupAnalysis = {\n /** Analysis of each transaction in the group */\n transactions: TransactionAnalysis[]\n /** Resources accessed by the group that qualify for group resource sharing */\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n}\n\n/** Parameters to create an `TransactionComposer`. */\nexport type TransactionComposerParams = {\n /** The algod client to use to get suggestedParams and send the transaction group */\n algod: AlgodClient\n /** The function used to get the TransactionSigner for a given address */\n getSigner: (address: ReadableAddress) => TransactionSigner\n /** The method used to get SuggestedParams for transactions in the group */\n getSuggestedParams?: () => Promise<SuggestedParams>\n /** How many rounds a transaction should be valid for by default; if not specified\n * then will be 10 rounds (or 1000 rounds if issuing transactions to LocalNet).\n */\n defaultValidityWindow?: bigint\n /** An existing `AppManager` to use to manage app compilation and cache compilation results.\n *\n * If not specified then an ephemeral one will be created.\n */\n appManager?: AppManager\n /**\n * An array of error transformers to use when an error is caught in simulate or execute\n * callbacks can later be registered with `registerErrorTransformer`\n */\n errorTransformers?: ErrorTransformer[]\n composerConfig?: TransactionComposerConfig\n}\n\n/** Set of transactions built by `TransactionComposer`. */\nexport interface BuiltTransactions {\n /** The built transactions */\n transactions: Transaction[]\n /** Any `ABIMethod` objects associated with any of the transactions in a map keyed by transaction index. */\n methodCalls: Map<number, ABIMethod>\n /** Any `TransactionSigner` objects associated with any of the transactions in a map keyed by transaction index. */\n signers: Map<number, TransactionSigner>\n}\n\n/** TransactionComposer helps you compose and execute transactions as a transaction group. */\nexport class TransactionComposer {\n /** Transactions that have not yet been composed */\n private txns: Txn[] = []\n\n /** The algod client used by the composer. */\n private algod: AlgodClient\n\n /** An async function that will return suggested params for the transaction. */\n private getSuggestedParams: () => Promise<SuggestedParams>\n\n /** A function that takes in an address and return a signer function for that address. */\n private getSigner: (address: ReadableAddress) => TransactionSigner\n\n /** The default transaction validity window */\n private defaultValidityWindow = 10n\n\n /** Whether the validity window was explicitly set on construction */\n private defaultValidityWindowIsExplicit = false\n\n private appManager: AppManager\n\n private errorTransformers: ErrorTransformer[]\n\n private composerConfig: TransactionComposerConfig\n\n private transactionsWithSigners?: TransactionWithSigner[]\n\n private signedTransactions?: SignedTransaction[]\n\n // Cache the raw transactions before resource population for error handling\n private rawBuildTransactions?: Transaction[]\n\n private async transformError(originalError: unknown): Promise<unknown> {\n // Transformers only work with Error instances, so immediately return anything else\n if (!(originalError instanceof Error)) {\n return originalError\n }\n\n let transformedError = originalError\n\n for (const transformer of this.errorTransformers) {\n try {\n transformedError = await transformer(transformedError)\n if (!(transformedError instanceof Error)) {\n return new InvalidErrorTransformerValue(originalError, transformedError)\n }\n } catch (errorFromTransformer) {\n return new ErrorTransformerError(originalError, errorFromTransformer)\n }\n }\n\n return transformedError\n }\n\n private validateReferenceParams(\n params: Pick<CommonAppCallParams, 'accessReferences' | 'appReferences' | 'assetReferences' | 'boxReferences'>,\n ) {\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n const hasLegacyReferences =\n (params.appReferences && params.appReferences.length > 0) ||\n (params.assetReferences && params.assetReferences.length > 0) ||\n (params.boxReferences && params.boxReferences.length > 0)\n\n if (hasAccessReferences && hasLegacyReferences) {\n throw new Error('Cannot specify both `accessReferences` and reference arrays (`appReferences`, `assetReferences`, `boxReferences`).')\n }\n }\n\n /**\n * Create a `TransactionComposer`.\n * @param params The configuration for this composer\n * @returns The `TransactionComposer` instance\n */\n constructor(params: TransactionComposerParams) {\n this.algod = params.algod\n const defaultGetSuggestedParams = () => params.algod.suggestedParams()\n this.getSuggestedParams = params.getSuggestedParams ?? defaultGetSuggestedParams\n this.getSigner = params.getSigner\n this.defaultValidityWindow = params.defaultValidityWindow ?? this.defaultValidityWindow\n this.defaultValidityWindowIsExplicit = params.defaultValidityWindow !== undefined\n this.appManager = params.appManager ?? new AppManager(params.algod)\n this.errorTransformers = params.errorTransformers ?? []\n this.composerConfig = params.composerConfig ?? {\n coverAppCallInnerTransactionFees: false,\n populateAppCallResources: true,\n }\n }\n\n private cloneTransaction(txn: Txn): Txn {\n // The transaction params aren't meant to be mutated therefore a shallow clone is ok here\n // Only exceptions are txn and asyncTxn where they are encoded, then decoded\n switch (txn.type) {\n case 'pay':\n return {\n type: 'pay',\n data: { ...txn.data },\n }\n case 'assetCreate':\n return {\n type: 'assetCreate',\n data: { ...txn.data },\n }\n case 'assetConfig':\n return {\n type: 'assetConfig',\n data: { ...txn.data },\n }\n case 'assetFreeze':\n return {\n type: 'assetFreeze',\n data: { ...txn.data },\n }\n case 'assetDestroy':\n return {\n type: 'assetDestroy',\n data: { ...txn.data },\n }\n case 'assetTransfer':\n return {\n type: 'assetTransfer',\n data: { ...txn.data },\n }\n case 'assetOptIn':\n return {\n type: 'assetOptIn',\n data: { ...txn.data },\n }\n case 'assetOptOut':\n return {\n type: 'assetOptOut',\n data: { ...txn.data },\n }\n case 'appCall':\n return {\n type: 'appCall',\n data: { ...txn.data },\n }\n case 'keyReg':\n return {\n type: 'keyReg',\n data: { ...txn.data },\n }\n case 'txn': {\n const { txn: transaction, signer, maxFee } = txn.data\n const encoded = encodeTransactionRaw(transaction)\n const clonedTxn = decodeTransaction(encoded)\n delete clonedTxn.group\n return {\n type: 'txn',\n data: {\n txn: clonedTxn,\n signer,\n maxFee,\n },\n }\n }\n case 'asyncTxn': {\n const { txn: txnPromise, signer, maxFee } = txn.data\n // Create a new promise that resolves to a deep cloned transaction without the group field\n const newTxnPromise = txnPromise.then((resolvedTxn) => {\n const encoded = encodeTransactionRaw(resolvedTxn)\n const clonedTxn = decodeTransaction(encoded)\n delete clonedTxn.group\n return clonedTxn\n })\n return {\n type: 'asyncTxn',\n data: {\n txn: newTxnPromise,\n signer,\n maxFee: maxFee,\n },\n }\n }\n case 'methodCall':\n return {\n type: 'methodCall',\n data: { ...txn.data },\n }\n }\n }\n\n private push(...txns: Txn[]): void {\n if (this.transactionsWithSigners) {\n throw new Error('Cannot add new transactions after building')\n }\n const newSize = this.txns.length + txns.length\n if (newSize > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(\n `Adding ${txns.length} transaction(s) would exceed the maximum group size. Current: ${this.txns.length}, Maximum: ${MAX_TRANSACTION_GROUP_SIZE}`,\n )\n }\n this.txns.push(...txns)\n }\n\n public clone(composerConfig?: TransactionComposerConfig) {\n const newComposer = new TransactionComposer({\n algod: this.algod,\n getSuggestedParams: this.getSuggestedParams,\n getSigner: this.getSigner,\n defaultValidityWindow: this.defaultValidityWindow,\n appManager: this.appManager,\n errorTransformers: this.errorTransformers,\n composerConfig: {\n ...this.composerConfig,\n ...composerConfig,\n },\n })\n\n this.txns.forEach((txn) => {\n newComposer.txns.push(this.cloneTransaction(txn))\n })\n\n newComposer.defaultValidityWindowIsExplicit = this.defaultValidityWindowIsExplicit\n\n return newComposer\n }\n\n /**\n * Register a function that will be used to transform an error caught when simulating or executing\n *\n * @returns The composer so you can chain method calls\n */\n registerErrorTransformer(transformer: ErrorTransformer) {\n this.errorTransformers.push(transformer)\n return this\n }\n\n /**\n * Add a pre-built transaction to the transaction group.\n * @param transaction The pre-built transaction\n * @param signer Optional signer override for the transaction\n * @returns The composer so you can chain method calls\n * @example\n * ```typescript\n * composer.addTransaction(txn)\n * ```\n */\n addTransaction(transaction: Transaction, signer?: TransactionSigner): TransactionComposer {\n if (transaction.group) {\n throw new Error('Cannot add a transaction to the composer because it is already in a group')\n }\n this.push({\n data: {\n txn: transaction,\n signer: signer ?? this.getSigner(transaction.sender),\n },\n type: 'txn',\n })\n\n return this\n }\n\n /**\n * Add another transaction composer to the current transaction composer.\n * The transaction params of the input transaction composer will be added.\n * If the input transaction composer is updated, it won't affect the current transaction composer.\n * @param composer The transaction composer to add\n * @returns The composer so you can chain method calls\n * @example\n * ```typescript\n * const innerComposer = algorand.newGroup()\n * .addPayment({ sender: 'SENDER', receiver: 'RECEIVER', amount: (1).algo() })\n * .addPayment({ sender: 'SENDER', receiver: 'RECEIVER', amount: (2).algo() })\n *\n * composer.addTransactionComposer(innerComposer)\n * ```\n */\n public addTransactionComposer(composer: TransactionComposer): TransactionComposer {\n const clonedTxns = composer.txns.map((txn) => this.cloneTransaction(txn))\n this.push(...clonedTxns)\n\n return this\n }\n\n /**\n * Add a payment transaction to the transaction group.\n * @param params The payment transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addPayment({\n * sender: 'SENDERADDRESS',\n * receiver: 'RECEIVERADDRESS',\n * amount: (4).algo(),\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addPayment({\n * amount: (4).algo(),\n * receiver: 'RECEIVERADDRESS',\n * sender: 'SENDERADDRESS',\n * closeRemainderTo: 'CLOSEREMAINDERTOADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // Use this with caution, it's generally better to use algorand.account.rekeyAccount\n * rekeyTo: 'REKEYTOADDRESS',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n */\n addPayment(params: PaymentParams): TransactionComposer {\n this.push({ data: params, type: 'pay' })\n\n return this\n }\n\n /**\n * Add an asset create transaction to the transaction group.\n * @param params The asset create transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetCreate({ sender: \"CREATORADDRESS\", total: 100n})\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetCreate({\n * sender: 'CREATORADDRESS',\n * total: 100n,\n * decimals: 2,\n * assetName: 'asset',\n * unitName: 'unit',\n * url: 'url',\n * metadataHash: 'metadataHash',\n * defaultFrozen: false,\n * manager: 'MANAGERADDRESS',\n * reserve: 'RESERVEADDRESS',\n * freeze: 'FREEZEADDRESS',\n * clawback: 'CLAWBACKADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n */\n addAssetCreate(params: AssetCreateParams): TransactionComposer {\n this.push({ data: params, type: 'assetCreate' })\n\n return this\n }\n\n /**\n * Add an asset config transaction to the transaction group.\n * @param params The asset config transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetConfig({ sender: \"MANAGERADDRESS\", assetId: 123456n, manager: \"MANAGERADDRESS\" })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetConfig({\n * sender: 'MANAGERADDRESS',\n * assetId: 123456n,\n * manager: 'MANAGERADDRESS',\n * reserve: 'RESERVEADDRESS',\n * freeze: 'FREEZEADDRESS',\n * clawback: 'CLAWBACKADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n */\n addAssetConfig(params: AssetConfigParams): TransactionComposer {\n this.push({ data: params, type: 'assetConfig' })\n\n return this\n }\n\n /**\n * Add an asset freeze transaction to the transaction group.\n * @param params The asset freeze transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetFreeze({ sender: \"MANAGERADDRESS\", assetId: 123456n, account: \"ACCOUNTADDRESS\", frozen: true })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetFreeze({\n * sender: 'MANAGERADDRESS',\n * assetId: 123456n,\n * account: 'ACCOUNTADDRESS',\n * frozen: true,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetFreeze(params: AssetFreezeParams): TransactionComposer {\n this.push({ data: params, type: 'assetFreeze' })\n\n return this\n }\n\n /**\n * Add an asset destroy transaction to the transaction group.\n * @param params The asset destroy transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetDestroy({ sender: \"MANAGERADDRESS\", assetId: 123456n })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetDestroy({\n * sender: 'MANAGERADDRESS',\n * assetId: 123456n,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetDestroy(params: AssetDestroyParams): TransactionComposer {\n this.push({ data: params, type: 'assetDestroy' })\n\n return this\n }\n\n /**\n * Add an asset transfer transaction to the transaction group.\n * @param params The asset transfer transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetTransfer({ sender: \"HOLDERADDRESS\", assetId: 123456n, amount: 1n, receiver: \"RECEIVERADDRESS\" })\n * ```\n * @example Advanced example (with clawback)\n * ```typescript\n * composer.addAssetTransfer({\n * sender: 'CLAWBACKADDRESS',\n * assetId: 123456n,\n * amount: 1n,\n * receiver: 'RECEIVERADDRESS',\n * clawbackTarget: 'HOLDERADDRESS',\n * // This field needs to be used with caution\n * closeAssetTo: 'ADDRESSTOCLOSETO'\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetTransfer(params: AssetTransferParams): TransactionComposer {\n this.push({ data: params, type: 'assetTransfer' })\n\n return this\n }\n\n /**\n * Add an asset opt-in transaction to the transaction group.\n * @param params The asset opt-in transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetOptIn({ sender: \"SENDERADDRESS\", assetId: 123456n })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetOptIn({\n * sender: 'SENDERADDRESS',\n * assetId: 123456n,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetOptIn(params: AssetOptInParams): TransactionComposer {\n this.push({ data: params, type: 'assetOptIn' })\n\n return this\n }\n\n /**\n * Add an asset opt-out transaction to the transaction group.\n * @param params The asset opt-out transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example (without creator, will be retrieved from algod)\n * ```typescript\n * composer.addAssetOptOut({ sender: \"SENDERADDRESS\", assetId: 123456n, ensureZeroBalance: true })\n * ```\n * @example Basic example (with creator)\n * ```typescript\n * composer.addAssetOptOut({ sender: \"SENDERADDRESS\", creator: \"CREATORADDRESS\", assetId: 123456n, ensureZeroBalance: true })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetOptOut({\n * sender: 'SENDERADDRESS',\n * assetId: 123456n,\n * creator: 'CREATORADDRESS',\n * ensureZeroBalance: true,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetOptOut(params: AssetOptOutParams): TransactionComposer {\n this.push({ data: params, type: 'assetOptOut' })\n\n return this\n }\n\n /**\n * Add an application create transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application create transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppCreate({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppCreate({\n * sender: 'CREATORADDRESS',\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * schema: {\n * globalInts: 1,\n * globalByteSlices: 2,\n * localInts: 3,\n * localByteSlices: 4\n * },\n * extraProgramPages: 1,\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * // Signer only needed if you want to provide one,\n * // generally you'd register it with AlgorandClient\n * // against the sender and not need to pass it in\n * signer: transactionSigner,\n * maxRoundsToWaitForConfirmation: 5,\n * suppressLog: true,\n *})\n * ```\n */\n addAppCreate(params: AppCreateParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: params, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an application update transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application update transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppUpdate({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppUpdate({\n * sender: 'CREATORADDRESS',\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * onComplete: OnApplicationComplete.UpdateApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppUpdate(params: AppUpdateParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: { ...params, onComplete: OnApplicationComplete.UpdateApplication }, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an application delete transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application delete transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppDelete({ sender: 'CREATORADDRESS' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppDelete({\n * sender: 'CREATORADDRESS',\n * onComplete: OnApplicationComplete.DeleteApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppDelete(params: AppDeleteParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: { ...params, onComplete: OnApplicationComplete.DeleteApplication }, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an application call transaction to the transaction group.\n *\n * If you want to create or update an app use `addAppCreate` or `addAppUpdate`.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppCall({ sender: 'CREATORADDRESS' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppCall({\n * sender: 'CREATORADDRESS',\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppCall(params: AppCallParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: params, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an ABI method create application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI create method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCreateMethodCall({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCreateMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * schema: {\n * globalInts: 1,\n * globalByteSlices: 2,\n * localInts: 3,\n * localByteSlices: 4\n * },\n * extraProgramPages: 1,\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppCreateMethodCall(params: AppCreateMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args) },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add an ABI method update application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI update method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppUpdateMethodCall({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppUpdateMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * onComplete: OnApplicationComplete.UpdateApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppUpdateMethodCall(params: AppUpdateMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args), onComplete: OnApplicationComplete.UpdateApplication },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add an ABI method delete application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI delete method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppDeleteMethodCall({ sender: 'CREATORADDRESS', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppDeleteMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * onComplete: OnApplicationComplete.DeleteApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppDeleteMethodCall(params: AppDeleteMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args), onComplete: OnApplicationComplete.DeleteApplication },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add a non-create/non-update ABI method application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCallMethodCall({ sender: 'CREATORADDRESS', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCallMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n *})\n * ```\n */\n addAppCallMethodCall(params: AppCallMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args) },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add an online key registration transaction to the transaction group.\n * @param params The online key registration transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addOnlineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * voteKey: Uint8Array.from(Buffer.from(\"voteKeyBase64\", 'base64')),\n * selectionKey: Uint8Array.from(Buffer.from(\"selectionKeyBase64\", 'base64')),\n * stateProofKey: Uint8Array.from(Buffer.from(\"stateProofKeyBase64\", 'base64')),\n * voteFirst: 1n,\n * voteLast: 1000n,\n * voteKeyDilution: 1n,\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addOnlineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * voteKey: Uint8Array.from(Buffer.from(\"voteKeyBase64\", 'base64')),\n * selectionKey: Uint8Array.from(Buffer.from(\"selectionKeyBase64\", 'base64')),\n * stateProofKey: Uint8Array.from(Buffer.from(\"stateProofKeyBase64\", 'base64')),\n * voteFirst: 1n,\n * voteLast: 1000n,\n * voteKeyDilution: 1n,\n * lease: 'lease',\n * note: 'note',\n * // Use this with caution, it's generally better to use algorand.account.rekeyAccount\n * rekeyTo: 'REKEYTOADDRESS',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addOnlineKeyRegistration(params: OnlineKeyRegistrationParams): TransactionComposer {\n this.push({ data: params, type: 'keyReg' })\n\n return this\n }\n\n /**\n * Add an offline key registration transaction to the transaction group.\n * @param params The offline key registration transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addOfflineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addOfflineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // Use this with caution, it's generally better to use algorand.account.rekeyAccount\n * rekeyTo: 'REKEYTOADDRESS',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addOfflineKeyRegistration(params: OfflineKeyRegistrationParams): TransactionComposer {\n this.push({ data: params, type: 'keyReg' })\n\n return this\n }\n\n /**\n * Get the number of transactions currently added to this composer.\n * @returns The number of transactions currently added to this composer\n */\n count() {\n return this.txns.length\n }\n\n /**\n * Build the transaction composer.\n *\n * This method performs resource population and inner transaction fee coverage if these options are set in the composer.\n *\n * Once this method is called, no further transactions will be able to be added.\n * You can safely call this method multiple times to get the same result.\n * @returns The built transaction composer, the transactions and any corresponding method calls\n * @example\n * ```typescript\n * const { transactions, methodCalls } = await composer.build()\n * ```\n */\n public async build() {\n if (!this.transactionsWithSigners) {\n const suggestedParams = await this.getSuggestedParams()\n const builtTransactions = await this._buildTransactions(suggestedParams)\n\n // Cache the raw transactions before resource population for error handling\n this.rawBuildTransactions = builtTransactions.transactions\n\n const groupAnalysis =\n (this.composerConfig.coverAppCallInnerTransactionFees || this.composerConfig.populateAppCallResources) &&\n builtTransactions.transactions.some((txn) => txn.type === TransactionType.AppCall)\n ? await this.analyzeGroupRequirements(builtTransactions.transactions, suggestedParams, this.composerConfig)\n : undefined\n\n this.populateTransactionAndGroupResources(builtTransactions.transactions, groupAnalysis)\n\n this.transactionsWithSigners = builtTransactions.transactions.map((txn, index) => {\n return {\n txn,\n signer: builtTransactions.signers.get(index) ?? this.getSigner(txn.sender),\n }\n })\n }\n\n const methodCalls = new Map<number, ABIMethod>()\n this.txns.forEach((txn, index) => {\n if (txn.type === 'methodCall') {\n methodCalls.set(index, txn.data.method)\n }\n })\n\n return {\n transactions: this.transactionsWithSigners,\n methodCalls,\n }\n }\n\n private async _buildTransactions(suggestedParams: SuggestedParams) {\n const defaultValidityWindow =\n !this.defaultValidityWindowIsExplicit && genesisIdIsLocalNet(suggestedParams.genesisId ?? 'unknown')\n ? 1000n\n : this.defaultValidityWindow\n const signers = new Map<number, TransactionSigner>()\n const transactions = new Array<Transaction>()\n\n let transactionIndex = 0\n for (const ctxn of this.txns) {\n if (ctxn.type === 'txn') {\n transactions.push(ctxn.data.txn)\n if (ctxn.data.signer) {\n signers.set(transactionIndex, ctxn.data.signer)\n }\n transactionIndex++\n } else if (ctxn.type === 'asyncTxn') {\n transactions.push(await ctxn.data.txn)\n if (ctxn.data.signer) {\n signers.set(transactionIndex, ctxn.data.signer)\n }\n transactionIndex++\n } else {\n let transaction: Transaction\n\n switch (ctxn.type) {\n case 'pay':\n transaction = buildPayment(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetCreate':\n transaction = buildAssetCreate(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetConfig':\n transaction = buildAssetConfig(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetFreeze':\n transaction = buildAssetFreeze(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetDestroy':\n transaction = buildAssetDestroy(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetTransfer':\n transaction = buildAssetTransfer(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetOptIn':\n transaction = buildAssetOptIn(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetOptOut':\n transaction = buildAssetOptOut(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'appCall':\n if (!('appId' in ctxn.data)) {\n transaction = await buildAppCreate(ctxn.data, this.appManager, suggestedParams, defaultValidityWindow)\n } else if ('approvalProgram' in ctxn.data && 'clearStateProgram' in ctxn.data) {\n transaction = await buildAppUpdate(ctxn.data, this.appManager, suggestedParams, defaultValidityWindow)\n } else {\n transaction = buildAppCall(ctxn.data, suggestedParams, defaultValidityWindow)\n }\n break\n case 'keyReg':\n transaction = buildKeyReg(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'methodCall':\n if (!('appId' in ctxn.data)) {\n transaction = await buildAppCreateMethodCall(ctxn.data, this.appManager, suggestedParams, defaultValidityWindow)\n } else if ('approvalProgram' in ctxn.data && 'clearStateProgram' in ctxn.data) {\n transaction = await buildAppUpdateMethodCall(ctxn.data, this.appManager, suggestedParams, defaultValidityWindow)\n } else {\n transaction = await buildAppCallMethodCall(ctxn.data, suggestedParams, defaultValidityWindow)\n }\n break\n default:\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n throw new Error(`Unsupported transaction type: ${(ctxn as any).type}`)\n }\n\n if (transaction.fee === undefined) {\n transaction = assignFee(transaction, {\n feePerByte: suggestedParams.fee,\n minFee: suggestedParams.minFee,\n extraFee: ctxn.data.extraFee?.microAlgos,\n maxFee: ctxn.data.maxFee?.microAlgos,\n })\n }\n\n transactions.push(transaction)\n\n if (ctxn.data.signer) {\n const signer = 'signer' in ctxn.data.signer ? ctxn.data.signer.signer : ctxn.data.signer\n signers.set(transactionIndex, signer)\n }\n transactionIndex++\n }\n }\n\n // Validate that the total group size doesn't exceed the maximum\n if (transactions.length > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(`Transaction group size ${transactions.length} exceeds the maximum limit of ${MAX_TRANSACTION_GROUP_SIZE}`)\n }\n\n const methodCalls = new Map<number, ABIMethod>()\n this.txns.forEach((txn, index) => {\n if (txn.type === 'methodCall') {\n methodCalls.set(index, txn.data.method)\n }\n })\n\n return { transactions, methodCalls, signers }\n }\n\n /**\n * Builds all transactions in the composer and returns them along with method calls and signers.\n *\n * Note: This method only builds the transactions as-is without resource population or automatic grouping.\n * Use this when you need the raw transactions.\n * @returns An object containing the array of built transactions, method calls, and signers\n * @example\n * ```typescript\n * const { transactions, methodCalls, signers } = await composer.buildTransactions()\n * ```\n */\n public async buildTransactions(): Promise<BuiltTransactions> {\n const suggestedParams = await this.getSuggestedParams()\n const buildResult = await this._buildTransactions(suggestedParams)\n return {\n ...buildResult,\n transactions: buildResult.transactions,\n }\n }\n\n private populateTransactionAndGroupResources(transactions: Transaction[], groupAnalysis?: GroupAnalysis): Transaction[] {\n if (groupAnalysis) {\n // Process fee adjustments\n let surplusGroupFees = 0n\n const transactionAnalysis: Array<{\n groupIndex: number\n requiredFeeDelta?: FeeDelta\n priority: FeePriority\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n }> = []\n\n // Process fee adjustments\n groupAnalysis.transactions.forEach((txnAnalysis, groupIndex) => {\n // Accumulate surplus fees\n if (txnAnalysis.requiredFeeDelta && FeeDelta.isSurplus(txnAnalysis.requiredFeeDelta)) {\n surplusGroupFees += FeeDelta.amount(txnAnalysis.requiredFeeDelta)\n }\n\n // Calculate priority and add to transaction info\n const ctxn = this.txns[groupIndex]\n const txn = transactions[groupIndex]\n const logicalMaxFee = getLogicalMaxFee(ctxn)\n const isImmutableFee = logicalMaxFee !== undefined && logicalMaxFee === (txn.fee || 0n)\n\n let priority = FeePriority.Covered\n if (txnAnalysis.requiredFeeDelta && FeeDelta.isDeficit(txnAnalysis.requiredFeeDelta)) {\n const deficitAmount = FeeDelta.amount(txnAnalysis.requiredFeeDelta)\n if (isImmutableFee || txn.type !== TransactionType.AppCall) {\n // High priority: transactions that can't be modified\n priority = FeePriority.ImmutableDeficit(deficitAmount)\n } else {\n // Normal priority: app call transactions that can be modified\n priority = FeePriority.ModifiableDeficit(deficitAmount)\n }\n }\n\n transactionAnalysis.push({\n groupIndex,\n requiredFeeDelta: txnAnalysis.requiredFeeDelta,\n priority,\n unnamedResourcesAccessed: txnAnalysis.unnamedResourcesAccessed,\n })\n })\n\n // Sort transactions by priority (highest first)\n transactionAnalysis.sort((a, b) => b.priority.compare(a.priority))\n\n const indexesWithAccessReferences: number[] = []\n\n for (const { groupIndex, requiredFeeDelta, unnamedResourcesAccessed } of transactionAnalysis) {\n // Cover any additional fees required for the transactions\n if (requiredFeeDelta && FeeDelta.isDeficit(requiredFeeDelta)) {\n const deficitAmount = FeeDelta.amount(requiredFeeDelta)\n let additionalFeeDelta: FeeDelta | undefined\n\n if (surplusGroupFees === 0n) {\n // No surplus group fees, the transaction must cover its own deficit\n additionalFeeDelta = requiredFeeDelta\n } else if (surplusGroupFees >= deficitAmount) {\n // Surplus fully covers the deficit\n surplusGroupFees -= deficitAmount\n } else {\n // Surplus partially covers the deficit\n additionalFeeDelta = FeeDelta.fromBigInt(deficitAmount - surplusGroupFees)\n surplusGroupFees = 0n\n }\n\n // If there is any additional fee deficit, the transaction must cover it by modifying the fee\n if (additionalFeeDelta && FeeDelta.isDeficit(additionalFeeDelta)) {\n const additionalDeficitAmount = FeeDelta.amount(additionalFeeDelta)\n\n if (transactions[groupIndex].type === TransactionType.AppCall) {\n const currentFee = transactions[groupIndex].fee || 0n\n const transactionFee = currentFee + additionalDeficitAmount\n\n const logicalMaxFee = getLogicalMaxFee(this.txns[groupIndex])\n if (!logicalMaxFee || transactionFee > logicalMaxFee) {\n throw new Error(\n `Calculated transaction fee ${transactionFee} µALGO is greater than max of ${logicalMaxFee ?? 0n} for transaction ${groupIndex}`,\n )\n }\n\n transactions[groupIndex].fee = transactionFee\n } else {\n throw new Error(\n `An additional fee of ${additionalDeficitAmount} µALGO is required for non app call transaction ${groupIndex}`,\n )\n }\n }\n }\n\n // Apply transaction-level resource population\n if (unnamedResourcesAccessed && transactions[groupIndex].type === TransactionType.AppCall) {\n const hasAccessReferences =\n transactions[groupIndex].appCall?.accessReferences && transactions[groupIndex].appCall?.accessReferences?.length\n if (!hasAccessReferences) {\n populateTransactionResources(transactions[groupIndex], unnamedResourcesAccessed, groupIndex)\n } else {\n indexesWithAccessReferences.push(groupIndex)\n }\n }\n }\n\n if (indexesWithAccessReferences.length > 0) {\n Config.logger.warn(\n `Resource population will be skipped for transaction indexes ${indexesWithAccessReferences.join(', ')} as they use access references.`,\n )\n }\n\n // Apply group-level resource population\n if (groupAnalysis.unnamedResourcesAccessed) {\n populateGroupResources(transactions, groupAnalysis.unnamedResourcesAccessed)\n }\n }\n\n if (transactions.length > 1) {\n const groupedTransactions = groupTransactions(transactions)\n // Mutate the input transactions so that the group is updated for any transaction passed into the composer\n transactions.forEach((t) => (t.group = groupedTransactions[0].group))\n return transactions\n } else {\n return transactions\n }\n }\n\n private async analyzeGroupRequirements(\n transactions: Transaction[],\n suggestedParams: SuggestedParams,\n analysisParams: TransactionComposerConfig,\n ): Promise<GroupAnalysis> {\n const appCallIndexesWithoutMaxFees: number[] = []\n\n let transactionsToSimulate = transactions.map((txn, groupIndex) => {\n const ctxn = this.txns[groupIndex]\n const params = { ...txn }\n delete params.group\n if (analysisParams.coverAppCallInnerTransactionFees && txn.type === TransactionType.AppCall) {\n const logicalMaxFee = getLogicalMaxFee(ctxn)\n if (logicalMaxFee !== undefined) {\n params.fee = logicalMaxFee\n } else {\n appCallIndexesWithoutMaxFees.push(groupIndex)\n }\n }\n\n return new Transaction(params)\n })\n\n // Regroup the transactions, as the transactions have likely been adjusted\n if (transactionsToSimulate.length > 1) {\n transactionsToSimulate = groupTransactions(transactionsToSimulate)\n }\n\n // Check for required max fees on app calls when fee coverage is enabled\n if (analysisParams.coverAppCallInnerTransactionFees && appCallIndexesWithoutMaxFees.length > 0) {\n throw new Error(\n `Please provide a maxFee for each app call transaction when coverAppCallInnerTransactionFees is enabled. Required for transaction ${appCallIndexesWithoutMaxFees.join(', ')}`,\n )\n }\n\n const signedTransactions = transactionsToSimulate.map(\n (txn) =>\n ({\n txn: txn,\n sig: EMPTY_SIGNATURE,\n }) satisfies SignedTransaction,\n )\n\n const simulateRequest: SimulateRequest = {\n txnGroups: [\n {\n txns: signedTransactions,\n },\n ],\n allowUnnamedResources: true,\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n }\n\n const response = await this.algod.simulateTransactions(simulateRequest)\n const groupResponse = response.txnGroups[0]\n\n // Handle any simulation failures\n if (groupResponse.failureMessage) {\n if (analysisParams.coverAppCallInnerTransactionFees && groupResponse.failureMessage.includes('fee too small')) {\n throw new Error(\n 'Fees were too small to resolve execution info via simulate. You may need to increase an app call transaction maxFee.',\n )\n }\n\n throw new Error(\n `Error resolving execution info via simulate in transaction ${groupResponse.failedAt?.join(', ')}: ${groupResponse.failureMessage}`,\n )\n }\n\n const txnAnalysisResults: TransactionAnalysis[] = groupResponse.txnResults.map((simulateTxnResult, groupIndex) => {\n const btxn = transactions[groupIndex]\n\n let requiredFeeDelta: FeeDelta | undefined\n\n if (analysisParams.coverAppCallInnerTransactionFees) {\n const minTxnFee = calculateFee(btxn, {\n feePerByte: suggestedParams.fee,\n minFee: suggestedParams.minFee,\n })\n const txnFee = btxn.fee ?? 0n\n const txnFeeDelta = FeeDelta.fromBigInt(minTxnFee - txnFee)\n\n if (btxn.type === TransactionType.AppCall) {\n // Calculate inner transaction fee delta\n const innerTxnsFeeDelta = calculateInnerFeeDelta(simulateTxnResult.txnResult.innerTxns, suggestedParams.minFee)\n requiredFeeDelta = FeeDelta.fromBigInt(\n (innerTxnsFeeDelta ? FeeDelta.toBigInt(innerTxnsFeeDelta) : 0n) + (txnFeeDelta ? FeeDelta.toBigInt(txnFeeDelta) : 0n),\n )\n } else {\n requiredFeeDelta = txnFeeDelta\n }\n }\n\n return {\n requiredFeeDelta,\n unnamedResourcesAccessed: analysisParams.populateAppCallResources ? simulateTxnResult.unnamedResourcesAccessed : undefined,\n }\n })\n\n const sortedResources = groupResponse.unnamedResourcesAccessed\n\n // NOTE: We explicitly want to avoid localeCompare as that can lead to different results in different environments\n const compare = (a: string | bigint, b: string | bigint) => (a < b ? -1 : a > b ? 1 : 0)\n\n if (sortedResources) {\n sortedResources.accounts?.sort((a, b) => compare(a.toString(), b.toString()))\n sortedResources.assets?.sort(compare)\n sortedResources.apps?.sort(compare)\n sortedResources.boxes?.sort((a, b) => {\n const aStr = `${a.app}-${a.name}`\n const bStr = `${b.app}-${b.name}`\n return compare(aStr, bStr)\n })\n sortedResources.appLocals?.sort((a, b) => {\n const aStr = `${a.app}-${a.account}`\n const bStr = `${b.app}-${b.account}`\n return compare(aStr, bStr)\n })\n sortedResources.assetHoldings?.sort((a, b) => {\n const aStr = `${a.asset}-${a.account}`\n const bStr = `${b.asset}-${b.account}`\n return compare(aStr, bStr)\n })\n }\n\n return {\n transactions: txnAnalysisResults,\n unnamedResourcesAccessed: analysisParams.populateAppCallResources ? sortedResources : undefined,\n }\n }\n\n /**\n * Rebuild the group, discarding any previously built transactions.\n * This will potentially cause new signers and suggested params to be used if the callbacks return a new value compared to the first build.\n * @returns The newly built transaction composer and the transactions\n * @example\n * ```typescript\n * const { atc, transactions, methodCalls } = await composer.rebuild()\n * ```\n */\n async rebuild() {\n this.reset()\n return await this.build()\n }\n\n private reset() {\n this.signedTransactions = undefined\n this.transactionsWithSigners = undefined\n }\n\n /**\n * Compose the transaction group and send it to the network.\n * @param params The parameters to control execution with\n * @returns The execution result\n * @example\n * ```typescript\n * const result = await composer.send()\n * ```\n */\n async send(params?: SendParams): Promise<SendTransactionComposerResults> {\n if (\n this.composerConfig.coverAppCallInnerTransactionFees !== (params?.coverAppCallInnerTransactionFees ?? false) ||\n this.composerConfig.populateAppCallResources !== (params?.populateAppCallResources ?? true)\n ) {\n // If the params are different to the composer config, reset the builtGroup\n // to ensure that the SendParams overwrites the composer config\n this.composerConfig = {\n coverAppCallInnerTransactionFees: params?.coverAppCallInnerTransactionFees ?? false,\n populateAppCallResources: params?.populateAppCallResources ?? true,\n }\n\n this.reset()\n }\n\n try {\n await this.gatherSignatures()\n\n if (\n !this.transactionsWithSigners ||\n this.transactionsWithSigners.length === 0 ||\n !this.signedTransactions ||\n this.signedTransactions.length === 0\n ) {\n throw new Error('No transactions available')\n }\n\n const transactionsToSend = this.transactionsWithSigners.map((stxn) => stxn.txn)\n const transactionIds = transactionsToSend.map((txn) => txn.txId())\n\n if (transactionsToSend.length > 1) {\n const groupId = transactionsToSend[0].group ? Buffer.from(transactionsToSend[0].group).toString('base64') : ''\n Config.getLogger(params?.suppressLog).verbose(`Sending group of ${transactionsToSend.length} transactions (${groupId})`, {\n transactionsToSend,\n })\n\n Config.getLogger(params?.suppressLog).debug(`Transaction IDs (${groupId})`, transactionIds)\n }\n\n if (Config.debug && Config.traceAll) {\n await this.simulate({\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n resultOnFailure: true,\n })\n }\n\n const group = this.signedTransactions[0].txn.group\n\n let waitRounds = params?.maxRoundsToWaitForConfirmation\n\n if (waitRounds === undefined) {\n const suggestedParams = await this.getSuggestedParams()\n const firstRound = suggestedParams.firstValid\n const lastRound = this.signedTransactions.reduce((max, txn) => (txn.txn.lastValid > max ? txn.txn.lastValid : max), 0n)\n waitRounds = Number(lastRound - firstRound) + 1\n }\n\n const encodedTxns = encodeSignedTransactions(this.signedTransactions)\n await this.algod.sendRawTransaction(encodedTxns)\n\n if (transactionsToSend.length > 1 && group) {\n Config.getLogger(params?.suppressLog).verbose(\n `Group transaction (${Buffer.from(group).toString('base64')}) sent with ${transactionsToSend.length} transactions`,\n )\n } else {\n Config.getLogger(params?.suppressLog).verbose(\n `Sent transaction ID ${transactionsToSend[0].txId()} ${transactionsToSend[0].type} from ${transactionsToSend[0].sender}`,\n )\n }\n\n let confirmations = new Array<PendingTransactionResponse>()\n if (params?.maxRoundsToWaitForConfirmation !== 0) {\n confirmations = await Promise.all(transactionIds.map(async (id) => await waitForConfirmation(id, waitRounds, this.algod)))\n }\n\n const abiReturns = this.parseAbiReturnValues(confirmations)\n\n return {\n groupId: group ? Buffer.from(group).toString('base64') : undefined,\n transactions: transactionsToSend,\n txIds: transactionIds,\n returns: abiReturns,\n confirmations: confirmations,\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (originalError: any) {\n const errorMessage = originalError.body?.message ?? originalError.message ?? 'Received error executing Transaction Composer'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = new Error(errorMessage) as any\n err.cause = originalError\n\n if (typeof originalError === 'object') {\n err.name = originalError.name\n }\n\n // Resolve transactions for error handling - use transactionsWithSigners if available,\n // otherwise fall back to rawBuildTransactions\n let sentTransactions: Transaction[] | undefined\n if (this.transactionsWithSigners) {\n sentTransactions = this.transactionsWithSigners.map((t) => t.txn)\n } else if (this.rawBuildTransactions) {\n sentTransactions = this.rawBuildTransactions.length > 1 ? groupTransactions(this.rawBuildTransactions) : this.rawBuildTransactions\n }\n\n if (Config.debug && typeof originalError === 'object' && sentTransactions) {\n err.traces = []\n Config.getLogger(params?.suppressLog).error(\n 'Received error executing Transaction Composer and debug flag enabled; attempting simulation to get more information',\n err,\n )\n\n const transactionsWithEmptySigners: TransactionWithSigner[] = sentTransactions.map((txn) => ({\n txn,\n signer: makeEmptyTransactionSigner(),\n }))\n const signedTransactions = await this.signTransactions(transactionsWithEmptySigners)\n const simulateResponse = await this.algod.simulateTransactions({\n txnGroups: [{ txns: signedTransactions }],\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n })\n\n if (Config.debug && !Config.traceAll) {\n // Emit the event only if traceAll: false, as it should have already been emitted above\n await Config.events.emitAsync(EventType.TxnGroupSimulated, {\n simulateResponse,\n })\n }\n\n if (simulateResponse && simulateResponse.txnGroups[0].failedAt) {\n for (const txn of simulateResponse.txnGroups[0].txnResults) {\n err.traces.push({\n trace: txn.execTrace,\n appBudget: txn.appBudgetConsumed,\n logicSigBudget: txn.logicSigBudgetConsumed,\n logs: txn.txnResult.logs,\n message: simulateResponse.txnGroups[0].failureMessage,\n })\n }\n }\n } else {\n Config.getLogger(params?.suppressLog).error(\n 'Received error executing Transaction Composer, for more information enable the debug flag',\n err,\n )\n }\n\n // Attach the sent transactions so we can use them in error transformers\n err.sentTransactions = sentTransactions ?? []\n\n throw await this.transformError(err)\n }\n }\n\n /**\n * Compose the transaction group and simulate sending it to the network\n * @returns The simulation result\n * @example\n * ```typescript\n * const result = await composer.simulate()\n * ```\n */\n async simulate(): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }>\n /**\n * Compose the transaction group and simulate sending it to the network\n * @returns The simulation result\n * @example\n * ```typescript\n * const result = await composer.simulate({\n * skipSignatures: true,\n * })\n * ```\n */\n async simulate(options: SkipSignaturesSimulateOptions): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }>\n /**\n * Compose the transaction group and simulate sending it to the network\n * @returns The simulation result\n * @example\n * ```typescript\n * const result = await composer.simulate({\n * extraOpcodeBudget: 1000,\n * })\n * ```\n */\n async simulate(options: RawSimulateOptions): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }>\n async simulate(options?: SimulateOptions): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }> {\n const { skipSignatures = false, resultOnFailure = false, ...rawOptions } = options ?? {}\n\n if (skipSignatures) {\n rawOptions.allowEmptySignatures = true\n rawOptions.fixSigners = true\n }\n\n let transactionsWithSigner: TransactionWithSigner[]\n if (!this.transactionsWithSigners) {\n const builtTransactions = await this.buildTransactions()\n const transactions =\n builtTransactions.transactions.length > 0 ? groupTransactions(builtTransactions.transactions) : builtTransactions.transactions\n\n transactionsWithSigner = transactions.map((txn, index) => ({\n txn: txn,\n signer: skipSignatures ? makeEmptyTransactionSigner() : (builtTransactions.signers.get(index) ?? makeEmptyTransactionSigner()),\n }))\n } else {\n transactionsWithSigner = this.transactionsWithSigners.map((e) => ({\n txn: e.txn,\n signer: skipSignatures ? makeEmptyTransactionSigner() : e.signer,\n }))\n }\n\n const transactions = transactionsWithSigner.map((e) => e.txn)\n const signedTransactions = await this.signTransactions(transactionsWithSigner)\n\n const simulateRequest = {\n txnGroups: [\n {\n txns: signedTransactions,\n },\n ],\n ...rawOptions,\n ...(Config.debug\n ? {\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n }\n : undefined),\n } satisfies SimulateRequest\n\n const simulateResponse = await this.algod.simulateTransactions(simulateRequest)\n const simulateResult = simulateResponse.txnGroups[0]\n\n if (simulateResult?.failureMessage && !resultOnFailure) {\n const errorMessage = `Transaction failed at transaction(s) ${simulateResult.failedAt?.join(', ') || 'unknown'} in the group. ${simulateResult.failureMessage}`\n const error = new Error(errorMessage)\n\n if (Config.debug) {\n await Config.events.emitAsync(EventType.TxnGroupSimulated, { simulateTransaction: simulateResponse })\n }\n\n throw await this.transformError(error)\n }\n\n if (Config.debug && Config.traceAll) {\n await Config.events.emitAsync(EventType.TxnGroupSimulated, { simulateTransaction: simulateResponse })\n }\n\n const abiReturns = this.parseAbiReturnValues(simulateResult.txnResults.map((t) => t.txnResult))\n\n return {\n confirmations: simulateResult.txnResults.map((t) => t.txnResult),\n transactions: transactions,\n txIds: transactions.map((t) => t.txId()),\n groupId: Buffer.from(transactions[0].group ?? new Uint8Array()).toString('base64'),\n simulateResponse,\n returns: abiReturns,\n }\n }\n\n /**\n * Create an encoded transaction note that follows the ARC-2 spec.\n *\n * https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md\n * @param note The ARC-2 transaction note data\n * @returns The binary encoded transaction note\n */\n static arc2Note(note: Arc2TransactionNote): Uint8Array {\n const arc2Payload = `${note.dAppName}:${note.format}${typeof note.data === 'string' ? note.data : asJson(note.data)}`\n const encoder = new TextEncoder()\n return encoder.encode(arc2Payload)\n }\n\n public async gatherSignatures(): Promise<SignedTransaction[]> {\n if (this.signedTransactions) {\n return this.signedTransactions\n }\n\n await this.build()\n\n if (!this.transactionsWithSigners || this.transactionsWithSigners.length === 0) {\n throw new Error('No transactions available to sign')\n }\n\n this.signedTransactions = await this.signTransactions(this.transactionsWithSigners)\n return this.signedTransactions\n }\n\n private async signTransactions(transactionsWithSigners: TransactionWithSigner[]): Promise<SignedTransaction[]> {\n if (transactionsWithSigners.length === 0) {\n throw new Error('No transactions available to sign')\n }\n\n const transactions = transactionsWithSigners.map((txnWithSigner) => txnWithSigner.txn)\n\n // Group transactions by signer\n const signerGroups = new Map<TransactionSigner, number[]>()\n transactionsWithSigners.forEach(({ signer }, index) => {\n const indexes = signerGroups.get(signer) ?? []\n indexes.push(index)\n signerGroups.set(signer, indexes)\n })\n\n // Sign transactions in parallel for each signer\n const signerEntries = Array.from(signerGroups)\n const signedGroups = await Promise.all(signerEntries.map(([signer, indexes]) => signer(transactions, indexes)))\n\n // Reconstruct signed transactions in original order\n const signedTransactions = new Array<SignedTransaction>(transactionsWithSigners.length)\n signerEntries.forEach(([, indexes], signerIndex) => {\n const stxs = signedGroups[signerIndex]\n indexes.forEach((txIndex, stxIndex) => {\n signedTransactions[txIndex] = decodeSignedTransaction(stxs[stxIndex])\n })\n })\n\n // Verify all transactions were signed\n const unsignedIndexes = signedTransactions\n .map((stxn, index) => (stxn === undefined ? index : null))\n .filter((index): index is number => index !== null)\n\n if (unsignedIndexes.length > 0) {\n throw new Error(`Transactions at indexes [${unsignedIndexes.join(', ')}] were not signed`)\n }\n\n return signedTransactions\n }\n\n private parseAbiReturnValues(confirmations: PendingTransactionResponse[]): ABIReturn[] {\n const abiReturns = new Array<ABIReturn>()\n\n for (let i = 0; i < confirmations.length; i++) {\n const confirmation = confirmations[i]\n const txn = this.txns[i]\n if (txn?.type !== 'methodCall') continue\n\n const method = txn.data.method\n if (method.returns.type !== 'void') {\n const abiReturn = AppManager.getABIReturn(confirmation, method)\n if (abiReturn !== undefined) {\n abiReturns.push(abiReturn)\n }\n }\n }\n\n return abiReturns\n }\n\n public setMaxFees(maxFees: Map<number, AlgoAmount>) {\n maxFees.forEach((_, index) => {\n if (index > this.txns.length - 1) {\n throw new Error(`Index ${index} is out of range. The composer only contains ${this.txns.length} transactions`)\n }\n })\n\n maxFees.forEach((maxFee, index) => {\n this.txns[index].data.maxFee = new AlgoAmount({ microAlgos: maxFee.microAlgos })\n })\n }\n}\n\n/** Get the logical maximum fee based on staticFee and maxFee */\nfunction getLogicalMaxFee(ctxn: Txn): bigint | undefined {\n if (ctxn.type === 'txn' || ctxn.type === 'asyncTxn') {\n return undefined\n }\n\n const maxFee = ctxn.data.maxFee\n const staticFee = ctxn.data.staticFee\n\n if (maxFee !== undefined && (staticFee === undefined || maxFee.microAlgos > staticFee.microAlgos)) {\n return maxFee.microAlgos\n }\n return staticFee?.microAlgos\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"composer.js","names":["AppManager","decodeTransaction","encodeTransactionRaw","MAX_TRANSACTION_GROUP_SIZE","OnApplicationComplete","extractComposerTransactionsFromAppMethodCallParams","processAppMethodCallArgs","Transaction","TransactionType","genesisIdIsLocalNet","transaction: Transaction","buildPayment","buildAssetCreate","buildAssetConfig","buildAssetFreeze","buildAssetDestroy","buildAssetTransfer","buildAssetOptIn","buildAssetOptOut","buildAppCreate","buildAppUpdate","buildAppCall","buildKeyReg","buildAppCreateMethodCall","buildAppUpdateMethodCall","buildAppCallMethodCall","assignFee","transactionAnalysis: Array<{\n groupIndex: number\n requiredFeeDelta?: FeeDelta\n priority: FeePriority\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n }>","FeeDelta","FeePriority","indexesWithAccessReferences: number[]","additionalFeeDelta: FeeDelta | undefined","groupTransactions","appCallIndexesWithoutMaxFees: number[]","simulateRequest: SimulateRequest","EMPTY_SIGNATURE","txnAnalysisResults: TransactionAnalysis[]","requiredFeeDelta: FeeDelta | undefined","calculateFee","calculateInnerFeeDelta","Buffer","Config","waitForConfirmation","originalError: any","sentTransactions: Transaction[] | undefined","transactionsWithEmptySigners: TransactionWithSigner[]","makeEmptyTransactionSigner","decodeSignedTransactions","EventType","transactionsWithSigner: TransactionWithSigner[]","asJson","encodedSignedTransactions: (Uint8Array | null)[]","AlgoAmount"],"sources":["../../src/types/composer.ts"],"sourcesContent":["import { ABIMethod, ABIReturn } from '@algorandfoundation/algokit-abi'\nimport {\n AlgodClient,\n PendingTransactionResponse,\n SimulateRequest,\n SimulateResponse,\n SimulateUnnamedResourcesAccessed,\n SuggestedParams,\n} from '@algorandfoundation/algokit-algod-client'\nimport { EMPTY_SIGNATURE, Expand } from '@algorandfoundation/algokit-common'\nimport {\n OnApplicationComplete,\n SignedTransaction,\n Transaction,\n TransactionSigner,\n TransactionType,\n assignFee,\n calculateFee,\n decodeSignedTransactions,\n decodeTransaction,\n encodeTransactionRaw,\n groupTransactions,\n makeEmptyTransactionSigner,\n validateTransaction,\n} from '@algorandfoundation/algokit-transact'\nimport { Buffer } from 'buffer'\nimport { Config } from '../config'\nimport { TransactionWithSigner, waitForConfirmation } from '../transaction'\nimport {\n buildAppCall,\n buildAppCreate,\n buildAppUpdate,\n populateGroupResources,\n populateTransactionResources,\n type AppCallParams,\n type AppCreateParams,\n type AppDeleteParams,\n type AppUpdateParams,\n type CommonAppCallParams,\n} from '../transactions/app-call'\nimport {\n buildAssetOptIn,\n buildAssetOptOut,\n buildAssetTransfer,\n type AssetOptInParams,\n type AssetOptOutParams,\n type AssetTransferParams,\n} from '../transactions/asset-transfer'\n\nimport { MAX_TRANSACTION_GROUP_SIZE, ReadableAddress } from '@algorandfoundation/algokit-common'\nimport {\n buildAssetConfig,\n buildAssetCreate,\n buildAssetDestroy,\n buildAssetFreeze,\n type AssetConfigParams,\n type AssetCreateParams,\n type AssetDestroyParams,\n type AssetFreezeParams,\n} from '../transactions/asset-config'\nimport { FeeDelta, FeePriority, calculateInnerFeeDelta } from '../transactions/fee-coverage'\nimport { buildKeyReg, type OfflineKeyRegistrationParams, type OnlineKeyRegistrationParams } from '../transactions/key-registration'\nimport {\n AsyncTransactionParams,\n ProcessedAppCallMethodCall,\n ProcessedAppCreateMethodCall,\n ProcessedAppUpdateMethodCall,\n TransactionParams,\n buildAppCallMethodCall,\n buildAppCreateMethodCall,\n buildAppUpdateMethodCall,\n extractComposerTransactionsFromAppMethodCallParams,\n processAppMethodCallArgs,\n type AppCallMethodCall,\n type AppCreateMethodCall,\n type AppDeleteMethodCall,\n type AppUpdateMethodCall,\n} from '../transactions/method-call'\nimport { buildPayment, type PaymentParams } from '../transactions/payment'\nimport { asJson } from '../util'\nimport { AlgoAmount } from './amount'\nimport { AppManager } from './app-manager'\nimport { EventType } from './lifecycle-events'\nimport { genesisIdIsLocalNet } from './network-client'\nimport { Arc2TransactionNote, SendParams, SendTransactionComposerResults } from './transaction'\n\n// Re-export transaction parameter types\nexport type {\n AppCallParams,\n AppCreateParams,\n AppDeleteParams,\n AppMethodCallParams,\n AppUpdateParams,\n CommonAppCallParams,\n} from '../transactions/app-call'\nexport type { AssetConfigParams, AssetCreateParams, AssetDestroyParams, AssetFreezeParams } from '../transactions/asset-config'\nexport type { AssetOptInParams, AssetOptOutParams, AssetTransferParams } from '../transactions/asset-transfer'\nexport type { CommonTransactionParams } from '../transactions/common'\nexport type { OfflineKeyRegistrationParams, OnlineKeyRegistrationParams } from '../transactions/key-registration'\nexport type {\n AppCallMethodCall,\n AppCreateMethodCall,\n AppDeleteMethodCall,\n AppMethodCall,\n AppMethodCallTransactionArgument,\n AppUpdateMethodCall,\n ProcessedAppCallMethodCall,\n ProcessedAppCreateMethodCall,\n ProcessedAppUpdateMethodCall,\n} from '../transactions/method-call'\nexport type { PaymentParams } from '../transactions/payment'\n\n/** Options to control a simulate request, that does not require transaction signing */\nexport type SkipSignaturesSimulateOptions = Expand<\n Omit<RawSimulateOptions, 'fixSigners' | 'allowEmptySignatures'> & {\n /** Whether or not to skip signatures for all built transactions and use an empty signer instead.\n * This will set `fixSigners` and `allowEmptySignatures` when sending the request to the algod API.\n */\n skipSignatures: boolean\n }\n>\n\n/** The raw API options to control a simulate request.\n * See algod API docs for more information: https://dev.algorand.co/reference/rest-apis/algod/#simulatetransaction\n */\nexport type RawSimulateOptions = Expand<Omit<SimulateRequest, 'txnGroups'>> & {\n /** Whether or not to return the result on simulation failure instead of throwing an error */\n resultOnFailure?: boolean\n}\n\n/** All options to control a simulate request */\nexport type SimulateOptions = Expand<Partial<SkipSignaturesSimulateOptions> & RawSimulateOptions>\n\ntype Txn =\n | { data: PaymentParams; type: 'pay' }\n | { data: AssetCreateParams; type: 'assetCreate' }\n | { data: AssetConfigParams; type: 'assetConfig' }\n | { data: AssetFreezeParams; type: 'assetFreeze' }\n | { data: AssetDestroyParams; type: 'assetDestroy' }\n | { data: AssetTransferParams; type: 'assetTransfer' }\n | { data: AssetOptInParams; type: 'assetOptIn' }\n | { data: AssetOptOutParams; type: 'assetOptOut' }\n | { data: AppCallParams | AppCreateParams | AppUpdateParams; type: 'appCall' }\n | { data: OnlineKeyRegistrationParams | OfflineKeyRegistrationParams; type: 'keyReg' }\n | { data: TransactionParams; type: 'txn' }\n | { data: AsyncTransactionParams; type: 'asyncTxn' }\n | { data: ProcessedAppCallMethodCall | ProcessedAppCreateMethodCall | ProcessedAppUpdateMethodCall; type: 'methodCall' }\n\n/**\n * A function that transforms an error into a new error.\n *\n * In most cases, an ErrorTransformer should first check if it can or should transform the error\n * and return the input error if it cannot or should not transform it.\n */\nexport type ErrorTransformer = (error: Error) => Promise<Error>\n\nclass InvalidErrorTransformerValue extends Error {\n constructor(originalError: unknown, value: unknown) {\n super(`An error transformer returned a non-error value: ${value}. The original error before any transformation: ${originalError}`)\n }\n}\n\nclass ErrorTransformerError extends Error {\n constructor(originalError: Error, cause: unknown) {\n super(`An error transformer threw an error: ${cause}. The original error before any transformation: ${originalError} `, { cause })\n }\n}\n\nexport type TransactionComposerConfig = {\n coverAppCallInnerTransactionFees: boolean\n populateAppCallResources: boolean\n}\n\ntype TransactionAnalysis = {\n /** The fee difference required for this transaction */\n requiredFeeDelta?: FeeDelta\n /** Resources accessed by this transaction but not declared */\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n}\n\ntype GroupAnalysis = {\n /** Analysis of each transaction in the group */\n transactions: TransactionAnalysis[]\n /** Resources accessed by the group that qualify for group resource sharing */\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n}\n\n/** Parameters to create an `TransactionComposer`. */\nexport type TransactionComposerParams = {\n /** The algod client to use to get suggestedParams and send the transaction group */\n algod: AlgodClient\n /** The function used to get the TransactionSigner for a given address */\n getSigner: (address: ReadableAddress) => TransactionSigner\n /** The method used to get SuggestedParams for transactions in the group */\n getSuggestedParams?: () => Promise<SuggestedParams>\n /** How many rounds a transaction should be valid for by default; if not specified\n * then will be 10 rounds (or 1000 rounds if issuing transactions to LocalNet).\n */\n defaultValidityWindow?: bigint\n /** An existing `AppManager` to use to manage app compilation and cache compilation results.\n *\n * If not specified then an ephemeral one will be created.\n */\n appManager?: AppManager\n /**\n * An array of error transformers to use when an error is caught in simulate or execute\n * callbacks can later be registered with `registerErrorTransformer`\n */\n errorTransformers?: ErrorTransformer[]\n composerConfig?: TransactionComposerConfig\n}\n\n/** Set of transactions built by `TransactionComposer`. */\nexport interface BuiltTransactions {\n /** The built transactions */\n transactions: Transaction[]\n /** Any `ABIMethod` objects associated with any of the transactions in a map keyed by transaction index. */\n methodCalls: Map<number, ABIMethod>\n /** Any `TransactionSigner` objects associated with any of the transactions in a map keyed by transaction index. */\n signers: Map<number, TransactionSigner>\n}\n\n/** TransactionComposer helps you compose and execute transactions as a transaction group. */\nexport class TransactionComposer {\n /** Transactions that have not yet been composed */\n private txns: Txn[] = []\n\n /** The algod client used by the composer. */\n private algod: AlgodClient\n\n /** An async function that will return suggested params for the transaction. */\n private getSuggestedParams: () => Promise<SuggestedParams>\n\n /** A function that takes in an address and return a signer function for that address. */\n private getSigner: (address: ReadableAddress) => TransactionSigner\n\n /** The default transaction validity window */\n private defaultValidityWindow = 10n\n\n /** Whether the validity window was explicitly set on construction */\n private defaultValidityWindowIsExplicit = false\n\n private appManager: AppManager\n\n private errorTransformers: ErrorTransformer[]\n\n private composerConfig: TransactionComposerConfig\n\n private transactionsWithSigners?: TransactionWithSigner[]\n\n private signedTransactions?: Uint8Array[]\n\n // Cache the raw transactions before resource population for error handling\n private rawBuildTransactions?: Transaction[]\n\n private async transformError(originalError: unknown): Promise<unknown> {\n // Transformers only work with Error instances, so immediately return anything else\n if (!(originalError instanceof Error)) {\n return originalError\n }\n\n let transformedError = originalError\n\n for (const transformer of this.errorTransformers) {\n try {\n transformedError = await transformer(transformedError)\n if (!(transformedError instanceof Error)) {\n return new InvalidErrorTransformerValue(originalError, transformedError)\n }\n } catch (errorFromTransformer) {\n return new ErrorTransformerError(originalError, errorFromTransformer)\n }\n }\n\n return transformedError\n }\n\n private validateReferenceParams(\n params: Pick<CommonAppCallParams, 'accessReferences' | 'appReferences' | 'assetReferences' | 'boxReferences'>,\n ) {\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n const hasLegacyReferences =\n (params.appReferences && params.appReferences.length > 0) ||\n (params.assetReferences && params.assetReferences.length > 0) ||\n (params.boxReferences && params.boxReferences.length > 0)\n\n if (hasAccessReferences && hasLegacyReferences) {\n throw new Error('Cannot specify both `accessReferences` and reference arrays (`appReferences`, `assetReferences`, `boxReferences`).')\n }\n }\n\n /**\n * Create a `TransactionComposer`.\n * @param params The configuration for this composer\n * @returns The `TransactionComposer` instance\n */\n constructor(params: TransactionComposerParams) {\n this.algod = params.algod\n const defaultGetSuggestedParams = () => params.algod.suggestedParams()\n this.getSuggestedParams = params.getSuggestedParams ?? defaultGetSuggestedParams\n this.getSigner = params.getSigner\n this.defaultValidityWindow = params.defaultValidityWindow ?? this.defaultValidityWindow\n this.defaultValidityWindowIsExplicit = params.defaultValidityWindow !== undefined\n this.appManager = params.appManager ?? new AppManager(params.algod)\n this.errorTransformers = params.errorTransformers ?? []\n this.composerConfig = params.composerConfig ?? {\n coverAppCallInnerTransactionFees: false,\n populateAppCallResources: true,\n }\n }\n\n private cloneTransaction(txn: Txn): Txn {\n // The transaction params aren't meant to be mutated therefore a shallow clone is ok here\n // Only exceptions are txn and asyncTxn where they are encoded, then decoded\n switch (txn.type) {\n case 'pay':\n return {\n type: 'pay',\n data: { ...txn.data },\n }\n case 'assetCreate':\n return {\n type: 'assetCreate',\n data: { ...txn.data },\n }\n case 'assetConfig':\n return {\n type: 'assetConfig',\n data: { ...txn.data },\n }\n case 'assetFreeze':\n return {\n type: 'assetFreeze',\n data: { ...txn.data },\n }\n case 'assetDestroy':\n return {\n type: 'assetDestroy',\n data: { ...txn.data },\n }\n case 'assetTransfer':\n return {\n type: 'assetTransfer',\n data: { ...txn.data },\n }\n case 'assetOptIn':\n return {\n type: 'assetOptIn',\n data: { ...txn.data },\n }\n case 'assetOptOut':\n return {\n type: 'assetOptOut',\n data: { ...txn.data },\n }\n case 'appCall':\n return {\n type: 'appCall',\n data: { ...txn.data },\n }\n case 'keyReg':\n return {\n type: 'keyReg',\n data: { ...txn.data },\n }\n case 'txn': {\n const { txn: transaction, signer, maxFee } = txn.data\n const encoded = encodeTransactionRaw(transaction)\n const clonedTxn = decodeTransaction(encoded)\n delete clonedTxn.group\n return {\n type: 'txn',\n data: {\n txn: clonedTxn,\n signer,\n maxFee,\n },\n }\n }\n case 'asyncTxn': {\n const { txn: txnPromise, signer, maxFee } = txn.data\n // Create a new promise that resolves to a deep cloned transaction without the group field\n const newTxnPromise = txnPromise.then((resolvedTxn) => {\n const encoded = encodeTransactionRaw(resolvedTxn)\n const clonedTxn = decodeTransaction(encoded)\n delete clonedTxn.group\n return clonedTxn\n })\n return {\n type: 'asyncTxn',\n data: {\n txn: newTxnPromise,\n signer,\n maxFee: maxFee,\n },\n }\n }\n case 'methodCall':\n return {\n type: 'methodCall',\n data: { ...txn.data },\n }\n }\n }\n\n private push(...txns: Txn[]): void {\n if (this.transactionsWithSigners) {\n throw new Error('Cannot add new transactions after building')\n }\n const newSize = this.txns.length + txns.length\n if (newSize > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(\n `Adding ${txns.length} transaction(s) would exceed the maximum group size. Current: ${this.txns.length}, Maximum: ${MAX_TRANSACTION_GROUP_SIZE}`,\n )\n }\n this.txns.push(...txns)\n }\n\n public clone(composerConfig?: TransactionComposerConfig) {\n const newComposer = new TransactionComposer({\n algod: this.algod,\n getSuggestedParams: this.getSuggestedParams,\n getSigner: this.getSigner,\n defaultValidityWindow: this.defaultValidityWindow,\n appManager: this.appManager,\n errorTransformers: this.errorTransformers,\n composerConfig: {\n ...this.composerConfig,\n ...composerConfig,\n },\n })\n\n this.txns.forEach((txn) => {\n newComposer.txns.push(this.cloneTransaction(txn))\n })\n\n newComposer.defaultValidityWindowIsExplicit = this.defaultValidityWindowIsExplicit\n\n return newComposer\n }\n\n /**\n * Register a function that will be used to transform an error caught when simulating or executing\n *\n * @returns The composer so you can chain method calls\n */\n registerErrorTransformer(transformer: ErrorTransformer) {\n this.errorTransformers.push(transformer)\n return this\n }\n\n /**\n * Add a pre-built transaction to the transaction group.\n * @param transaction The pre-built transaction\n * @param signer Optional signer override for the transaction\n * @returns The composer so you can chain method calls\n * @example\n * ```typescript\n * composer.addTransaction(txn)\n * ```\n */\n addTransaction(transaction: Transaction, signer?: TransactionSigner): TransactionComposer {\n if (transaction.group) {\n throw new Error('Cannot add a transaction to the composer because it is already in a group')\n }\n validateTransaction(transaction)\n this.push({\n data: {\n txn: transaction,\n signer: signer ?? this.getSigner(transaction.sender),\n },\n type: 'txn',\n })\n\n return this\n }\n\n /**\n * Add another transaction composer to the current transaction composer.\n * The transaction params of the input transaction composer will be added.\n * If the input transaction composer is updated, it won't affect the current transaction composer.\n * @param composer The transaction composer to add\n * @returns The composer so you can chain method calls\n * @example\n * ```typescript\n * const innerComposer = algorand.newGroup()\n * .addPayment({ sender: 'SENDER', receiver: 'RECEIVER', amount: (1).algo() })\n * .addPayment({ sender: 'SENDER', receiver: 'RECEIVER', amount: (2).algo() })\n *\n * composer.addTransactionComposer(innerComposer)\n * ```\n */\n public addTransactionComposer(composer: TransactionComposer): TransactionComposer {\n const clonedTxns = composer.txns.map((txn) => this.cloneTransaction(txn))\n this.push(...clonedTxns)\n\n return this\n }\n\n /**\n * Add a payment transaction to the transaction group.\n * @param params The payment transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addPayment({\n * sender: 'SENDERADDRESS',\n * receiver: 'RECEIVERADDRESS',\n * amount: (4).algo(),\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addPayment({\n * amount: (4).algo(),\n * receiver: 'RECEIVERADDRESS',\n * sender: 'SENDERADDRESS',\n * closeRemainderTo: 'CLOSEREMAINDERTOADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // Use this with caution, it's generally better to use algorand.account.rekeyAccount\n * rekeyTo: 'REKEYTOADDRESS',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n */\n addPayment(params: PaymentParams): TransactionComposer {\n this.push({ data: params, type: 'pay' })\n\n return this\n }\n\n /**\n * Add an asset create transaction to the transaction group.\n * @param params The asset create transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetCreate({ sender: \"CREATORADDRESS\", total: 100n})\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetCreate({\n * sender: 'CREATORADDRESS',\n * total: 100n,\n * decimals: 2,\n * assetName: 'asset',\n * unitName: 'unit',\n * url: 'url',\n * metadataHash: 'metadataHash',\n * defaultFrozen: false,\n * manager: 'MANAGERADDRESS',\n * reserve: 'RESERVEADDRESS',\n * freeze: 'FREEZEADDRESS',\n * clawback: 'CLAWBACKADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n */\n addAssetCreate(params: AssetCreateParams): TransactionComposer {\n this.push({ data: params, type: 'assetCreate' })\n\n return this\n }\n\n /**\n * Add an asset config transaction to the transaction group.\n * @param params The asset config transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetConfig({ sender: \"MANAGERADDRESS\", assetId: 123456n, manager: \"MANAGERADDRESS\" })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetConfig({\n * sender: 'MANAGERADDRESS',\n * assetId: 123456n,\n * manager: 'MANAGERADDRESS',\n * reserve: 'RESERVEADDRESS',\n * freeze: 'FREEZEADDRESS',\n * clawback: 'CLAWBACKADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n */\n addAssetConfig(params: AssetConfigParams): TransactionComposer {\n this.push({ data: params, type: 'assetConfig' })\n\n return this\n }\n\n /**\n * Add an asset freeze transaction to the transaction group.\n * @param params The asset freeze transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetFreeze({ sender: \"MANAGERADDRESS\", assetId: 123456n, account: \"ACCOUNTADDRESS\", frozen: true })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetFreeze({\n * sender: 'MANAGERADDRESS',\n * assetId: 123456n,\n * account: 'ACCOUNTADDRESS',\n * frozen: true,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetFreeze(params: AssetFreezeParams): TransactionComposer {\n this.push({ data: params, type: 'assetFreeze' })\n\n return this\n }\n\n /**\n * Add an asset destroy transaction to the transaction group.\n * @param params The asset destroy transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetDestroy({ sender: \"MANAGERADDRESS\", assetId: 123456n })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetDestroy({\n * sender: 'MANAGERADDRESS',\n * assetId: 123456n,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetDestroy(params: AssetDestroyParams): TransactionComposer {\n this.push({ data: params, type: 'assetDestroy' })\n\n return this\n }\n\n /**\n * Add an asset transfer transaction to the transaction group.\n * @param params The asset transfer transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetTransfer({ sender: \"HOLDERADDRESS\", assetId: 123456n, amount: 1n, receiver: \"RECEIVERADDRESS\" })\n * ```\n * @example Advanced example (with clawback)\n * ```typescript\n * composer.addAssetTransfer({\n * sender: 'CLAWBACKADDRESS',\n * assetId: 123456n,\n * amount: 1n,\n * receiver: 'RECEIVERADDRESS',\n * clawbackTarget: 'HOLDERADDRESS',\n * // This field needs to be used with caution\n * closeAssetTo: 'ADDRESSTOCLOSETO'\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetTransfer(params: AssetTransferParams): TransactionComposer {\n this.push({ data: params, type: 'assetTransfer' })\n\n return this\n }\n\n /**\n * Add an asset opt-in transaction to the transaction group.\n * @param params The asset opt-in transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAssetOptIn({ sender: \"SENDERADDRESS\", assetId: 123456n })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetOptIn({\n * sender: 'SENDERADDRESS',\n * assetId: 123456n,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetOptIn(params: AssetOptInParams): TransactionComposer {\n this.push({ data: params, type: 'assetOptIn' })\n\n return this\n }\n\n /**\n * Add an asset opt-out transaction to the transaction group.\n * @param params The asset opt-out transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example (without creator, will be retrieved from algod)\n * ```typescript\n * composer.addAssetOptOut({ sender: \"SENDERADDRESS\", assetId: 123456n, ensureZeroBalance: true })\n * ```\n * @example Basic example (with creator)\n * ```typescript\n * composer.addAssetOptOut({ sender: \"SENDERADDRESS\", creator: \"CREATORADDRESS\", assetId: 123456n, ensureZeroBalance: true })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAssetOptOut({\n * sender: 'SENDERADDRESS',\n * assetId: 123456n,\n * creator: 'CREATORADDRESS',\n * ensureZeroBalance: true,\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addAssetOptOut(params: AssetOptOutParams): TransactionComposer {\n this.push({ data: params, type: 'assetOptOut' })\n\n return this\n }\n\n /**\n * Add an application create transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application create transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppCreate({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppCreate({\n * sender: 'CREATORADDRESS',\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * schema: {\n * globalInts: 1,\n * globalByteSlices: 2,\n * localInts: 3,\n * localByteSlices: 4\n * },\n * extraProgramPages: 1,\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n * // Signer only needed if you want to provide one,\n * // generally you'd register it with AlgorandClient\n * // against the sender and not need to pass it in\n * signer: transactionSigner,\n * maxRoundsToWaitForConfirmation: 5,\n * suppressLog: true,\n *})\n * ```\n */\n addAppCreate(params: AppCreateParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: params, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an application update transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application update transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppUpdate({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppUpdate({\n * sender: 'CREATORADDRESS',\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * onComplete: OnApplicationComplete.UpdateApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppUpdate(params: AppUpdateParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: { ...params, onComplete: OnApplicationComplete.UpdateApplication }, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an application delete transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application delete transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppDelete({ sender: 'CREATORADDRESS' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppDelete({\n * sender: 'CREATORADDRESS',\n * onComplete: OnApplicationComplete.DeleteApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppDelete(params: AppDeleteParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: { ...params, onComplete: OnApplicationComplete.DeleteApplication }, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an application call transaction to the transaction group.\n *\n * If you want to create or update an app use `addAppCreate` or `addAppUpdate`.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addAppCall({ sender: 'CREATORADDRESS' })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addAppCall({\n * sender: 'CREATORADDRESS',\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppCall(params: AppCallParams): TransactionComposer {\n this.validateReferenceParams(params)\n this.push({ data: params, type: 'appCall' })\n\n return this\n }\n\n /**\n * Add an ABI method create application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI create method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCreateMethodCall({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCreateMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * schema: {\n * globalInts: 1,\n * globalByteSlices: 2,\n * localInts: 3,\n * localByteSlices: 4\n * },\n * extraProgramPages: 1,\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppCreateMethodCall(params: AppCreateMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args) },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add an ABI method update application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI update method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppUpdateMethodCall({ sender: 'CREATORADDRESS', approvalProgram: 'TEALCODE', clearStateProgram: 'TEALCODE', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppUpdateMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * approvalProgram: \"TEALCODE\",\n * clearStateProgram: \"TEALCODE\",\n * onComplete: OnApplicationComplete.UpdateApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppUpdateMethodCall(params: AppUpdateMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args), onComplete: OnApplicationComplete.UpdateApplication },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add an ABI method delete application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI delete method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppDeleteMethodCall({ sender: 'CREATORADDRESS', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppDeleteMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * onComplete: OnApplicationComplete.DeleteApplication,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppDeleteMethodCall(params: AppDeleteMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args), onComplete: OnApplicationComplete.DeleteApplication },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add a non-create/non-update ABI method application call transaction to the transaction group.\n *\n * Note: we recommend using app clients to make it easier to make app calls.\n * @param params The ABI method application call transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCallMethodCall({ sender: 'CREATORADDRESS', method: method, args: [\"arg1_value\"] })\n * ```\n * @example Advanced example\n * ```typescript\n * const method = new ABIMethod({\n * name: 'method',\n * args: [{ name: 'arg1', type: 'string' }],\n * returns: { type: 'string' },\n * })\n * composer.addAppCallMethodCall({\n * sender: 'CREATORADDRESS',\n * method: method,\n * args: [\"arg1_value\"],\n * onComplete: OnApplicationComplete.OptIn,\n * args: [new Uint8Array(1, 2, 3, 4)]\n * accountReferences: [\"ACCOUNT_1\"]\n * appReferences: [123n, 1234n]\n * assetReferences: [12345n]\n * boxReferences: [\"box1\", {appId: 1234n, name: \"box2\"}]\n * accessReferences: [{ appId: 1234n }]\n * lease: 'lease',\n * note: 'note',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * rejectVersion: 1,\n *})\n * ```\n */\n addAppCallMethodCall(params: AppCallMethodCall) {\n this.validateReferenceParams(params)\n const txnArgs = extractComposerTransactionsFromAppMethodCallParams(params)\n\n // Push all transaction arguments and the method call itself\n this.push(...txnArgs, {\n data: { ...params, args: processAppMethodCallArgs(params.args) },\n type: 'methodCall',\n })\n\n return this\n }\n\n /**\n * Add an online key registration transaction to the transaction group.\n * @param params The online key registration transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addOnlineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * voteKey: Uint8Array.from(Buffer.from(\"voteKeyBase64\", 'base64')),\n * selectionKey: Uint8Array.from(Buffer.from(\"selectionKeyBase64\", 'base64')),\n * stateProofKey: Uint8Array.from(Buffer.from(\"stateProofKeyBase64\", 'base64')),\n * voteFirst: 1n,\n * voteLast: 1000n,\n * voteKeyDilution: 1n,\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addOnlineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * voteKey: Uint8Array.from(Buffer.from(\"voteKeyBase64\", 'base64')),\n * selectionKey: Uint8Array.from(Buffer.from(\"selectionKeyBase64\", 'base64')),\n * stateProofKey: Uint8Array.from(Buffer.from(\"stateProofKeyBase64\", 'base64')),\n * voteFirst: 1n,\n * voteLast: 1000n,\n * voteKeyDilution: 1n,\n * lease: 'lease',\n * note: 'note',\n * // Use this with caution, it's generally better to use algorand.account.rekeyAccount\n * rekeyTo: 'REKEYTOADDRESS',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addOnlineKeyRegistration(params: OnlineKeyRegistrationParams): TransactionComposer {\n this.push({ data: params, type: 'keyReg' })\n\n return this\n }\n\n /**\n * Add an offline key registration transaction to the transaction group.\n * @param params The offline key registration transaction parameters\n * @returns The composer so you can chain method calls\n * @example Basic example\n * ```typescript\n * composer.addOfflineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * composer.addOfflineKeyRegistration({\n * sender: 'SENDERADDRESS',\n * lease: 'lease',\n * note: 'note',\n * // Use this with caution, it's generally better to use algorand.account.rekeyAccount\n * rekeyTo: 'REKEYTOADDRESS',\n * // You wouldn't normally set this field\n * firstValidRound: 1000n,\n * validityWindow: 10,\n * extraFee: (1000).microAlgo(),\n * staticFee: (1000).microAlgo(),\n * // Max fee doesn't make sense with extraFee AND staticFee\n * // already specified, but here for completeness\n * maxFee: (3000).microAlgo(),\n * })\n * ```\n */\n addOfflineKeyRegistration(params: OfflineKeyRegistrationParams): TransactionComposer {\n this.push({ data: params, type: 'keyReg' })\n\n return this\n }\n\n /**\n * Get the number of transactions currently added to this composer.\n * @returns The number of transactions currently added to this composer\n */\n count() {\n return this.txns.length\n }\n\n /**\n * Build the transaction composer.\n *\n * This method performs resource population and inner transaction fee coverage if these options are set in the composer.\n *\n * Once this method is called, no further transactions will be able to be added.\n * You can safely call this method multiple times to get the same result.\n * @returns The built transaction composer, the transactions and any corresponding method calls\n * @example\n * ```typescript\n * const { transactions, methodCalls } = await composer.build()\n * ```\n */\n public async build() {\n if (!this.transactionsWithSigners) {\n const suggestedParams = await this.getSuggestedParams()\n const builtTransactions = await this._buildTransactions(suggestedParams)\n\n // Cache copies of the raw transactions before resource population for error handling.\n // We need copies because populateTransactionAndGroupResources mutates the transactions (sets .group).\n this.rawBuildTransactions = builtTransactions.transactions.map((txn) => new Transaction({ ...txn }))\n\n const groupAnalysis =\n (this.composerConfig.coverAppCallInnerTransactionFees || this.composerConfig.populateAppCallResources) &&\n builtTransactions.transactions.some((txn) => txn.type === TransactionType.AppCall)\n ? await this.analyzeGroupRequirements(builtTransactions.transactions, suggestedParams, this.composerConfig)\n : undefined\n\n this.populateTransactionAndGroupResources(builtTransactions.transactions, groupAnalysis)\n\n this.transactionsWithSigners = builtTransactions.transactions.map((txn, index) => {\n return {\n txn,\n signer: builtTransactions.signers.get(index) ?? this.getSigner(txn.sender),\n }\n })\n }\n\n const methodCalls = new Map<number, ABIMethod>()\n this.txns.forEach((txn, index) => {\n if (txn.type === 'methodCall') {\n methodCalls.set(index, txn.data.method)\n }\n })\n\n return {\n transactions: this.transactionsWithSigners,\n methodCalls,\n }\n }\n\n private async _buildTransactions(suggestedParams: SuggestedParams) {\n const defaultValidityWindow =\n !this.defaultValidityWindowIsExplicit && genesisIdIsLocalNet(suggestedParams.genesisId ?? 'unknown')\n ? 1000n\n : this.defaultValidityWindow\n const signers = new Map<number, TransactionSigner>()\n const transactions = new Array<Transaction>()\n\n let transactionIndex = 0\n for (const ctxn of this.txns) {\n if (ctxn.type === 'txn') {\n validateTransaction(ctxn.data.txn)\n transactions.push(ctxn.data.txn)\n if (ctxn.data.signer) {\n signers.set(transactionIndex, ctxn.data.signer)\n }\n transactionIndex++\n } else if (ctxn.type === 'asyncTxn') {\n const transaction = await ctxn.data.txn\n validateTransaction(transaction)\n transactions.push(transaction)\n if (ctxn.data.signer) {\n signers.set(transactionIndex, ctxn.data.signer)\n }\n transactionIndex++\n } else {\n let transaction: Transaction\n\n switch (ctxn.type) {\n case 'pay':\n transaction = buildPayment(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetCreate':\n transaction = buildAssetCreate(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetConfig':\n transaction = buildAssetConfig(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetFreeze':\n transaction = buildAssetFreeze(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetDestroy':\n transaction = buildAssetDestroy(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetTransfer':\n transaction = buildAssetTransfer(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetOptIn':\n transaction = buildAssetOptIn(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'assetOptOut':\n transaction = buildAssetOptOut(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'appCall':\n if (ctxn.data.appId === undefined || ctxn.data.appId === 0) {\n transaction = await buildAppCreate(ctxn.data as AppCreateParams, this.appManager, suggestedParams, defaultValidityWindow)\n } else if ('approvalProgram' in ctxn.data && 'clearStateProgram' in ctxn.data) {\n transaction = await buildAppUpdate(ctxn.data as AppUpdateParams, this.appManager, suggestedParams, defaultValidityWindow)\n } else {\n transaction = buildAppCall(ctxn.data as AppCallParams, suggestedParams, defaultValidityWindow)\n }\n break\n case 'keyReg':\n transaction = buildKeyReg(ctxn.data, suggestedParams, defaultValidityWindow)\n break\n case 'methodCall':\n if (ctxn.data.appId === undefined || ctxn.data.appId === 0) {\n transaction = await buildAppCreateMethodCall(\n ctxn.data as ProcessedAppCreateMethodCall,\n this.appManager,\n suggestedParams,\n defaultValidityWindow,\n )\n } else if ('approvalProgram' in ctxn.data && 'clearStateProgram' in ctxn.data) {\n transaction = await buildAppUpdateMethodCall(\n ctxn.data as ProcessedAppUpdateMethodCall,\n this.appManager,\n suggestedParams,\n defaultValidityWindow,\n )\n } else {\n transaction = await buildAppCallMethodCall(ctxn.data as ProcessedAppCallMethodCall, suggestedParams, defaultValidityWindow)\n }\n break\n default:\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n throw new Error(`Unsupported transaction type: ${(ctxn as any).type}`)\n }\n\n if (transaction.fee === undefined) {\n transaction = assignFee(transaction, {\n feePerByte: suggestedParams.fee,\n minFee: suggestedParams.minFee,\n extraFee: ctxn.data.extraFee?.microAlgos,\n maxFee: ctxn.data.maxFee?.microAlgos,\n })\n }\n\n validateTransaction(transaction)\n transactions.push(transaction)\n\n if (ctxn.data.signer) {\n const signer = 'signer' in ctxn.data.signer ? ctxn.data.signer.signer : ctxn.data.signer\n signers.set(transactionIndex, signer)\n }\n transactionIndex++\n }\n }\n\n // Validate that the total group size doesn't exceed the maximum\n if (transactions.length > MAX_TRANSACTION_GROUP_SIZE) {\n throw new Error(`Transaction group size ${transactions.length} exceeds the maximum limit of ${MAX_TRANSACTION_GROUP_SIZE}`)\n }\n\n const methodCalls = new Map<number, ABIMethod>()\n this.txns.forEach((txn, index) => {\n if (txn.type === 'methodCall') {\n methodCalls.set(index, txn.data.method)\n }\n })\n\n return { transactions, methodCalls, signers }\n }\n\n /**\n * Builds all transactions in the composer and returns them along with method calls and signers.\n *\n * Note: This method only builds the transactions as-is without resource population or automatic grouping.\n * Use this when you need the raw transactions.\n * @returns An object containing the array of built transactions, method calls, and signers\n * @example\n * ```typescript\n * const { transactions, methodCalls, signers } = await composer.buildTransactions()\n * ```\n */\n public async buildTransactions(): Promise<BuiltTransactions> {\n const suggestedParams = await this.getSuggestedParams()\n const buildResult = await this._buildTransactions(suggestedParams)\n return {\n ...buildResult,\n transactions: buildResult.transactions,\n }\n }\n\n private populateTransactionAndGroupResources(transactions: Transaction[], groupAnalysis?: GroupAnalysis): Transaction[] {\n if (groupAnalysis) {\n // Process fee adjustments\n let surplusGroupFees = 0n\n const transactionAnalysis: Array<{\n groupIndex: number\n requiredFeeDelta?: FeeDelta\n priority: FeePriority\n unnamedResourcesAccessed?: SimulateUnnamedResourcesAccessed\n }> = []\n\n // Process fee adjustments\n groupAnalysis.transactions.forEach((txnAnalysis, groupIndex) => {\n // Accumulate surplus fees\n if (txnAnalysis.requiredFeeDelta && FeeDelta.isSurplus(txnAnalysis.requiredFeeDelta)) {\n surplusGroupFees += FeeDelta.amount(txnAnalysis.requiredFeeDelta)\n }\n\n // Calculate priority and add to transaction info\n const ctxn = this.txns[groupIndex]\n const txn = transactions[groupIndex]\n const logicalMaxFee = getLogicalMaxFee(ctxn)\n const isImmutableFee = logicalMaxFee !== undefined && logicalMaxFee === (txn.fee || 0n)\n\n let priority = FeePriority.Covered\n if (txnAnalysis.requiredFeeDelta && FeeDelta.isDeficit(txnAnalysis.requiredFeeDelta)) {\n const deficitAmount = FeeDelta.amount(txnAnalysis.requiredFeeDelta)\n if (isImmutableFee || txn.type !== TransactionType.AppCall) {\n // High priority: transactions that can't be modified\n priority = FeePriority.ImmutableDeficit(deficitAmount)\n } else {\n // Normal priority: app call transactions that can be modified\n priority = FeePriority.ModifiableDeficit(deficitAmount)\n }\n }\n\n transactionAnalysis.push({\n groupIndex,\n requiredFeeDelta: txnAnalysis.requiredFeeDelta,\n priority,\n unnamedResourcesAccessed: txnAnalysis.unnamedResourcesAccessed,\n })\n })\n\n // Sort transactions by priority (highest first)\n transactionAnalysis.sort((a, b) => b.priority.compare(a.priority))\n\n const indexesWithAccessReferences: number[] = []\n\n for (const { groupIndex, requiredFeeDelta, unnamedResourcesAccessed } of transactionAnalysis) {\n // Cover any additional fees required for the transactions\n if (requiredFeeDelta && FeeDelta.isDeficit(requiredFeeDelta)) {\n const deficitAmount = FeeDelta.amount(requiredFeeDelta)\n let additionalFeeDelta: FeeDelta | undefined\n\n if (surplusGroupFees === 0n) {\n // No surplus group fees, the transaction must cover its own deficit\n additionalFeeDelta = requiredFeeDelta\n } else if (surplusGroupFees >= deficitAmount) {\n // Surplus fully covers the deficit\n surplusGroupFees -= deficitAmount\n } else {\n // Surplus partially covers the deficit\n additionalFeeDelta = FeeDelta.fromBigInt(deficitAmount - surplusGroupFees)\n surplusGroupFees = 0n\n }\n\n // If there is any additional fee deficit, the transaction must cover it by modifying the fee\n if (additionalFeeDelta && FeeDelta.isDeficit(additionalFeeDelta)) {\n const additionalDeficitAmount = FeeDelta.amount(additionalFeeDelta)\n\n if (transactions[groupIndex].type === TransactionType.AppCall) {\n const currentFee = transactions[groupIndex].fee || 0n\n const transactionFee = currentFee + additionalDeficitAmount\n\n const logicalMaxFee = getLogicalMaxFee(this.txns[groupIndex])\n if (!logicalMaxFee || transactionFee > logicalMaxFee) {\n throw new Error(\n `Calculated transaction fee ${transactionFee} µALGO is greater than max of ${logicalMaxFee ?? 0n} for transaction ${groupIndex}`,\n )\n }\n\n transactions[groupIndex].fee = transactionFee\n } else {\n throw new Error(\n `An additional fee of ${additionalDeficitAmount} µALGO is required for non app call transaction ${groupIndex}`,\n )\n }\n }\n }\n\n // Apply transaction-level resource population\n if (unnamedResourcesAccessed && transactions[groupIndex].type === TransactionType.AppCall) {\n const hasAccessReferences =\n transactions[groupIndex].appCall?.accessReferences && transactions[groupIndex].appCall?.accessReferences?.length\n if (!hasAccessReferences) {\n populateTransactionResources(transactions[groupIndex], unnamedResourcesAccessed, groupIndex)\n } else {\n indexesWithAccessReferences.push(groupIndex)\n }\n }\n }\n\n if (indexesWithAccessReferences.length > 0) {\n Config.logger.warn(\n `Resource population will be skipped for transaction indexes ${indexesWithAccessReferences.join(', ')} as they use access references.`,\n )\n }\n\n // Apply group-level resource population\n if (groupAnalysis.unnamedResourcesAccessed) {\n populateGroupResources(transactions, groupAnalysis.unnamedResourcesAccessed)\n }\n }\n\n if (transactions.length > 1) {\n const groupedTransactions = groupTransactions(transactions)\n // Mutate the input transactions so that the group is updated for any transaction passed into the composer\n transactions.forEach((t) => (t.group = groupedTransactions[0].group))\n return transactions\n } else {\n return transactions\n }\n }\n\n private async analyzeGroupRequirements(\n transactions: Transaction[],\n suggestedParams: SuggestedParams,\n analysisParams: TransactionComposerConfig,\n ): Promise<GroupAnalysis> {\n const appCallIndexesWithoutMaxFees: number[] = []\n\n let transactionsToSimulate = transactions.map((txn, groupIndex) => {\n const ctxn = this.txns[groupIndex]\n const params = { ...txn }\n delete params.group\n if (analysisParams.coverAppCallInnerTransactionFees && txn.type === TransactionType.AppCall) {\n const logicalMaxFee = getLogicalMaxFee(ctxn)\n if (logicalMaxFee !== undefined) {\n params.fee = logicalMaxFee\n } else {\n appCallIndexesWithoutMaxFees.push(groupIndex)\n }\n }\n\n return new Transaction(params)\n })\n\n // Regroup the transactions, as the transactions have likely been adjusted\n if (transactionsToSimulate.length > 1) {\n transactionsToSimulate = groupTransactions(transactionsToSimulate)\n }\n\n // Check for required max fees on app calls when fee coverage is enabled\n if (analysisParams.coverAppCallInnerTransactionFees && appCallIndexesWithoutMaxFees.length > 0) {\n throw new Error(\n `Please provide a maxFee for each app call transaction when coverAppCallInnerTransactionFees is enabled. Required for transaction ${appCallIndexesWithoutMaxFees.join(', ')}`,\n )\n }\n\n const signedTransactions = transactionsToSimulate.map(\n (txn) =>\n ({\n txn: txn,\n sig: EMPTY_SIGNATURE,\n }) satisfies SignedTransaction,\n )\n\n const simulateRequest: SimulateRequest = {\n txnGroups: [\n {\n txns: signedTransactions,\n },\n ],\n allowUnnamedResources: true,\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n }\n\n const response = await this.algod.simulateTransactions(simulateRequest)\n const groupResponse = response.txnGroups[0]\n\n // Handle any simulation failures\n if (groupResponse.failureMessage) {\n if (analysisParams.coverAppCallInnerTransactionFees && groupResponse.failureMessage.includes('fee too small')) {\n throw new Error(\n 'Fees were too small to resolve execution info via simulate. You may need to increase an app call transaction maxFee.',\n )\n }\n\n throw new Error(\n `Error resolving execution info via simulate in transaction ${groupResponse.failedAt?.join(', ')}: ${groupResponse.failureMessage}`,\n )\n }\n\n const txnAnalysisResults: TransactionAnalysis[] = groupResponse.txnResults.map((simulateTxnResult, groupIndex) => {\n const btxn = transactions[groupIndex]\n\n let requiredFeeDelta: FeeDelta | undefined\n\n if (analysisParams.coverAppCallInnerTransactionFees) {\n const minTxnFee = calculateFee(btxn, {\n feePerByte: suggestedParams.fee,\n minFee: suggestedParams.minFee,\n })\n const txnFee = btxn.fee ?? 0n\n const txnFeeDelta = FeeDelta.fromBigInt(minTxnFee - txnFee)\n\n if (btxn.type === TransactionType.AppCall) {\n // Calculate inner transaction fee delta\n const innerTxnsFeeDelta = calculateInnerFeeDelta(simulateTxnResult.txnResult.innerTxns, suggestedParams.minFee)\n requiredFeeDelta = FeeDelta.fromBigInt(\n (innerTxnsFeeDelta ? FeeDelta.toBigInt(innerTxnsFeeDelta) : 0n) + (txnFeeDelta ? FeeDelta.toBigInt(txnFeeDelta) : 0n),\n )\n } else {\n requiredFeeDelta = txnFeeDelta\n }\n }\n\n return {\n requiredFeeDelta,\n unnamedResourcesAccessed: analysisParams.populateAppCallResources ? simulateTxnResult.unnamedResourcesAccessed : undefined,\n }\n })\n\n const sortedResources = groupResponse.unnamedResourcesAccessed\n\n // NOTE: We explicitly want to avoid localeCompare as that can lead to different results in different environments\n const compare = (a: string | bigint, b: string | bigint) => (a < b ? -1 : a > b ? 1 : 0)\n\n if (sortedResources) {\n sortedResources.accounts?.sort((a, b) => compare(a.toString(), b.toString()))\n sortedResources.assets?.sort(compare)\n sortedResources.apps?.sort(compare)\n sortedResources.boxes?.sort((a, b) => {\n const aStr = `${a.appId}-${a.name}`\n const bStr = `${b.appId}-${b.name}`\n return compare(aStr, bStr)\n })\n sortedResources.appLocals?.sort((a, b) => {\n const aStr = `${a.appId}-${a.address}`\n const bStr = `${b.appId}-${b.address}`\n return compare(aStr, bStr)\n })\n sortedResources.assetHoldings?.sort((a, b) => {\n const aStr = `${a.assetId}-${a.address}`\n const bStr = `${b.assetId}-${b.address}`\n return compare(aStr, bStr)\n })\n }\n\n return {\n transactions: txnAnalysisResults,\n unnamedResourcesAccessed: analysisParams.populateAppCallResources ? sortedResources : undefined,\n }\n }\n\n /**\n * Rebuild the group, discarding any previously built transactions.\n * This will potentially cause new signers and suggested params to be used if the callbacks return a new value compared to the first build.\n * @returns The newly built transaction composer and the transactions\n * @example\n * ```typescript\n * const { atc, transactions, methodCalls } = await composer.rebuild()\n * ```\n */\n async rebuild() {\n this.reset()\n return await this.build()\n }\n\n private reset() {\n this.signedTransactions = undefined\n this.transactionsWithSigners = undefined\n }\n\n /**\n * Compose the transaction group and send it to the network.\n * @param params The parameters to control execution with\n * @returns The execution result\n * @example\n * ```typescript\n * const result = await composer.send()\n * ```\n */\n async send(params?: SendParams): Promise<SendTransactionComposerResults> {\n const effectiveConfig = {\n coverAppCallInnerTransactionFees: params?.coverAppCallInnerTransactionFees ?? this.composerConfig.coverAppCallInnerTransactionFees,\n populateAppCallResources: params?.populateAppCallResources ?? this.composerConfig.populateAppCallResources,\n }\n\n if (\n this.composerConfig.coverAppCallInnerTransactionFees !== effectiveConfig.coverAppCallInnerTransactionFees ||\n this.composerConfig.populateAppCallResources !== effectiveConfig.populateAppCallResources\n ) {\n // If the params are different to the composer config, reset the builtGroup\n // to ensure that the SendParams overwrites the composer config\n this.composerConfig = effectiveConfig\n\n this.reset()\n }\n\n try {\n await this.gatherSignatures()\n\n if (\n !this.transactionsWithSigners ||\n this.transactionsWithSigners.length === 0 ||\n !this.signedTransactions ||\n this.signedTransactions.length === 0\n ) {\n throw new Error('No transactions available')\n }\n\n const transactionsToSend = this.transactionsWithSigners.map((stxn) => stxn.txn)\n const transactionIds = transactionsToSend.map((txn) => txn.txId())\n\n if (transactionsToSend.length > 1) {\n const groupId = transactionsToSend[0].group ? Buffer.from(transactionsToSend[0].group).toString('base64') : ''\n Config.getLogger(params?.suppressLog).verbose(`Sending group of ${transactionsToSend.length} transactions (${groupId})`, {\n transactionsToSend,\n })\n\n Config.getLogger(params?.suppressLog).debug(`Transaction IDs (${groupId})`, transactionIds)\n }\n\n if (Config.debug && Config.traceAll) {\n await this.simulate({\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n resultOnFailure: true,\n })\n }\n\n const group = this.transactionsWithSigners[0].txn.group\n\n let waitRounds = params?.maxRoundsToWaitForConfirmation\n\n if (waitRounds === undefined) {\n const suggestedParams = await this.getSuggestedParams()\n const firstRound = suggestedParams.firstValid\n const lastRound = this.transactionsWithSigners.reduce((max, txn) => (txn.txn.lastValid > max ? txn.txn.lastValid : max), 0n)\n waitRounds = Number(lastRound - firstRound) + 1\n }\n\n await this.algod.sendRawTransaction(this.signedTransactions)\n\n if (transactionsToSend.length > 1 && group) {\n Config.getLogger(params?.suppressLog).verbose(\n `Group transaction (${Buffer.from(group).toString('base64')}) sent with ${transactionsToSend.length} transactions`,\n )\n } else {\n Config.getLogger(params?.suppressLog).verbose(\n `Sent transaction ID ${transactionsToSend[0].txId()} ${transactionsToSend[0].type} from ${transactionsToSend[0].sender}`,\n )\n }\n\n let confirmations = new Array<PendingTransactionResponse>()\n if (params?.maxRoundsToWaitForConfirmation !== 0) {\n confirmations = await Promise.all(transactionIds.map(async (id) => await waitForConfirmation(id, waitRounds, this.algod)))\n }\n\n const abiReturns = this.parseAbiReturnValues(confirmations)\n\n return {\n groupId: group ? Buffer.from(group).toString('base64') : undefined,\n transactions: transactionsToSend,\n txIds: transactionIds,\n returns: abiReturns,\n confirmations: confirmations,\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (originalError: any) {\n const errorMessage = originalError.body?.message ?? originalError.message ?? 'Received error executing Transaction Composer'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = new Error(errorMessage) as any\n err.cause = originalError\n\n if (typeof originalError === 'object') {\n err.name = originalError.name\n }\n\n // Resolve transactions for error handling - use transactionsWithSigners if available,\n // otherwise fall back to rawBuildTransactions\n let sentTransactions: Transaction[] | undefined\n if (this.transactionsWithSigners) {\n sentTransactions = this.transactionsWithSigners.map((t) => t.txn)\n } else if (this.rawBuildTransactions) {\n sentTransactions = this.rawBuildTransactions.length > 1 ? groupTransactions(this.rawBuildTransactions) : this.rawBuildTransactions\n }\n\n if (Config.debug && typeof originalError === 'object' && sentTransactions) {\n err.traces = []\n Config.getLogger(params?.suppressLog).error(\n 'Received error executing Transaction Composer and debug flag enabled; attempting simulation to get more information',\n err,\n )\n\n const transactionsWithEmptySigners: TransactionWithSigner[] = sentTransactions.map((txn) => ({\n txn,\n signer: makeEmptyTransactionSigner(),\n }))\n const encodedSignedTransactions = await this.signTransactions(transactionsWithEmptySigners)\n const signedTransactions = decodeSignedTransactions(encodedSignedTransactions)\n\n const simulateResponse = await this.algod.simulateTransactions({\n txnGroups: [{ txns: signedTransactions }],\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n })\n\n if (Config.debug && !Config.traceAll) {\n // Emit the event only if traceAll: false, as it should have already been emitted above\n await Config.events.emitAsync(EventType.TxnGroupSimulated, {\n simulateResponse,\n })\n }\n\n if (simulateResponse && simulateResponse.txnGroups[0].failedAt) {\n for (const txn of simulateResponse.txnGroups[0].txnResults) {\n err.traces.push({\n trace: txn.execTrace,\n appBudget: txn.appBudgetConsumed,\n logicSigBudget: txn.logicSigBudgetConsumed,\n logs: txn.txnResult.logs,\n message: simulateResponse.txnGroups[0].failureMessage,\n })\n }\n }\n } else {\n Config.getLogger(params?.suppressLog).error(\n 'Received error executing Transaction Composer, for more information enable the debug flag',\n err,\n )\n }\n\n // Attach the sent transactions so we can use them in error transformers\n err.sentTransactions = sentTransactions ?? []\n\n throw await this.transformError(err)\n }\n }\n\n /**\n * Compose the transaction group and simulate sending it to the network\n * @returns The simulation result\n * @example\n * ```typescript\n * const result = await composer.simulate()\n * ```\n */\n async simulate(): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }>\n /**\n * Compose the transaction group and simulate sending it to the network\n * @returns The simulation result\n * @example\n * ```typescript\n * const result = await composer.simulate({\n * skipSignatures: true,\n * })\n * ```\n */\n async simulate(options: SkipSignaturesSimulateOptions): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }>\n /**\n * Compose the transaction group and simulate sending it to the network\n * @returns The simulation result\n * @example\n * ```typescript\n * const result = await composer.simulate({\n * extraOpcodeBudget: 1000,\n * })\n * ```\n */\n async simulate(options: RawSimulateOptions): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }>\n async simulate(options?: SimulateOptions): Promise<SendTransactionComposerResults & { simulateResponse: SimulateResponse }> {\n const { skipSignatures = false, resultOnFailure = false, ...rawOptions } = options ?? {}\n\n if (skipSignatures) {\n rawOptions.allowEmptySignatures = true\n rawOptions.fixSigners = true\n }\n\n let transactionsWithSigner: TransactionWithSigner[]\n if (!this.transactionsWithSigners) {\n const builtTransactions = await this.buildTransactions()\n const transactions =\n builtTransactions.transactions.length > 1 ? groupTransactions(builtTransactions.transactions) : builtTransactions.transactions\n\n transactionsWithSigner = transactions.map((txn, index) => ({\n txn: txn,\n signer: skipSignatures ? makeEmptyTransactionSigner() : (builtTransactions.signers.get(index) ?? makeEmptyTransactionSigner()),\n }))\n } else {\n transactionsWithSigner = this.transactionsWithSigners.map((e) => ({\n txn: e.txn,\n signer: skipSignatures ? makeEmptyTransactionSigner() : e.signer,\n }))\n }\n\n const transactions = transactionsWithSigner.map((e) => e.txn)\n const encodedSignedTransactions = await this.signTransactions(transactionsWithSigner)\n const signedTransactions = decodeSignedTransactions(encodedSignedTransactions)\n\n const simulateRequest = {\n txnGroups: [\n {\n txns: signedTransactions,\n },\n ],\n ...rawOptions,\n ...(Config.debug\n ? {\n allowEmptySignatures: true,\n fixSigners: true,\n allowMoreLogging: true,\n execTraceConfig: {\n enable: true,\n scratchChange: true,\n stackChange: true,\n stateChange: true,\n },\n }\n : undefined),\n } satisfies SimulateRequest\n\n const simulateResponse = await this.algod.simulateTransactions(simulateRequest)\n const simulateResult = simulateResponse.txnGroups[0]\n\n if (simulateResult?.failureMessage && !resultOnFailure) {\n const errorMessage = `Transaction failed at transaction(s) ${simulateResult.failedAt?.join(', ') || 'unknown'} in the group. ${simulateResult.failureMessage}`\n const error = new Error(errorMessage)\n\n if (Config.debug) {\n await Config.events.emitAsync(EventType.TxnGroupSimulated, { simulateResponse })\n }\n\n throw await this.transformError(error)\n }\n\n if (Config.debug && Config.traceAll) {\n await Config.events.emitAsync(EventType.TxnGroupSimulated, { simulateResponse })\n }\n\n const abiReturns = this.parseAbiReturnValues(simulateResult.txnResults.map((t) => t.txnResult))\n\n return {\n confirmations: simulateResult.txnResults.map((t) => t.txnResult),\n transactions: transactions,\n txIds: transactions.map((t) => t.txId()),\n groupId: Buffer.from(transactions[0].group ?? new Uint8Array()).toString('base64'),\n simulateResponse,\n returns: abiReturns,\n }\n }\n\n /**\n * Create an encoded transaction note that follows the ARC-2 spec.\n *\n * https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md\n * @param note The ARC-2 transaction note data\n * @returns The binary encoded transaction note\n */\n static arc2Note(note: Arc2TransactionNote): Uint8Array {\n const arc2Payload = `${note.dAppName}:${note.format}${typeof note.data === 'string' ? note.data : asJson(note.data)}`\n const encoder = new TextEncoder()\n return encoder.encode(arc2Payload)\n }\n\n public async gatherSignatures(): Promise<Uint8Array[]> {\n if (this.signedTransactions) {\n return this.signedTransactions\n }\n\n await this.build()\n\n if (!this.transactionsWithSigners || this.transactionsWithSigners.length === 0) {\n throw new Error('No transactions available to sign')\n }\n\n this.signedTransactions = await this.signTransactions(this.transactionsWithSigners)\n return this.signedTransactions\n }\n\n private async signTransactions(transactionsWithSigners: TransactionWithSigner[]): Promise<Uint8Array[]> {\n if (transactionsWithSigners.length === 0) {\n throw new Error('No transactions available to sign')\n }\n\n const transactions = transactionsWithSigners.map((txnWithSigner) => txnWithSigner.txn)\n\n // Group transactions by signer\n const signerGroups = new Map<TransactionSigner, number[]>()\n transactionsWithSigners.forEach(({ signer }, index) => {\n const indexes = signerGroups.get(signer) ?? []\n indexes.push(index)\n signerGroups.set(signer, indexes)\n })\n\n // Sign transactions in parallel for each signer\n const signerEntries = Array.from(signerGroups)\n const signedGroups = await Promise.all(signerEntries.map(([signer, indexes]) => signer(transactions, indexes)))\n\n // Reconstruct signed transactions in original order\n const encodedSignedTransactions: (Uint8Array | null)[] = new Array(transactionsWithSigners.length).fill(null)\n signerEntries.forEach(([, indexes], signerIndex) => {\n const stxs = signedGroups[signerIndex]\n indexes.forEach((txIndex, stxIndex) => {\n encodedSignedTransactions[txIndex] = stxs[stxIndex] ?? null\n })\n })\n\n // Verify all transactions were signed\n const unsignedIndexes = encodedSignedTransactions\n .map((stxn, index) => (stxn == null ? index : null))\n .filter((index): index is number => index !== null)\n\n if (unsignedIndexes.length > 0) {\n throw new Error(`Transactions at indexes [${unsignedIndexes.join(', ')}] were not signed`)\n }\n\n return encodedSignedTransactions as Uint8Array[] // The guard above ensures no nulls\n }\n\n private parseAbiReturnValues(confirmations: PendingTransactionResponse[]): ABIReturn[] {\n const abiReturns = new Array<ABIReturn>()\n\n for (let i = 0; i < confirmations.length; i++) {\n const confirmation = confirmations[i]\n const txn = this.txns[i]\n if (txn?.type !== 'methodCall') continue\n\n const method = txn.data.method\n const abiReturn = AppManager.getABIReturn(confirmation, method)\n if (abiReturn !== undefined) {\n abiReturns.push(abiReturn)\n }\n }\n\n return abiReturns\n }\n\n public setMaxFees(maxFees: Map<number, AlgoAmount>) {\n maxFees.forEach((_, index) => {\n if (index > this.txns.length - 1) {\n throw new Error(`Index ${index} is out of range. The composer only contains ${this.txns.length} transactions`)\n }\n })\n\n maxFees.forEach((maxFee, index) => {\n this.txns[index].data.maxFee = new AlgoAmount({ microAlgos: maxFee.microAlgos })\n })\n }\n}\n\n/** Get the logical maximum fee based on staticFee and maxFee */\nfunction getLogicalMaxFee(ctxn: Txn): bigint | undefined {\n if (ctxn.type === 'txn' || ctxn.type === 'asyncTxn') {\n return undefined\n }\n\n const maxFee = ctxn.data.maxFee\n const staticFee = ctxn.data.staticFee\n\n if (maxFee !== undefined && (staticFee === undefined || maxFee.microAlgos > staticFee.microAlgos)) {\n return maxFee.microAlgos\n }\n return staticFee?.microAlgos\n}\n"],"mappings":"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"}
|