@aptos-labs/ts-sdk 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/{account-CEmLe1wW.d.ts → account-Bb5REyaT.d.ts} +60 -11
- package/dist/common/chunk-6MMUUJHX.js +4 -0
- package/dist/common/chunk-6MMUUJHX.js.map +1 -0
- package/dist/common/cli/index.d.ts +1 -1
- package/dist/common/cli/index.js +1 -1
- package/dist/common/cli/index.js.map +1 -1
- package/dist/common/index.d.ts +121 -9
- package/dist/common/index.js +53 -32
- package/dist/common/index.js.map +1 -1
- package/dist/esm/{Ed25519Account-Ccxj1zdx.d.mts → Ed25519Account-ndmdpFe9.d.mts} +1 -1
- package/dist/esm/account/AbstractKeylessAccount.d.mts +3 -3
- package/dist/esm/account/AbstractKeylessAccount.mjs +1 -1
- package/dist/esm/account/AbstractedAccount.d.mts +2 -2
- package/dist/esm/account/AbstractedAccount.mjs +1 -1
- package/dist/esm/account/Account.d.mts +2 -2
- package/dist/esm/account/Account.mjs +1 -1
- package/dist/esm/account/AccountUtils.d.mts +3 -3
- package/dist/esm/account/AccountUtils.mjs +1 -1
- package/dist/esm/account/DerivableAbstractedAccount.d.mts +2 -2
- package/dist/esm/account/DerivableAbstractedAccount.mjs +1 -1
- package/dist/esm/account/Ed25519Account.d.mts +2 -2
- package/dist/esm/account/Ed25519Account.mjs +1 -1
- package/dist/esm/account/EphemeralKeyPair.d.mts +1 -1
- package/dist/esm/account/EphemeralKeyPair.mjs +1 -1
- package/dist/esm/account/FederatedKeylessAccount.d.mts +4 -3
- package/dist/esm/account/FederatedKeylessAccount.mjs +1 -1
- package/dist/esm/account/KeylessAccount.d.mts +4 -3
- package/dist/esm/account/KeylessAccount.mjs +1 -1
- package/dist/esm/account/MultiEd25519Account.d.mts +2 -2
- package/dist/esm/account/MultiEd25519Account.mjs +1 -1
- package/dist/esm/account/MultiKeyAccount.d.mts +3 -3
- package/dist/esm/account/MultiKeyAccount.mjs +1 -1
- package/dist/esm/account/SingleKeyAccount.d.mts +2 -2
- package/dist/esm/account/SingleKeyAccount.mjs +1 -1
- package/dist/esm/account/index.d.mts +3 -3
- package/dist/esm/account/index.mjs +1 -1
- package/dist/esm/account/utils.d.mts +1 -1
- package/dist/esm/account/utils.mjs +1 -1
- package/dist/esm/{account-9G6tix5T.d.mts → account--Q9z_xMN.d.mts} +37 -3
- package/dist/esm/api/account/abstraction.d.mts +1 -1
- package/dist/esm/api/account/abstraction.mjs +1 -1
- package/dist/esm/api/account.d.mts +94 -3
- package/dist/esm/api/account.mjs +1 -1
- package/dist/esm/api/ans.d.mts +2 -2
- package/dist/esm/api/ans.mjs +1 -1
- package/dist/esm/api/aptos.d.mts +6 -4
- package/dist/esm/api/aptos.mjs +1 -1
- package/dist/esm/api/aptosConfig.d.mts +1 -1
- package/dist/esm/api/aptosConfig.mjs +1 -1
- package/dist/esm/api/coin.d.mts +1 -1
- package/dist/esm/api/coin.mjs +1 -1
- package/dist/esm/api/digitalAsset.d.mts +2 -2
- package/dist/esm/api/digitalAsset.mjs +1 -1
- package/dist/esm/api/event.d.mts +1 -1
- package/dist/esm/api/event.mjs +1 -1
- package/dist/esm/api/faucet.d.mts +1 -1
- package/dist/esm/api/faucet.mjs +1 -1
- package/dist/esm/api/fungibleAsset.d.mts +2 -2
- package/dist/esm/api/fungibleAsset.mjs +1 -1
- package/dist/esm/api/general.d.mts +1 -1
- package/dist/esm/api/general.mjs +1 -1
- package/dist/esm/api/index.d.mts +6 -4
- package/dist/esm/api/index.mjs +1 -1
- package/dist/esm/api/keyless.d.mts +3 -3
- package/dist/esm/api/keyless.mjs +1 -1
- package/dist/esm/api/object.d.mts +1 -1
- package/dist/esm/api/object.mjs +1 -1
- package/dist/esm/api/staking.d.mts +1 -1
- package/dist/esm/api/staking.mjs +1 -1
- package/dist/esm/api/table.d.mts +1 -1
- package/dist/esm/api/table.mjs +1 -1
- package/dist/esm/api/transaction.d.mts +3 -2
- package/dist/esm/api/transaction.mjs +1 -1
- package/dist/esm/api/transactionSubmission/build.d.mts +1 -1
- package/dist/esm/api/transactionSubmission/build.mjs +1 -1
- package/dist/esm/api/transactionSubmission/management.d.mts +2 -2
- package/dist/esm/api/transactionSubmission/management.mjs +1 -1
- package/dist/esm/api/transactionSubmission/sign.d.mts +2 -2
- package/dist/esm/api/transactionSubmission/sign.mjs +1 -1
- package/dist/esm/api/transactionSubmission/sign.mjs.map +1 -1
- package/dist/esm/api/transactionSubmission/simulate.d.mts +1 -1
- package/dist/esm/api/transactionSubmission/simulate.mjs +1 -1
- package/dist/esm/api/transactionSubmission/submit.d.mts +1 -1
- package/dist/esm/api/transactionSubmission/submit.mjs +1 -1
- package/dist/esm/api/utils.d.mts +1 -1
- package/dist/esm/api/utils.mjs +1 -1
- package/dist/esm/bcs/consts.d.mts +1 -1
- package/dist/esm/bcs/deserializer.d.mts +1 -1
- package/dist/esm/bcs/index.d.mts +1 -1
- package/dist/esm/bcs/index.mjs +1 -1
- package/dist/esm/bcs/serializable/entryFunctionBytes.d.mts +1 -1
- package/dist/esm/bcs/serializable/fixedBytes.d.mts +1 -1
- package/dist/esm/bcs/serializable/movePrimitives.d.mts +1 -1
- package/dist/esm/bcs/serializable/movePrimitives.mjs +1 -1
- package/dist/esm/bcs/serializable/moveStructs.d.mts +1 -1
- package/dist/esm/bcs/serializable/moveStructs.mjs +1 -1
- package/dist/esm/bcs/serializer.d.mts +1 -1
- package/dist/esm/{chunk-Q4W3WJ2U.mjs → chunk-2BOHKN33.mjs} +2 -2
- package/dist/esm/{chunk-SAMHWS73.mjs → chunk-4COLMDT3.mjs} +2 -2
- package/dist/esm/chunk-5HXLZHDW.mjs +1 -0
- package/dist/esm/chunk-5HXLZHDW.mjs.map +1 -0
- package/dist/esm/{chunk-5ZRPV4YI.mjs → chunk-5URUYE6H.mjs} +2 -2
- package/dist/esm/chunk-ACNHLCQQ.mjs +6 -0
- package/dist/esm/chunk-ACNHLCQQ.mjs.map +1 -0
- package/dist/esm/{chunk-2XQKGWHQ.mjs → chunk-FYYEPFML.mjs} +2 -2
- package/dist/esm/chunk-HUWKPKPQ.mjs +2 -0
- package/dist/esm/{chunk-HMUIOIBG.mjs.map → chunk-HUWKPKPQ.mjs.map} +1 -1
- package/dist/esm/chunk-IJE2LVZG.mjs +2 -0
- package/dist/esm/chunk-IJE2LVZG.mjs.map +1 -0
- package/dist/esm/chunk-JCFTAG5Z.mjs +2 -0
- package/dist/esm/{chunk-RJ7F4JDV.mjs.map → chunk-JCFTAG5Z.mjs.map} +1 -1
- package/dist/esm/{chunk-YHGGNYYL.mjs → chunk-MML57K5H.mjs} +2 -2
- package/dist/esm/{chunk-PFXXFUBL.mjs → chunk-MNDTFHDB.mjs} +2 -2
- package/dist/esm/{chunk-FSP4QM2T.mjs → chunk-SLWIGOQL.mjs} +2 -2
- package/dist/esm/{chunk-7T62PEFI.mjs → chunk-TYYVB2A6.mjs} +2 -2
- package/dist/esm/{chunk-WOTQ7227.mjs → chunk-U3GMNXO4.mjs} +2 -2
- package/dist/esm/{chunk-VHNX2NUR.mjs → chunk-UL777LTI.mjs} +47 -26
- package/dist/esm/chunk-UL777LTI.mjs.map +1 -0
- package/dist/esm/{chunk-IDHVW7HS.mjs → chunk-XZ75T7Q7.mjs} +2 -2
- package/dist/esm/{chunk-UIVX6WSC.mjs → chunk-Y7ZQTLH4.mjs} +2 -2
- package/dist/esm/{chunk-R7NQJWDG.mjs → chunk-Z5URUE4U.mjs} +2 -2
- package/dist/esm/cli/index.d.mts +1 -1
- package/dist/esm/cli/index.mjs +1 -1
- package/dist/esm/cli/localNode.mjs +1 -1
- package/dist/esm/cli/move.d.mts +1 -1
- package/dist/esm/client/core.d.mts +1 -1
- package/dist/esm/client/core.mjs +1 -1
- package/dist/esm/client/get.d.mts +1 -1
- package/dist/esm/client/get.mjs +1 -1
- package/dist/esm/client/index.d.mts +1 -1
- package/dist/esm/client/index.mjs +1 -1
- package/dist/esm/client/post.d.mts +1 -1
- package/dist/esm/client/post.mjs +1 -1
- package/dist/esm/core/account/index.d.mts +1 -1
- package/dist/esm/core/account/index.mjs +1 -1
- package/dist/esm/core/account/utils/address.d.mts +1 -1
- package/dist/esm/core/account/utils/address.mjs +1 -1
- package/dist/esm/core/account/utils/index.d.mts +1 -1
- package/dist/esm/core/account/utils/index.mjs +1 -1
- package/dist/esm/core/accountAddress.d.mts +1 -1
- package/dist/esm/core/accountAddress.mjs +1 -1
- package/dist/esm/core/authenticationKey.d.mts +1 -1
- package/dist/esm/core/authenticationKey.mjs +1 -1
- package/dist/esm/core/crypto/abstraction.d.mts +1 -1
- package/dist/esm/core/crypto/abstraction.mjs +1 -1
- package/dist/esm/core/crypto/deserializationUtils.d.mts +1 -1
- package/dist/esm/core/crypto/deserializationUtils.mjs +1 -1
- package/dist/esm/core/crypto/ed25519.d.mts +1 -1
- package/dist/esm/core/crypto/ed25519.mjs +1 -1
- package/dist/esm/core/crypto/ephemeral.d.mts +1 -1
- package/dist/esm/core/crypto/ephemeral.mjs +1 -1
- package/dist/esm/core/crypto/federatedKeyless.d.mts +2 -2
- package/dist/esm/core/crypto/federatedKeyless.mjs +1 -1
- package/dist/esm/core/crypto/index.d.mts +3 -2
- package/dist/esm/core/crypto/index.mjs +1 -1
- package/dist/esm/core/crypto/keyless.d.mts +2 -2
- package/dist/esm/core/crypto/keyless.mjs +1 -1
- package/dist/esm/core/crypto/multiEd25519.d.mts +1 -1
- package/dist/esm/core/crypto/multiEd25519.mjs +1 -1
- package/dist/esm/core/crypto/multiKey.d.mts +1 -1
- package/dist/esm/core/crypto/multiKey.mjs +1 -1
- package/dist/esm/core/crypto/privateKey.d.mts +1 -1
- package/dist/esm/core/crypto/privateKey.mjs +1 -1
- package/dist/esm/core/crypto/proof.d.mts +1 -1
- package/dist/esm/core/crypto/proof.mjs +1 -1
- package/dist/esm/core/crypto/publicKey.d.mts +1 -1
- package/dist/esm/core/crypto/publicKey.mjs +1 -1
- package/dist/esm/core/crypto/secp256k1.d.mts +1 -1
- package/dist/esm/core/crypto/secp256k1.mjs +1 -1
- package/dist/esm/core/crypto/signature.d.mts +1 -1
- package/dist/esm/core/crypto/signature.mjs +1 -1
- package/dist/esm/core/crypto/singleKey.d.mts +1 -1
- package/dist/esm/core/crypto/singleKey.mjs +1 -1
- package/dist/esm/core/crypto/types.d.mts +11 -0
- package/dist/esm/core/crypto/types.mjs +2 -0
- package/dist/esm/core/crypto/types.mjs.map +1 -0
- package/dist/esm/core/crypto/utils.d.mts +1 -1
- package/dist/esm/core/hex.d.mts +1 -1
- package/dist/esm/core/index.d.mts +3 -2
- package/dist/esm/core/index.mjs +1 -1
- package/dist/esm/errors/index.d.mts +1 -1
- package/dist/esm/errors/index.mjs +1 -1
- package/dist/esm/{federatedKeyless-CVKW5pnz.d.mts → federatedKeyless-CiyplsOB.d.mts} +1 -1
- package/dist/esm/index.d.mts +6 -4
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/internal/abstraction.d.mts +1 -1
- package/dist/esm/internal/abstraction.mjs +1 -1
- package/dist/esm/internal/account.d.mts +38 -8
- package/dist/esm/internal/account.mjs +1 -1
- package/dist/esm/internal/ans.d.mts +2 -2
- package/dist/esm/internal/ans.mjs +1 -1
- package/dist/esm/internal/coin.d.mts +1 -1
- package/dist/esm/internal/coin.mjs +1 -1
- package/dist/esm/internal/digitalAsset.d.mts +2 -2
- package/dist/esm/internal/digitalAsset.mjs +1 -1
- package/dist/esm/internal/event.d.mts +1 -1
- package/dist/esm/internal/event.mjs +1 -1
- package/dist/esm/internal/faucet.d.mts +1 -1
- package/dist/esm/internal/faucet.mjs +1 -1
- package/dist/esm/internal/fungibleAsset.d.mts +2 -2
- package/dist/esm/internal/fungibleAsset.mjs +1 -1
- package/dist/esm/internal/general.d.mts +1 -1
- package/dist/esm/internal/general.mjs +1 -1
- package/dist/esm/internal/keyless.d.mts +12 -3
- package/dist/esm/internal/keyless.mjs +1 -1
- package/dist/esm/internal/object.d.mts +1 -1
- package/dist/esm/internal/object.mjs +1 -1
- package/dist/esm/internal/staking.d.mts +1 -1
- package/dist/esm/internal/staking.mjs +1 -1
- package/dist/esm/internal/table.d.mts +1 -1
- package/dist/esm/internal/table.mjs +1 -1
- package/dist/esm/internal/transaction.d.mts +1 -1
- package/dist/esm/internal/transaction.mjs +1 -1
- package/dist/esm/internal/transactionSubmission.d.mts +2 -2
- package/dist/esm/internal/transactionSubmission.mjs +1 -1
- package/dist/esm/internal/utils/index.d.mts +1 -1
- package/dist/esm/internal/utils/index.mjs +1 -1
- package/dist/esm/internal/utils/utils.d.mts +1 -1
- package/dist/esm/internal/utils/utils.mjs +1 -1
- package/dist/esm/internal/view.d.mts +1 -1
- package/dist/esm/internal/view.mjs +1 -1
- package/dist/esm/transactions/authenticator/account.d.mts +1 -1
- package/dist/esm/transactions/authenticator/account.mjs +1 -1
- package/dist/esm/transactions/authenticator/index.d.mts +1 -1
- package/dist/esm/transactions/authenticator/index.mjs +1 -1
- package/dist/esm/transactions/authenticator/transaction.d.mts +1 -1
- package/dist/esm/transactions/authenticator/transaction.mjs +1 -1
- package/dist/esm/transactions/index.d.mts +1 -1
- package/dist/esm/transactions/index.mjs +1 -1
- package/dist/esm/transactions/instances/chainId.d.mts +1 -1
- package/dist/esm/transactions/instances/identifier.d.mts +1 -1
- package/dist/esm/transactions/instances/index.d.mts +1 -1
- package/dist/esm/transactions/instances/index.mjs +1 -1
- package/dist/esm/transactions/instances/moduleId.d.mts +1 -1
- package/dist/esm/transactions/instances/moduleId.mjs +1 -1
- package/dist/esm/transactions/instances/multiAgentTransaction.d.mts +1 -1
- package/dist/esm/transactions/instances/multiAgentTransaction.mjs +1 -1
- package/dist/esm/transactions/instances/rawTransaction.d.mts +1 -1
- package/dist/esm/transactions/instances/rawTransaction.mjs +1 -1
- package/dist/esm/transactions/instances/rotationProofChallenge.d.mts +1 -1
- package/dist/esm/transactions/instances/rotationProofChallenge.mjs +1 -1
- package/dist/esm/transactions/instances/signedTransaction.d.mts +1 -1
- package/dist/esm/transactions/instances/signedTransaction.mjs +1 -1
- package/dist/esm/transactions/instances/simpleTransaction.d.mts +1 -1
- package/dist/esm/transactions/instances/simpleTransaction.mjs +1 -1
- package/dist/esm/transactions/instances/transactionArgument.d.mts +1 -1
- package/dist/esm/transactions/instances/transactionPayload.d.mts +1 -1
- package/dist/esm/transactions/instances/transactionPayload.mjs +1 -1
- package/dist/esm/transactions/management/accountSequenceNumber.d.mts +2 -2
- package/dist/esm/transactions/management/accountSequenceNumber.mjs +1 -1
- package/dist/esm/transactions/management/index.d.mts +2 -2
- package/dist/esm/transactions/management/index.mjs +1 -1
- package/dist/esm/transactions/management/transactionWorker.d.mts +2 -2
- package/dist/esm/transactions/management/transactionWorker.mjs +1 -1
- package/dist/esm/transactions/transactionBuilder/helpers.d.mts +1 -1
- package/dist/esm/transactions/transactionBuilder/helpers.mjs +1 -1
- package/dist/esm/transactions/transactionBuilder/index.d.mts +1 -1
- package/dist/esm/transactions/transactionBuilder/index.mjs +1 -1
- package/dist/esm/transactions/transactionBuilder/remoteAbi.d.mts +1 -1
- package/dist/esm/transactions/transactionBuilder/remoteAbi.mjs +1 -1
- package/dist/esm/transactions/transactionBuilder/signingMessage.d.mts +1 -1
- package/dist/esm/transactions/transactionBuilder/signingMessage.mjs +1 -1
- package/dist/esm/transactions/transactionBuilder/transactionBuilder.d.mts +1 -1
- package/dist/esm/transactions/transactionBuilder/transactionBuilder.mjs +1 -1
- package/dist/esm/transactions/typeTag/index.d.mts +1 -1
- package/dist/esm/transactions/typeTag/index.mjs +1 -1
- package/dist/esm/transactions/typeTag/parser.d.mts +1 -1
- package/dist/esm/transactions/typeTag/parser.mjs +1 -1
- package/dist/esm/transactions/types.d.mts +1 -1
- package/dist/esm/types/generated/operations.d.mts +37 -10
- package/dist/esm/types/generated/queries.d.mts +6 -2
- package/dist/esm/types/generated/queries.mjs +1 -1
- package/dist/esm/types/generated/types.d.mts +584 -1172
- package/dist/esm/types/generated/types.mjs +1 -1
- package/dist/esm/types/generated/types.mjs.map +1 -1
- package/dist/esm/types/index.d.mts +2 -2
- package/dist/esm/types/index.mjs +1 -1
- package/dist/esm/types/indexer.d.mts +8 -2
- package/dist/esm/types/types.d.mts +1 -1
- package/dist/esm/types/types.mjs +1 -1
- package/dist/esm/utils/const.d.mts +1 -0
- package/dist/esm/utils/const.mjs +1 -1
- package/dist/esm/utils/helpers.d.mts +1 -1
- package/dist/esm/utils/helpers.mjs +1 -1
- package/dist/esm/utils/index.d.mts +1 -1
- package/dist/esm/utils/index.mjs +1 -1
- package/dist/esm/utils/normalizeBundle.d.mts +1 -1
- package/dist/esm/utils/normalizeBundle.mjs +1 -1
- package/dist/esm/version.d.mts +1 -1
- package/dist/esm/version.mjs +1 -1
- package/package.json +19 -18
- package/src/account/FederatedKeylessAccount.ts +7 -1
- package/src/account/KeylessAccount.ts +17 -2
- package/src/api/account.ts +135 -2
- package/src/api/transaction.ts +1 -0
- package/src/core/crypto/index.ts +1 -0
- package/src/core/crypto/multiEd25519.ts +26 -0
- package/src/core/crypto/multiKey.ts +6 -0
- package/src/core/crypto/types.ts +9 -0
- package/src/internal/account.ts +526 -59
- package/src/internal/keyless.ts +10 -0
- package/src/internal/move/jwks/build/jwk/BuildInfo.yaml +56 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/account.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/aggregator.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/aggregator_factory.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/aggregator_v2.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/aptos_account.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/aptos_coin.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/aptos_governance.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/block.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/chain_id.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/chain_status.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/code.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/coin.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/config_buffer.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/consensus_config.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/create_signer.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/delegation_pool.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/dispatchable_fungible_asset.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/dkg.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/event.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/execution_config.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/function_info.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/fungible_asset.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/gas_schedule.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/genesis.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/governance_proposal.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/guid.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/jwk_consensus_config.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/jwks.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/keyless_account.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/managed_coin.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/multisig_account.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/object.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/object_code_deployment.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/optional_aggregator.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/primary_fungible_store.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/randomness.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/randomness_api_v0_config.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/randomness_config.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/randomness_config_seqnum.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/reconfiguration.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/reconfiguration_state.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/reconfiguration_with_dkg.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/resource_account.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/stake.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/staking_config.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/staking_contract.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/staking_proxy.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/state_storage.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/storage_gas.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/system_addresses.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/timestamp.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/transaction_context.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/transaction_fee.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/transaction_validation.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/util.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/validator_consensus_info.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/version.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/vesting.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosFramework/voting.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/any.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/aptos_hash.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/big_vector.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/bls12381.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/bls12381_algebra.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/bn254_algebra.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/capability.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/comparator.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/copyable_any.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/crypto_algebra.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/debug.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/ed25519.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/fixed_point64.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/from_bcs.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/math128.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/math64.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/math_fixed.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/math_fixed64.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/multi_ed25519.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/pool_u64.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/pool_u64_unbound.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/ristretto255.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/ristretto255_bulletproofs.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/ristretto255_elgamal.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/ristretto255_pedersen.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/secp256k1.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/simple_map.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/smart_table.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/smart_vector.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/string_utils.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/table.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/table_with_length.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/AptosStdlib/type_info.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/acl.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/bcs.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/bit_vector.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/error.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/features.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/fixed_point32.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/hash.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/option.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/signer.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/string.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_modules/dependencies/MoveStdlib/vector.mv +0 -0
- package/src/internal/move/jwks/build/jwk/bytecode_scripts/main.mv +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/account.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/aggregator.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/aggregator_factory.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/aggregator_v2.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/aptos_account.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/aptos_coin.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/aptos_governance.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/block.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/chain_id.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/chain_status.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/code.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/coin.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/config_buffer.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/consensus_config.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/create_signer.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/delegation_pool.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/dispatchable_fungible_asset.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/dkg.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/event.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/execution_config.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/function_info.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/fungible_asset.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/gas_schedule.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/genesis.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/governance_proposal.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/guid.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/jwk_consensus_config.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/jwks.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/keyless_account.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/managed_coin.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/multisig_account.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/object.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/object_code_deployment.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/optional_aggregator.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/primary_fungible_store.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/randomness.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/randomness_api_v0_config.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/randomness_config.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/randomness_config_seqnum.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/reconfiguration.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/reconfiguration_state.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/reconfiguration_with_dkg.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/resource_account.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/stake.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/staking_config.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/staking_contract.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/staking_proxy.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/state_storage.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/storage_gas.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/system_addresses.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/timestamp.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/transaction_context.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/transaction_fee.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/transaction_validation.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/util.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/validator_consensus_info.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/version.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/vesting.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosFramework/voting.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/any.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/aptos_hash.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/big_vector.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/bls12381.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/bls12381_algebra.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/bn254_algebra.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/capability.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/comparator.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/copyable_any.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/crypto_algebra.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/debug.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/ed25519.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/fixed_point64.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/from_bcs.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/math128.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/math64.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/math_fixed.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/math_fixed64.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/multi_ed25519.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/pool_u64.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/pool_u64_unbound.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/ristretto255.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/ristretto255_bulletproofs.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/ristretto255_elgamal.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/ristretto255_pedersen.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/secp256k1.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/simple_map.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/smart_table.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/smart_vector.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/string_utils.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/table.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/table_with_length.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/AptosStdlib/type_info.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/acl.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/bcs.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/bit_vector.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/error.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/features.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/fixed_point32.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/hash.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/option.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/signer.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/string.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/dependencies/MoveStdlib/vector.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/source_maps/main.mvsm +0 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/account.move +1533 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/aggregator.move +48 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/aggregator_factory.move +66 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/aggregator_v2.move +280 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/aptos_account.move +443 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/aptos_coin.move +204 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/aptos_governance.move +1387 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/block.move +394 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/chain_id.move +41 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/chain_status.move +48 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/code.move +367 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/coin.move +2214 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/config_buffer.move +101 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/consensus_config.move +77 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/create_signer.move +21 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/delegation_pool.move +5568 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/dispatchable_fungible_asset.move +228 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/dkg.move +121 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/event.move +92 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/execution_config.move +66 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/function_info.move +100 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/fungible_asset.move +1566 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/gas_schedule.move +176 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/genesis.move +550 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/governance_proposal.move +23 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/guid.move +68 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/jwk_consensus_config.move +148 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/jwks.move +817 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/keyless_account.move +312 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/managed_coin.move +205 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/multisig_account.move +2477 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/object.move +1073 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/object_code_deployment.move +147 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/optional_aggregator.move +295 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/primary_fungible_store.move +405 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/randomness.move +574 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/randomness_api_v0_config.move +57 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/randomness_config.move +153 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/randomness_config_seqnum.move +49 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/reconfiguration.move +237 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/reconfiguration_state.move +132 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/reconfiguration_with_dkg.move +69 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/resource_account.move +267 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/stake.move +3286 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/staking_config.move +686 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/staking_contract.move +1618 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/staking_proxy.move +228 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/state_storage.move +90 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/storage_gas.move +622 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/system_addresses.move +82 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/timestamp.move +88 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/transaction_context.move +262 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/transaction_fee.move +457 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/transaction_validation.move +501 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/util.move +16 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/validator_consensus_info.move +42 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/version.move +115 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/vesting.move +2183 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosFramework/voting.move +1279 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/any.move +57 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/aptos_hash.move +253 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/big_vector.move +469 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/bls12381.move +985 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/bls12381_algebra.move +802 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/bn254_algebra.move +855 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/capability.move +193 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/comparator.move +173 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/copyable_any.move +45 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/crypto_algebra.move +351 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/debug.move +278 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/ed25519.move +262 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/fixed_point64.move +447 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/from_bcs.move +91 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/math128.move +381 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/math64.move +336 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/math_fixed.move +139 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/math_fixed64.move +142 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/multi_ed25519.move +482 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/pool_u64.move +571 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/pool_u64_unbound.move +270 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/ristretto255.move +1310 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/ristretto255_bulletproofs.move +253 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/ristretto255_elgamal.move +234 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/ristretto255_pedersen.move +158 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/secp256k1.move +114 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/simple_map.move +319 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/smart_table.move +769 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/smart_vector.move +766 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/string_utils.move +148 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/table.move +152 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/table_with_length.move +141 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/AptosStdlib/type_info.move +351 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/acl.move +46 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/bcs.move +27 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/bit_vector.move +239 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/error.move +88 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/features.move +780 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/fixed_point32.move +295 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/hash.move +8 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/option.move +356 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/signer.move +21 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/string.move +93 -0
- package/src/internal/move/jwks/build/jwk/sources/dependencies/MoveStdlib/vector.move +669 -0
- package/src/internal/move/jwks/build/jwk/sources/main.move +20 -0
- package/src/internal/queries/getAccountAddressesForAuthKey.graphql +8 -0
- package/src/internal/queries/getAuthKeysForPublicKey.graphql +11 -0
- package/src/types/codegen.yaml +1 -1
- package/src/types/generated/operations.ts +39 -8
- package/src/types/generated/queries.ts +53 -0
- package/src/types/generated/types.ts +620 -1239
- package/src/types/indexer.ts +8 -0
- package/src/types/types.ts +40 -3
- package/src/utils/const.ts +1 -0
- package/src/version.ts +1 -1
- package/dist/common/chunk-5JIJXVJ5.js +0 -4
- package/dist/common/chunk-5JIJXVJ5.js.map +0 -1
- package/dist/esm/chunk-4H2RMR7D.mjs +0 -2
- package/dist/esm/chunk-4H2RMR7D.mjs.map +0 -1
- package/dist/esm/chunk-GMDBBVDH.mjs +0 -6
- package/dist/esm/chunk-GMDBBVDH.mjs.map +0 -1
- package/dist/esm/chunk-HMUIOIBG.mjs +0 -2
- package/dist/esm/chunk-RJ7F4JDV.mjs +0 -2
- package/dist/esm/chunk-VHNX2NUR.mjs.map +0 -1
- /package/dist/esm/{chunk-Q4W3WJ2U.mjs.map → chunk-2BOHKN33.mjs.map} +0 -0
- /package/dist/esm/{chunk-SAMHWS73.mjs.map → chunk-4COLMDT3.mjs.map} +0 -0
- /package/dist/esm/{chunk-5ZRPV4YI.mjs.map → chunk-5URUYE6H.mjs.map} +0 -0
- /package/dist/esm/{chunk-2XQKGWHQ.mjs.map → chunk-FYYEPFML.mjs.map} +0 -0
- /package/dist/esm/{chunk-YHGGNYYL.mjs.map → chunk-MML57K5H.mjs.map} +0 -0
- /package/dist/esm/{chunk-PFXXFUBL.mjs.map → chunk-MNDTFHDB.mjs.map} +0 -0
- /package/dist/esm/{chunk-FSP4QM2T.mjs.map → chunk-SLWIGOQL.mjs.map} +0 -0
- /package/dist/esm/{chunk-7T62PEFI.mjs.map → chunk-TYYVB2A6.mjs.map} +0 -0
- /package/dist/esm/{chunk-WOTQ7227.mjs.map → chunk-U3GMNXO4.mjs.map} +0 -0
- /package/dist/esm/{chunk-IDHVW7HS.mjs.map → chunk-XZ75T7Q7.mjs.map} +0 -0
- /package/dist/esm/{chunk-UIVX6WSC.mjs.map → chunk-Y7ZQTLH4.mjs.map} +0 -0
- /package/dist/esm/{chunk-R7NQJWDG.mjs.map → chunk-Z5URUE4U.mjs.map} +0 -0
|
@@ -0,0 +1,2214 @@
|
|
|
1
|
+
/// This module provides the foundation for typesafe Coins.
|
|
2
|
+
module aptos_framework::coin {
|
|
3
|
+
use std::error;
|
|
4
|
+
use std::features;
|
|
5
|
+
use std::option::{Self, Option};
|
|
6
|
+
use std::signer;
|
|
7
|
+
use std::string::{Self, String};
|
|
8
|
+
use aptos_std::table::{Self, Table};
|
|
9
|
+
|
|
10
|
+
use aptos_framework::account;
|
|
11
|
+
use aptos_framework::aggregator_factory;
|
|
12
|
+
use aptos_framework::aggregator::{Self, Aggregator};
|
|
13
|
+
use aptos_framework::event::{Self, EventHandle};
|
|
14
|
+
use aptos_framework::guid;
|
|
15
|
+
use aptos_framework::optional_aggregator::{Self, OptionalAggregator};
|
|
16
|
+
use aptos_framework::system_addresses;
|
|
17
|
+
|
|
18
|
+
use aptos_framework::fungible_asset::{Self, FungibleAsset, Metadata, MintRef, TransferRef, BurnRef};
|
|
19
|
+
use aptos_framework::object::{Self, Object, object_address};
|
|
20
|
+
use aptos_framework::primary_fungible_store;
|
|
21
|
+
use aptos_std::type_info::{Self, TypeInfo, type_name};
|
|
22
|
+
use aptos_framework::create_signer;
|
|
23
|
+
|
|
24
|
+
friend aptos_framework::aptos_coin;
|
|
25
|
+
friend aptos_framework::genesis;
|
|
26
|
+
friend aptos_framework::transaction_fee;
|
|
27
|
+
|
|
28
|
+
//
|
|
29
|
+
// Errors.
|
|
30
|
+
//
|
|
31
|
+
|
|
32
|
+
/// Address of account which is used to initialize a coin `CoinType` doesn't match the deployer of module
|
|
33
|
+
const ECOIN_INFO_ADDRESS_MISMATCH: u64 = 1;
|
|
34
|
+
|
|
35
|
+
/// `CoinType` is already initialized as a coin
|
|
36
|
+
const ECOIN_INFO_ALREADY_PUBLISHED: u64 = 2;
|
|
37
|
+
|
|
38
|
+
/// `CoinType` hasn't been initialized as a coin
|
|
39
|
+
const ECOIN_INFO_NOT_PUBLISHED: u64 = 3;
|
|
40
|
+
|
|
41
|
+
/// Deprecated. Account already has `CoinStore` registered for `CoinType`
|
|
42
|
+
const ECOIN_STORE_ALREADY_PUBLISHED: u64 = 4;
|
|
43
|
+
|
|
44
|
+
/// Account hasn't registered `CoinStore` for `CoinType`
|
|
45
|
+
const ECOIN_STORE_NOT_PUBLISHED: u64 = 5;
|
|
46
|
+
|
|
47
|
+
/// Not enough coins to complete transaction
|
|
48
|
+
const EINSUFFICIENT_BALANCE: u64 = 6;
|
|
49
|
+
|
|
50
|
+
/// Cannot destroy non-zero coins
|
|
51
|
+
const EDESTRUCTION_OF_NONZERO_TOKEN: u64 = 7;
|
|
52
|
+
|
|
53
|
+
/// CoinStore is frozen. Coins cannot be deposited or withdrawn
|
|
54
|
+
const EFROZEN: u64 = 10;
|
|
55
|
+
|
|
56
|
+
/// Cannot upgrade the total supply of coins to different implementation.
|
|
57
|
+
const ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED: u64 = 11;
|
|
58
|
+
|
|
59
|
+
/// Name of the coin is too long
|
|
60
|
+
const ECOIN_NAME_TOO_LONG: u64 = 12;
|
|
61
|
+
|
|
62
|
+
/// Symbol of the coin is too long
|
|
63
|
+
const ECOIN_SYMBOL_TOO_LONG: u64 = 13;
|
|
64
|
+
|
|
65
|
+
/// The value of aggregatable coin used for transaction fees redistribution does not fit in u64.
|
|
66
|
+
const EAGGREGATABLE_COIN_VALUE_TOO_LARGE: u64 = 14;
|
|
67
|
+
|
|
68
|
+
/// Error regarding paired coin type of the fungible asset metadata.
|
|
69
|
+
const EPAIRED_COIN: u64 = 15;
|
|
70
|
+
|
|
71
|
+
/// Error regarding paired fungible asset metadata of a coin type.
|
|
72
|
+
const EPAIRED_FUNGIBLE_ASSET: u64 = 16;
|
|
73
|
+
|
|
74
|
+
/// The coin type from the map does not match the calling function type argument.
|
|
75
|
+
const ECOIN_TYPE_MISMATCH: u64 = 17;
|
|
76
|
+
|
|
77
|
+
/// The feature of migration from coin to fungible asset is not enabled.
|
|
78
|
+
const ECOIN_TO_FUNGIBLE_ASSET_FEATURE_NOT_ENABLED: u64 = 18;
|
|
79
|
+
|
|
80
|
+
/// PairedFungibleAssetRefs resource does not exist.
|
|
81
|
+
const EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND: u64 = 19;
|
|
82
|
+
|
|
83
|
+
/// The MintRefReceipt does not match the MintRef to be returned.
|
|
84
|
+
const EMINT_REF_RECEIPT_MISMATCH: u64 = 20;
|
|
85
|
+
|
|
86
|
+
/// The MintRef does not exist.
|
|
87
|
+
const EMINT_REF_NOT_FOUND: u64 = 21;
|
|
88
|
+
|
|
89
|
+
/// The TransferRefReceipt does not match the TransferRef to be returned.
|
|
90
|
+
const ETRANSFER_REF_RECEIPT_MISMATCH: u64 = 22;
|
|
91
|
+
|
|
92
|
+
/// The TransferRef does not exist.
|
|
93
|
+
const ETRANSFER_REF_NOT_FOUND: u64 = 23;
|
|
94
|
+
|
|
95
|
+
/// The BurnRefReceipt does not match the BurnRef to be returned.
|
|
96
|
+
const EBURN_REF_RECEIPT_MISMATCH: u64 = 24;
|
|
97
|
+
|
|
98
|
+
/// The BurnRef does not exist.
|
|
99
|
+
const EBURN_REF_NOT_FOUND: u64 = 25;
|
|
100
|
+
|
|
101
|
+
/// The migration process from coin to fungible asset is not enabled yet.
|
|
102
|
+
const EMIGRATION_FRAMEWORK_NOT_ENABLED: u64 = 26;
|
|
103
|
+
|
|
104
|
+
/// The coin converison map is not created yet.
|
|
105
|
+
const ECOIN_CONVERSION_MAP_NOT_FOUND: u64 = 27;
|
|
106
|
+
|
|
107
|
+
/// APT pairing is not eanbled yet.
|
|
108
|
+
const EAPT_PAIRING_IS_NOT_ENABLED: u64 = 28;
|
|
109
|
+
|
|
110
|
+
//
|
|
111
|
+
// Constants
|
|
112
|
+
//
|
|
113
|
+
|
|
114
|
+
const MAX_COIN_NAME_LENGTH: u64 = 32;
|
|
115
|
+
const MAX_COIN_SYMBOL_LENGTH: u64 = 10;
|
|
116
|
+
|
|
117
|
+
/// Core data structures
|
|
118
|
+
|
|
119
|
+
/// Main structure representing a coin/token in an account's custody.
|
|
120
|
+
struct Coin<phantom CoinType> has store {
|
|
121
|
+
/// Amount of coin this address has.
|
|
122
|
+
value: u64,
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/// Represents a coin with aggregator as its value. This allows to update
|
|
126
|
+
/// the coin in every transaction avoiding read-modify-write conflicts. Only
|
|
127
|
+
/// used for gas fees distribution by Aptos Framework (0x1).
|
|
128
|
+
struct AggregatableCoin<phantom CoinType> has store {
|
|
129
|
+
/// Amount of aggregatable coin this address has.
|
|
130
|
+
value: Aggregator,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/// Maximum possible aggregatable coin value.
|
|
134
|
+
const MAX_U64: u128 = 18446744073709551615;
|
|
135
|
+
|
|
136
|
+
/// A holder of a specific coin types and associated event handles.
|
|
137
|
+
/// These are kept in a single resource to ensure locality of data.
|
|
138
|
+
struct CoinStore<phantom CoinType> has key {
|
|
139
|
+
coin: Coin<CoinType>,
|
|
140
|
+
frozen: bool,
|
|
141
|
+
deposit_events: EventHandle<DepositEvent>,
|
|
142
|
+
withdraw_events: EventHandle<WithdrawEvent>,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/// Maximum possible coin supply.
|
|
146
|
+
const MAX_U128: u128 = 340282366920938463463374607431768211455;
|
|
147
|
+
|
|
148
|
+
/// Configuration that controls the behavior of total coin supply. If the field
|
|
149
|
+
/// is set, coin creators are allowed to upgrade to parallelizable implementations.
|
|
150
|
+
struct SupplyConfig has key {
|
|
151
|
+
allow_upgrades: bool,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/// Information about a specific coin type. Stored on the creator of the coin's account.
|
|
155
|
+
struct CoinInfo<phantom CoinType> has key {
|
|
156
|
+
name: String,
|
|
157
|
+
/// Symbol of the coin, usually a shorter version of the name.
|
|
158
|
+
/// For example, Singapore Dollar is SGD.
|
|
159
|
+
symbol: String,
|
|
160
|
+
/// Number of decimals used to get its user representation.
|
|
161
|
+
/// For example, if `decimals` equals `2`, a balance of `505` coins should
|
|
162
|
+
/// be displayed to a user as `5.05` (`505 / 10 ** 2`).
|
|
163
|
+
decimals: u8,
|
|
164
|
+
/// Amount of this coin type in existence.
|
|
165
|
+
supply: Option<OptionalAggregator>,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
#[event]
|
|
170
|
+
/// Module event emitted when some amount of a coin is deposited into an account.
|
|
171
|
+
struct CoinDeposit has drop, store {
|
|
172
|
+
coin_type: String,
|
|
173
|
+
account: address,
|
|
174
|
+
amount: u64,
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
#[event]
|
|
178
|
+
/// Module event emitted when some amount of a coin is withdrawn from an account.
|
|
179
|
+
struct CoinWithdraw has drop, store {
|
|
180
|
+
coin_type: String,
|
|
181
|
+
account: address,
|
|
182
|
+
amount: u64,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// DEPRECATED, NEVER USED
|
|
186
|
+
#[deprecated]
|
|
187
|
+
#[event]
|
|
188
|
+
struct Deposit<phantom CoinType> has drop, store {
|
|
189
|
+
account: address,
|
|
190
|
+
amount: u64,
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// DEPRECATED, NEVER USED
|
|
194
|
+
#[deprecated]
|
|
195
|
+
#[event]
|
|
196
|
+
struct Withdraw<phantom CoinType> has drop, store {
|
|
197
|
+
account: address,
|
|
198
|
+
amount: u64,
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/// Event emitted when some amount of a coin is deposited into an account.
|
|
202
|
+
struct DepositEvent has drop, store {
|
|
203
|
+
amount: u64,
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/// Event emitted when some amount of a coin is withdrawn from an account.
|
|
207
|
+
struct WithdrawEvent has drop, store {
|
|
208
|
+
amount: u64,
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
#[event]
|
|
213
|
+
/// Module event emitted when the event handles related to coin store is deleted.
|
|
214
|
+
struct CoinEventHandleDeletion has drop, store {
|
|
215
|
+
event_handle_creation_address: address,
|
|
216
|
+
deleted_deposit_event_handle_creation_number: u64,
|
|
217
|
+
deleted_withdraw_event_handle_creation_number: u64,
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#[event]
|
|
221
|
+
/// Module event emitted when a new pair of coin and fungible asset is created.
|
|
222
|
+
struct PairCreation has drop, store {
|
|
223
|
+
coin_type: TypeInfo,
|
|
224
|
+
fungible_asset_metadata_address: address,
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
|
|
228
|
+
/// The flag the existence of which indicates the primary fungible store is created by the migration from CoinStore.
|
|
229
|
+
struct MigrationFlag has key {}
|
|
230
|
+
|
|
231
|
+
/// Capability required to mint coins.
|
|
232
|
+
struct MintCapability<phantom CoinType> has copy, store {}
|
|
233
|
+
|
|
234
|
+
/// Capability required to freeze a coin store.
|
|
235
|
+
struct FreezeCapability<phantom CoinType> has copy, store {}
|
|
236
|
+
|
|
237
|
+
/// Capability required to burn coins.
|
|
238
|
+
struct BurnCapability<phantom CoinType> has copy, store {}
|
|
239
|
+
|
|
240
|
+
/// The mapping between coin and fungible asset.
|
|
241
|
+
struct CoinConversionMap has key {
|
|
242
|
+
coin_to_fungible_asset_map: Table<TypeInfo, Object<Metadata>>,
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
|
|
246
|
+
/// The paired coin type info stored in fungible asset metadata object.
|
|
247
|
+
struct PairedCoinType has key {
|
|
248
|
+
type: TypeInfo,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
|
|
252
|
+
/// The refs of the paired fungible asset.
|
|
253
|
+
struct PairedFungibleAssetRefs has key {
|
|
254
|
+
mint_ref_opt: Option<MintRef>,
|
|
255
|
+
transfer_ref_opt: Option<TransferRef>,
|
|
256
|
+
burn_ref_opt: Option<BurnRef>,
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/// The hot potato receipt for flash borrowing MintRef.
|
|
260
|
+
struct MintRefReceipt {
|
|
261
|
+
metadata: Object<Metadata>,
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/// The hot potato receipt for flash borrowing TransferRef.
|
|
265
|
+
struct TransferRefReceipt {
|
|
266
|
+
metadata: Object<Metadata>,
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/// The hot potato receipt for flash borrowing BurnRef.
|
|
270
|
+
struct BurnRefReceipt {
|
|
271
|
+
metadata: Object<Metadata>,
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
#[view]
|
|
275
|
+
/// Get the paired fungible asset metadata object of a coin type. If not exist, return option::none().
|
|
276
|
+
public fun paired_metadata<CoinType>(): Option<Object<Metadata>> acquires CoinConversionMap {
|
|
277
|
+
if (exists<CoinConversionMap>(@aptos_framework) && features::coin_to_fungible_asset_migration_feature_enabled(
|
|
278
|
+
)) {
|
|
279
|
+
let map = &borrow_global<CoinConversionMap>(@aptos_framework).coin_to_fungible_asset_map;
|
|
280
|
+
let type = type_info::type_of<CoinType>();
|
|
281
|
+
if (table::contains(map, type)) {
|
|
282
|
+
return option::some(*table::borrow(map, type))
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
option::none()
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
public entry fun create_coin_conversion_map(aptos_framework: &signer) {
|
|
289
|
+
system_addresses::assert_aptos_framework(aptos_framework);
|
|
290
|
+
if (!exists<CoinConversionMap>(@aptos_framework)) {
|
|
291
|
+
move_to(aptos_framework, CoinConversionMap {
|
|
292
|
+
coin_to_fungible_asset_map: table::new(),
|
|
293
|
+
})
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// Create APT pairing by passing `AptosCoin`.
|
|
298
|
+
public entry fun create_pairing<CoinType>(
|
|
299
|
+
aptos_framework: &signer
|
|
300
|
+
) acquires CoinConversionMap, CoinInfo {
|
|
301
|
+
system_addresses::assert_aptos_framework(aptos_framework);
|
|
302
|
+
create_and_return_paired_metadata_if_not_exist<CoinType>(true);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
inline fun is_apt<CoinType>(): bool {
|
|
306
|
+
type_info::type_name<CoinType>() == string::utf8(b"0x1::aptos_coin::AptosCoin")
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
inline fun create_and_return_paired_metadata_if_not_exist<CoinType>(allow_apt_creation: bool): Object<Metadata> {
|
|
310
|
+
assert!(
|
|
311
|
+
features::coin_to_fungible_asset_migration_feature_enabled(),
|
|
312
|
+
error::invalid_state(EMIGRATION_FRAMEWORK_NOT_ENABLED)
|
|
313
|
+
);
|
|
314
|
+
assert!(exists<CoinConversionMap>(@aptos_framework), error::not_found(ECOIN_CONVERSION_MAP_NOT_FOUND));
|
|
315
|
+
let map = borrow_global_mut<CoinConversionMap>(@aptos_framework);
|
|
316
|
+
let type = type_info::type_of<CoinType>();
|
|
317
|
+
if (!table::contains(&map.coin_to_fungible_asset_map, type)) {
|
|
318
|
+
let is_apt = is_apt<CoinType>();
|
|
319
|
+
assert!(!is_apt || allow_apt_creation, error::invalid_state(EAPT_PAIRING_IS_NOT_ENABLED));
|
|
320
|
+
let metadata_object_cref =
|
|
321
|
+
if (is_apt) {
|
|
322
|
+
object::create_sticky_object_at_address(@aptos_framework, @aptos_fungible_asset)
|
|
323
|
+
} else {
|
|
324
|
+
object::create_named_object(
|
|
325
|
+
&create_signer::create_signer(@aptos_fungible_asset),
|
|
326
|
+
*string::bytes(&type_info::type_name<CoinType>())
|
|
327
|
+
)
|
|
328
|
+
};
|
|
329
|
+
primary_fungible_store::create_primary_store_enabled_fungible_asset(
|
|
330
|
+
&metadata_object_cref,
|
|
331
|
+
option::none(),
|
|
332
|
+
name<CoinType>(),
|
|
333
|
+
symbol<CoinType>(),
|
|
334
|
+
decimals<CoinType>(),
|
|
335
|
+
string::utf8(b""),
|
|
336
|
+
string::utf8(b""),
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
let metadata_object_signer = &object::generate_signer(&metadata_object_cref);
|
|
340
|
+
let type = type_info::type_of<CoinType>();
|
|
341
|
+
move_to(metadata_object_signer, PairedCoinType { type });
|
|
342
|
+
let metadata_obj = object::object_from_constructor_ref(&metadata_object_cref);
|
|
343
|
+
|
|
344
|
+
table::add(&mut map.coin_to_fungible_asset_map, type, metadata_obj);
|
|
345
|
+
event::emit(PairCreation {
|
|
346
|
+
coin_type: type,
|
|
347
|
+
fungible_asset_metadata_address: object_address(&metadata_obj)
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// Generates all three refs
|
|
351
|
+
let mint_ref = fungible_asset::generate_mint_ref(&metadata_object_cref);
|
|
352
|
+
let transfer_ref = fungible_asset::generate_transfer_ref(&metadata_object_cref);
|
|
353
|
+
let burn_ref = fungible_asset::generate_burn_ref(&metadata_object_cref);
|
|
354
|
+
move_to(metadata_object_signer,
|
|
355
|
+
PairedFungibleAssetRefs {
|
|
356
|
+
mint_ref_opt: option::some(mint_ref),
|
|
357
|
+
transfer_ref_opt: option::some(transfer_ref),
|
|
358
|
+
burn_ref_opt: option::some(burn_ref),
|
|
359
|
+
}
|
|
360
|
+
);
|
|
361
|
+
};
|
|
362
|
+
*table::borrow(&map.coin_to_fungible_asset_map, type)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/// Get the paired fungible asset metadata object of a coin type, create if not exist.
|
|
366
|
+
public(friend) fun ensure_paired_metadata<CoinType>(): Object<Metadata> acquires CoinConversionMap, CoinInfo {
|
|
367
|
+
create_and_return_paired_metadata_if_not_exist<CoinType>(false)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
#[view]
|
|
371
|
+
/// Get the paired coin type of a fungible asset metadata object.
|
|
372
|
+
public fun paired_coin(metadata: Object<Metadata>): Option<TypeInfo> acquires PairedCoinType {
|
|
373
|
+
let metadata_addr = object::object_address(&metadata);
|
|
374
|
+
if (exists<PairedCoinType>(metadata_addr)) {
|
|
375
|
+
option::some(borrow_global<PairedCoinType>(metadata_addr).type)
|
|
376
|
+
} else {
|
|
377
|
+
option::none()
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/// Conversion from coin to fungible asset
|
|
382
|
+
public fun coin_to_fungible_asset<CoinType>(
|
|
383
|
+
coin: Coin<CoinType>
|
|
384
|
+
): FungibleAsset acquires CoinConversionMap, CoinInfo {
|
|
385
|
+
let metadata = ensure_paired_metadata<CoinType>();
|
|
386
|
+
let amount = burn_internal(coin);
|
|
387
|
+
fungible_asset::mint_internal(metadata, amount)
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/// Conversion from fungible asset to coin. Not public to push the migration to FA.
|
|
391
|
+
fun fungible_asset_to_coin<CoinType>(
|
|
392
|
+
fungible_asset: FungibleAsset
|
|
393
|
+
): Coin<CoinType> acquires CoinInfo, PairedCoinType {
|
|
394
|
+
let metadata_addr = object::object_address(&fungible_asset::metadata_from_asset(&fungible_asset));
|
|
395
|
+
assert!(
|
|
396
|
+
object::object_exists<PairedCoinType>(metadata_addr),
|
|
397
|
+
error::not_found(EPAIRED_COIN)
|
|
398
|
+
);
|
|
399
|
+
let coin_type_info = borrow_global<PairedCoinType>(metadata_addr).type;
|
|
400
|
+
assert!(coin_type_info == type_info::type_of<CoinType>(), error::invalid_argument(ECOIN_TYPE_MISMATCH));
|
|
401
|
+
let amount = fungible_asset::burn_internal(fungible_asset);
|
|
402
|
+
mint_internal<CoinType>(amount)
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
inline fun assert_paired_metadata_exists<CoinType>(): Object<Metadata> {
|
|
406
|
+
let metadata_opt = paired_metadata<CoinType>();
|
|
407
|
+
assert!(option::is_some(&metadata_opt), error::not_found(EPAIRED_FUNGIBLE_ASSET));
|
|
408
|
+
option::destroy_some(metadata_opt)
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
#[view]
|
|
412
|
+
/// Check whether `MintRef` has not been taken.
|
|
413
|
+
public fun paired_mint_ref_exists<CoinType>(): bool acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
414
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
415
|
+
let metadata_addr = object_address(&metadata);
|
|
416
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
417
|
+
option::is_some(&borrow_global<PairedFungibleAssetRefs>(metadata_addr).mint_ref_opt)
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/// Get the `MintRef` of paired fungible asset of a coin type from `MintCapability`.
|
|
421
|
+
public fun get_paired_mint_ref<CoinType>(
|
|
422
|
+
_: &MintCapability<CoinType>
|
|
423
|
+
): (MintRef, MintRefReceipt) acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
424
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
425
|
+
let metadata_addr = object_address(&metadata);
|
|
426
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
427
|
+
let mint_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).mint_ref_opt;
|
|
428
|
+
assert!(option::is_some(mint_ref_opt), error::not_found(EMINT_REF_NOT_FOUND));
|
|
429
|
+
(option::extract(mint_ref_opt), MintRefReceipt { metadata })
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/// Return the `MintRef` with the hot potato receipt.
|
|
433
|
+
public fun return_paired_mint_ref(mint_ref: MintRef, receipt: MintRefReceipt) acquires PairedFungibleAssetRefs {
|
|
434
|
+
let MintRefReceipt { metadata } = receipt;
|
|
435
|
+
assert!(
|
|
436
|
+
fungible_asset::mint_ref_metadata(&mint_ref) == metadata,
|
|
437
|
+
error::invalid_argument(EMINT_REF_RECEIPT_MISMATCH)
|
|
438
|
+
);
|
|
439
|
+
let metadata_addr = object_address(&metadata);
|
|
440
|
+
let mint_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).mint_ref_opt;
|
|
441
|
+
option::fill(mint_ref_opt, mint_ref);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
#[view]
|
|
445
|
+
/// Check whether `TransferRef` still exists.
|
|
446
|
+
public fun paired_transfer_ref_exists<CoinType>(): bool acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
447
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
448
|
+
let metadata_addr = object_address(&metadata);
|
|
449
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
450
|
+
option::is_some(&borrow_global<PairedFungibleAssetRefs>(metadata_addr).transfer_ref_opt)
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/// Get the TransferRef of paired fungible asset of a coin type from `FreezeCapability`.
|
|
454
|
+
public fun get_paired_transfer_ref<CoinType>(
|
|
455
|
+
_: &FreezeCapability<CoinType>
|
|
456
|
+
): (TransferRef, TransferRefReceipt) acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
457
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
458
|
+
let metadata_addr = object_address(&metadata);
|
|
459
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
460
|
+
let transfer_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).transfer_ref_opt;
|
|
461
|
+
assert!(option::is_some(transfer_ref_opt), error::not_found(ETRANSFER_REF_NOT_FOUND));
|
|
462
|
+
(option::extract(transfer_ref_opt), TransferRefReceipt { metadata })
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/// Return the `TransferRef` with the hot potato receipt.
|
|
466
|
+
public fun return_paired_transfer_ref(
|
|
467
|
+
transfer_ref: TransferRef,
|
|
468
|
+
receipt: TransferRefReceipt
|
|
469
|
+
) acquires PairedFungibleAssetRefs {
|
|
470
|
+
let TransferRefReceipt { metadata } = receipt;
|
|
471
|
+
assert!(
|
|
472
|
+
fungible_asset::transfer_ref_metadata(&transfer_ref) == metadata,
|
|
473
|
+
error::invalid_argument(ETRANSFER_REF_RECEIPT_MISMATCH)
|
|
474
|
+
);
|
|
475
|
+
let metadata_addr = object_address(&metadata);
|
|
476
|
+
let transfer_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).transfer_ref_opt;
|
|
477
|
+
option::fill(transfer_ref_opt, transfer_ref);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
#[view]
|
|
481
|
+
/// Check whether `BurnRef` has not been taken.
|
|
482
|
+
public fun paired_burn_ref_exists<CoinType>(): bool acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
483
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
484
|
+
let metadata_addr = object_address(&metadata);
|
|
485
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
486
|
+
option::is_some(&borrow_global<PairedFungibleAssetRefs>(metadata_addr).burn_ref_opt)
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/// Get the `BurnRef` of paired fungible asset of a coin type from `BurnCapability`.
|
|
490
|
+
public fun get_paired_burn_ref<CoinType>(
|
|
491
|
+
_: &BurnCapability<CoinType>
|
|
492
|
+
): (BurnRef, BurnRefReceipt) acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
493
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
494
|
+
let metadata_addr = object_address(&metadata);
|
|
495
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
496
|
+
let burn_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).burn_ref_opt;
|
|
497
|
+
assert!(option::is_some(burn_ref_opt), error::not_found(EBURN_REF_NOT_FOUND));
|
|
498
|
+
(option::extract(burn_ref_opt), BurnRefReceipt { metadata })
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Permanently convert to BurnRef, and take it from the pairing.
|
|
502
|
+
// (i.e. future calls to borrow/convert BurnRef will fail)
|
|
503
|
+
public fun convert_and_take_paired_burn_ref<CoinType>(
|
|
504
|
+
burn_cap: BurnCapability<CoinType>
|
|
505
|
+
): BurnRef acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
506
|
+
destroy_burn_cap(burn_cap);
|
|
507
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
508
|
+
let metadata_addr = object_address(&metadata);
|
|
509
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
510
|
+
let burn_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).burn_ref_opt;
|
|
511
|
+
assert!(option::is_some(burn_ref_opt), error::not_found(EBURN_REF_NOT_FOUND));
|
|
512
|
+
option::extract(burn_ref_opt)
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/// Return the `BurnRef` with the hot potato receipt.
|
|
516
|
+
public fun return_paired_burn_ref(
|
|
517
|
+
burn_ref: BurnRef,
|
|
518
|
+
receipt: BurnRefReceipt
|
|
519
|
+
) acquires PairedFungibleAssetRefs {
|
|
520
|
+
let BurnRefReceipt { metadata } = receipt;
|
|
521
|
+
assert!(
|
|
522
|
+
fungible_asset::burn_ref_metadata(&burn_ref) == metadata,
|
|
523
|
+
error::invalid_argument(EBURN_REF_RECEIPT_MISMATCH)
|
|
524
|
+
);
|
|
525
|
+
let metadata_addr = object_address(&metadata);
|
|
526
|
+
let burn_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).burn_ref_opt;
|
|
527
|
+
option::fill(burn_ref_opt, burn_ref);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
inline fun borrow_paired_burn_ref<CoinType>(
|
|
531
|
+
_: &BurnCapability<CoinType>
|
|
532
|
+
): &BurnRef acquires CoinConversionMap, PairedFungibleAssetRefs {
|
|
533
|
+
let metadata = assert_paired_metadata_exists<CoinType>();
|
|
534
|
+
let metadata_addr = object_address(&metadata);
|
|
535
|
+
assert!(exists<PairedFungibleAssetRefs>(metadata_addr), error::internal(EPAIRED_FUNGIBLE_ASSET_REFS_NOT_FOUND));
|
|
536
|
+
let burn_ref_opt = &mut borrow_global_mut<PairedFungibleAssetRefs>(metadata_addr).burn_ref_opt;
|
|
537
|
+
assert!(option::is_some(burn_ref_opt), error::not_found(EBURN_REF_NOT_FOUND));
|
|
538
|
+
option::borrow(burn_ref_opt)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
//
|
|
542
|
+
// Total supply config
|
|
543
|
+
//
|
|
544
|
+
|
|
545
|
+
/// Publishes supply configuration. Initially, upgrading is not allowed.
|
|
546
|
+
public(friend) fun initialize_supply_config(aptos_framework: &signer) {
|
|
547
|
+
system_addresses::assert_aptos_framework(aptos_framework);
|
|
548
|
+
move_to(aptos_framework, SupplyConfig { allow_upgrades: false });
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/// This should be called by on-chain governance to update the config and allow
|
|
552
|
+
/// or disallow upgradability of total supply.
|
|
553
|
+
public fun allow_supply_upgrades(aptos_framework: &signer, allowed: bool) acquires SupplyConfig {
|
|
554
|
+
system_addresses::assert_aptos_framework(aptos_framework);
|
|
555
|
+
let allow_upgrades = &mut borrow_global_mut<SupplyConfig>(@aptos_framework).allow_upgrades;
|
|
556
|
+
*allow_upgrades = allowed;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
//
|
|
560
|
+
// Aggregatable coin functions
|
|
561
|
+
//
|
|
562
|
+
|
|
563
|
+
/// Creates a new aggregatable coin with value overflowing on `limit`. Note that this function can
|
|
564
|
+
/// only be called by Aptos Framework (0x1) account for now because of `create_aggregator`.
|
|
565
|
+
public(friend) fun initialize_aggregatable_coin<CoinType>(aptos_framework: &signer): AggregatableCoin<CoinType> {
|
|
566
|
+
let aggregator = aggregator_factory::create_aggregator(aptos_framework, MAX_U64);
|
|
567
|
+
AggregatableCoin<CoinType> {
|
|
568
|
+
value: aggregator,
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/// Returns true if the value of aggregatable coin is zero.
|
|
573
|
+
public(friend) fun is_aggregatable_coin_zero<CoinType>(coin: &AggregatableCoin<CoinType>): bool {
|
|
574
|
+
let amount = aggregator::read(&coin.value);
|
|
575
|
+
amount == 0
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/// Drains the aggregatable coin, setting it to zero and returning a standard coin.
|
|
579
|
+
public(friend) fun drain_aggregatable_coin<CoinType>(coin: &mut AggregatableCoin<CoinType>): Coin<CoinType> {
|
|
580
|
+
spec {
|
|
581
|
+
// TODO: The data invariant is not properly assumed from CollectedFeesPerBlock.
|
|
582
|
+
assume aggregator::spec_get_limit(coin.value) == MAX_U64;
|
|
583
|
+
};
|
|
584
|
+
let amount = aggregator::read(&coin.value);
|
|
585
|
+
assert!(amount <= MAX_U64, error::out_of_range(EAGGREGATABLE_COIN_VALUE_TOO_LARGE));
|
|
586
|
+
spec {
|
|
587
|
+
update aggregate_supply<CoinType> = aggregate_supply<CoinType> - amount;
|
|
588
|
+
};
|
|
589
|
+
aggregator::sub(&mut coin.value, amount);
|
|
590
|
+
spec {
|
|
591
|
+
update supply<CoinType> = supply<CoinType> + amount;
|
|
592
|
+
};
|
|
593
|
+
Coin<CoinType> {
|
|
594
|
+
value: (amount as u64),
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/// Merges `coin` into aggregatable coin (`dst_coin`).
|
|
599
|
+
public(friend) fun merge_aggregatable_coin<CoinType>(
|
|
600
|
+
dst_coin: &mut AggregatableCoin<CoinType>,
|
|
601
|
+
coin: Coin<CoinType>
|
|
602
|
+
) {
|
|
603
|
+
spec {
|
|
604
|
+
update supply<CoinType> = supply<CoinType> - coin.value;
|
|
605
|
+
};
|
|
606
|
+
let Coin { value } = coin;
|
|
607
|
+
let amount = (value as u128);
|
|
608
|
+
spec {
|
|
609
|
+
update aggregate_supply<CoinType> = aggregate_supply<CoinType> + amount;
|
|
610
|
+
};
|
|
611
|
+
aggregator::add(&mut dst_coin.value, amount);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/// Collects a specified amount of coin form an account into aggregatable coin.
|
|
615
|
+
public(friend) fun collect_into_aggregatable_coin<CoinType>(
|
|
616
|
+
account_addr: address,
|
|
617
|
+
amount: u64,
|
|
618
|
+
dst_coin: &mut AggregatableCoin<CoinType>,
|
|
619
|
+
) acquires CoinStore, CoinConversionMap, CoinInfo, PairedCoinType {
|
|
620
|
+
// Skip collecting if amount is zero.
|
|
621
|
+
if (amount == 0) {
|
|
622
|
+
return
|
|
623
|
+
};
|
|
624
|
+
|
|
625
|
+
let (coin_amount_to_collect, fa_amount_to_collect) = calculate_amount_to_withdraw<CoinType>(
|
|
626
|
+
account_addr,
|
|
627
|
+
amount
|
|
628
|
+
);
|
|
629
|
+
let coin = if (coin_amount_to_collect > 0) {
|
|
630
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
631
|
+
extract(&mut coin_store.coin, coin_amount_to_collect)
|
|
632
|
+
} else {
|
|
633
|
+
zero()
|
|
634
|
+
};
|
|
635
|
+
if (fa_amount_to_collect > 0) {
|
|
636
|
+
let store_addr = primary_fungible_store::primary_store_address(
|
|
637
|
+
account_addr,
|
|
638
|
+
option::destroy_some(paired_metadata<CoinType>())
|
|
639
|
+
);
|
|
640
|
+
let fa = fungible_asset::withdraw_internal(store_addr, fa_amount_to_collect);
|
|
641
|
+
merge(&mut coin, fungible_asset_to_coin<CoinType>(fa));
|
|
642
|
+
};
|
|
643
|
+
merge_aggregatable_coin(dst_coin, coin);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
inline fun calculate_amount_to_withdraw<CoinType>(
|
|
647
|
+
account_addr: address,
|
|
648
|
+
amount: u64
|
|
649
|
+
): (u64, u64) {
|
|
650
|
+
let coin_balance = coin_balance<CoinType>(account_addr);
|
|
651
|
+
if (coin_balance >= amount) {
|
|
652
|
+
(amount, 0)
|
|
653
|
+
} else {
|
|
654
|
+
let metadata = paired_metadata<CoinType>();
|
|
655
|
+
if (option::is_some(&metadata) && primary_fungible_store::primary_store_exists(
|
|
656
|
+
account_addr,
|
|
657
|
+
option::destroy_some(metadata)
|
|
658
|
+
))
|
|
659
|
+
(coin_balance, amount - coin_balance)
|
|
660
|
+
else
|
|
661
|
+
abort error::invalid_argument(EINSUFFICIENT_BALANCE)
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
fun maybe_convert_to_fungible_store<CoinType>(account: address) acquires CoinStore, CoinConversionMap, CoinInfo {
|
|
666
|
+
if (!features::coin_to_fungible_asset_migration_feature_enabled()) {
|
|
667
|
+
abort error::unavailable(ECOIN_TO_FUNGIBLE_ASSET_FEATURE_NOT_ENABLED)
|
|
668
|
+
};
|
|
669
|
+
assert!(is_coin_initialized<CoinType>(), error::invalid_argument(ECOIN_INFO_NOT_PUBLISHED));
|
|
670
|
+
|
|
671
|
+
let metadata = ensure_paired_metadata<CoinType>();
|
|
672
|
+
let store = primary_fungible_store::ensure_primary_store_exists(account, metadata);
|
|
673
|
+
let store_address = object::object_address(&store);
|
|
674
|
+
if (exists<CoinStore<CoinType>>(account)) {
|
|
675
|
+
let CoinStore<CoinType> { coin, frozen, deposit_events, withdraw_events } = move_from<CoinStore<CoinType>>(
|
|
676
|
+
account
|
|
677
|
+
);
|
|
678
|
+
event::emit(
|
|
679
|
+
CoinEventHandleDeletion {
|
|
680
|
+
event_handle_creation_address: guid::creator_address(
|
|
681
|
+
event::guid(&deposit_events)
|
|
682
|
+
),
|
|
683
|
+
deleted_deposit_event_handle_creation_number: guid::creation_num(event::guid(&deposit_events)),
|
|
684
|
+
deleted_withdraw_event_handle_creation_number: guid::creation_num(event::guid(&withdraw_events))
|
|
685
|
+
}
|
|
686
|
+
);
|
|
687
|
+
event::destroy_handle(deposit_events);
|
|
688
|
+
event::destroy_handle(withdraw_events);
|
|
689
|
+
if (coin.value == 0) {
|
|
690
|
+
destroy_zero(coin);
|
|
691
|
+
} else {
|
|
692
|
+
fungible_asset::deposit(store, coin_to_fungible_asset(coin));
|
|
693
|
+
};
|
|
694
|
+
// Note:
|
|
695
|
+
// It is possible the primary fungible store may already exist before this function call.
|
|
696
|
+
// In this case, if the account owns a frozen CoinStore and an unfrozen primary fungible store, this
|
|
697
|
+
// function would convert and deposit the rest coin into the primary store and freeze it to make the
|
|
698
|
+
// `frozen` semantic as consistent as possible.
|
|
699
|
+
if (frozen != fungible_asset::is_frozen(store)) {
|
|
700
|
+
fungible_asset::set_frozen_flag_internal(store, frozen);
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
if (!exists<MigrationFlag>(store_address)) {
|
|
704
|
+
move_to(&create_signer::create_signer(store_address), MigrationFlag {});
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
/// Voluntarily migrate to fungible store for `CoinType` if not yet.
|
|
709
|
+
public entry fun migrate_to_fungible_store<CoinType>(
|
|
710
|
+
account: &signer
|
|
711
|
+
) acquires CoinStore, CoinConversionMap, CoinInfo {
|
|
712
|
+
maybe_convert_to_fungible_store<CoinType>(signer::address_of(account));
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
//
|
|
716
|
+
// Getter functions
|
|
717
|
+
//
|
|
718
|
+
|
|
719
|
+
/// A helper function that returns the address of CoinType.
|
|
720
|
+
fun coin_address<CoinType>(): address {
|
|
721
|
+
let type_info = type_info::type_of<CoinType>();
|
|
722
|
+
type_info::account_address(&type_info)
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
#[view]
|
|
726
|
+
/// Returns the balance of `owner` for provided `CoinType` and its paired FA if exists.
|
|
727
|
+
public fun balance<CoinType>(owner: address): u64 acquires CoinConversionMap, CoinStore {
|
|
728
|
+
let paired_metadata = paired_metadata<CoinType>();
|
|
729
|
+
coin_balance<CoinType>(owner) + if (option::is_some(&paired_metadata)) {
|
|
730
|
+
primary_fungible_store::balance(
|
|
731
|
+
owner,
|
|
732
|
+
option::extract(&mut paired_metadata)
|
|
733
|
+
)
|
|
734
|
+
} else { 0 }
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
#[view]
|
|
738
|
+
/// Returns whether the balance of `owner` for provided `CoinType` and its paired FA is >= `amount`.
|
|
739
|
+
public fun is_balance_at_least<CoinType>(owner: address, amount: u64): bool acquires CoinConversionMap, CoinStore {
|
|
740
|
+
let coin_balance = coin_balance<CoinType>(owner);
|
|
741
|
+
if (coin_balance >= amount) {
|
|
742
|
+
return true
|
|
743
|
+
};
|
|
744
|
+
|
|
745
|
+
let paired_metadata = paired_metadata<CoinType>();
|
|
746
|
+
let left_amount = amount - coin_balance;
|
|
747
|
+
if (option::is_some(&paired_metadata)) {
|
|
748
|
+
primary_fungible_store::is_balance_at_least(
|
|
749
|
+
owner,
|
|
750
|
+
option::extract(&mut paired_metadata),
|
|
751
|
+
left_amount
|
|
752
|
+
)
|
|
753
|
+
} else { false }
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
inline fun coin_balance<CoinType>(owner: address): u64 {
|
|
757
|
+
if (exists<CoinStore<CoinType>>(owner)) {
|
|
758
|
+
borrow_global<CoinStore<CoinType>>(owner).coin.value
|
|
759
|
+
} else {
|
|
760
|
+
0
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
#[view]
|
|
765
|
+
/// Returns `true` if the type `CoinType` is an initialized coin.
|
|
766
|
+
public fun is_coin_initialized<CoinType>(): bool {
|
|
767
|
+
exists<CoinInfo<CoinType>>(coin_address<CoinType>())
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
#[view]
|
|
771
|
+
/// Returns `true` is account_addr has frozen the CoinStore or if it's not registered at all
|
|
772
|
+
public fun is_coin_store_frozen<CoinType>(
|
|
773
|
+
account_addr: address
|
|
774
|
+
): bool acquires CoinStore, CoinConversionMap {
|
|
775
|
+
if (!is_account_registered<CoinType>(account_addr)) {
|
|
776
|
+
return true
|
|
777
|
+
};
|
|
778
|
+
|
|
779
|
+
let coin_store = borrow_global<CoinStore<CoinType>>(account_addr);
|
|
780
|
+
coin_store.frozen
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
#[view]
|
|
784
|
+
/// Returns `true` if `account_addr` is registered to receive `CoinType`.
|
|
785
|
+
public fun is_account_registered<CoinType>(account_addr: address): bool acquires CoinConversionMap {
|
|
786
|
+
assert!(is_coin_initialized<CoinType>(), error::invalid_argument(ECOIN_INFO_NOT_PUBLISHED));
|
|
787
|
+
if (exists<CoinStore<CoinType>>(account_addr)) {
|
|
788
|
+
true
|
|
789
|
+
} else {
|
|
790
|
+
let paired_metadata_opt = paired_metadata<CoinType>();
|
|
791
|
+
(option::is_some(
|
|
792
|
+
&paired_metadata_opt
|
|
793
|
+
) && migrated_primary_fungible_store_exists(account_addr, option::destroy_some(paired_metadata_opt)))
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
#[view]
|
|
798
|
+
/// Returns the name of the coin.
|
|
799
|
+
public fun name<CoinType>(): string::String acquires CoinInfo {
|
|
800
|
+
borrow_global<CoinInfo<CoinType>>(coin_address<CoinType>()).name
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
#[view]
|
|
804
|
+
/// Returns the symbol of the coin, usually a shorter version of the name.
|
|
805
|
+
public fun symbol<CoinType>(): string::String acquires CoinInfo {
|
|
806
|
+
borrow_global<CoinInfo<CoinType>>(coin_address<CoinType>()).symbol
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
#[view]
|
|
810
|
+
/// Returns the number of decimals used to get its user representation.
|
|
811
|
+
/// For example, if `decimals` equals `2`, a balance of `505` coins should
|
|
812
|
+
/// be displayed to a user as `5.05` (`505 / 10 ** 2`).
|
|
813
|
+
public fun decimals<CoinType>(): u8 acquires CoinInfo {
|
|
814
|
+
borrow_global<CoinInfo<CoinType>>(coin_address<CoinType>()).decimals
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
#[view]
|
|
818
|
+
/// Returns the amount of coin in existence.
|
|
819
|
+
public fun supply<CoinType>(): Option<u128> acquires CoinInfo, CoinConversionMap {
|
|
820
|
+
let coin_supply = coin_supply<CoinType>();
|
|
821
|
+
let metadata = paired_metadata<CoinType>();
|
|
822
|
+
if (option::is_some(&metadata)) {
|
|
823
|
+
let fungible_asset_supply = fungible_asset::supply(option::extract(&mut metadata));
|
|
824
|
+
if (option::is_some(&coin_supply)) {
|
|
825
|
+
let supply = option::borrow_mut(&mut coin_supply);
|
|
826
|
+
*supply = *supply + option::destroy_some(fungible_asset_supply);
|
|
827
|
+
};
|
|
828
|
+
};
|
|
829
|
+
coin_supply
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
#[view]
|
|
833
|
+
/// Returns the amount of coin in existence.
|
|
834
|
+
public fun coin_supply<CoinType>(): Option<u128> acquires CoinInfo {
|
|
835
|
+
let maybe_supply = &borrow_global<CoinInfo<CoinType>>(coin_address<CoinType>()).supply;
|
|
836
|
+
if (option::is_some(maybe_supply)) {
|
|
837
|
+
// We do track supply, in this case read from optional aggregator.
|
|
838
|
+
let supply = option::borrow(maybe_supply);
|
|
839
|
+
let value = optional_aggregator::read(supply);
|
|
840
|
+
option::some(value)
|
|
841
|
+
} else {
|
|
842
|
+
option::none()
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
//
|
|
846
|
+
// Public functions
|
|
847
|
+
//
|
|
848
|
+
|
|
849
|
+
/// Burn `coin` with capability.
|
|
850
|
+
/// The capability `_cap` should be passed as a reference to `BurnCapability<CoinType>`.
|
|
851
|
+
public fun burn<CoinType>(coin: Coin<CoinType>, _cap: &BurnCapability<CoinType>) acquires CoinInfo {
|
|
852
|
+
burn_internal(coin);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
/// Burn `coin` from the specified `account` with capability.
|
|
856
|
+
/// The capability `burn_cap` should be passed as a reference to `BurnCapability<CoinType>`.
|
|
857
|
+
/// This function shouldn't fail as it's called as part of transaction fee burning.
|
|
858
|
+
///
|
|
859
|
+
/// Note: This bypasses CoinStore::frozen -- coins within a frozen CoinStore can be burned.
|
|
860
|
+
public fun burn_from<CoinType>(
|
|
861
|
+
account_addr: address,
|
|
862
|
+
amount: u64,
|
|
863
|
+
burn_cap: &BurnCapability<CoinType>,
|
|
864
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedFungibleAssetRefs {
|
|
865
|
+
// Skip burning if amount is zero. This shouldn't error out as it's called as part of transaction fee burning.
|
|
866
|
+
if (amount == 0) {
|
|
867
|
+
return
|
|
868
|
+
};
|
|
869
|
+
|
|
870
|
+
let (coin_amount_to_burn, fa_amount_to_burn) = calculate_amount_to_withdraw<CoinType>(
|
|
871
|
+
account_addr,
|
|
872
|
+
amount
|
|
873
|
+
);
|
|
874
|
+
if (coin_amount_to_burn > 0) {
|
|
875
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
876
|
+
let coin_to_burn = extract(&mut coin_store.coin, coin_amount_to_burn);
|
|
877
|
+
burn(coin_to_burn, burn_cap);
|
|
878
|
+
};
|
|
879
|
+
if (fa_amount_to_burn > 0) {
|
|
880
|
+
fungible_asset::burn_from(
|
|
881
|
+
borrow_paired_burn_ref(burn_cap),
|
|
882
|
+
primary_fungible_store::primary_store(account_addr, option::destroy_some(paired_metadata<CoinType>())),
|
|
883
|
+
fa_amount_to_burn
|
|
884
|
+
);
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/// Deposit the coin balance into the recipient's account and emit an event.
|
|
889
|
+
public fun deposit<CoinType>(
|
|
890
|
+
account_addr: address,
|
|
891
|
+
coin: Coin<CoinType>
|
|
892
|
+
) acquires CoinStore, CoinConversionMap, CoinInfo {
|
|
893
|
+
if (exists<CoinStore<CoinType>>(account_addr)) {
|
|
894
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
895
|
+
assert!(
|
|
896
|
+
!coin_store.frozen,
|
|
897
|
+
error::permission_denied(EFROZEN),
|
|
898
|
+
);
|
|
899
|
+
if (std::features::module_event_migration_enabled()) {
|
|
900
|
+
event::emit(
|
|
901
|
+
CoinDeposit { coin_type: type_name<CoinType>(), account: account_addr, amount: coin.value }
|
|
902
|
+
);
|
|
903
|
+
};
|
|
904
|
+
event::emit_event<DepositEvent>(
|
|
905
|
+
&mut coin_store.deposit_events,
|
|
906
|
+
DepositEvent { amount: coin.value },
|
|
907
|
+
);
|
|
908
|
+
merge(&mut coin_store.coin, coin);
|
|
909
|
+
} else {
|
|
910
|
+
let metadata = paired_metadata<CoinType>();
|
|
911
|
+
if (option::is_some(&metadata) && migrated_primary_fungible_store_exists(
|
|
912
|
+
account_addr,
|
|
913
|
+
option::destroy_some(metadata)
|
|
914
|
+
)) {
|
|
915
|
+
primary_fungible_store::deposit(account_addr, coin_to_fungible_asset(coin));
|
|
916
|
+
} else {
|
|
917
|
+
abort error::not_found(ECOIN_STORE_NOT_PUBLISHED)
|
|
918
|
+
};
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
inline fun migrated_primary_fungible_store_exists(
|
|
923
|
+
account_address: address,
|
|
924
|
+
metadata: Object<Metadata>
|
|
925
|
+
): bool {
|
|
926
|
+
let primary_store_address = primary_fungible_store::primary_store_address<Metadata>(account_address, metadata);
|
|
927
|
+
fungible_asset::store_exists(primary_store_address) && (
|
|
928
|
+
// migration flag is needed, until we start defaulting new accounts to APT PFS
|
|
929
|
+
features::new_accounts_default_to_fa_apt_store_enabled() || exists<MigrationFlag>(primary_store_address)
|
|
930
|
+
)
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
/// Deposit the coin balance into the recipient's account without checking if the account is frozen.
|
|
934
|
+
/// This is for internal use only and doesn't emit an DepositEvent.
|
|
935
|
+
public(friend) fun force_deposit<CoinType>(
|
|
936
|
+
account_addr: address,
|
|
937
|
+
coin: Coin<CoinType>
|
|
938
|
+
) acquires CoinStore, CoinConversionMap, CoinInfo {
|
|
939
|
+
if (exists<CoinStore<CoinType>>(account_addr)) {
|
|
940
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
941
|
+
merge(&mut coin_store.coin, coin);
|
|
942
|
+
} else {
|
|
943
|
+
let metadata = paired_metadata<CoinType>();
|
|
944
|
+
if (option::is_some(&metadata) && migrated_primary_fungible_store_exists(
|
|
945
|
+
account_addr,
|
|
946
|
+
option::destroy_some(metadata)
|
|
947
|
+
)) {
|
|
948
|
+
let fa = coin_to_fungible_asset(coin);
|
|
949
|
+
let metadata = fungible_asset::asset_metadata(&fa);
|
|
950
|
+
let store = primary_fungible_store::primary_store(account_addr, metadata);
|
|
951
|
+
fungible_asset::deposit_internal(object::object_address(&store), fa);
|
|
952
|
+
} else {
|
|
953
|
+
abort error::not_found(ECOIN_STORE_NOT_PUBLISHED)
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
/// Destroys a zero-value coin. Calls will fail if the `value` in the passed-in `token` is non-zero
|
|
959
|
+
/// so it is impossible to "burn" any non-zero amount of `Coin` without having
|
|
960
|
+
/// a `BurnCapability` for the specific `CoinType`.
|
|
961
|
+
public fun destroy_zero<CoinType>(zero_coin: Coin<CoinType>) {
|
|
962
|
+
spec {
|
|
963
|
+
update supply<CoinType> = supply<CoinType> - zero_coin.value;
|
|
964
|
+
};
|
|
965
|
+
let Coin { value } = zero_coin;
|
|
966
|
+
assert!(value == 0, error::invalid_argument(EDESTRUCTION_OF_NONZERO_TOKEN))
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
/// Extracts `amount` from the passed-in `coin`, where the original token is modified in place.
|
|
970
|
+
public fun extract<CoinType>(coin: &mut Coin<CoinType>, amount: u64): Coin<CoinType> {
|
|
971
|
+
assert!(coin.value >= amount, error::invalid_argument(EINSUFFICIENT_BALANCE));
|
|
972
|
+
spec {
|
|
973
|
+
update supply<CoinType> = supply<CoinType> - amount;
|
|
974
|
+
};
|
|
975
|
+
coin.value = coin.value - amount;
|
|
976
|
+
spec {
|
|
977
|
+
update supply<CoinType> = supply<CoinType> + amount;
|
|
978
|
+
};
|
|
979
|
+
Coin { value: amount }
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
/// Extracts the entire amount from the passed-in `coin`, where the original token is modified in place.
|
|
983
|
+
public fun extract_all<CoinType>(coin: &mut Coin<CoinType>): Coin<CoinType> {
|
|
984
|
+
let total_value = coin.value;
|
|
985
|
+
spec {
|
|
986
|
+
update supply<CoinType> = supply<CoinType> - coin.value;
|
|
987
|
+
};
|
|
988
|
+
coin.value = 0;
|
|
989
|
+
spec {
|
|
990
|
+
update supply<CoinType> = supply<CoinType> + total_value;
|
|
991
|
+
};
|
|
992
|
+
Coin { value: total_value }
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
#[legacy_entry_fun]
|
|
996
|
+
/// Freeze a CoinStore to prevent transfers
|
|
997
|
+
public entry fun freeze_coin_store<CoinType>(
|
|
998
|
+
account_addr: address,
|
|
999
|
+
_freeze_cap: &FreezeCapability<CoinType>,
|
|
1000
|
+
) acquires CoinStore {
|
|
1001
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
1002
|
+
coin_store.frozen = true;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
#[legacy_entry_fun]
|
|
1006
|
+
/// Unfreeze a CoinStore to allow transfers
|
|
1007
|
+
public entry fun unfreeze_coin_store<CoinType>(
|
|
1008
|
+
account_addr: address,
|
|
1009
|
+
_freeze_cap: &FreezeCapability<CoinType>,
|
|
1010
|
+
) acquires CoinStore {
|
|
1011
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
1012
|
+
coin_store.frozen = false;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/// Upgrade total supply to use a parallelizable implementation if it is
|
|
1016
|
+
/// available.
|
|
1017
|
+
public entry fun upgrade_supply<CoinType>(account: &signer) acquires CoinInfo, SupplyConfig {
|
|
1018
|
+
let account_addr = signer::address_of(account);
|
|
1019
|
+
|
|
1020
|
+
// Only coin creators can upgrade total supply.
|
|
1021
|
+
assert!(
|
|
1022
|
+
coin_address<CoinType>() == account_addr,
|
|
1023
|
+
error::invalid_argument(ECOIN_INFO_ADDRESS_MISMATCH),
|
|
1024
|
+
);
|
|
1025
|
+
|
|
1026
|
+
// Can only succeed once on-chain governance agreed on the upgrade.
|
|
1027
|
+
assert!(
|
|
1028
|
+
borrow_global_mut<SupplyConfig>(@aptos_framework).allow_upgrades,
|
|
1029
|
+
error::permission_denied(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED)
|
|
1030
|
+
);
|
|
1031
|
+
|
|
1032
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<CoinType>>(account_addr).supply;
|
|
1033
|
+
if (option::is_some(maybe_supply)) {
|
|
1034
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1035
|
+
|
|
1036
|
+
// If supply is tracked and the current implementation uses an integer - upgrade.
|
|
1037
|
+
if (!optional_aggregator::is_parallelizable(supply)) {
|
|
1038
|
+
optional_aggregator::switch(supply);
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
/// Creates a new Coin with given `CoinType` and returns minting/freezing/burning capabilities.
|
|
1044
|
+
/// The given signer also becomes the account hosting the information about the coin
|
|
1045
|
+
/// (name, supply, etc.). Supply is initialized as non-parallelizable integer.
|
|
1046
|
+
public fun initialize<CoinType>(
|
|
1047
|
+
account: &signer,
|
|
1048
|
+
name: string::String,
|
|
1049
|
+
symbol: string::String,
|
|
1050
|
+
decimals: u8,
|
|
1051
|
+
monitor_supply: bool,
|
|
1052
|
+
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {
|
|
1053
|
+
initialize_internal(account, name, symbol, decimals, monitor_supply, false)
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
/// Same as `initialize` but supply can be initialized to parallelizable aggregator.
|
|
1057
|
+
public(friend) fun initialize_with_parallelizable_supply<CoinType>(
|
|
1058
|
+
account: &signer,
|
|
1059
|
+
name: string::String,
|
|
1060
|
+
symbol: string::String,
|
|
1061
|
+
decimals: u8,
|
|
1062
|
+
monitor_supply: bool,
|
|
1063
|
+
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {
|
|
1064
|
+
system_addresses::assert_aptos_framework(account);
|
|
1065
|
+
initialize_internal(account, name, symbol, decimals, monitor_supply, true)
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
fun initialize_internal<CoinType>(
|
|
1069
|
+
account: &signer,
|
|
1070
|
+
name: string::String,
|
|
1071
|
+
symbol: string::String,
|
|
1072
|
+
decimals: u8,
|
|
1073
|
+
monitor_supply: bool,
|
|
1074
|
+
parallelizable: bool,
|
|
1075
|
+
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {
|
|
1076
|
+
let account_addr = signer::address_of(account);
|
|
1077
|
+
|
|
1078
|
+
assert!(
|
|
1079
|
+
coin_address<CoinType>() == account_addr,
|
|
1080
|
+
error::invalid_argument(ECOIN_INFO_ADDRESS_MISMATCH),
|
|
1081
|
+
);
|
|
1082
|
+
|
|
1083
|
+
assert!(
|
|
1084
|
+
!exists<CoinInfo<CoinType>>(account_addr),
|
|
1085
|
+
error::already_exists(ECOIN_INFO_ALREADY_PUBLISHED),
|
|
1086
|
+
);
|
|
1087
|
+
|
|
1088
|
+
assert!(string::length(&name) <= MAX_COIN_NAME_LENGTH, error::invalid_argument(ECOIN_NAME_TOO_LONG));
|
|
1089
|
+
assert!(string::length(&symbol) <= MAX_COIN_SYMBOL_LENGTH, error::invalid_argument(ECOIN_SYMBOL_TOO_LONG));
|
|
1090
|
+
|
|
1091
|
+
let coin_info = CoinInfo<CoinType> {
|
|
1092
|
+
name,
|
|
1093
|
+
symbol,
|
|
1094
|
+
decimals,
|
|
1095
|
+
supply: if (monitor_supply) {
|
|
1096
|
+
option::some(
|
|
1097
|
+
optional_aggregator::new(MAX_U128, parallelizable)
|
|
1098
|
+
)
|
|
1099
|
+
} else { option::none() },
|
|
1100
|
+
};
|
|
1101
|
+
move_to(account, coin_info);
|
|
1102
|
+
|
|
1103
|
+
(BurnCapability<CoinType> {}, FreezeCapability<CoinType> {}, MintCapability<CoinType> {})
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
/// "Merges" the two given coins. The coin passed in as `dst_coin` will have a value equal
|
|
1107
|
+
/// to the sum of the two tokens (`dst_coin` and `source_coin`).
|
|
1108
|
+
public fun merge<CoinType>(dst_coin: &mut Coin<CoinType>, source_coin: Coin<CoinType>) {
|
|
1109
|
+
spec {
|
|
1110
|
+
assume dst_coin.value + source_coin.value <= MAX_U64;
|
|
1111
|
+
};
|
|
1112
|
+
spec {
|
|
1113
|
+
update supply<CoinType> = supply<CoinType> - source_coin.value;
|
|
1114
|
+
};
|
|
1115
|
+
let Coin { value } = source_coin;
|
|
1116
|
+
spec {
|
|
1117
|
+
update supply<CoinType> = supply<CoinType> + value;
|
|
1118
|
+
};
|
|
1119
|
+
dst_coin.value = dst_coin.value + value;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
/// Mint new `Coin` with capability.
|
|
1123
|
+
/// The capability `_cap` should be passed as reference to `MintCapability<CoinType>`.
|
|
1124
|
+
/// Returns minted `Coin`.
|
|
1125
|
+
public fun mint<CoinType>(
|
|
1126
|
+
amount: u64,
|
|
1127
|
+
_cap: &MintCapability<CoinType>,
|
|
1128
|
+
): Coin<CoinType> acquires CoinInfo {
|
|
1129
|
+
mint_internal<CoinType>(amount)
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
public fun register<CoinType>(account: &signer) acquires CoinConversionMap {
|
|
1133
|
+
let account_addr = signer::address_of(account);
|
|
1134
|
+
// Short-circuit and do nothing if account is already registered for CoinType.
|
|
1135
|
+
if (is_account_registered<CoinType>(account_addr)) {
|
|
1136
|
+
return
|
|
1137
|
+
};
|
|
1138
|
+
|
|
1139
|
+
account::register_coin<CoinType>(account_addr);
|
|
1140
|
+
let coin_store = CoinStore<CoinType> {
|
|
1141
|
+
coin: Coin { value: 0 },
|
|
1142
|
+
frozen: false,
|
|
1143
|
+
deposit_events: account::new_event_handle<DepositEvent>(account),
|
|
1144
|
+
withdraw_events: account::new_event_handle<WithdrawEvent>(account),
|
|
1145
|
+
};
|
|
1146
|
+
move_to(account, coin_store);
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
/// Transfers `amount` of coins `CoinType` from `from` to `to`.
|
|
1150
|
+
public entry fun transfer<CoinType>(
|
|
1151
|
+
from: &signer,
|
|
1152
|
+
to: address,
|
|
1153
|
+
amount: u64,
|
|
1154
|
+
) acquires CoinStore, CoinConversionMap, CoinInfo, PairedCoinType {
|
|
1155
|
+
let coin = withdraw<CoinType>(from, amount);
|
|
1156
|
+
deposit(to, coin);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
/// Returns the `value` passed in `coin`.
|
|
1160
|
+
public fun value<CoinType>(coin: &Coin<CoinType>): u64 {
|
|
1161
|
+
coin.value
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
/// Withdraw specified `amount` of coin `CoinType` from the signing account.
|
|
1165
|
+
public fun withdraw<CoinType>(
|
|
1166
|
+
account: &signer,
|
|
1167
|
+
amount: u64,
|
|
1168
|
+
): Coin<CoinType> acquires CoinStore, CoinConversionMap, CoinInfo, PairedCoinType {
|
|
1169
|
+
let account_addr = signer::address_of(account);
|
|
1170
|
+
|
|
1171
|
+
let (coin_amount_to_withdraw, fa_amount_to_withdraw) = calculate_amount_to_withdraw<CoinType>(
|
|
1172
|
+
account_addr,
|
|
1173
|
+
amount
|
|
1174
|
+
);
|
|
1175
|
+
let withdrawn_coin = if (coin_amount_to_withdraw > 0) {
|
|
1176
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
1177
|
+
assert!(
|
|
1178
|
+
!coin_store.frozen,
|
|
1179
|
+
error::permission_denied(EFROZEN),
|
|
1180
|
+
);
|
|
1181
|
+
if (std::features::module_event_migration_enabled()) {
|
|
1182
|
+
event::emit(
|
|
1183
|
+
CoinWithdraw {
|
|
1184
|
+
coin_type: type_name<CoinType>(), account: account_addr, amount: coin_amount_to_withdraw
|
|
1185
|
+
}
|
|
1186
|
+
);
|
|
1187
|
+
};
|
|
1188
|
+
event::emit_event<WithdrawEvent>(
|
|
1189
|
+
&mut coin_store.withdraw_events,
|
|
1190
|
+
WithdrawEvent { amount: coin_amount_to_withdraw },
|
|
1191
|
+
);
|
|
1192
|
+
extract(&mut coin_store.coin, coin_amount_to_withdraw)
|
|
1193
|
+
} else {
|
|
1194
|
+
zero()
|
|
1195
|
+
};
|
|
1196
|
+
if (fa_amount_to_withdraw > 0) {
|
|
1197
|
+
let fa = primary_fungible_store::withdraw(
|
|
1198
|
+
account,
|
|
1199
|
+
option::destroy_some(paired_metadata<CoinType>()),
|
|
1200
|
+
fa_amount_to_withdraw
|
|
1201
|
+
);
|
|
1202
|
+
merge(&mut withdrawn_coin, fungible_asset_to_coin(fa));
|
|
1203
|
+
};
|
|
1204
|
+
withdrawn_coin
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
/// Create a new `Coin<CoinType>` with a value of `0`.
|
|
1208
|
+
public fun zero<CoinType>(): Coin<CoinType> {
|
|
1209
|
+
spec {
|
|
1210
|
+
update supply<CoinType> = supply<CoinType> + 0;
|
|
1211
|
+
};
|
|
1212
|
+
Coin<CoinType> {
|
|
1213
|
+
value: 0
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
/// Destroy a freeze capability. Freeze capability is dangerous and therefore should be destroyed if not used.
|
|
1218
|
+
public fun destroy_freeze_cap<CoinType>(freeze_cap: FreezeCapability<CoinType>) {
|
|
1219
|
+
let FreezeCapability<CoinType> {} = freeze_cap;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
/// Destroy a mint capability.
|
|
1223
|
+
public fun destroy_mint_cap<CoinType>(mint_cap: MintCapability<CoinType>) {
|
|
1224
|
+
let MintCapability<CoinType> {} = mint_cap;
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
/// Destroy a burn capability.
|
|
1228
|
+
public fun destroy_burn_cap<CoinType>(burn_cap: BurnCapability<CoinType>) {
|
|
1229
|
+
let BurnCapability<CoinType> {} = burn_cap;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
fun mint_internal<CoinType>(amount: u64): Coin<CoinType> acquires CoinInfo {
|
|
1233
|
+
if (amount == 0) {
|
|
1234
|
+
return Coin<CoinType> {
|
|
1235
|
+
value: 0
|
|
1236
|
+
}
|
|
1237
|
+
};
|
|
1238
|
+
|
|
1239
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<CoinType>>(coin_address<CoinType>()).supply;
|
|
1240
|
+
if (option::is_some(maybe_supply)) {
|
|
1241
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1242
|
+
spec {
|
|
1243
|
+
use aptos_framework::optional_aggregator;
|
|
1244
|
+
use aptos_framework::aggregator;
|
|
1245
|
+
assume optional_aggregator::is_parallelizable(supply) ==> (aggregator::spec_aggregator_get_val(
|
|
1246
|
+
option::borrow(supply.aggregator)
|
|
1247
|
+
)
|
|
1248
|
+
+ amount <= aggregator::spec_get_limit(option::borrow(supply.aggregator)));
|
|
1249
|
+
assume !optional_aggregator::is_parallelizable(supply) ==>
|
|
1250
|
+
(option::borrow(supply.integer).value + amount <= option::borrow(supply.integer).limit);
|
|
1251
|
+
};
|
|
1252
|
+
optional_aggregator::add(supply, (amount as u128));
|
|
1253
|
+
};
|
|
1254
|
+
spec {
|
|
1255
|
+
update supply<CoinType> = supply<CoinType> + amount;
|
|
1256
|
+
};
|
|
1257
|
+
Coin<CoinType> { value: amount }
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
fun burn_internal<CoinType>(coin: Coin<CoinType>): u64 acquires CoinInfo {
|
|
1261
|
+
spec {
|
|
1262
|
+
update supply<CoinType> = supply<CoinType> - coin.value;
|
|
1263
|
+
};
|
|
1264
|
+
let Coin { value: amount } = coin;
|
|
1265
|
+
if (amount != 0) {
|
|
1266
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<CoinType>>(coin_address<CoinType>()).supply;
|
|
1267
|
+
if (option::is_some(maybe_supply)) {
|
|
1268
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1269
|
+
optional_aggregator::sub(supply, (amount as u128));
|
|
1270
|
+
};
|
|
1271
|
+
};
|
|
1272
|
+
amount
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
#[test_only]
|
|
1276
|
+
struct FakeMoney {}
|
|
1277
|
+
|
|
1278
|
+
#[test_only]
|
|
1279
|
+
struct FakeMoneyCapabilities has key {
|
|
1280
|
+
burn_cap: BurnCapability<FakeMoney>,
|
|
1281
|
+
freeze_cap: FreezeCapability<FakeMoney>,
|
|
1282
|
+
mint_cap: MintCapability<FakeMoney>,
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
#[test_only]
|
|
1286
|
+
struct FakeMoneyRefs has key {
|
|
1287
|
+
mint_ref: MintRef,
|
|
1288
|
+
transfer_ref: TransferRef,
|
|
1289
|
+
burn_ref: BurnRef,
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
#[test_only]
|
|
1293
|
+
fun create_coin_store<CoinType>(account: &signer) {
|
|
1294
|
+
assert!(is_coin_initialized<CoinType>(), error::invalid_argument(ECOIN_INFO_NOT_PUBLISHED));
|
|
1295
|
+
if (!exists<CoinStore<CoinType>>(signer::address_of(account))) {
|
|
1296
|
+
let coin_store = CoinStore<CoinType> {
|
|
1297
|
+
coin: Coin { value: 0 },
|
|
1298
|
+
frozen: false,
|
|
1299
|
+
deposit_events: account::new_event_handle<DepositEvent>(account),
|
|
1300
|
+
withdraw_events: account::new_event_handle<WithdrawEvent>(account),
|
|
1301
|
+
};
|
|
1302
|
+
move_to(account, coin_store);
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
#[test_only]
|
|
1307
|
+
fun coin_store_exists<CoinType>(account: address): bool {
|
|
1308
|
+
exists<CoinStore<CoinType>>(account)
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
#[test_only]
|
|
1312
|
+
fun initialize_fake_money(
|
|
1313
|
+
account: &signer,
|
|
1314
|
+
decimals: u8,
|
|
1315
|
+
monitor_supply: bool,
|
|
1316
|
+
): (BurnCapability<FakeMoney>, FreezeCapability<FakeMoney>, MintCapability<FakeMoney>) {
|
|
1317
|
+
aggregator_factory::initialize_aggregator_factory_for_test(account);
|
|
1318
|
+
initialize<FakeMoney>(
|
|
1319
|
+
account,
|
|
1320
|
+
string::utf8(b"Fake money"),
|
|
1321
|
+
string::utf8(b"FMD"),
|
|
1322
|
+
decimals,
|
|
1323
|
+
monitor_supply
|
|
1324
|
+
)
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
#[test_only]
|
|
1328
|
+
public fun initialize_and_register_fake_money(
|
|
1329
|
+
account: &signer,
|
|
1330
|
+
decimals: u8,
|
|
1331
|
+
monitor_supply: bool,
|
|
1332
|
+
): (BurnCapability<FakeMoney>, FreezeCapability<FakeMoney>, MintCapability<FakeMoney>) {
|
|
1333
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_fake_money(
|
|
1334
|
+
account,
|
|
1335
|
+
decimals,
|
|
1336
|
+
monitor_supply
|
|
1337
|
+
);
|
|
1338
|
+
create_coin_store<FakeMoney>(account);
|
|
1339
|
+
create_coin_conversion_map(account);
|
|
1340
|
+
(burn_cap, freeze_cap, mint_cap)
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
#[test_only]
|
|
1344
|
+
public entry fun create_fake_money(
|
|
1345
|
+
source: &signer,
|
|
1346
|
+
destination: &signer,
|
|
1347
|
+
amount: u64
|
|
1348
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap {
|
|
1349
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(source, 18, true);
|
|
1350
|
+
|
|
1351
|
+
create_coin_store<FakeMoney>(destination);
|
|
1352
|
+
let coins_minted = mint<FakeMoney>(amount, &mint_cap);
|
|
1353
|
+
deposit(signer::address_of(source), coins_minted);
|
|
1354
|
+
move_to(source, FakeMoneyCapabilities {
|
|
1355
|
+
burn_cap,
|
|
1356
|
+
freeze_cap,
|
|
1357
|
+
mint_cap,
|
|
1358
|
+
});
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
#[test(source = @0x1, destination = @0x2)]
|
|
1362
|
+
public entry fun end_to_end(
|
|
1363
|
+
source: signer,
|
|
1364
|
+
destination: signer,
|
|
1365
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedCoinType {
|
|
1366
|
+
let source_addr = signer::address_of(&source);
|
|
1367
|
+
account::create_account_for_test(source_addr);
|
|
1368
|
+
let destination_addr = signer::address_of(&destination);
|
|
1369
|
+
account::create_account_for_test(destination_addr);
|
|
1370
|
+
|
|
1371
|
+
let name = string::utf8(b"Fake money");
|
|
1372
|
+
let symbol = string::utf8(b"FMD");
|
|
1373
|
+
|
|
1374
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(
|
|
1375
|
+
&source,
|
|
1376
|
+
18,
|
|
1377
|
+
true
|
|
1378
|
+
);
|
|
1379
|
+
register<FakeMoney>(&source);
|
|
1380
|
+
register<FakeMoney>(&destination);
|
|
1381
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 0, 0);
|
|
1382
|
+
|
|
1383
|
+
assert!(name<FakeMoney>() == name, 1);
|
|
1384
|
+
assert!(symbol<FakeMoney>() == symbol, 2);
|
|
1385
|
+
assert!(decimals<FakeMoney>() == 18, 3);
|
|
1386
|
+
|
|
1387
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1388
|
+
deposit(source_addr, coins_minted);
|
|
1389
|
+
maybe_convert_to_fungible_store<FakeMoney>(source_addr);
|
|
1390
|
+
assert!(!coin_store_exists<FakeMoney>(source_addr), 0);
|
|
1391
|
+
assert!(coin_store_exists<FakeMoney>(destination_addr), 0);
|
|
1392
|
+
|
|
1393
|
+
transfer<FakeMoney>(&source, destination_addr, 50);
|
|
1394
|
+
maybe_convert_to_fungible_store<FakeMoney>(destination_addr);
|
|
1395
|
+
assert!(!coin_store_exists<FakeMoney>(destination_addr), 0);
|
|
1396
|
+
|
|
1397
|
+
assert!(balance<FakeMoney>(source_addr) == 50, 4);
|
|
1398
|
+
assert!(balance<FakeMoney>(destination_addr) == 50, 5);
|
|
1399
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 100, 6);
|
|
1400
|
+
|
|
1401
|
+
let coin = withdraw<FakeMoney>(&source, 10);
|
|
1402
|
+
assert!(value(&coin) == 10, 7);
|
|
1403
|
+
burn(coin, &burn_cap);
|
|
1404
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 90, 8);
|
|
1405
|
+
|
|
1406
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1407
|
+
burn_cap,
|
|
1408
|
+
freeze_cap,
|
|
1409
|
+
mint_cap,
|
|
1410
|
+
});
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
#[test(source = @0x1, destination = @0x2)]
|
|
1414
|
+
public entry fun end_to_end_no_supply(
|
|
1415
|
+
source: signer,
|
|
1416
|
+
destination: signer,
|
|
1417
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedCoinType {
|
|
1418
|
+
let source_addr = signer::address_of(&source);
|
|
1419
|
+
account::create_account_for_test(source_addr);
|
|
1420
|
+
let destination_addr = signer::address_of(&destination);
|
|
1421
|
+
account::create_account_for_test(destination_addr);
|
|
1422
|
+
|
|
1423
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&source, 1, false);
|
|
1424
|
+
|
|
1425
|
+
register<FakeMoney>(&destination);
|
|
1426
|
+
assert!(option::is_none(&supply<FakeMoney>()), 0);
|
|
1427
|
+
|
|
1428
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1429
|
+
deposit<FakeMoney>(source_addr, coins_minted);
|
|
1430
|
+
transfer<FakeMoney>(&source, destination_addr, 50);
|
|
1431
|
+
|
|
1432
|
+
assert!(balance<FakeMoney>(source_addr) == 50, 1);
|
|
1433
|
+
assert!(balance<FakeMoney>(destination_addr) == 50, 2);
|
|
1434
|
+
assert!(option::is_none(&supply<FakeMoney>()), 3);
|
|
1435
|
+
|
|
1436
|
+
let coin = withdraw<FakeMoney>(&source, 10);
|
|
1437
|
+
burn(coin, &burn_cap);
|
|
1438
|
+
assert!(option::is_none(&supply<FakeMoney>()), 4);
|
|
1439
|
+
|
|
1440
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1441
|
+
burn_cap,
|
|
1442
|
+
freeze_cap,
|
|
1443
|
+
mint_cap,
|
|
1444
|
+
});
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
#[test(source = @0x2, framework = @aptos_framework)]
|
|
1448
|
+
#[expected_failure(abort_code = 0x10001, location = Self)]
|
|
1449
|
+
public fun fail_initialize(source: signer, framework: signer) {
|
|
1450
|
+
aggregator_factory::initialize_aggregator_factory_for_test(&framework);
|
|
1451
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize<FakeMoney>(
|
|
1452
|
+
&source,
|
|
1453
|
+
string::utf8(b"Fake money"),
|
|
1454
|
+
string::utf8(b"FMD"),
|
|
1455
|
+
1,
|
|
1456
|
+
true,
|
|
1457
|
+
);
|
|
1458
|
+
|
|
1459
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1460
|
+
burn_cap,
|
|
1461
|
+
freeze_cap,
|
|
1462
|
+
mint_cap,
|
|
1463
|
+
});
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
#[test(source = @0x1, destination = @0x2)]
|
|
1467
|
+
public entry fun transfer_to_migrated_destination(
|
|
1468
|
+
source: signer,
|
|
1469
|
+
destination: signer,
|
|
1470
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedCoinType {
|
|
1471
|
+
let source_addr = signer::address_of(&source);
|
|
1472
|
+
account::create_account_for_test(source_addr);
|
|
1473
|
+
let destination_addr = signer::address_of(&destination);
|
|
1474
|
+
account::create_account_for_test(destination_addr);
|
|
1475
|
+
|
|
1476
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&source, 1, true);
|
|
1477
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 0, 0);
|
|
1478
|
+
|
|
1479
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1480
|
+
deposit(source_addr, coins_minted);
|
|
1481
|
+
maybe_convert_to_fungible_store<FakeMoney>(source_addr);
|
|
1482
|
+
assert!(!coin_store_exists<FakeMoney>(source_addr), 0);
|
|
1483
|
+
maybe_convert_to_fungible_store<FakeMoney>(destination_addr);
|
|
1484
|
+
transfer<FakeMoney>(&source, destination_addr, 50);
|
|
1485
|
+
assert!(balance<FakeMoney>(destination_addr) == 50, 2);
|
|
1486
|
+
assert!(!coin_store_exists<FakeMoney>(destination_addr), 0);
|
|
1487
|
+
|
|
1488
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1489
|
+
burn_cap,
|
|
1490
|
+
freeze_cap,
|
|
1491
|
+
mint_cap,
|
|
1492
|
+
});
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
#[test(source = @0x1)]
|
|
1496
|
+
public entry fun test_burn_from_with_capability(
|
|
1497
|
+
source: signer,
|
|
1498
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedFungibleAssetRefs {
|
|
1499
|
+
let source_addr = signer::address_of(&source);
|
|
1500
|
+
account::create_account_for_test(source_addr);
|
|
1501
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&source, 1, true);
|
|
1502
|
+
|
|
1503
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1504
|
+
deposit(source_addr, coins_minted);
|
|
1505
|
+
let fa_minted = coin_to_fungible_asset(mint<FakeMoney>(200, &mint_cap));
|
|
1506
|
+
primary_fungible_store::deposit(source_addr, fa_minted);
|
|
1507
|
+
|
|
1508
|
+
// Burn coin only with both stores
|
|
1509
|
+
burn_from<FakeMoney>(source_addr, 50, &burn_cap);
|
|
1510
|
+
assert!(balance<FakeMoney>(source_addr) == 250, 0);
|
|
1511
|
+
assert!(coin_balance<FakeMoney>(source_addr) == 50, 0);
|
|
1512
|
+
|
|
1513
|
+
// Burn coin and fa with both stores
|
|
1514
|
+
burn_from<FakeMoney>(source_addr, 100, &burn_cap);
|
|
1515
|
+
assert!(balance<FakeMoney>(source_addr) == 150, 0);
|
|
1516
|
+
assert!(primary_fungible_store::balance(source_addr, ensure_paired_metadata<FakeMoney>()) == 150, 0);
|
|
1517
|
+
|
|
1518
|
+
// Burn fa only with both stores
|
|
1519
|
+
burn_from<FakeMoney>(source_addr, 100, &burn_cap);
|
|
1520
|
+
assert!(balance<FakeMoney>(source_addr) == 50, 0);
|
|
1521
|
+
assert!(primary_fungible_store::balance(source_addr, ensure_paired_metadata<FakeMoney>()) == 50, 0);
|
|
1522
|
+
|
|
1523
|
+
// Burn fa only with only fungible store
|
|
1524
|
+
let coins_minted = mint<FakeMoney>(50, &mint_cap);
|
|
1525
|
+
deposit(source_addr, coins_minted);
|
|
1526
|
+
maybe_convert_to_fungible_store<FakeMoney>(source_addr);
|
|
1527
|
+
assert!(!coin_store_exists<FakeMoney>(source_addr), 0);
|
|
1528
|
+
assert!(balance<FakeMoney>(source_addr) == 100, 0);
|
|
1529
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 100, 1);
|
|
1530
|
+
|
|
1531
|
+
burn_from<FakeMoney>(source_addr, 10, &burn_cap);
|
|
1532
|
+
assert!(balance<FakeMoney>(source_addr) == 90, 2);
|
|
1533
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 90, 3);
|
|
1534
|
+
|
|
1535
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1536
|
+
burn_cap,
|
|
1537
|
+
freeze_cap,
|
|
1538
|
+
mint_cap,
|
|
1539
|
+
});
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
#[test(source = @0x1)]
|
|
1543
|
+
#[expected_failure(abort_code = 0x10007, location = Self)]
|
|
1544
|
+
public fun test_destroy_non_zero(
|
|
1545
|
+
source: signer,
|
|
1546
|
+
) acquires CoinInfo {
|
|
1547
|
+
account::create_account_for_test(signer::address_of(&source));
|
|
1548
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&source, 1, true);
|
|
1549
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1550
|
+
destroy_zero(coins_minted);
|
|
1551
|
+
|
|
1552
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1553
|
+
burn_cap,
|
|
1554
|
+
freeze_cap,
|
|
1555
|
+
mint_cap,
|
|
1556
|
+
});
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
#[test(source = @0x1)]
|
|
1560
|
+
public entry fun test_extract(
|
|
1561
|
+
source: signer,
|
|
1562
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap {
|
|
1563
|
+
let source_addr = signer::address_of(&source);
|
|
1564
|
+
account::create_account_for_test(source_addr);
|
|
1565
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&source, 1, true);
|
|
1566
|
+
|
|
1567
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1568
|
+
|
|
1569
|
+
let extracted = extract(&mut coins_minted, 25);
|
|
1570
|
+
assert!(value(&coins_minted) == 75, 0);
|
|
1571
|
+
assert!(value(&extracted) == 25, 1);
|
|
1572
|
+
|
|
1573
|
+
deposit(source_addr, coins_minted);
|
|
1574
|
+
deposit(source_addr, extracted);
|
|
1575
|
+
|
|
1576
|
+
assert!(balance<FakeMoney>(source_addr) == 100, 2);
|
|
1577
|
+
|
|
1578
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1579
|
+
burn_cap,
|
|
1580
|
+
freeze_cap,
|
|
1581
|
+
mint_cap,
|
|
1582
|
+
});
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
#[test(source = @0x1)]
|
|
1586
|
+
public fun test_is_coin_initialized(source: signer) {
|
|
1587
|
+
assert!(!is_coin_initialized<FakeMoney>(), 0);
|
|
1588
|
+
|
|
1589
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_fake_money(&source, 1, true);
|
|
1590
|
+
assert!(is_coin_initialized<FakeMoney>(), 1);
|
|
1591
|
+
|
|
1592
|
+
move_to(&source, FakeMoneyCapabilities {
|
|
1593
|
+
burn_cap,
|
|
1594
|
+
freeze_cap,
|
|
1595
|
+
mint_cap,
|
|
1596
|
+
});
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
#[test(account = @0x1)]
|
|
1600
|
+
public fun test_is_coin_store_frozen(account: signer) acquires CoinStore, CoinConversionMap, CoinInfo {
|
|
1601
|
+
let account_addr = signer::address_of(&account);
|
|
1602
|
+
account::create_account_for_test(account_addr);
|
|
1603
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&account, 18, true);
|
|
1604
|
+
assert!(coin_store_exists<FakeMoney>(account_addr), 1);
|
|
1605
|
+
assert!(!is_coin_store_frozen<FakeMoney>(account_addr), 1);
|
|
1606
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
1607
|
+
assert!(!coin_store_exists<FakeMoney>(account_addr), 1);
|
|
1608
|
+
|
|
1609
|
+
move_to(&account, FakeMoneyCapabilities {
|
|
1610
|
+
burn_cap,
|
|
1611
|
+
freeze_cap,
|
|
1612
|
+
mint_cap,
|
|
1613
|
+
});
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
#[test]
|
|
1617
|
+
fun test_zero() {
|
|
1618
|
+
let zero = zero<FakeMoney>();
|
|
1619
|
+
assert!(value(&zero) == 0, 1);
|
|
1620
|
+
destroy_zero(zero);
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1623
|
+
#[test(account = @0x1)]
|
|
1624
|
+
public entry fun burn_frozen(
|
|
1625
|
+
account: signer
|
|
1626
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedFungibleAssetRefs {
|
|
1627
|
+
let account_addr = signer::address_of(&account);
|
|
1628
|
+
account::create_account_for_test(account_addr);
|
|
1629
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&account, 18, true);
|
|
1630
|
+
|
|
1631
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1632
|
+
deposit(account_addr, coins_minted);
|
|
1633
|
+
|
|
1634
|
+
freeze_coin_store(account_addr, &freeze_cap);
|
|
1635
|
+
burn_from(account_addr, 90, &burn_cap);
|
|
1636
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
1637
|
+
assert!(primary_fungible_store::is_frozen(account_addr, ensure_paired_metadata<FakeMoney>()), 1);
|
|
1638
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 10, 1);
|
|
1639
|
+
|
|
1640
|
+
move_to(&account, FakeMoneyCapabilities {
|
|
1641
|
+
burn_cap,
|
|
1642
|
+
freeze_cap,
|
|
1643
|
+
mint_cap,
|
|
1644
|
+
});
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
#[test(account = @0x1)]
|
|
1648
|
+
#[expected_failure(abort_code = 0x50003, location = aptos_framework::fungible_asset)]
|
|
1649
|
+
public entry fun withdraw_frozen(account: signer) acquires CoinInfo, CoinStore, CoinConversionMap, PairedCoinType {
|
|
1650
|
+
let account_addr = signer::address_of(&account);
|
|
1651
|
+
account::create_account_for_test(account_addr);
|
|
1652
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&account, 18, true);
|
|
1653
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1654
|
+
deposit(account_addr, coins_minted);
|
|
1655
|
+
|
|
1656
|
+
freeze_coin_store(account_addr, &freeze_cap);
|
|
1657
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
1658
|
+
let coin = withdraw<FakeMoney>(&account, 90);
|
|
1659
|
+
burn(coin, &burn_cap);
|
|
1660
|
+
|
|
1661
|
+
move_to(&account, FakeMoneyCapabilities {
|
|
1662
|
+
burn_cap,
|
|
1663
|
+
freeze_cap,
|
|
1664
|
+
mint_cap,
|
|
1665
|
+
});
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
#[test(account = @0x1)]
|
|
1669
|
+
#[expected_failure(abort_code = 0x5000A, location = Self)]
|
|
1670
|
+
public entry fun deposit_frozen(account: signer) acquires CoinInfo, CoinStore, CoinConversionMap {
|
|
1671
|
+
let account_addr = signer::address_of(&account);
|
|
1672
|
+
account::create_account_for_test(account_addr);
|
|
1673
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&account, 18, true);
|
|
1674
|
+
|
|
1675
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1676
|
+
freeze_coin_store(account_addr, &freeze_cap);
|
|
1677
|
+
deposit(account_addr, coins_minted);
|
|
1678
|
+
|
|
1679
|
+
move_to(&account, FakeMoneyCapabilities {
|
|
1680
|
+
burn_cap,
|
|
1681
|
+
freeze_cap,
|
|
1682
|
+
mint_cap,
|
|
1683
|
+
});
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
#[test(account = @0x1)]
|
|
1687
|
+
public entry fun deposit_withdraw_unfrozen(
|
|
1688
|
+
account: signer
|
|
1689
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedCoinType {
|
|
1690
|
+
let account_addr = signer::address_of(&account);
|
|
1691
|
+
account::create_account_for_test(account_addr);
|
|
1692
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&account, 18, true);
|
|
1693
|
+
|
|
1694
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1695
|
+
freeze_coin_store(account_addr, &freeze_cap);
|
|
1696
|
+
unfreeze_coin_store(account_addr, &freeze_cap);
|
|
1697
|
+
deposit(account_addr, coins_minted);
|
|
1698
|
+
|
|
1699
|
+
freeze_coin_store(account_addr, &freeze_cap);
|
|
1700
|
+
unfreeze_coin_store(account_addr, &freeze_cap);
|
|
1701
|
+
let coin = withdraw<FakeMoney>(&account, 10);
|
|
1702
|
+
burn(coin, &burn_cap);
|
|
1703
|
+
|
|
1704
|
+
move_to(&account, FakeMoneyCapabilities {
|
|
1705
|
+
burn_cap,
|
|
1706
|
+
freeze_cap,
|
|
1707
|
+
mint_cap,
|
|
1708
|
+
});
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
#[test_only]
|
|
1712
|
+
fun initialize_with_aggregator(account: &signer) {
|
|
1713
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_with_parallelizable_supply<FakeMoney>(
|
|
1714
|
+
account,
|
|
1715
|
+
string::utf8(b"Fake money"),
|
|
1716
|
+
string::utf8(b"FMD"),
|
|
1717
|
+
1,
|
|
1718
|
+
true
|
|
1719
|
+
);
|
|
1720
|
+
move_to(account, FakeMoneyCapabilities {
|
|
1721
|
+
burn_cap,
|
|
1722
|
+
freeze_cap,
|
|
1723
|
+
mint_cap,
|
|
1724
|
+
});
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
#[test_only]
|
|
1728
|
+
fun initialize_with_integer(account: &signer) {
|
|
1729
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize<FakeMoney>(
|
|
1730
|
+
account,
|
|
1731
|
+
string::utf8(b"Fake money"),
|
|
1732
|
+
string::utf8(b"FMD"),
|
|
1733
|
+
1,
|
|
1734
|
+
true
|
|
1735
|
+
);
|
|
1736
|
+
move_to(account, FakeMoneyCapabilities {
|
|
1737
|
+
burn_cap,
|
|
1738
|
+
freeze_cap,
|
|
1739
|
+
mint_cap,
|
|
1740
|
+
});
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
|
|
1744
|
+
#[test(framework = @aptos_framework, other = @0x123)]
|
|
1745
|
+
#[expected_failure(abort_code = 0x50003, location = aptos_framework::system_addresses)]
|
|
1746
|
+
fun test_supply_initialize_fails(framework: signer, other: signer) {
|
|
1747
|
+
aggregator_factory::initialize_aggregator_factory_for_test(&framework);
|
|
1748
|
+
initialize_with_aggregator(&other);
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
#[test(other = @0x123)]
|
|
1752
|
+
#[expected_failure(abort_code = 0x10003, location = Self)]
|
|
1753
|
+
fun test_create_coin_store_with_non_coin_type(other: signer) acquires CoinConversionMap {
|
|
1754
|
+
register<String>(&other);
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
#[test(other = @0x123)]
|
|
1758
|
+
#[expected_failure(abort_code = 0x10003, location = Self)]
|
|
1759
|
+
fun test_migration_coin_store_with_non_coin_type(other: signer) acquires CoinConversionMap, CoinStore, CoinInfo {
|
|
1760
|
+
migrate_to_fungible_store<String>(&other);
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
#[test(framework = @aptos_framework)]
|
|
1764
|
+
fun test_supply_initialize(framework: signer) acquires CoinInfo {
|
|
1765
|
+
aggregator_factory::initialize_aggregator_factory_for_test(&framework);
|
|
1766
|
+
initialize_with_aggregator(&framework);
|
|
1767
|
+
|
|
1768
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<FakeMoney>>(coin_address<FakeMoney>()).supply;
|
|
1769
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1770
|
+
|
|
1771
|
+
// Supply should be parallelizable.
|
|
1772
|
+
assert!(optional_aggregator::is_parallelizable(supply), 0);
|
|
1773
|
+
|
|
1774
|
+
optional_aggregator::add(supply, 100);
|
|
1775
|
+
optional_aggregator::sub(supply, 50);
|
|
1776
|
+
optional_aggregator::add(supply, 950);
|
|
1777
|
+
assert!(optional_aggregator::read(supply) == 1000, 0);
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
#[test(framework = @aptos_framework)]
|
|
1781
|
+
#[expected_failure(abort_code = 0x20001, location = aptos_framework::aggregator)]
|
|
1782
|
+
fun test_supply_overflow(framework: signer) acquires CoinInfo {
|
|
1783
|
+
aggregator_factory::initialize_aggregator_factory_for_test(&framework);
|
|
1784
|
+
initialize_with_aggregator(&framework);
|
|
1785
|
+
|
|
1786
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<FakeMoney>>(coin_address<FakeMoney>()).supply;
|
|
1787
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1788
|
+
|
|
1789
|
+
optional_aggregator::add(supply, MAX_U128);
|
|
1790
|
+
optional_aggregator::add(supply, 1);
|
|
1791
|
+
optional_aggregator::sub(supply, 1);
|
|
1792
|
+
}
|
|
1793
|
+
|
|
1794
|
+
#[test(framework = @aptos_framework)]
|
|
1795
|
+
#[expected_failure(abort_code = 0x5000B, location = aptos_framework::coin)]
|
|
1796
|
+
fun test_supply_upgrade_fails(framework: signer) acquires CoinInfo, SupplyConfig {
|
|
1797
|
+
initialize_supply_config(&framework);
|
|
1798
|
+
aggregator_factory::initialize_aggregator_factory_for_test(&framework);
|
|
1799
|
+
initialize_with_integer(&framework);
|
|
1800
|
+
|
|
1801
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<FakeMoney>>(coin_address<FakeMoney>()).supply;
|
|
1802
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1803
|
+
|
|
1804
|
+
// Supply should be non-parallelizable.
|
|
1805
|
+
assert!(!optional_aggregator::is_parallelizable(supply), 0);
|
|
1806
|
+
|
|
1807
|
+
optional_aggregator::add(supply, 100);
|
|
1808
|
+
optional_aggregator::sub(supply, 50);
|
|
1809
|
+
optional_aggregator::add(supply, 950);
|
|
1810
|
+
assert!(optional_aggregator::read(supply) == 1000, 0);
|
|
1811
|
+
|
|
1812
|
+
upgrade_supply<FakeMoney>(&framework);
|
|
1813
|
+
}
|
|
1814
|
+
|
|
1815
|
+
#[test(framework = @aptos_framework)]
|
|
1816
|
+
fun test_supply_upgrade(framework: signer) acquires CoinInfo, SupplyConfig {
|
|
1817
|
+
initialize_supply_config(&framework);
|
|
1818
|
+
aggregator_factory::initialize_aggregator_factory_for_test(&framework);
|
|
1819
|
+
initialize_with_integer(&framework);
|
|
1820
|
+
|
|
1821
|
+
// Ensure we have a non-parellelizable non-zero supply.
|
|
1822
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<FakeMoney>>(coin_address<FakeMoney>()).supply;
|
|
1823
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1824
|
+
assert!(!optional_aggregator::is_parallelizable(supply), 0);
|
|
1825
|
+
optional_aggregator::add(supply, 100);
|
|
1826
|
+
|
|
1827
|
+
// Upgrade.
|
|
1828
|
+
allow_supply_upgrades(&framework, true);
|
|
1829
|
+
upgrade_supply<FakeMoney>(&framework);
|
|
1830
|
+
|
|
1831
|
+
// Check supply again.
|
|
1832
|
+
let maybe_supply = &mut borrow_global_mut<CoinInfo<FakeMoney>>(coin_address<FakeMoney>()).supply;
|
|
1833
|
+
let supply = option::borrow_mut(maybe_supply);
|
|
1834
|
+
assert!(optional_aggregator::is_parallelizable(supply), 0);
|
|
1835
|
+
assert!(optional_aggregator::read(supply) == 100, 0);
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
#[test_only]
|
|
1839
|
+
fun destroy_aggregatable_coin_for_test<CoinType>(aggregatable_coin: AggregatableCoin<CoinType>) {
|
|
1840
|
+
let AggregatableCoin { value } = aggregatable_coin;
|
|
1841
|
+
aggregator::destroy(value);
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
#[test(framework = @aptos_framework)]
|
|
1845
|
+
public entry fun test_collect_from_and_drain(
|
|
1846
|
+
framework: signer,
|
|
1847
|
+
) acquires CoinInfo, CoinStore, CoinConversionMap, PairedCoinType {
|
|
1848
|
+
let framework_addr = signer::address_of(&framework);
|
|
1849
|
+
account::create_account_for_test(framework_addr);
|
|
1850
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(&framework, 1, true);
|
|
1851
|
+
|
|
1852
|
+
// Collect from coin store only.
|
|
1853
|
+
let coins_minted = mint<FakeMoney>(100, &mint_cap);
|
|
1854
|
+
deposit(framework_addr, coins_minted);
|
|
1855
|
+
let aggregatable_coin = initialize_aggregatable_coin<FakeMoney>(&framework);
|
|
1856
|
+
collect_into_aggregatable_coin<FakeMoney>(framework_addr, 50, &mut aggregatable_coin);
|
|
1857
|
+
|
|
1858
|
+
let fa_minted = coin_to_fungible_asset(mint<FakeMoney>(100, &mint_cap));
|
|
1859
|
+
primary_fungible_store::deposit(framework_addr, fa_minted);
|
|
1860
|
+
assert!(balance<FakeMoney>(framework_addr) == 150, 0);
|
|
1861
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 200, 0);
|
|
1862
|
+
|
|
1863
|
+
// Collect from coin store and fungible store.
|
|
1864
|
+
collect_into_aggregatable_coin<FakeMoney>(framework_addr, 100, &mut aggregatable_coin);
|
|
1865
|
+
|
|
1866
|
+
assert!(balance<FakeMoney>(framework_addr) == 50, 0);
|
|
1867
|
+
maybe_convert_to_fungible_store<FakeMoney>(framework_addr);
|
|
1868
|
+
// Collect from fungible store only.
|
|
1869
|
+
collect_into_aggregatable_coin<FakeMoney>(framework_addr, 30, &mut aggregatable_coin);
|
|
1870
|
+
|
|
1871
|
+
// Check that aggregatable coin has the right amount.
|
|
1872
|
+
let collected_coin = drain_aggregatable_coin(&mut aggregatable_coin);
|
|
1873
|
+
assert!(is_aggregatable_coin_zero(&aggregatable_coin), 0);
|
|
1874
|
+
assert!(value(&collected_coin) == 180, 0);
|
|
1875
|
+
|
|
1876
|
+
// Supply of coins should be unchanged, but the balance on the account should decrease.
|
|
1877
|
+
assert!(balance<FakeMoney>(framework_addr) == 20, 0);
|
|
1878
|
+
assert!(*option::borrow(&supply<FakeMoney>()) == 200, 0);
|
|
1879
|
+
|
|
1880
|
+
burn(collected_coin, &burn_cap);
|
|
1881
|
+
destroy_aggregatable_coin_for_test(aggregatable_coin);
|
|
1882
|
+
move_to(&framework, FakeMoneyCapabilities {
|
|
1883
|
+
burn_cap,
|
|
1884
|
+
freeze_cap,
|
|
1885
|
+
mint_cap,
|
|
1886
|
+
});
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
#[test_only]
|
|
1890
|
+
fun deposit_to_coin_store<CoinType>(account_addr: address, coin: Coin<CoinType>) acquires CoinStore {
|
|
1891
|
+
assert!(
|
|
1892
|
+
coin_store_exists<CoinType>(account_addr),
|
|
1893
|
+
error::not_found(ECOIN_STORE_NOT_PUBLISHED),
|
|
1894
|
+
);
|
|
1895
|
+
|
|
1896
|
+
let coin_store = borrow_global_mut<CoinStore<CoinType>>(account_addr);
|
|
1897
|
+
assert!(
|
|
1898
|
+
!coin_store.frozen,
|
|
1899
|
+
error::permission_denied(EFROZEN),
|
|
1900
|
+
);
|
|
1901
|
+
|
|
1902
|
+
event::emit_event<DepositEvent>(
|
|
1903
|
+
&mut coin_store.deposit_events,
|
|
1904
|
+
DepositEvent { amount: coin.value },
|
|
1905
|
+
);
|
|
1906
|
+
|
|
1907
|
+
merge(&mut coin_store.coin, coin);
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
#[test(account = @aptos_framework)]
|
|
1911
|
+
fun test_conversion_basic(
|
|
1912
|
+
account: &signer
|
|
1913
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore, PairedCoinType, PairedFungibleAssetRefs {
|
|
1914
|
+
let account_addr = signer::address_of(account);
|
|
1915
|
+
account::create_account_for_test(account_addr);
|
|
1916
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
1917
|
+
|
|
1918
|
+
assert!(fungible_asset::name(ensure_paired_metadata<FakeMoney>()) == name<FakeMoney>(), 0);
|
|
1919
|
+
assert!(fungible_asset::symbol(ensure_paired_metadata<FakeMoney>()) == symbol<FakeMoney>(), 0);
|
|
1920
|
+
assert!(fungible_asset::decimals(ensure_paired_metadata<FakeMoney>()) == decimals<FakeMoney>(), 0);
|
|
1921
|
+
|
|
1922
|
+
let minted_coin = mint(100, &mint_cap);
|
|
1923
|
+
let converted_fa = coin_to_fungible_asset(minted_coin);
|
|
1924
|
+
|
|
1925
|
+
// check and get refs
|
|
1926
|
+
assert!(paired_mint_ref_exists<FakeMoney>(), 0);
|
|
1927
|
+
assert!(paired_transfer_ref_exists<FakeMoney>(), 0);
|
|
1928
|
+
assert!(paired_burn_ref_exists<FakeMoney>(), 0);
|
|
1929
|
+
let (mint_ref, mint_ref_receipt) = get_paired_mint_ref(&mint_cap);
|
|
1930
|
+
let (transfer_ref, transfer_ref_receipt) = get_paired_transfer_ref(&freeze_cap);
|
|
1931
|
+
let (burn_ref, burn_ref_receipt) = get_paired_burn_ref(&burn_cap);
|
|
1932
|
+
assert!(!paired_mint_ref_exists<FakeMoney>(), 0);
|
|
1933
|
+
assert!(!paired_transfer_ref_exists<FakeMoney>(), 0);
|
|
1934
|
+
assert!(!paired_burn_ref_exists<FakeMoney>(), 0);
|
|
1935
|
+
|
|
1936
|
+
let minted_fa = fungible_asset::mint(&mint_ref, 100);
|
|
1937
|
+
assert!(&converted_fa == &minted_fa, 0);
|
|
1938
|
+
|
|
1939
|
+
let coin = fungible_asset_to_coin<FakeMoney>(converted_fa);
|
|
1940
|
+
assert!(value(&coin) == 100, 0);
|
|
1941
|
+
|
|
1942
|
+
deposit_to_coin_store(account_addr, coin);
|
|
1943
|
+
assert!(coin_store_exists<FakeMoney>(account_addr), 0);
|
|
1944
|
+
primary_fungible_store::deposit(account_addr, minted_fa);
|
|
1945
|
+
assert!(balance<FakeMoney>(account_addr) == 200, 0);
|
|
1946
|
+
|
|
1947
|
+
let withdrawn_coin = withdraw<FakeMoney>(account, 1);
|
|
1948
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
1949
|
+
assert!(!coin_store_exists<FakeMoney>(account_addr), 0);
|
|
1950
|
+
assert!(balance<FakeMoney>(account_addr) == 199, 0);
|
|
1951
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 199, 0);
|
|
1952
|
+
|
|
1953
|
+
let fa = coin_to_fungible_asset(withdrawn_coin);
|
|
1954
|
+
fungible_asset::burn(&burn_ref, fa);
|
|
1955
|
+
|
|
1956
|
+
// Return and check the refs
|
|
1957
|
+
return_paired_mint_ref(mint_ref, mint_ref_receipt);
|
|
1958
|
+
return_paired_transfer_ref(transfer_ref, transfer_ref_receipt);
|
|
1959
|
+
return_paired_burn_ref(burn_ref, burn_ref_receipt);
|
|
1960
|
+
assert!(paired_mint_ref_exists<FakeMoney>(), 0);
|
|
1961
|
+
assert!(paired_transfer_ref_exists<FakeMoney>(), 0);
|
|
1962
|
+
assert!(paired_burn_ref_exists<FakeMoney>(), 0);
|
|
1963
|
+
|
|
1964
|
+
move_to(account, FakeMoneyCapabilities {
|
|
1965
|
+
burn_cap,
|
|
1966
|
+
freeze_cap,
|
|
1967
|
+
mint_cap,
|
|
1968
|
+
});
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
#[test(account = @aptos_framework, aaron = @0xcafe)]
|
|
1972
|
+
fun test_balance_with_both_stores(
|
|
1973
|
+
account: &signer,
|
|
1974
|
+
aaron: &signer
|
|
1975
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore {
|
|
1976
|
+
let account_addr = signer::address_of(account);
|
|
1977
|
+
let aaron_addr = signer::address_of(aaron);
|
|
1978
|
+
account::create_account_for_test(account_addr);
|
|
1979
|
+
account::create_account_for_test(aaron_addr);
|
|
1980
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
1981
|
+
create_coin_store<FakeMoney>(aaron);
|
|
1982
|
+
let coin = mint(100, &mint_cap);
|
|
1983
|
+
let fa = coin_to_fungible_asset(mint(100, &mint_cap));
|
|
1984
|
+
primary_fungible_store::deposit(aaron_addr, fa);
|
|
1985
|
+
deposit_to_coin_store(aaron_addr, coin);
|
|
1986
|
+
assert!(coin_balance<FakeMoney>(aaron_addr) == 100, 0);
|
|
1987
|
+
assert!(balance<FakeMoney>(aaron_addr) == 200, 0);
|
|
1988
|
+
maybe_convert_to_fungible_store<FakeMoney>(aaron_addr);
|
|
1989
|
+
assert!(balance<FakeMoney>(aaron_addr) == 200, 0);
|
|
1990
|
+
assert!(coin_balance<FakeMoney>(aaron_addr) == 0, 0);
|
|
1991
|
+
|
|
1992
|
+
move_to(account, FakeMoneyCapabilities {
|
|
1993
|
+
burn_cap,
|
|
1994
|
+
freeze_cap,
|
|
1995
|
+
mint_cap,
|
|
1996
|
+
});
|
|
1997
|
+
}
|
|
1998
|
+
|
|
1999
|
+
#[test(account = @aptos_framework)]
|
|
2000
|
+
fun test_deposit(
|
|
2001
|
+
account: &signer,
|
|
2002
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore {
|
|
2003
|
+
let account_addr = signer::address_of(account);
|
|
2004
|
+
account::create_account_for_test(account_addr);
|
|
2005
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
2006
|
+
let coin = mint<FakeMoney>(100, &mint_cap);
|
|
2007
|
+
deposit(account_addr, coin);
|
|
2008
|
+
assert!(coin_store_exists<FakeMoney>(account_addr), 0);
|
|
2009
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 0, 0);
|
|
2010
|
+
assert!(balance<FakeMoney>(account_addr) == 100, 0);
|
|
2011
|
+
|
|
2012
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
2013
|
+
let coin = mint<FakeMoney>(100, &mint_cap);
|
|
2014
|
+
deposit(account_addr, coin);
|
|
2015
|
+
assert!(!coin_store_exists<FakeMoney>(account_addr), 0);
|
|
2016
|
+
assert!(balance<FakeMoney>(account_addr) == 200, 0);
|
|
2017
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 200, 0);
|
|
2018
|
+
|
|
2019
|
+
move_to(account, FakeMoneyCapabilities {
|
|
2020
|
+
burn_cap,
|
|
2021
|
+
freeze_cap,
|
|
2022
|
+
mint_cap,
|
|
2023
|
+
});
|
|
2024
|
+
}
|
|
2025
|
+
|
|
2026
|
+
#[test(account = @aptos_framework)]
|
|
2027
|
+
fun test_withdraw(
|
|
2028
|
+
account: &signer,
|
|
2029
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore, PairedCoinType {
|
|
2030
|
+
let account_addr = signer::address_of(account);
|
|
2031
|
+
account::create_account_for_test(account_addr);
|
|
2032
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
2033
|
+
let coin = mint<FakeMoney>(200, &mint_cap);
|
|
2034
|
+
deposit_to_coin_store(account_addr, coin);
|
|
2035
|
+
assert!(coin_balance<FakeMoney>(account_addr) == 200, 0);
|
|
2036
|
+
assert!(balance<FakeMoney>(account_addr) == 200, 0);
|
|
2037
|
+
|
|
2038
|
+
// Withdraw from coin store only.
|
|
2039
|
+
let coin = withdraw<FakeMoney>(account, 100);
|
|
2040
|
+
assert!(coin_balance<FakeMoney>(account_addr) == 100, 0);
|
|
2041
|
+
assert!(balance<FakeMoney>(account_addr) == 100, 0);
|
|
2042
|
+
|
|
2043
|
+
let fa = coin_to_fungible_asset(coin);
|
|
2044
|
+
primary_fungible_store::deposit(account_addr, fa);
|
|
2045
|
+
assert!(coin_store_exists<FakeMoney>(account_addr), 0);
|
|
2046
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 100, 0);
|
|
2047
|
+
assert!(balance<FakeMoney>(account_addr) == 200, 0);
|
|
2048
|
+
|
|
2049
|
+
// Withdraw from both coin store and fungible store.
|
|
2050
|
+
let coin = withdraw<FakeMoney>(account, 150);
|
|
2051
|
+
assert!(coin_balance<FakeMoney>(account_addr) == 0, 0);
|
|
2052
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 50, 0);
|
|
2053
|
+
|
|
2054
|
+
deposit_to_coin_store(account_addr, coin);
|
|
2055
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
2056
|
+
assert!(!coin_store_exists<FakeMoney>(account_addr), 0);
|
|
2057
|
+
assert!(balance<FakeMoney>(account_addr) == 200, 0);
|
|
2058
|
+
assert!(primary_fungible_store::balance(account_addr, ensure_paired_metadata<FakeMoney>()) == 200, 0);
|
|
2059
|
+
|
|
2060
|
+
// Withdraw from fungible store only.
|
|
2061
|
+
let coin = withdraw<FakeMoney>(account, 150);
|
|
2062
|
+
assert!(balance<FakeMoney>(account_addr) == 50, 0);
|
|
2063
|
+
burn(coin, &burn_cap);
|
|
2064
|
+
|
|
2065
|
+
move_to(account, FakeMoneyCapabilities {
|
|
2066
|
+
burn_cap,
|
|
2067
|
+
freeze_cap,
|
|
2068
|
+
mint_cap,
|
|
2069
|
+
});
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
#[test(account = @aptos_framework)]
|
|
2073
|
+
fun test_supply(
|
|
2074
|
+
account: &signer,
|
|
2075
|
+
) acquires CoinConversionMap, CoinInfo, PairedCoinType, PairedFungibleAssetRefs {
|
|
2076
|
+
account::create_account_for_test(signer::address_of(account));
|
|
2077
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
2078
|
+
let coin = mint<FakeMoney>(100, &mint_cap);
|
|
2079
|
+
ensure_paired_metadata<FakeMoney>();
|
|
2080
|
+
let (mint_ref, mint_ref_receipt) = get_paired_mint_ref(&mint_cap);
|
|
2081
|
+
let (burn_ref, burn_ref_receipt) = get_paired_burn_ref(&burn_cap);
|
|
2082
|
+
let fungible_asset = fungible_asset::mint(&mint_ref, 50);
|
|
2083
|
+
assert!(option::is_none(&fungible_asset::maximum(ensure_paired_metadata<FakeMoney>())), 0);
|
|
2084
|
+
assert!(supply<FakeMoney>() == option::some(150), 0);
|
|
2085
|
+
assert!(coin_supply<FakeMoney>() == option::some(100), 0);
|
|
2086
|
+
assert!(fungible_asset::supply(ensure_paired_metadata<FakeMoney>()) == option::some(50), 0);
|
|
2087
|
+
let fa_from_coin = coin_to_fungible_asset(coin);
|
|
2088
|
+
assert!(supply<FakeMoney>() == option::some(150), 0);
|
|
2089
|
+
assert!(coin_supply<FakeMoney>() == option::some(0), 0);
|
|
2090
|
+
assert!(fungible_asset::supply(ensure_paired_metadata<FakeMoney>()) == option::some(150), 0);
|
|
2091
|
+
|
|
2092
|
+
let coin_from_fa = fungible_asset_to_coin<FakeMoney>(fungible_asset);
|
|
2093
|
+
assert!(supply<FakeMoney>() == option::some(150), 0);
|
|
2094
|
+
assert!(coin_supply<FakeMoney>() == option::some(50), 0);
|
|
2095
|
+
assert!(fungible_asset::supply(ensure_paired_metadata<FakeMoney>()) == option::some(100), 0);
|
|
2096
|
+
burn(coin_from_fa, &burn_cap);
|
|
2097
|
+
fungible_asset::burn(&burn_ref, fa_from_coin);
|
|
2098
|
+
assert!(supply<FakeMoney>() == option::some(0), 0);
|
|
2099
|
+
return_paired_mint_ref(mint_ref, mint_ref_receipt);
|
|
2100
|
+
return_paired_burn_ref(burn_ref, burn_ref_receipt);
|
|
2101
|
+
move_to(account, FakeMoneyCapabilities {
|
|
2102
|
+
burn_cap,
|
|
2103
|
+
freeze_cap,
|
|
2104
|
+
mint_cap,
|
|
2105
|
+
});
|
|
2106
|
+
}
|
|
2107
|
+
|
|
2108
|
+
#[test(account = @aptos_framework, aaron = @0xaa10, bob = @0xb0b)]
|
|
2109
|
+
#[expected_failure(abort_code = 0x60005, location = Self)]
|
|
2110
|
+
fun test_force_deposit(
|
|
2111
|
+
account: &signer,
|
|
2112
|
+
aaron: &signer,
|
|
2113
|
+
bob: &signer
|
|
2114
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore {
|
|
2115
|
+
let account_addr = signer::address_of(account);
|
|
2116
|
+
let aaron_addr = signer::address_of(aaron);
|
|
2117
|
+
let bob_addr = signer::address_of(bob);
|
|
2118
|
+
account::create_account_for_test(account_addr);
|
|
2119
|
+
account::create_account_for_test(aaron_addr);
|
|
2120
|
+
account::create_account_for_test(bob_addr);
|
|
2121
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
2122
|
+
maybe_convert_to_fungible_store<FakeMoney>(aaron_addr);
|
|
2123
|
+
deposit(aaron_addr, mint<FakeMoney>(1, &mint_cap));
|
|
2124
|
+
|
|
2125
|
+
force_deposit(account_addr, mint<FakeMoney>(100, &mint_cap));
|
|
2126
|
+
force_deposit(aaron_addr, mint<FakeMoney>(50, &mint_cap));
|
|
2127
|
+
assert!(
|
|
2128
|
+
primary_fungible_store::balance(aaron_addr, option::extract(&mut paired_metadata<FakeMoney>())) == 51,
|
|
2129
|
+
0
|
|
2130
|
+
);
|
|
2131
|
+
assert!(coin_balance<FakeMoney>(account_addr) == 100, 0);
|
|
2132
|
+
force_deposit(bob_addr, mint<FakeMoney>(1, &mint_cap));
|
|
2133
|
+
move_to(account, FakeMoneyCapabilities {
|
|
2134
|
+
burn_cap,
|
|
2135
|
+
freeze_cap,
|
|
2136
|
+
mint_cap,
|
|
2137
|
+
});
|
|
2138
|
+
}
|
|
2139
|
+
|
|
2140
|
+
#[test(account = @aptos_framework, aaron = @0xaa10, bob = @0xb0b)]
|
|
2141
|
+
fun test_is_account_registered(
|
|
2142
|
+
account: &signer,
|
|
2143
|
+
aaron: &signer,
|
|
2144
|
+
bob: &signer,
|
|
2145
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore {
|
|
2146
|
+
let account_addr = signer::address_of(account);
|
|
2147
|
+
let aaron_addr = signer::address_of(aaron);
|
|
2148
|
+
let bob_addr = signer::address_of(bob);
|
|
2149
|
+
account::create_account_for_test(account_addr);
|
|
2150
|
+
account::create_account_for_test(aaron_addr);
|
|
2151
|
+
account::create_account_for_test(bob_addr);
|
|
2152
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
2153
|
+
|
|
2154
|
+
assert!(coin_store_exists<FakeMoney>(account_addr), 0);
|
|
2155
|
+
assert!(is_account_registered<FakeMoney>(account_addr), 0);
|
|
2156
|
+
|
|
2157
|
+
assert!(!coin_store_exists<FakeMoney>(aaron_addr), 0);
|
|
2158
|
+
assert!(!is_account_registered<FakeMoney>(aaron_addr), 0);
|
|
2159
|
+
|
|
2160
|
+
maybe_convert_to_fungible_store<FakeMoney>(aaron_addr);
|
|
2161
|
+
let coin = mint<FakeMoney>(100, &mint_cap);
|
|
2162
|
+
deposit(aaron_addr, coin);
|
|
2163
|
+
|
|
2164
|
+
assert!(!coin_store_exists<FakeMoney>(aaron_addr), 0);
|
|
2165
|
+
assert!(is_account_registered<FakeMoney>(aaron_addr), 0);
|
|
2166
|
+
|
|
2167
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
2168
|
+
assert!(!coin_store_exists<FakeMoney>(account_addr), 0);
|
|
2169
|
+
assert!(is_account_registered<FakeMoney>(account_addr), 0);
|
|
2170
|
+
|
|
2171
|
+
// Deposit FA to bob to created primary fungible store without `MigrationFlag`.
|
|
2172
|
+
primary_fungible_store::deposit(bob_addr, coin_to_fungible_asset(mint<FakeMoney>(100, &mint_cap)));
|
|
2173
|
+
assert!(!coin_store_exists<FakeMoney>(bob_addr), 0);
|
|
2174
|
+
register<FakeMoney>(bob);
|
|
2175
|
+
assert!(coin_store_exists<FakeMoney>(bob_addr), 0);
|
|
2176
|
+
maybe_convert_to_fungible_store<FakeMoney>(bob_addr);
|
|
2177
|
+
assert!(!coin_store_exists<FakeMoney>(bob_addr), 0);
|
|
2178
|
+
register<FakeMoney>(bob);
|
|
2179
|
+
assert!(!coin_store_exists<FakeMoney>(bob_addr), 0);
|
|
2180
|
+
|
|
2181
|
+
move_to(account, FakeMoneyCapabilities {
|
|
2182
|
+
burn_cap,
|
|
2183
|
+
freeze_cap,
|
|
2184
|
+
mint_cap,
|
|
2185
|
+
});
|
|
2186
|
+
}
|
|
2187
|
+
|
|
2188
|
+
#[test(account = @aptos_framework, aaron = @0xaa10)]
|
|
2189
|
+
fun test_migration_with_existing_primary_fungible_store(
|
|
2190
|
+
account: &signer,
|
|
2191
|
+
) acquires CoinConversionMap, CoinInfo, CoinStore, PairedCoinType {
|
|
2192
|
+
account::create_account_for_test(signer::address_of(account));
|
|
2193
|
+
let account_addr = signer::address_of(account);
|
|
2194
|
+
let (burn_cap, freeze_cap, mint_cap) = initialize_and_register_fake_money(account, 1, true);
|
|
2195
|
+
|
|
2196
|
+
let coin = mint<FakeMoney>(100, &mint_cap);
|
|
2197
|
+
primary_fungible_store::deposit(account_addr, coin_to_fungible_asset(coin));
|
|
2198
|
+
assert!(coin_balance<FakeMoney>(account_addr) == 0, 0);
|
|
2199
|
+
assert!(balance<FakeMoney>(account_addr) == 100, 0);
|
|
2200
|
+
let coin = withdraw<FakeMoney>(account, 50);
|
|
2201
|
+
assert!(!migrated_primary_fungible_store_exists(account_addr, ensure_paired_metadata<FakeMoney>()), 0);
|
|
2202
|
+
maybe_convert_to_fungible_store<FakeMoney>(account_addr);
|
|
2203
|
+
assert!(migrated_primary_fungible_store_exists(account_addr, ensure_paired_metadata<FakeMoney>()), 0);
|
|
2204
|
+
deposit(account_addr, coin);
|
|
2205
|
+
assert!(coin_balance<FakeMoney>(account_addr) == 0, 0);
|
|
2206
|
+
assert!(balance<FakeMoney>(account_addr) == 100, 0);
|
|
2207
|
+
|
|
2208
|
+
move_to(account, FakeMoneyCapabilities {
|
|
2209
|
+
burn_cap,
|
|
2210
|
+
freeze_cap,
|
|
2211
|
+
mint_cap,
|
|
2212
|
+
});
|
|
2213
|
+
}
|
|
2214
|
+
}
|