@pezkuwi/api-contract 16.5.6 → 16.5.8
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/build/Abi/index.d.ts +31 -0
- package/build/Abi/index.js +359 -0
- package/build/Abi/toLatestCompatible.d.ts +15 -0
- package/build/Abi/toLatestCompatible.js +30 -0
- package/build/Abi/toV1.d.ts +3 -0
- package/build/Abi/toV1.js +21 -0
- package/build/Abi/toV2.d.ts +3 -0
- package/build/Abi/toV2.js +27 -0
- package/build/Abi/toV3.d.ts +3 -0
- package/build/Abi/toV3.js +10 -0
- package/build/Abi/toV4.d.ts +3 -0
- package/build/Abi/toV4.js +10 -0
- package/build/LICENSE +201 -0
- package/build/README.md +3 -0
- package/build/augment.d.ts +1 -0
- package/build/augment.js +1 -0
- package/build/base/Base.d.ts +13 -0
- package/build/base/Base.js +40 -0
- package/build/base/Blueprint.d.ts +24 -0
- package/build/base/Blueprint.js +51 -0
- package/build/base/Code.d.ts +22 -0
- package/build/base/Code.js +74 -0
- package/build/base/Contract.d.ts +25 -0
- package/build/base/Contract.js +127 -0
- package/build/base/index.d.ts +3 -0
- package/build/base/index.js +3 -0
- package/build/base/mock.d.ts +3 -0
- package/build/base/mock.js +38 -0
- package/build/base/types.d.ts +25 -0
- package/build/base/types.js +1 -0
- package/build/base/util.d.ts +16 -0
- package/build/base/util.js +33 -0
- package/build/bundle-pezkuwi-api-contract.js +1238 -0
- package/build/bundle.d.ts +4 -0
- package/build/bundle.js +4 -0
- package/build/cjs/Abi/index.d.ts +31 -0
- package/build/cjs/Abi/index.js +363 -0
- package/build/cjs/Abi/toLatestCompatible.d.ts +15 -0
- package/build/cjs/Abi/toLatestCompatible.js +36 -0
- package/build/cjs/Abi/toV1.d.ts +3 -0
- package/build/cjs/Abi/toV1.js +24 -0
- package/build/cjs/Abi/toV2.d.ts +3 -0
- package/build/cjs/Abi/toV2.js +30 -0
- package/build/cjs/Abi/toV3.d.ts +3 -0
- package/build/cjs/Abi/toV3.js +13 -0
- package/build/cjs/Abi/toV4.d.ts +3 -0
- package/build/cjs/Abi/toV4.js +13 -0
- package/build/cjs/augment.d.ts +1 -0
- package/build/cjs/augment.js +3 -0
- package/build/cjs/base/Base.d.ts +13 -0
- package/build/cjs/base/Base.js +44 -0
- package/build/cjs/base/Blueprint.d.ts +24 -0
- package/build/cjs/base/Blueprint.js +57 -0
- package/build/cjs/base/Code.d.ts +22 -0
- package/build/cjs/base/Code.js +80 -0
- package/build/cjs/base/Contract.d.ts +25 -0
- package/build/cjs/base/Contract.js +133 -0
- package/build/cjs/base/index.d.ts +3 -0
- package/build/cjs/base/index.js +14 -0
- package/build/cjs/base/mock.d.ts +3 -0
- package/build/cjs/base/mock.js +41 -0
- package/build/cjs/base/types.d.ts +25 -0
- package/build/cjs/base/types.js +2 -0
- package/build/cjs/base/util.d.ts +16 -0
- package/build/cjs/base/util.js +42 -0
- package/build/cjs/bundle.d.ts +4 -0
- package/build/cjs/bundle.js +10 -0
- package/build/cjs/index.d.ts +2 -0
- package/build/cjs/index.js +5 -0
- package/build/cjs/package.json +3 -0
- package/build/cjs/packageDetect.d.ts +1 -0
- package/build/cjs/packageDetect.js +7 -0
- package/build/cjs/packageInfo.d.ts +6 -0
- package/build/cjs/packageInfo.js +4 -0
- package/build/cjs/promise/index.d.ts +13 -0
- package/build/cjs/promise/index.js +23 -0
- package/build/cjs/promise/types.d.ts +3 -0
- package/build/cjs/promise/types.js +2 -0
- package/build/cjs/rx/index.d.ts +13 -0
- package/build/cjs/rx/index.js +23 -0
- package/build/cjs/rx/types.d.ts +3 -0
- package/build/cjs/rx/types.js +2 -0
- package/build/cjs/types.d.ts +79 -0
- package/build/cjs/types.js +2 -0
- package/build/cjs/util.d.ts +5 -0
- package/build/cjs/util.js +13 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +2 -0
- package/build/package.json +408 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageDetect.js +5 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/packageInfo.js +1 -0
- package/build/promise/index.d.ts +13 -0
- package/build/promise/index.js +17 -0
- package/build/promise/types.d.ts +3 -0
- package/build/promise/types.js +1 -0
- package/build/rx/index.d.ts +13 -0
- package/build/rx/index.js +17 -0
- package/build/rx/types.d.ts +3 -0
- package/build/rx/types.js +1 -0
- package/build/types.d.ts +79 -0
- package/build/types.js +1 -0
- package/build/util.d.ts +5 -0
- package/build/util.js +10 -0
- package/build-deno/Abi/index.ts +475 -0
- package/build-deno/Abi/toLatestCompatible.ts +47 -0
- package/build-deno/Abi/toV1.ts +33 -0
- package/build-deno/Abi/toV2.ts +56 -0
- package/build-deno/Abi/toV3.ts +16 -0
- package/build-deno/Abi/toV4.ts +19 -0
- package/build-deno/README.md +3 -0
- package/build-deno/augment.ts +2 -0
- package/build-deno/base/Base.ts +50 -0
- package/build-deno/base/Blueprint.ts +88 -0
- package/build-deno/base/Code.ts +140 -0
- package/build-deno/base/Contract.ts +194 -0
- package/build-deno/base/index.ts +4 -0
- package/build-deno/base/mock.ts +46 -0
- package/build-deno/base/types.ts +38 -0
- package/build-deno/base/util.ts +54 -0
- package/build-deno/bundle.ts +6 -0
- package/build-deno/checkTypes.manual.ts +42 -0
- package/build-deno/index.ts +4 -0
- package/build-deno/mod.ts +2 -0
- package/build-deno/packageDetect.ts +9 -0
- package/build-deno/packageInfo.ts +3 -0
- package/build-deno/promise/index.ts +28 -0
- package/build-deno/promise/types.ts +5 -0
- package/build-deno/rx/index.ts +28 -0
- package/build-deno/rx/types.ts +5 -0
- package/build-deno/test/contracts/index.ts +18 -0
- package/build-deno/test/contracts/ink/index.ts +11 -0
- package/build-deno/test/contracts/ink/v0/accumulator.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/adder.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/delegator.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/dns.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/erc20.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/erc721.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/flipper.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/incrementer.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/index.ts +9 -0
- package/build-deno/test/contracts/ink/v0/multisig_plain.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/subber.wasm +0 -0
- package/build-deno/test/contracts/ink/v0/trait-flipper.wasm +0 -0
- package/build-deno/test/contracts/ink/v1/index.ts +3 -0
- package/build-deno/test/contracts/ink/v2/index.ts +3 -0
- package/build-deno/test/contracts/ink/v3/index.ts +3 -0
- package/build-deno/test/contracts/ink/v4/erc20.wasm +0 -0
- package/build-deno/test/contracts/ink/v4/flipper.wasm +0 -0
- package/build-deno/test/contracts/ink/v4/index.ts +5 -0
- package/build-deno/test/contracts/ink/v5/erc20.wasm +0 -0
- package/build-deno/test/contracts/ink/v5/flipper.wasm +0 -0
- package/build-deno/test/contracts/ink/v5/index.ts +6 -0
- package/build-deno/test/contracts/ink/v6/erc20.polkavm +0 -0
- package/build-deno/test/contracts/ink/v6/index.ts +3 -0
- package/build-deno/test/contracts/solang/index.ts +5 -0
- package/build-deno/test/contracts/solang/v0/index.ts +2 -0
- package/build-deno/test/contracts/solang/v0/ints256.sol +13 -0
- package/build-deno/test/contracts/solang/v0/ints256.wasm +0 -0
- package/build-deno/test/contracts/user/index.ts +7 -0
- package/build-deno/test/contracts/user/v0/assetTransfer.wasm +0 -0
- package/build-deno/test/contracts/user/v0/enumExample.wasm +0 -0
- package/build-deno/test/contracts/user/v0/index.ts +5 -0
- package/build-deno/test/contracts/user/v3/index.ts +2 -0
- package/build-deno/test/contracts/user/v4/index.ts +2 -0
- package/build-deno/test/contracts/util.ts +12 -0
- package/build-deno/types.ts +95 -0
- package/build-deno/util.ts +18 -0
- package/build-tsc/Abi/index.d.ts +31 -0
- package/build-tsc/Abi/toLatestCompatible.d.ts +15 -0
- package/build-tsc/Abi/toV1.d.ts +3 -0
- package/build-tsc/Abi/toV2.d.ts +3 -0
- package/build-tsc/Abi/toV3.d.ts +3 -0
- package/build-tsc/Abi/toV4.d.ts +3 -0
- package/build-tsc/augment.d.ts +1 -0
- package/build-tsc/base/Base.d.ts +13 -0
- package/build-tsc/base/Blueprint.d.ts +24 -0
- package/build-tsc/base/Code.d.ts +22 -0
- package/build-tsc/base/Contract.d.ts +25 -0
- package/build-tsc/base/index.d.ts +3 -0
- package/build-tsc/base/mock.d.ts +3 -0
- package/build-tsc/base/types.d.ts +25 -0
- package/build-tsc/base/util.d.ts +16 -0
- package/build-tsc/bundle.d.ts +4 -0
- package/build-tsc/index.d.ts +2 -0
- package/build-tsc/packageDetect.d.ts +1 -0
- package/build-tsc/packageInfo.d.ts +6 -0
- package/build-tsc/promise/index.d.ts +13 -0
- package/build-tsc/promise/types.d.ts +3 -0
- package/build-tsc/rx/index.d.ts +13 -0
- package/build-tsc/rx/types.d.ts +3 -0
- package/build-tsc/types.d.ts +79 -0
- package/build-tsc/util.d.ts +5 -0
- package/build-tsc-cjs/Abi/index.js +363 -0
- package/build-tsc-cjs/Abi/toLatestCompatible.js +36 -0
- package/build-tsc-cjs/Abi/toV1.js +24 -0
- package/build-tsc-cjs/Abi/toV2.js +30 -0
- package/build-tsc-cjs/Abi/toV3.js +13 -0
- package/build-tsc-cjs/Abi/toV4.js +13 -0
- package/build-tsc-cjs/augment.js +3 -0
- package/build-tsc-cjs/base/Base.js +44 -0
- package/build-tsc-cjs/base/Blueprint.js +57 -0
- package/build-tsc-cjs/base/Code.js +80 -0
- package/build-tsc-cjs/base/Contract.js +133 -0
- package/build-tsc-cjs/base/index.js +14 -0
- package/build-tsc-cjs/base/mock.js +41 -0
- package/build-tsc-cjs/base/types.js +2 -0
- package/build-tsc-cjs/base/util.js +42 -0
- package/build-tsc-cjs/bundle.js +10 -0
- package/build-tsc-cjs/index.js +5 -0
- package/build-tsc-cjs/packageDetect.js +7 -0
- package/build-tsc-cjs/packageInfo.js +4 -0
- package/build-tsc-cjs/promise/index.js +23 -0
- package/build-tsc-cjs/promise/types.js +2 -0
- package/build-tsc-cjs/rx/index.js +23 -0
- package/build-tsc-cjs/rx/types.js +2 -0
- package/build-tsc-cjs/types.js +2 -0
- package/build-tsc-cjs/util.js +13 -0
- package/build-tsc-esm/Abi/index.js +359 -0
- package/build-tsc-esm/Abi/toLatestCompatible.js +30 -0
- package/build-tsc-esm/Abi/toV1.js +21 -0
- package/build-tsc-esm/Abi/toV2.js +27 -0
- package/build-tsc-esm/Abi/toV3.js +10 -0
- package/build-tsc-esm/Abi/toV4.js +10 -0
- package/build-tsc-esm/augment.js +1 -0
- package/build-tsc-esm/base/Base.js +40 -0
- package/build-tsc-esm/base/Blueprint.js +51 -0
- package/build-tsc-esm/base/Code.js +74 -0
- package/build-tsc-esm/base/Contract.js +127 -0
- package/build-tsc-esm/base/index.js +3 -0
- package/build-tsc-esm/base/mock.js +38 -0
- package/build-tsc-esm/base/types.js +1 -0
- package/build-tsc-esm/base/util.js +33 -0
- package/build-tsc-esm/bundle.js +4 -0
- package/build-tsc-esm/index.js +2 -0
- package/build-tsc-esm/packageDetect.js +5 -0
- package/build-tsc-esm/packageInfo.js +1 -0
- package/build-tsc-esm/promise/index.js +17 -0
- package/build-tsc-esm/promise/types.js +1 -0
- package/build-tsc-esm/rx/index.js +17 -0
- package/build-tsc-esm/rx/types.js +1 -0
- package/build-tsc-esm/types.js +1 -0
- package/build-tsc-esm/util.js +10 -0
- package/bundle-pezkuwi-api-contract.js +1 -1
- package/cjs/packageInfo.js +1 -1
- package/package.json +6 -6
- package/packageInfo.js +1 -1
- package/src/Abi/Abi.spec.ts +235 -0
- package/src/Abi/index.ts +477 -0
- package/src/Abi/toLatestCompatible.spec.ts +219 -0
- package/src/Abi/toLatestCompatible.ts +52 -0
- package/src/Abi/toV1.ts +35 -0
- package/src/Abi/toV2.ts +58 -0
- package/src/Abi/toV3.ts +18 -0
- package/src/Abi/toV4.ts +21 -0
- package/src/augment.ts +4 -0
- package/src/base/Base.ts +52 -0
- package/src/base/Blueprint.ts +90 -0
- package/src/base/Code.spec.ts +47 -0
- package/src/base/Code.ts +142 -0
- package/src/base/Contract.ts +197 -0
- package/src/base/index.ts +6 -0
- package/src/base/mock.ts +48 -0
- package/src/base/types.ts +40 -0
- package/src/base/util.ts +56 -0
- package/src/bundle.ts +10 -0
- package/src/checkTypes.manual.ts +45 -0
- package/src/index.ts +6 -0
- package/src/mod.ts +4 -0
- package/src/packageDetect.ts +13 -0
- package/src/packageInfo.ts +6 -0
- package/src/promise/index.ts +28 -0
- package/src/promise/types.ts +7 -0
- package/src/rx/index.ts +28 -0
- package/src/rx/types.ts +7 -0
- package/src/test/compare/ink_v0_delegator.test.json +47 -0
- package/src/test/compare/ink_v0_dns.test.json +232 -0
- package/src/test/compare/ink_v0_erc20.test.json +253 -0
- package/src/test/compare/ink_v0_erc721.test.json +415 -0
- package/src/test/compare/ink_v0_flipper.test.json +9 -0
- package/src/test/compare/ink_v0_flipperBundle.test.json +9 -0
- package/src/test/compare/ink_v0_incrementer.test.json +9 -0
- package/src/test/compare/ink_v0_multisigPlain.test.json +562 -0
- package/src/test/compare/ink_v1_flipper.test.json +9 -0
- package/src/test/compare/ink_v1_psp22.test.json +531 -0
- package/src/test/compare/ink_v2_erc20.test.json +205 -0
- package/src/test/compare/ink_v2_flipper.test.json +9 -0
- package/src/test/compare/ink_v3_flipper.test.json +9 -0
- package/src/test/compare/ink_v3_traitErc20.test.json +205 -0
- package/src/test/compare/ink_v4_erc20Contract.test.json +253 -0
- package/src/test/compare/ink_v4_erc20Metadata.test.json +253 -0
- package/src/test/compare/ink_v4_flipperContract.test.json +155 -0
- package/src/test/compare/ink_v4_flipperMetadata.test.json +155 -0
- package/src/test/compare/ink_v5_erc20.test.json +370 -0
- package/src/test/compare/ink_v5_erc20AnonymousTransferMetadata.test.json +370 -0
- package/src/test/compare/ink_v5_erc20Contract.test.json +370 -0
- package/src/test/compare/ink_v5_erc20Metadata.test.json +370 -0
- package/src/test/compare/ink_v5_flipperContract.test.json +174 -0
- package/src/test/compare/ink_v5_flipperMetadata.test.json +174 -0
- package/src/test/compare/ink_v6_erc20Contract.test.json +418 -0
- package/src/test/compare/ink_v6_erc20Metadata.test.json +418 -0
- package/src/test/compare/solang_v0_ints256.test.json +9 -0
- package/src/test/compare/user_v0_assetTransfer.test.json +54 -0
- package/src/test/compare/user_v0_enumExample.test.json +303 -0
- package/src/test/compare/user_v0_recursive.test.json +27 -0
- package/src/test/compare/user_v0_withString.test.json +260 -0
- package/src/test/compare/user_v3_ask.test.json +71 -0
- package/src/test/compare/user_v4_events.test.json +1328 -0
- package/src/test/contracts/index.ts +20 -0
- package/src/test/contracts/ink/index.ts +13 -0
- package/src/test/contracts/ink/v0/accumulator.wasm +0 -0
- package/src/test/contracts/ink/v0/adder.wasm +0 -0
- package/src/test/contracts/ink/v0/delegator.json +252 -0
- package/src/test/contracts/ink/v0/delegator.wasm +0 -0
- package/src/test/contracts/ink/v0/dns.json +713 -0
- package/src/test/contracts/ink/v0/dns.wasm +0 -0
- package/src/test/contracts/ink/v0/erc20.json +704 -0
- package/src/test/contracts/ink/v0/erc20.wasm +0 -0
- package/src/test/contracts/ink/v0/erc721.json +1197 -0
- package/src/test/contracts/ink/v0/erc721.wasm +0 -0
- package/src/test/contracts/ink/v0/flipper.contract.json +107 -0
- package/src/test/contracts/ink/v0/flipper.json +106 -0
- package/src/test/contracts/ink/v0/flipper.wasm +0 -0
- package/src/test/contracts/ink/v0/incrementer.json +108 -0
- package/src/test/contracts/ink/v0/incrementer.wasm +0 -0
- package/src/test/contracts/ink/v0/index.ts +11 -0
- package/src/test/contracts/ink/v0/multisig_plain.json +1466 -0
- package/src/test/contracts/ink/v0/multisig_plain.wasm +0 -0
- package/src/test/contracts/ink/v0/subber.wasm +0 -0
- package/src/test/contracts/ink/v0/trait-flipper.json +103 -0
- package/src/test/contracts/ink/v0/trait-flipper.wasm +0 -0
- package/src/test/contracts/ink/v1/flipper.contract.json +111 -0
- package/src/test/contracts/ink/v1/index.ts +6 -0
- package/src/test/contracts/ink/v1/psp22_minter_pauser.contract.json +1722 -0
- package/src/test/contracts/ink/v2/erc20.contract.json +630 -0
- package/src/test/contracts/ink/v2/flipper.contract.json +103 -0
- package/src/test/contracts/ink/v2/index.ts +5 -0
- package/src/test/contracts/ink/v3/flipper.contract.json +105 -0
- package/src/test/contracts/ink/v3/index.ts +6 -0
- package/src/test/contracts/ink/v3/trait_erc20.contract.json +631 -0
- package/src/test/contracts/ink/v4/erc20.contract.json +1 -0
- package/src/test/contracts/ink/v4/erc20.json +821 -0
- package/src/test/contracts/ink/v4/erc20.wasm +0 -0
- package/src/test/contracts/ink/v4/flipper.contract.json +1 -0
- package/src/test/contracts/ink/v4/flipper.json +396 -0
- package/src/test/contracts/ink/v4/flipper.wasm +0 -0
- package/src/test/contracts/ink/v4/index.ts +7 -0
- package/src/test/contracts/ink/v5/erc20.contract.json +1 -0
- package/src/test/contracts/ink/v5/erc20.json +1025 -0
- package/src/test/contracts/ink/v5/erc20.wasm +0 -0
- package/src/test/contracts/ink/v5/erc20_anonymous_transfer.json +1025 -0
- package/src/test/contracts/ink/v5/flipper.contract.json +1 -0
- package/src/test/contracts/ink/v5/flipper.json +420 -0
- package/src/test/contracts/ink/v5/flipper.wasm +0 -0
- package/src/test/contracts/ink/v5/index.ts +8 -0
- package/src/test/contracts/ink/v6/erc20.contract.json +1 -0
- package/src/test/contracts/ink/v6/erc20.json +1081 -0
- package/src/test/contracts/ink/v6/erc20.polkavm +0 -0
- package/src/test/contracts/ink/v6/index.ts +5 -0
- package/src/test/contracts/solang/index.ts +7 -0
- package/src/test/contracts/solang/v0/index.ts +4 -0
- package/src/test/contracts/solang/v0/ints256.json +113 -0
- package/src/test/contracts/solang/v0/ints256.sol +13 -0
- package/src/test/contracts/solang/v0/ints256.wasm +0 -0
- package/src/test/contracts/user/index.ts +9 -0
- package/src/test/contracts/user/v0/assetTransfer.json +299 -0
- package/src/test/contracts/user/v0/assetTransfer.wasm +0 -0
- package/src/test/contracts/user/v0/enumExample.json +528 -0
- package/src/test/contracts/user/v0/enumExample.wasm +0 -0
- package/src/test/contracts/user/v0/index.ts +7 -0
- package/src/test/contracts/user/v0/recursive.contract.json +1 -0
- package/src/test/contracts/user/v0/withString.json +777 -0
- package/src/test/contracts/user/v3/ask.json +550 -0
- package/src/test/contracts/user/v3/index.ts +4 -0
- package/src/test/contracts/user/v4/events.contract.json +2990 -0
- package/src/test/contracts/user/v4/index.ts +4 -0
- package/src/test/contracts/util.ts +14 -0
- package/src/types.ts +98 -0
- package/src/util.ts +20 -0
- package/tsconfig.build.json +22 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.spec.json +26 -0
- package/tsconfig.spec.tsbuildinfo +1 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ContractMetadataV4, ContractMetadataV5, ContractMetadataV6 } from '@pezkuwi/types/interfaces';
|
|
5
|
+
import type { Registry } from '@pezkuwi/types/types';
|
|
6
|
+
import type { ContractMetadataSupported } from './index.js';
|
|
7
|
+
|
|
8
|
+
import { v0ToV1 } from './toV1.js';
|
|
9
|
+
import { v1ToV2 } from './toV2.js';
|
|
10
|
+
import { v2ToV3 } from './toV3.js';
|
|
11
|
+
import { v3ToV4 } from './toV4.js';
|
|
12
|
+
|
|
13
|
+
// The versions where an enum is used, aka V0 is missing
|
|
14
|
+
// (Order from newest, i.e. we expect more on newest vs oldest)
|
|
15
|
+
export const enumVersions = ['V6', 'V5', 'V4', 'V3', 'V2', 'V1'] as const;
|
|
16
|
+
|
|
17
|
+
type Versions = typeof enumVersions[number] | 'V0';
|
|
18
|
+
|
|
19
|
+
type Converter = (registry: Registry, vx: any) => ContractMetadataSupported;
|
|
20
|
+
|
|
21
|
+
// Helper to convert metadata from one step to the next
|
|
22
|
+
function createConverter <I, O> (next: (registry: Registry, input: O) => ContractMetadataSupported, step: (registry: Registry, input: I) => O): (registry: Registry, input: I) => ContractMetadataSupported {
|
|
23
|
+
return (registry: Registry, input: I): ContractMetadataSupported =>
|
|
24
|
+
next(registry, step(registry, input));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function v6ToLatestCompatible (_registry: Registry, v6: ContractMetadataV6): ContractMetadataV6 {
|
|
28
|
+
return v6;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function v5ToLatestCompatible (_registry: Registry, v5: ContractMetadataV5): ContractMetadataV5 {
|
|
32
|
+
return v5;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function v4ToLatestCompatible (_registry: Registry, v4: ContractMetadataV4): ContractMetadataV4 {
|
|
36
|
+
return v4;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const v3ToLatestCompatible = /*#__PURE__*/ createConverter(v4ToLatestCompatible, v3ToV4);
|
|
40
|
+
export const v2ToLatestCompatible = /*#__PURE__*/ createConverter(v3ToLatestCompatible, v2ToV3);
|
|
41
|
+
export const v1ToLatestCompatible = /*#__PURE__*/ createConverter(v2ToLatestCompatible, v1ToV2);
|
|
42
|
+
export const v0ToLatestCompatible = /*#__PURE__*/ createConverter(v1ToLatestCompatible, v0ToV1);
|
|
43
|
+
|
|
44
|
+
export const convertVersions: [Versions, Converter][] = [
|
|
45
|
+
['V6', v6ToLatestCompatible],
|
|
46
|
+
['V5', v5ToLatestCompatible],
|
|
47
|
+
['V4', v4ToLatestCompatible],
|
|
48
|
+
['V3', v3ToLatestCompatible],
|
|
49
|
+
['V2', v2ToLatestCompatible],
|
|
50
|
+
['V1', v1ToLatestCompatible],
|
|
51
|
+
['V0', v0ToLatestCompatible]
|
|
52
|
+
];
|
package/src/Abi/toV1.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ContractMetadataV0, ContractMetadataV1 } from '@pezkuwi/types/interfaces';
|
|
5
|
+
import type { Registry } from '@pezkuwi/types/types';
|
|
6
|
+
|
|
7
|
+
import { convertSiV0toV1 } from '@pezkuwi/types';
|
|
8
|
+
import { objectSpread } from '@pezkuwi/util';
|
|
9
|
+
|
|
10
|
+
interface Named {
|
|
11
|
+
name: unknown;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function v0ToV1Names (all: Named[]): unknown[] {
|
|
15
|
+
return all.map((e) =>
|
|
16
|
+
objectSpread({}, e, {
|
|
17
|
+
name: Array.isArray(e.name)
|
|
18
|
+
? e.name
|
|
19
|
+
: [e.name]
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function v0ToV1 (registry: Registry, v0: ContractMetadataV0): ContractMetadataV1 {
|
|
24
|
+
if (!v0.metadataVersion.length) {
|
|
25
|
+
throw new Error('Invalid format for V0 (detected) contract metadata');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return registry.createType('ContractMetadataV1', objectSpread({}, v0, {
|
|
29
|
+
spec: objectSpread({}, v0.spec, {
|
|
30
|
+
constructors: v0ToV1Names(v0.spec.constructors),
|
|
31
|
+
messages: v0ToV1Names(v0.spec.messages)
|
|
32
|
+
}),
|
|
33
|
+
types: convertSiV0toV1(registry, v0.types)
|
|
34
|
+
}));
|
|
35
|
+
}
|
package/src/Abi/toV2.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { Text } from '@pezkuwi/types';
|
|
5
|
+
import type { ContractConstructorSpecV0, ContractEventSpecV0, ContractMessageSpecV0, ContractMetadataV1, ContractMetadataV2 } from '@pezkuwi/types/interfaces';
|
|
6
|
+
import type { Registry } from '@pezkuwi/types/types';
|
|
7
|
+
|
|
8
|
+
import { objectSpread } from '@pezkuwi/util';
|
|
9
|
+
|
|
10
|
+
type WithArgs = keyof typeof ARG_TYPES;
|
|
11
|
+
|
|
12
|
+
interface NamedEntry {
|
|
13
|
+
name: Text | Text[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type GetArgsType<T extends WithArgs> = T extends 'ContractConstructorSpec'
|
|
17
|
+
? ContractConstructorSpecV0
|
|
18
|
+
: T extends ContractEventSpecV0
|
|
19
|
+
? ContractEventSpecV0
|
|
20
|
+
: ContractMessageSpecV0;
|
|
21
|
+
|
|
22
|
+
interface ArgsEntry <T extends WithArgs> extends NamedEntry {
|
|
23
|
+
args: GetArgsType<T>['args'][0][];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const ARG_TYPES = {
|
|
27
|
+
ContractConstructorSpec: 'ContractMessageParamSpecV2',
|
|
28
|
+
ContractEventSpec: 'ContractEventParamSpecV2',
|
|
29
|
+
ContractMessageSpec: 'ContractMessageParamSpecV2'
|
|
30
|
+
} as const;
|
|
31
|
+
|
|
32
|
+
function v1ToV2Label (entry: NamedEntry): { label: Text } {
|
|
33
|
+
return objectSpread({}, entry, {
|
|
34
|
+
label: Array.isArray(entry.name)
|
|
35
|
+
? entry.name.join('::')
|
|
36
|
+
: entry.name
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function v1ToV2Labels <T extends WithArgs> (registry: Registry, outType: T, all: ArgsEntry<T>[]): unknown[] {
|
|
41
|
+
return all.map((e) =>
|
|
42
|
+
registry.createType(`${outType}V2`, objectSpread(v1ToV2Label(e), {
|
|
43
|
+
args: e.args.map((a) =>
|
|
44
|
+
registry.createType(ARG_TYPES[outType], v1ToV2Label(a))
|
|
45
|
+
)
|
|
46
|
+
}))
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function v1ToV2 (registry: Registry, v1: ContractMetadataV1): ContractMetadataV2 {
|
|
51
|
+
return registry.createType('ContractMetadataV2', objectSpread({}, v1, {
|
|
52
|
+
spec: objectSpread({}, v1.spec, {
|
|
53
|
+
constructors: v1ToV2Labels(registry, 'ContractConstructorSpec', v1.spec.constructors),
|
|
54
|
+
events: v1ToV2Labels(registry, 'ContractEventSpec', v1.spec.events),
|
|
55
|
+
messages: v1ToV2Labels(registry, 'ContractMessageSpec', v1.spec.messages)
|
|
56
|
+
})
|
|
57
|
+
}));
|
|
58
|
+
}
|
package/src/Abi/toV3.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ContractMetadataV2, ContractMetadataV3 } from '@pezkuwi/types/interfaces';
|
|
5
|
+
import type { Registry } from '@pezkuwi/types/types';
|
|
6
|
+
|
|
7
|
+
import { objectSpread } from '@pezkuwi/util';
|
|
8
|
+
|
|
9
|
+
export function v2ToV3 (registry: Registry, v2: ContractMetadataV2): ContractMetadataV3 {
|
|
10
|
+
return registry.createType('ContractMetadataV3', objectSpread({}, v2, {
|
|
11
|
+
spec: objectSpread({}, v2.spec, {
|
|
12
|
+
constructors: v2.spec.constructors.map((c) =>
|
|
13
|
+
// V3 introduces the payable flag on constructors, for <V3, it is always true
|
|
14
|
+
registry.createType('ContractConstructorSpecV3', objectSpread({}, c, { payable: true }))
|
|
15
|
+
)
|
|
16
|
+
})
|
|
17
|
+
}));
|
|
18
|
+
}
|
package/src/Abi/toV4.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ContractMetadataV3, ContractMetadataV4 } from '@pezkuwi/types/interfaces';
|
|
5
|
+
import type { Registry } from '@pezkuwi/types/types';
|
|
6
|
+
|
|
7
|
+
import { objectSpread } from '@pezkuwi/util';
|
|
8
|
+
|
|
9
|
+
export function v3ToV4 (registry: Registry, v3: ContractMetadataV3): ContractMetadataV4 {
|
|
10
|
+
return registry.createType('ContractMetadataV4', objectSpread({}, v3, {
|
|
11
|
+
spec: objectSpread({}, v3.spec, {
|
|
12
|
+
constructors: v3.spec.constructors.map((c) =>
|
|
13
|
+
registry.createType('ContractConstructorSpecV4', objectSpread({}, c))
|
|
14
|
+
),
|
|
15
|
+
messages: v3.spec.messages.map((m) =>
|
|
16
|
+
registry.createType('ContractMessageSpecV3', objectSpread({}, m))
|
|
17
|
+
)
|
|
18
|
+
}),
|
|
19
|
+
version: registry.createType('Text', '4')
|
|
20
|
+
}));
|
|
21
|
+
}
|
package/src/augment.ts
ADDED
package/src/base/Base.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ApiBase } from '@pezkuwi/api/base';
|
|
5
|
+
import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
|
|
6
|
+
import type { WeightV2 } from '@pezkuwi/types/interfaces';
|
|
7
|
+
import type { Registry } from '@pezkuwi/types/types';
|
|
8
|
+
|
|
9
|
+
import { isFunction } from '@pezkuwi/util';
|
|
10
|
+
|
|
11
|
+
import { Abi } from '../Abi/index.js';
|
|
12
|
+
|
|
13
|
+
export abstract class Base<ApiType extends ApiTypes> {
|
|
14
|
+
readonly abi: Abi;
|
|
15
|
+
readonly api: ApiBase<ApiType>;
|
|
16
|
+
|
|
17
|
+
protected readonly _decorateMethod: DecorateMethod<ApiType>;
|
|
18
|
+
protected readonly _isWeightV1: boolean;
|
|
19
|
+
protected readonly _isRevive: boolean;
|
|
20
|
+
|
|
21
|
+
constructor (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, decorateMethod: DecorateMethod<ApiType>) {
|
|
22
|
+
if (!api || !api.isConnected || !api.tx) {
|
|
23
|
+
throw new Error('Your API has not been initialized correctly and is not connected to a chain');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
this.abi = abi instanceof Abi
|
|
27
|
+
? abi
|
|
28
|
+
: new Abi(abi, api.registry.getChainProperties());
|
|
29
|
+
this.api = api;
|
|
30
|
+
this._decorateMethod = decorateMethod;
|
|
31
|
+
this._isWeightV1 = !api.registry.createType<WeightV2>('Weight').proofSize;
|
|
32
|
+
this._isRevive = this.abi.isRevive;
|
|
33
|
+
|
|
34
|
+
if (this._isRevive) {
|
|
35
|
+
if (!api.tx.revive || !isFunction(api.tx.revive.instantiateWithCode) || api.tx.revive.instantiateWithCode.meta.args.length !== 6) {
|
|
36
|
+
throw new Error('The runtime does not expose api.tx.revive.instantiateWithCode with storageDepositLimit');
|
|
37
|
+
} else if (!api.call.reviveApi || !isFunction(api.call.reviveApi.call)) {
|
|
38
|
+
throw new Error('Your runtime does not expose the api.call.reviveApi.call runtime interfaces');
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
if (!api.tx.contracts || !isFunction(api.tx.contracts.instantiateWithCode) || api.tx.contracts.instantiateWithCode.meta.args.length !== 6) {
|
|
42
|
+
throw new Error('The runtime does not expose api.tx.contracts.instantiateWithCode with storageDepositLimit');
|
|
43
|
+
} else if (!api.call.contractsApi || !isFunction(api.call.contractsApi.call)) {
|
|
44
|
+
throw new Error('Your runtime does not expose the api.call.contractsApi.call runtime interfaces');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public get registry (): Registry {
|
|
50
|
+
return this.api.registry;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ApiBase } from '@pezkuwi/api/base';
|
|
5
|
+
import type { SubmittableExtrinsic } from '@pezkuwi/api/submittable/types';
|
|
6
|
+
import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
|
|
7
|
+
import type { AccountId, EventRecord, Hash } from '@pezkuwi/types/interfaces';
|
|
8
|
+
import type { ISubmittableResult } from '@pezkuwi/types/types';
|
|
9
|
+
import type { Abi } from '../Abi/index.js';
|
|
10
|
+
import type { AbiConstructor, BlueprintOptions } from '../types.js';
|
|
11
|
+
import type { MapConstructorExec } from './types.js';
|
|
12
|
+
|
|
13
|
+
import { SubmittableResult } from '@pezkuwi/api';
|
|
14
|
+
import { BN_ZERO, isUndefined } from '@pezkuwi/util';
|
|
15
|
+
|
|
16
|
+
import { applyOnEvent } from '../util.js';
|
|
17
|
+
import { Base } from './Base.js';
|
|
18
|
+
import { Contract } from './Contract.js';
|
|
19
|
+
import { convertWeight, createBluePrintTx, encodeSalt } from './util.js';
|
|
20
|
+
|
|
21
|
+
export type BlueprintConstructor<ApiType extends ApiTypes> = new(api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash | Uint8Array) => Blueprint<ApiType>;
|
|
22
|
+
|
|
23
|
+
export class BlueprintSubmittableResult<ApiType extends ApiTypes> extends SubmittableResult {
|
|
24
|
+
readonly contract?: Contract<ApiType> | undefined;
|
|
25
|
+
|
|
26
|
+
constructor (result: ISubmittableResult, contract?: Contract<ApiType>) {
|
|
27
|
+
super(result);
|
|
28
|
+
|
|
29
|
+
this.contract = contract;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class Blueprint<ApiType extends ApiTypes> extends Base<ApiType> {
|
|
34
|
+
/**
|
|
35
|
+
* @description The on-chain code hash for this blueprint
|
|
36
|
+
*/
|
|
37
|
+
readonly codeHash: Hash;
|
|
38
|
+
|
|
39
|
+
readonly #tx: MapConstructorExec<ApiType> = {};
|
|
40
|
+
|
|
41
|
+
constructor (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash | Uint8Array, decorateMethod: DecorateMethod<ApiType>) {
|
|
42
|
+
super(api, abi, decorateMethod);
|
|
43
|
+
|
|
44
|
+
this.codeHash = this.registry.createType('Hash', codeHash);
|
|
45
|
+
|
|
46
|
+
this.abi.constructors.forEach((c): void => {
|
|
47
|
+
if (isUndefined(this.#tx[c.method])) {
|
|
48
|
+
this.#tx[c.method] = createBluePrintTx(c, (o, p) => this.#deploy(c, o, p));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public get tx (): MapConstructorExec<ApiType> {
|
|
54
|
+
return this.#tx;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#deploy = (constructorOrId: AbiConstructor | string | number, { gasLimit = BN_ZERO, salt, storageDepositLimit = null, value = BN_ZERO }: BlueprintOptions, params: unknown[]): SubmittableExtrinsic<ApiType, BlueprintSubmittableResult<ApiType>> => {
|
|
58
|
+
const palletTx = this._isRevive
|
|
59
|
+
? this.api.tx.revive
|
|
60
|
+
: this.api.tx.contracts;
|
|
61
|
+
|
|
62
|
+
return palletTx.instantiate(
|
|
63
|
+
value,
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
65
|
+
// @ts-ignore jiggle v1 weights, metadata points to latest
|
|
66
|
+
this._isWeightV1
|
|
67
|
+
? convertWeight(gasLimit).v1Weight
|
|
68
|
+
: convertWeight(gasLimit).v2Weight,
|
|
69
|
+
storageDepositLimit,
|
|
70
|
+
this.codeHash,
|
|
71
|
+
this.abi.findConstructor(constructorOrId).toU8a(params),
|
|
72
|
+
encodeSalt(salt)
|
|
73
|
+
).withResultTransform((result: ISubmittableResult) =>
|
|
74
|
+
new BlueprintSubmittableResult(result, applyOnEvent(result, ['Instantiated'], ([record]: EventRecord[]) =>
|
|
75
|
+
new Contract<ApiType>(this.api, this.abi, record.event.data[1] as AccountId, this._decorateMethod), this._isRevive
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function extendBlueprint <ApiType extends ApiTypes> (type: ApiType, decorateMethod: DecorateMethod<ApiType>): BlueprintConstructor<ApiType> {
|
|
83
|
+
return class extends Blueprint<ApiType> {
|
|
84
|
+
static __BlueprintType = type;
|
|
85
|
+
|
|
86
|
+
constructor (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash | Uint8Array) {
|
|
87
|
+
super(api, abi, codeHash, decorateMethod);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@pezkuwi/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
|
|
8
|
+
import { toPromiseMethod } from '@pezkuwi/api';
|
|
9
|
+
|
|
10
|
+
import v0contractFlipper from '../test/contracts/ink/v0/flipper.contract.json' assert { type: 'json' };
|
|
11
|
+
import v0abiFlipper from '../test/contracts/ink/v0/flipper.json' assert { type: 'json' };
|
|
12
|
+
import v1contractFlipper from '../test/contracts/ink/v1/flipper.contract.json' assert { type: 'json' };
|
|
13
|
+
import v6contractErc20 from '../test/contracts/ink/v6/erc20.contract.json' assert { type: 'json' };
|
|
14
|
+
import { Code } from './Code.js';
|
|
15
|
+
import { mockApi, mockReviveApi } from './mock.js';
|
|
16
|
+
|
|
17
|
+
const v0wasmFlipper = fs.readFileSync(new URL('../test/contracts/ink/v0/flipper.wasm', import.meta.url), 'utf-8');
|
|
18
|
+
|
|
19
|
+
describe('Code', (): void => {
|
|
20
|
+
it('can construct with an individual ABI/WASM combo', (): void => {
|
|
21
|
+
expect(
|
|
22
|
+
() => new Code(mockApi, v0abiFlipper as Record<string, unknown>, v0wasmFlipper, toPromiseMethod)
|
|
23
|
+
).not.toThrow();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('can construct with an .contract ABI (v0)', (): void => {
|
|
27
|
+
expect(
|
|
28
|
+
() => new Code(mockApi, v0contractFlipper as Record<string, unknown>, null, toPromiseMethod)
|
|
29
|
+
).not.toThrow();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('can construct with an .contract ABI (v1)', (): void => {
|
|
33
|
+
expect(
|
|
34
|
+
() => new Code(mockApi, v1contractFlipper as Record<string, unknown>, null, toPromiseMethod)
|
|
35
|
+
).not.toThrow();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('can construct a revive compatible contract (v6)', (): void => {
|
|
39
|
+
expect(
|
|
40
|
+
() => new Code(mockApi, v6contractErc20 as Record<string, unknown>, null, toPromiseMethod)
|
|
41
|
+
).toThrow('The runtime does not expose api.tx.revive.instantiateWithCode with storageDepositLimit');
|
|
42
|
+
|
|
43
|
+
expect(
|
|
44
|
+
() => new Code(mockReviveApi, v6contractErc20 as Record<string, unknown>, null, toPromiseMethod)
|
|
45
|
+
).not.toThrow();
|
|
46
|
+
});
|
|
47
|
+
});
|
package/src/base/Code.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// Copyright 2017-2025 @pezkuwi/api-contract authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { ApiBase } from '@pezkuwi/api/base';
|
|
5
|
+
import type { SubmittableExtrinsic } from '@pezkuwi/api/submittable/types';
|
|
6
|
+
import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
|
|
7
|
+
import type { AccountId, EventRecord } from '@pezkuwi/types/interfaces';
|
|
8
|
+
import type { ISubmittableResult } from '@pezkuwi/types/types';
|
|
9
|
+
import type { Codec } from '@pezkuwi/types-codec/types';
|
|
10
|
+
import type { Abi } from '../Abi/index.js';
|
|
11
|
+
import type { AbiConstructor, BlueprintOptions } from '../types.js';
|
|
12
|
+
import type { MapConstructorExec } from './types.js';
|
|
13
|
+
|
|
14
|
+
import { SubmittableResult } from '@pezkuwi/api';
|
|
15
|
+
import { BN_ZERO, compactAddLength, isRiscV, isUndefined, isWasm, u8aToU8a } from '@pezkuwi/util';
|
|
16
|
+
|
|
17
|
+
import { applyOnEvent } from '../util.js';
|
|
18
|
+
import { Base } from './Base.js';
|
|
19
|
+
import { Blueprint } from './Blueprint.js';
|
|
20
|
+
import { Contract } from './Contract.js';
|
|
21
|
+
import { convertWeight, createBluePrintTx, encodeSalt } from './util.js';
|
|
22
|
+
|
|
23
|
+
export type CodeConstructor<ApiType extends ApiTypes> = new(api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined) => Code<ApiType>;
|
|
24
|
+
|
|
25
|
+
export class CodeSubmittableResult<ApiType extends ApiTypes> extends SubmittableResult {
|
|
26
|
+
readonly blueprint?: Blueprint<ApiType> | undefined;
|
|
27
|
+
readonly contract?: Contract<ApiType> | undefined;
|
|
28
|
+
|
|
29
|
+
constructor (result: ISubmittableResult, blueprint?: Blueprint<ApiType> | undefined, contract?: Contract<ApiType> | undefined) {
|
|
30
|
+
super(result);
|
|
31
|
+
|
|
32
|
+
this.blueprint = blueprint;
|
|
33
|
+
this.contract = contract;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// checks to see if the code (or at least the header)
|
|
38
|
+
// is a valid/supported format
|
|
39
|
+
function isValidCode (code: Uint8Array): boolean {
|
|
40
|
+
return isWasm(code) || isRiscV(code);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class Code<ApiType extends ApiTypes> extends Base<ApiType> {
|
|
44
|
+
readonly code: Uint8Array;
|
|
45
|
+
|
|
46
|
+
readonly #tx: MapConstructorExec<ApiType> = {};
|
|
47
|
+
|
|
48
|
+
constructor (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined, decorateMethod: DecorateMethod<ApiType>) {
|
|
49
|
+
super(api, abi, decorateMethod);
|
|
50
|
+
|
|
51
|
+
this.code = isValidCode(this.abi.info.source.wasm)
|
|
52
|
+
? this.abi.info.source.wasm
|
|
53
|
+
: u8aToU8a(wasm);
|
|
54
|
+
|
|
55
|
+
if (!isValidCode(this.code)) {
|
|
56
|
+
throw new Error('Invalid code provided');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.abi.constructors.forEach((c): void => {
|
|
60
|
+
if (isUndefined(this.#tx[c.method])) {
|
|
61
|
+
this.#tx[c.method] = createBluePrintTx(c, (o, p) => this.#instantiate(c, o, p));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public get tx (): MapConstructorExec<ApiType> {
|
|
67
|
+
return this.#tx;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#instantiate = (constructorOrId: AbiConstructor | string | number, { gasLimit = BN_ZERO, salt, storageDepositLimit = null, value = BN_ZERO }: BlueprintOptions, params: unknown[]): SubmittableExtrinsic<ApiType, CodeSubmittableResult<ApiType>> => {
|
|
71
|
+
const palletTx = this._isRevive ? this.api.tx.revive : this.api.tx.contracts;
|
|
72
|
+
|
|
73
|
+
if (this._isRevive) {
|
|
74
|
+
return palletTx.instantiateWithCode(
|
|
75
|
+
value,
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
77
|
+
// @ts-ignore jiggle v1 weights, metadata points to latest
|
|
78
|
+
this._isWeightV1
|
|
79
|
+
? convertWeight(gasLimit).v1Weight
|
|
80
|
+
: convertWeight(gasLimit).v2Weight,
|
|
81
|
+
storageDepositLimit,
|
|
82
|
+
compactAddLength(this.code),
|
|
83
|
+
this.abi.findConstructor(constructorOrId).toU8a(params),
|
|
84
|
+
encodeSalt(salt)
|
|
85
|
+
).withResultTransform((result: ISubmittableResult) =>
|
|
86
|
+
new CodeSubmittableResult(
|
|
87
|
+
result,
|
|
88
|
+
...(applyOnEvent(result, ['Instantiated'], (records: EventRecord[]) =>
|
|
89
|
+
records.reduce<[Blueprint<ApiType> | undefined, Contract<ApiType> | undefined]>(
|
|
90
|
+
([blueprint, contract], { event }) =>
|
|
91
|
+
this.api.events.revive['Instantiated'].is(event)
|
|
92
|
+
? [
|
|
93
|
+
blueprint,
|
|
94
|
+
new Contract<ApiType>(
|
|
95
|
+
this.api,
|
|
96
|
+
this.abi,
|
|
97
|
+
(event as unknown as { data: [Codec, AccountId] }).data[1],
|
|
98
|
+
this._decorateMethod
|
|
99
|
+
)
|
|
100
|
+
]
|
|
101
|
+
: [blueprint, contract],
|
|
102
|
+
[undefined, undefined]
|
|
103
|
+
), this._isRevive
|
|
104
|
+
) || [undefined, undefined])
|
|
105
|
+
)
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return palletTx.instantiateWithCode(
|
|
110
|
+
value,
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
112
|
+
// @ts-ignore jiggle v1 weights, metadata points to latest
|
|
113
|
+
this._isWeightV1
|
|
114
|
+
? convertWeight(gasLimit).v1Weight
|
|
115
|
+
: convertWeight(gasLimit).v2Weight,
|
|
116
|
+
storageDepositLimit,
|
|
117
|
+
compactAddLength(this.code),
|
|
118
|
+
this.abi.findConstructor(constructorOrId).toU8a(params),
|
|
119
|
+
encodeSalt(salt)
|
|
120
|
+
).withResultTransform((result: ISubmittableResult) =>
|
|
121
|
+
new CodeSubmittableResult(result, ...(applyOnEvent(result, ['CodeStored', 'Instantiated'], (records: EventRecord[]) =>
|
|
122
|
+
records.reduce<[Blueprint<ApiType> | undefined, Contract<ApiType> | undefined]>(([blueprint, contract], { event }) =>
|
|
123
|
+
this.api.events.contracts.Instantiated.is(event)
|
|
124
|
+
? [blueprint, new Contract<ApiType>(this.api, this.abi, (event as unknown as { data: [Codec, AccountId] }).data[1], this._decorateMethod)]
|
|
125
|
+
: this.api.events.contracts.CodeStored.is(event)
|
|
126
|
+
? [new Blueprint<ApiType>(this.api, this.abi, (event as unknown as { data: [AccountId] }).data[0], this._decorateMethod), contract]
|
|
127
|
+
: [blueprint, contract],
|
|
128
|
+
[undefined, undefined]), this._isRevive
|
|
129
|
+
) || [undefined, undefined]))
|
|
130
|
+
);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function extendCode <ApiType extends ApiTypes> (type: ApiType, decorateMethod: DecorateMethod<ApiType>): CodeConstructor<ApiType> {
|
|
135
|
+
return class extends Code<ApiType> {
|
|
136
|
+
static __CodeType = type;
|
|
137
|
+
|
|
138
|
+
constructor (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined) {
|
|
139
|
+
super(api, abi, wasm, decorateMethod);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|