@pezkuwi/api-contract 16.5.5 → 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/Abi/index.d.ts +31 -0
- package/Abi/index.js +359 -0
- package/Abi/toLatestCompatible.d.ts +15 -0
- package/Abi/toLatestCompatible.js +30 -0
- package/Abi/toV1.d.ts +3 -0
- package/Abi/toV1.js +21 -0
- package/Abi/toV2.d.ts +3 -0
- package/Abi/toV2.js +27 -0
- package/Abi/toV3.d.ts +3 -0
- package/Abi/toV3.js +10 -0
- package/Abi/toV4.d.ts +3 -0
- package/Abi/toV4.js +10 -0
- package/LICENSE +201 -0
- package/README.md +1 -1
- package/augment.d.ts +1 -0
- package/augment.js +1 -0
- package/base/Base.d.ts +13 -0
- package/base/Base.js +40 -0
- package/base/Blueprint.d.ts +24 -0
- package/base/Blueprint.js +51 -0
- package/base/Code.d.ts +22 -0
- package/base/Code.js +74 -0
- package/base/Contract.d.ts +25 -0
- package/base/Contract.js +127 -0
- package/base/index.d.ts +3 -0
- package/base/index.js +3 -0
- package/base/mock.d.ts +3 -0
- package/base/mock.js +38 -0
- package/base/types.d.ts +25 -0
- package/base/types.js +1 -0
- package/base/util.d.ts +16 -0
- package/base/util.js +33 -0
- package/build/Abi/index.js +359 -0
- package/build/Abi/toLatestCompatible.js +30 -0
- package/build/Abi/toV1.js +21 -0
- package/build/Abi/toV2.js +27 -0
- package/build/Abi/toV3.js +10 -0
- package/build/Abi/toV4.js +10 -0
- package/build/LICENSE +201 -0
- package/build/README.md +3 -0
- package/build/augment.js +1 -0
- package/build/base/Base.js +40 -0
- package/build/base/Blueprint.js +51 -0
- package/build/base/Code.js +74 -0
- package/build/base/Contract.js +127 -0
- package/build/base/index.js +3 -0
- package/build/base/mock.js +38 -0
- package/build/base/types.js +1 -0
- package/build/base/util.d.ts +1 -1
- package/build/base/util.js +33 -0
- package/build/bundle-pezkuwi-api-contract.js +1238 -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.js +2 -0
- package/build/package.json +408 -0
- package/build/packageDetect.js +5 -0
- package/build/packageInfo.js +1 -0
- package/build/promise/index.js +17 -0
- package/build/promise/types.js +1 -0
- package/build/rx/index.js +17 -0
- package/build/rx/types.js +1 -0
- package/build/types.js +1 -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 +1238 -0
- package/bundle.d.ts +4 -0
- package/bundle.js +4 -0
- package/cjs/Abi/index.d.ts +31 -0
- package/cjs/Abi/index.js +363 -0
- package/cjs/Abi/toLatestCompatible.d.ts +15 -0
- package/cjs/Abi/toLatestCompatible.js +36 -0
- package/cjs/Abi/toV1.d.ts +3 -0
- package/cjs/Abi/toV1.js +24 -0
- package/cjs/Abi/toV2.d.ts +3 -0
- package/cjs/Abi/toV2.js +30 -0
- package/cjs/Abi/toV3.d.ts +3 -0
- package/cjs/Abi/toV3.js +13 -0
- package/cjs/Abi/toV4.d.ts +3 -0
- package/cjs/Abi/toV4.js +13 -0
- package/cjs/augment.d.ts +1 -0
- package/cjs/augment.js +3 -0
- package/cjs/base/Base.d.ts +13 -0
- package/cjs/base/Base.js +44 -0
- package/cjs/base/Blueprint.d.ts +24 -0
- package/cjs/base/Blueprint.js +57 -0
- package/cjs/base/Code.d.ts +22 -0
- package/cjs/base/Code.js +80 -0
- package/cjs/base/Contract.d.ts +25 -0
- package/cjs/base/Contract.js +133 -0
- package/cjs/base/index.d.ts +3 -0
- package/cjs/base/index.js +14 -0
- package/cjs/base/mock.d.ts +3 -0
- package/cjs/base/mock.js +41 -0
- package/cjs/base/types.d.ts +25 -0
- package/cjs/base/types.js +2 -0
- package/cjs/base/util.d.ts +16 -0
- package/cjs/base/util.js +42 -0
- package/cjs/bundle.d.ts +4 -0
- package/cjs/bundle.js +10 -0
- package/cjs/index.d.ts +2 -0
- package/cjs/index.js +5 -0
- package/cjs/package.json +3 -0
- package/cjs/packageDetect.d.ts +1 -0
- package/cjs/packageDetect.js +7 -0
- package/cjs/packageInfo.d.ts +6 -0
- package/cjs/packageInfo.js +4 -0
- package/cjs/promise/index.d.ts +13 -0
- package/cjs/promise/index.js +23 -0
- package/cjs/promise/types.d.ts +3 -0
- package/cjs/promise/types.js +2 -0
- package/cjs/rx/index.d.ts +13 -0
- package/cjs/rx/index.js +23 -0
- package/cjs/rx/types.d.ts +3 -0
- package/cjs/rx/types.js +2 -0
- package/cjs/types.d.ts +79 -0
- package/cjs/types.js +2 -0
- package/cjs/util.d.ts +5 -0
- package/cjs/util.js +13 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/package.json +384 -15
- package/packageDetect.d.ts +1 -0
- package/packageDetect.js +5 -0
- package/packageInfo.d.ts +6 -0
- package/packageInfo.js +1 -0
- package/promise/index.d.ts +13 -0
- package/promise/index.js +17 -0
- package/promise/types.d.ts +3 -0
- package/promise/types.js +1 -0
- package/rx/index.d.ts +13 -0
- package/rx/index.js +17 -0
- package/rx/types.d.ts +3 -0
- package/rx/types.js +1 -0
- package/src/Abi/Abi.spec.ts +2 -2
- package/src/Abi/index.ts +1 -1
- package/src/Abi/toLatestCompatible.spec.ts +1 -1
- package/src/Abi/toLatestCompatible.ts +1 -1
- package/src/Abi/toV1.ts +1 -1
- package/src/Abi/toV2.ts +1 -1
- package/src/Abi/toV3.ts +1 -1
- package/src/Abi/toV4.ts +1 -1
- package/src/augment.ts +1 -1
- package/src/base/Base.ts +1 -1
- package/src/base/Blueprint.ts +1 -1
- package/src/base/Code.spec.ts +1 -1
- package/src/base/Code.ts +1 -1
- package/src/base/Contract.ts +1 -1
- package/src/base/index.ts +1 -1
- package/src/base/mock.ts +1 -1
- package/src/base/types.ts +1 -1
- package/src/base/util.ts +1 -1
- package/src/bundle.ts +1 -1
- package/src/checkTypes.manual.ts +4 -4
- package/src/index.ts +1 -1
- package/src/mod.ts +1 -1
- package/src/packageDetect.ts +2 -2
- package/src/packageInfo.ts +3 -3
- package/src/promise/index.ts +1 -1
- package/src/promise/types.ts +1 -1
- package/src/rx/index.ts +1 -1
- package/src/rx/types.ts +1 -1
- package/src/test/contracts/index.ts +1 -1
- package/src/test/contracts/ink/index.ts +1 -1
- package/src/test/contracts/ink/v0/index.ts +1 -1
- package/src/test/contracts/ink/v1/index.ts +1 -1
- package/src/test/contracts/ink/v2/index.ts +1 -1
- package/src/test/contracts/ink/v3/index.ts +1 -1
- package/src/test/contracts/ink/v4/index.ts +1 -1
- package/src/test/contracts/ink/v5/index.ts +1 -1
- package/src/test/contracts/ink/v6/index.ts +1 -1
- package/src/test/contracts/solang/index.ts +1 -1
- package/src/test/contracts/solang/v0/index.ts +1 -1
- package/src/test/contracts/user/index.ts +1 -1
- package/src/test/contracts/user/v0/index.ts +1 -1
- package/src/test/contracts/user/v3/index.ts +1 -1
- package/src/test/contracts/user/v4/index.ts +1 -1
- package/src/test/contracts/util.ts +1 -1
- package/src/types.ts +1 -1
- package/src/util.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/tsconfig.spec.tsbuildinfo +1 -0
- package/types.d.ts +79 -0
- package/types.js +1 -0
- package/util.d.ts +5 -0
- package/util.js +10 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
|
|
2
|
+
import type { Bytes, Vec } from 'https://deno.land/x/pezkuwi/types/mod.ts';
|
|
3
|
+
import type { ChainProperties, ContractConstructorSpecLatest, ContractEventParamSpecLatest, ContractMessageParamSpecLatest, ContractMessageSpecLatest, ContractMetadata, ContractMetadataV4, ContractMetadataV5, ContractMetadataV6, ContractProjectInfo, ContractTypeSpec, EventRecord } from 'https://deno.land/x/pezkuwi/types/interfaces/index.ts';
|
|
4
|
+
import type { Codec, Registry, TypeDef } from 'https://deno.land/x/pezkuwi/types/types/index.ts';
|
|
5
|
+
import type { AbiConstructor, AbiEvent, AbiEventParam, AbiMessage, AbiMessageParam, AbiParam, DecodedEvent, DecodedMessage } from '../types.ts';
|
|
6
|
+
|
|
7
|
+
import { Option, TypeRegistry } from 'https://deno.land/x/pezkuwi/types/mod.ts';
|
|
8
|
+
import { TypeDefInfo } from 'https://deno.land/x/pezkuwi/types-create/mod.ts';
|
|
9
|
+
import { assertReturn, compactAddLength, compactStripLength, isBn, isNumber, isObject, isString, isUndefined, logger, stringCamelCase, stringify, u8aConcat, u8aToHex } from 'https://deno.land/x/pezkuwi/util/mod.ts';
|
|
10
|
+
|
|
11
|
+
import { convertVersions, enumVersions } from './toLatestCompatible.ts';
|
|
12
|
+
|
|
13
|
+
interface AbiJson {
|
|
14
|
+
version?: string;
|
|
15
|
+
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type EventOf<M> = M extends {spec: { events: Vec<infer E>}} ? E : never
|
|
20
|
+
export type ContractMetadataSupported = ContractMetadataV4 | ContractMetadataV5 | ContractMetadataV6;
|
|
21
|
+
type ContractEventSupported = EventOf<ContractMetadataSupported>;
|
|
22
|
+
|
|
23
|
+
const l = logger('Abi');
|
|
24
|
+
|
|
25
|
+
const PRIMITIVE_ALWAYS = ['AccountId', 'AccountId20', 'AccountIndex', 'Address', 'Balance'];
|
|
26
|
+
|
|
27
|
+
function findMessage <T extends AbiMessage> (list: T[], messageOrId: T | string | number): T {
|
|
28
|
+
const message = isNumber(messageOrId)
|
|
29
|
+
? list[messageOrId]
|
|
30
|
+
: isString(messageOrId)
|
|
31
|
+
? list.find(({ identifier }) => [identifier, stringCamelCase(identifier)].includes(messageOrId.toString()))
|
|
32
|
+
: messageOrId;
|
|
33
|
+
|
|
34
|
+
return assertReturn(message, () => `Attempted to call an invalid contract interface, ${stringify(messageOrId)}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function getMetadata (registry: Registry, json: AbiJson): ContractMetadataSupported {
|
|
38
|
+
// this is for V1, V2, V3
|
|
39
|
+
const vx = enumVersions.find((v) => isObject(json[v]));
|
|
40
|
+
|
|
41
|
+
// this was added in V4
|
|
42
|
+
const jsonVersion = json.version;
|
|
43
|
+
|
|
44
|
+
if (!vx && jsonVersion && !enumVersions.find((v) => v === `V${jsonVersion}`)) {
|
|
45
|
+
throw new Error(`Unable to handle version ${jsonVersion}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const metadata = registry.createType<ContractMetadata>('ContractMetadata',
|
|
49
|
+
vx
|
|
50
|
+
? { [vx]: json[vx] }
|
|
51
|
+
: jsonVersion
|
|
52
|
+
? { [`V${jsonVersion}`]: json }
|
|
53
|
+
: { V0: json }
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const converter = convertVersions.find(([v]) => metadata[`is${v}`]);
|
|
57
|
+
|
|
58
|
+
if (!converter) {
|
|
59
|
+
throw new Error(`Unable to convert ABI with version ${metadata.type} to a supported version`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const upgradedMetadata = converter[1](registry, metadata[`as${converter[0]}`]);
|
|
63
|
+
|
|
64
|
+
return upgradedMetadata;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isRevive (json: Record<string, unknown>): boolean {
|
|
68
|
+
const source = json['source'];
|
|
69
|
+
const version = json['version'];
|
|
70
|
+
|
|
71
|
+
const hasContractBinary =
|
|
72
|
+
typeof source === 'object' &&
|
|
73
|
+
source !== null &&
|
|
74
|
+
'contract_binary' in source;
|
|
75
|
+
|
|
76
|
+
const hasVersion =
|
|
77
|
+
typeof version === 'number' && version >= 6;
|
|
78
|
+
|
|
79
|
+
return hasContractBinary || hasVersion;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function parseJson (json: Record<string, unknown>, chainProperties?: ChainProperties): [Record<string, unknown>, Registry, ContractMetadataSupported, ContractProjectInfo, boolean] {
|
|
83
|
+
const registry = new TypeRegistry();
|
|
84
|
+
|
|
85
|
+
const revive = isRevive(json);
|
|
86
|
+
const typeName = revive ? 'ContractReviveProjectInfo' : 'ContractProjectInfo';
|
|
87
|
+
|
|
88
|
+
const info = registry.createType(typeName, json) as unknown as ContractProjectInfo;
|
|
89
|
+
const metadata = getMetadata(registry, json as unknown as AbiJson);
|
|
90
|
+
const lookup = registry.createType('PortableRegistry', { types: metadata.types }, true);
|
|
91
|
+
|
|
92
|
+
// attach the lookup to the registry - now the types are known
|
|
93
|
+
registry.setLookup(lookup);
|
|
94
|
+
|
|
95
|
+
if (chainProperties) {
|
|
96
|
+
registry.setChainProperties(chainProperties);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// warm-up the actual type, pre-use
|
|
100
|
+
lookup.types.forEach(({ id }) =>
|
|
101
|
+
lookup.getTypeDef(id)
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
return [json, registry, metadata, info, revive];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @internal
|
|
109
|
+
* Determines if the given input value is a ContractTypeSpec
|
|
110
|
+
*/
|
|
111
|
+
function isTypeSpec (value: Codec): value is ContractTypeSpec {
|
|
112
|
+
return !!value && value instanceof Map && !isUndefined((value as ContractTypeSpec).type) && !isUndefined((value as ContractTypeSpec).displayName);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @internal
|
|
117
|
+
* Determines if the given input value is an Option
|
|
118
|
+
*/
|
|
119
|
+
function isOption (value: Codec): value is Option<Codec> {
|
|
120
|
+
return !!value && value instanceof Option;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export class Abi {
|
|
124
|
+
readonly events: AbiEvent[];
|
|
125
|
+
readonly constructors: AbiConstructor[];
|
|
126
|
+
readonly info: ContractProjectInfo;
|
|
127
|
+
readonly json: Record<string, unknown>;
|
|
128
|
+
readonly messages: AbiMessage[];
|
|
129
|
+
readonly metadata: ContractMetadataSupported;
|
|
130
|
+
readonly registry: Registry;
|
|
131
|
+
readonly environment = new Map<string, TypeDef | Codec>();
|
|
132
|
+
readonly isRevive: boolean;
|
|
133
|
+
|
|
134
|
+
constructor (abiJson: Record<string, unknown> | string, chainProperties?: ChainProperties) {
|
|
135
|
+
[this.json, this.registry, this.metadata, this.info, this.isRevive] = parseJson(
|
|
136
|
+
isString(abiJson)
|
|
137
|
+
? JSON.parse(abiJson) as Record<string, unknown>
|
|
138
|
+
: abiJson,
|
|
139
|
+
chainProperties
|
|
140
|
+
);
|
|
141
|
+
this.constructors = this.metadata.spec.constructors.map((spec: ContractConstructorSpecLatest, index) =>
|
|
142
|
+
this.#createMessage(spec, index, {
|
|
143
|
+
isConstructor: true,
|
|
144
|
+
isDefault: spec.default.isTrue,
|
|
145
|
+
isPayable: spec.payable.isTrue,
|
|
146
|
+
returnType: spec.returnType.isSome
|
|
147
|
+
? this.registry.lookup.getTypeDef(spec.returnType.unwrap().type)
|
|
148
|
+
: null
|
|
149
|
+
})
|
|
150
|
+
);
|
|
151
|
+
this.events = this.metadata.spec.events.map((_: ContractEventSupported, index: number) =>
|
|
152
|
+
this.#createEvent(index)
|
|
153
|
+
);
|
|
154
|
+
this.messages = this.metadata.spec.messages.map((spec: ContractMessageSpecLatest, index): AbiMessage =>
|
|
155
|
+
this.#createMessage(spec, index, {
|
|
156
|
+
isDefault: spec.default.isTrue,
|
|
157
|
+
isMutating: spec.mutates.isTrue,
|
|
158
|
+
isPayable: spec.payable.isTrue,
|
|
159
|
+
returnType: spec.returnType.isSome
|
|
160
|
+
? this.registry.lookup.getTypeDef(spec.returnType.unwrap().type)
|
|
161
|
+
: null
|
|
162
|
+
})
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
// NOTE See the rationale for having Option<...> values in the actual
|
|
166
|
+
// ContractEnvironmentV4 structure definition in interfaces/contractsAbi
|
|
167
|
+
// (Due to conversions, the fields may not exist)
|
|
168
|
+
for (const [key, opt] of this.metadata.spec.environment.entries()) {
|
|
169
|
+
if (isOption(opt)) {
|
|
170
|
+
if (opt.isSome) {
|
|
171
|
+
const value = opt.unwrap();
|
|
172
|
+
|
|
173
|
+
if (isBn(value)) {
|
|
174
|
+
this.environment.set(key, value);
|
|
175
|
+
} else if (isTypeSpec(value)) {
|
|
176
|
+
this.environment.set(key, this.registry.lookup.getTypeDef(value.type));
|
|
177
|
+
} else {
|
|
178
|
+
throw new Error(`Invalid environment definition for ${key}:: Expected either Number or ContractTypeSpec`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
throw new Error(`Expected Option<*> definition for ${key} in ContractEnvironment`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Warning: Unstable API, bound to change
|
|
189
|
+
*/
|
|
190
|
+
public decodeEvent (record: EventRecord): DecodedEvent {
|
|
191
|
+
switch (this.metadata.version.toString()) {
|
|
192
|
+
// earlier version are hoisted to v4
|
|
193
|
+
case '4':
|
|
194
|
+
return this.#decodeEventV4(record);
|
|
195
|
+
case '5':
|
|
196
|
+
return this.#decodeEventV5(record);
|
|
197
|
+
// Latest
|
|
198
|
+
default:
|
|
199
|
+
return this.#decodeEventV6(record);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
#decodeEventV6 = (record: EventRecord): DecodedEvent => {
|
|
204
|
+
const topics = record.event.data[2] as unknown as { toHex: () => string }[];
|
|
205
|
+
// Try to match by signature topic (first topic)
|
|
206
|
+
const signatureTopic = topics[0];
|
|
207
|
+
const data = record.event.data[1] as Bytes;
|
|
208
|
+
|
|
209
|
+
if (signatureTopic) {
|
|
210
|
+
const event = this.events.find((e) => e.signatureTopic !== undefined && e.signatureTopic !== null && e.signatureTopic === signatureTopic.toHex());
|
|
211
|
+
|
|
212
|
+
// Early return if event found by signature topic
|
|
213
|
+
if (event) {
|
|
214
|
+
return event.fromU8a(data);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// If no event returned yet, it might be anonymous
|
|
219
|
+
const amountOfTopics = topics.length;
|
|
220
|
+
const potentialEvents = this.events.filter((e) => {
|
|
221
|
+
// event can't have a signature topic
|
|
222
|
+
if (e.signatureTopic !== null && e.signatureTopic !== undefined) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// event should have same amount of indexed fields as emitted topics
|
|
227
|
+
const amountIndexed = e.args.filter((a) => a.indexed).length;
|
|
228
|
+
|
|
229
|
+
if (amountIndexed !== amountOfTopics) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// If all conditions met, it's a potential event
|
|
234
|
+
return true;
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
if (potentialEvents.length === 1) {
|
|
238
|
+
return potentialEvents[0].fromU8a(data);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
throw new Error('Unable to determine event');
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
#decodeEventV5 = (record: EventRecord): DecodedEvent => {
|
|
245
|
+
// Find event by first topic, which potentially is the signature_topic
|
|
246
|
+
const signatureTopic = record.topics[0];
|
|
247
|
+
const data = record.event.data[1] as Bytes;
|
|
248
|
+
|
|
249
|
+
if (signatureTopic) {
|
|
250
|
+
const event = this.events.find((e) => e.signatureTopic !== undefined && e.signatureTopic !== null && e.signatureTopic === signatureTopic.toHex());
|
|
251
|
+
|
|
252
|
+
// Early return if event found by signature topic
|
|
253
|
+
if (event) {
|
|
254
|
+
return event.fromU8a(data);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// If no event returned yet, it might be anonymous
|
|
259
|
+
const amountOfTopics = record.topics.length;
|
|
260
|
+
const potentialEvents = this.events.filter((e) => {
|
|
261
|
+
// event can't have a signature topic
|
|
262
|
+
if (e.signatureTopic !== null && e.signatureTopic !== undefined) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// event should have same amount of indexed fields as emitted topics
|
|
267
|
+
const amountIndexed = e.args.filter((a) => a.indexed).length;
|
|
268
|
+
|
|
269
|
+
if (amountIndexed !== amountOfTopics) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// If all conditions met, it's a potential event
|
|
274
|
+
return true;
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
if (potentialEvents.length === 1) {
|
|
278
|
+
return potentialEvents[0].fromU8a(data);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
throw new Error('Unable to determine event');
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
#decodeEventV4 = (record: EventRecord): DecodedEvent => {
|
|
285
|
+
const data = record.event.data[1] as Bytes;
|
|
286
|
+
const index = data[0];
|
|
287
|
+
const event = this.events[index];
|
|
288
|
+
|
|
289
|
+
if (!event) {
|
|
290
|
+
throw new Error(`Unable to find event with index ${index}`);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return event.fromU8a(data.subarray(1));
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Warning: Unstable API, bound to change
|
|
298
|
+
*/
|
|
299
|
+
public decodeConstructor (data: Uint8Array): DecodedMessage {
|
|
300
|
+
return this.#decodeMessage('message', this.constructors, data);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Warning: Unstable API, bound to change
|
|
305
|
+
*/
|
|
306
|
+
public decodeMessage (data: Uint8Array): DecodedMessage {
|
|
307
|
+
return this.#decodeMessage('message', this.messages, data);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public findConstructor (constructorOrId: AbiConstructor | string | number): AbiConstructor {
|
|
311
|
+
return findMessage(this.constructors, constructorOrId);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
public findMessage (messageOrId: AbiMessage | string | number): AbiMessage {
|
|
315
|
+
return findMessage(this.messages, messageOrId);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
#createArgs = (args: ContractMessageParamSpecLatest[] | ContractEventParamSpecLatest[], spec: unknown): AbiParam[] => {
|
|
319
|
+
return args.map(({ label, type }, index): AbiParam => {
|
|
320
|
+
try {
|
|
321
|
+
if (!isObject(type)) {
|
|
322
|
+
throw new Error('Invalid type definition found');
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const displayName = type.displayName.length
|
|
326
|
+
? type.displayName[type.displayName.length - 1].toString()
|
|
327
|
+
: undefined;
|
|
328
|
+
const camelName = stringCamelCase(label);
|
|
329
|
+
|
|
330
|
+
if (displayName && PRIMITIVE_ALWAYS.includes(displayName)) {
|
|
331
|
+
return {
|
|
332
|
+
name: camelName,
|
|
333
|
+
type: {
|
|
334
|
+
info: TypeDefInfo.Plain,
|
|
335
|
+
type: displayName
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const typeDef = this.registry.lookup.getTypeDef(type.type);
|
|
341
|
+
|
|
342
|
+
return {
|
|
343
|
+
name: camelName,
|
|
344
|
+
type: displayName && !typeDef.type.startsWith(displayName)
|
|
345
|
+
? { displayName, ...typeDef }
|
|
346
|
+
: typeDef
|
|
347
|
+
};
|
|
348
|
+
} catch (error) {
|
|
349
|
+
l.error(`Error expanding argument ${index} in ${stringify(spec)}`);
|
|
350
|
+
|
|
351
|
+
throw error;
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
#createMessageParams = (args: ContractMessageParamSpecLatest[], spec: unknown): AbiMessageParam[] => {
|
|
357
|
+
return this.#createArgs(args, spec);
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
#createEventParams = (args: ContractEventParamSpecLatest[], spec: unknown): AbiEventParam[] => {
|
|
361
|
+
const params = this.#createArgs(args, spec);
|
|
362
|
+
|
|
363
|
+
return params.map((p, index): AbiEventParam => ({ ...p, indexed: args[index].indexed.toPrimitive() }));
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
#createEvent = (index: number): AbiEvent => {
|
|
367
|
+
// TODO TypeScript would narrow this type to the correct version,
|
|
368
|
+
// but version is `Text` so I need to call `toString()` here,
|
|
369
|
+
// which breaks the type inference.
|
|
370
|
+
switch (this.metadata.version.toString()) {
|
|
371
|
+
case '4':
|
|
372
|
+
return this.#createEventV4((this.metadata as ContractMetadataV4).spec.events[index], index);
|
|
373
|
+
default:
|
|
374
|
+
return this.#createEventV5((this.metadata as ContractMetadataV5).spec.events[index], index);
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
#createEventV5 = (spec: EventOf<ContractMetadataV5>, index: number): AbiEvent => {
|
|
379
|
+
const args = this.#createEventParams(spec.args, spec);
|
|
380
|
+
const event = {
|
|
381
|
+
args,
|
|
382
|
+
docs: spec.docs.map((d) => d.toString()),
|
|
383
|
+
fromU8a: (data: Uint8Array): DecodedEvent => ({
|
|
384
|
+
args: this.#decodeArgs(args, data),
|
|
385
|
+
event
|
|
386
|
+
}),
|
|
387
|
+
identifier: [spec.module_path, spec.label].join('::'),
|
|
388
|
+
index,
|
|
389
|
+
signatureTopic: spec.signature_topic.isSome ? spec.signature_topic.unwrap().toHex() : null
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
return event;
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
#createEventV4 = (spec: EventOf<ContractMetadataV4>, index: number): AbiEvent => {
|
|
396
|
+
const args = this.#createEventParams(spec.args, spec);
|
|
397
|
+
const event = {
|
|
398
|
+
args,
|
|
399
|
+
docs: spec.docs.map((d) => d.toString()),
|
|
400
|
+
fromU8a: (data: Uint8Array): DecodedEvent => ({
|
|
401
|
+
args: this.#decodeArgs(args, data),
|
|
402
|
+
event
|
|
403
|
+
}),
|
|
404
|
+
identifier: spec.label.toString(),
|
|
405
|
+
index
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
return event;
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
#createMessage = (spec: ContractMessageSpecLatest | ContractConstructorSpecLatest, index: number, add: Partial<AbiMessage> = {}): AbiMessage => {
|
|
412
|
+
const args = this.#createMessageParams(spec.args, spec);
|
|
413
|
+
const identifier = spec.label.toString();
|
|
414
|
+
const message = {
|
|
415
|
+
...add,
|
|
416
|
+
args,
|
|
417
|
+
docs: spec.docs.map((d) => d.toString()),
|
|
418
|
+
fromU8a: (data: Uint8Array): DecodedMessage => ({
|
|
419
|
+
args: this.#decodeArgs(args, data),
|
|
420
|
+
message
|
|
421
|
+
}),
|
|
422
|
+
identifier,
|
|
423
|
+
index,
|
|
424
|
+
isDefault: spec.default.isTrue,
|
|
425
|
+
method: stringCamelCase(identifier),
|
|
426
|
+
path: identifier.split('::').map((s) => stringCamelCase(s)),
|
|
427
|
+
selector: spec.selector,
|
|
428
|
+
toU8a: (params: unknown[]) =>
|
|
429
|
+
this.#encodeMessageArgs(spec, args, params)
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
return message;
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
#decodeArgs = (args: AbiParam[], data: Uint8Array): Codec[] => {
|
|
436
|
+
// for decoding we expect the input to be just the arg data, no selectors
|
|
437
|
+
// no length added (this allows use with events as well)
|
|
438
|
+
let offset = 0;
|
|
439
|
+
|
|
440
|
+
return args.map(({ type: { lookupName, type } }): Codec => {
|
|
441
|
+
const value = this.registry.createType(lookupName || type, data.subarray(offset));
|
|
442
|
+
|
|
443
|
+
offset += value.encodedLength;
|
|
444
|
+
|
|
445
|
+
return value;
|
|
446
|
+
});
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
#decodeMessage = (type: 'constructor' | 'message', list: AbiMessage[], data: Uint8Array): DecodedMessage => {
|
|
450
|
+
const [, trimmed] = compactStripLength(data);
|
|
451
|
+
const selector = trimmed.subarray(0, 4);
|
|
452
|
+
const message = list.find((m) => m.selector.eq(selector));
|
|
453
|
+
|
|
454
|
+
if (!message) {
|
|
455
|
+
throw new Error(`Unable to find ${type} with selector ${u8aToHex(selector)}`);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return message.fromU8a(trimmed.subarray(4));
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
#encodeMessageArgs = ({ label, selector }: ContractMessageSpecLatest | ContractConstructorSpecLatest, args: AbiMessageParam[], data: unknown[]): Uint8Array => {
|
|
462
|
+
if (data.length !== args.length) {
|
|
463
|
+
throw new Error(`Expected ${args.length} arguments to contract message '${label.toString()}', found ${data.length}`);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return compactAddLength(
|
|
467
|
+
u8aConcat(
|
|
468
|
+
this.registry.createType('ContractSelector', selector).toU8a(),
|
|
469
|
+
...args.map(({ type: { lookupName, type } }, index) =>
|
|
470
|
+
this.registry.createType(lookupName || type, data[index]).toU8a()
|
|
471
|
+
)
|
|
472
|
+
)
|
|
473
|
+
);
|
|
474
|
+
};
|
|
475
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
|
|
2
|
+
import type { ContractMetadataV4, ContractMetadataV5, ContractMetadataV6 } from 'https://deno.land/x/pezkuwi/types/interfaces/index.ts';
|
|
3
|
+
import type { Registry } from 'https://deno.land/x/pezkuwi/types/types/index.ts';
|
|
4
|
+
import type { ContractMetadataSupported } from './index.ts';
|
|
5
|
+
|
|
6
|
+
import { v0ToV1 } from './toV1.ts';
|
|
7
|
+
import { v1ToV2 } from './toV2.ts';
|
|
8
|
+
import { v2ToV3 } from './toV3.ts';
|
|
9
|
+
import { v3ToV4 } from './toV4.ts';
|
|
10
|
+
|
|
11
|
+
export const enumVersions = ['V6', 'V5', 'V4', 'V3', 'V2', 'V1'] as const;
|
|
12
|
+
|
|
13
|
+
type Versions = typeof enumVersions[number] | 'V0';
|
|
14
|
+
|
|
15
|
+
type Converter = (registry: Registry, vx: any) => ContractMetadataSupported;
|
|
16
|
+
|
|
17
|
+
function createConverter <I, O> (next: (registry: Registry, input: O) => ContractMetadataSupported, step: (registry: Registry, input: I) => O): (registry: Registry, input: I) => ContractMetadataSupported {
|
|
18
|
+
return (registry: Registry, input: I): ContractMetadataSupported =>
|
|
19
|
+
next(registry, step(registry, input));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function v6ToLatestCompatible (_registry: Registry, v6: ContractMetadataV6): ContractMetadataV6 {
|
|
23
|
+
return v6;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function v5ToLatestCompatible (_registry: Registry, v5: ContractMetadataV5): ContractMetadataV5 {
|
|
27
|
+
return v5;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function v4ToLatestCompatible (_registry: Registry, v4: ContractMetadataV4): ContractMetadataV4 {
|
|
31
|
+
return v4;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const v3ToLatestCompatible = /*#__PURE__*/ createConverter(v4ToLatestCompatible, v3ToV4);
|
|
35
|
+
export const v2ToLatestCompatible = /*#__PURE__*/ createConverter(v3ToLatestCompatible, v2ToV3);
|
|
36
|
+
export const v1ToLatestCompatible = /*#__PURE__*/ createConverter(v2ToLatestCompatible, v1ToV2);
|
|
37
|
+
export const v0ToLatestCompatible = /*#__PURE__*/ createConverter(v1ToLatestCompatible, v0ToV1);
|
|
38
|
+
|
|
39
|
+
export const convertVersions: [Versions, Converter][] = [
|
|
40
|
+
['V6', v6ToLatestCompatible],
|
|
41
|
+
['V5', v5ToLatestCompatible],
|
|
42
|
+
['V4', v4ToLatestCompatible],
|
|
43
|
+
['V3', v3ToLatestCompatible],
|
|
44
|
+
['V2', v2ToLatestCompatible],
|
|
45
|
+
['V1', v1ToLatestCompatible],
|
|
46
|
+
['V0', v0ToLatestCompatible]
|
|
47
|
+
];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
import type { ContractMetadataV0, ContractMetadataV1 } from 'https://deno.land/x/pezkuwi/types/interfaces/index.ts';
|
|
3
|
+
import type { Registry } from 'https://deno.land/x/pezkuwi/types/types/index.ts';
|
|
4
|
+
|
|
5
|
+
import { convertSiV0toV1 } from 'https://deno.land/x/pezkuwi/types/mod.ts';
|
|
6
|
+
import { objectSpread } from 'https://deno.land/x/pezkuwi/util/mod.ts';
|
|
7
|
+
|
|
8
|
+
interface Named {
|
|
9
|
+
name: unknown;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function v0ToV1Names (all: Named[]): unknown[] {
|
|
13
|
+
return all.map((e) =>
|
|
14
|
+
objectSpread({}, e, {
|
|
15
|
+
name: Array.isArray(e.name)
|
|
16
|
+
? e.name
|
|
17
|
+
: [e.name]
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function v0ToV1 (registry: Registry, v0: ContractMetadataV0): ContractMetadataV1 {
|
|
22
|
+
if (!v0.metadataVersion.length) {
|
|
23
|
+
throw new Error('Invalid format for V0 (detected) contract metadata');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return registry.createType('ContractMetadataV1', objectSpread({}, v0, {
|
|
27
|
+
spec: objectSpread({}, v0.spec, {
|
|
28
|
+
constructors: v0ToV1Names(v0.spec.constructors),
|
|
29
|
+
messages: v0ToV1Names(v0.spec.messages)
|
|
30
|
+
}),
|
|
31
|
+
types: convertSiV0toV1(registry, v0.types)
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
|
|
2
|
+
import type { Text } from 'https://deno.land/x/pezkuwi/types/mod.ts';
|
|
3
|
+
import type { ContractConstructorSpecV0, ContractEventSpecV0, ContractMessageSpecV0, ContractMetadataV1, ContractMetadataV2 } from 'https://deno.land/x/pezkuwi/types/interfaces/index.ts';
|
|
4
|
+
import type { Registry } from 'https://deno.land/x/pezkuwi/types/types/index.ts';
|
|
5
|
+
|
|
6
|
+
import { objectSpread } from 'https://deno.land/x/pezkuwi/util/mod.ts';
|
|
7
|
+
|
|
8
|
+
type WithArgs = keyof typeof ARG_TYPES;
|
|
9
|
+
|
|
10
|
+
interface NamedEntry {
|
|
11
|
+
name: Text | Text[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type GetArgsType<T extends WithArgs> = T extends 'ContractConstructorSpec'
|
|
15
|
+
? ContractConstructorSpecV0
|
|
16
|
+
: T extends ContractEventSpecV0
|
|
17
|
+
? ContractEventSpecV0
|
|
18
|
+
: ContractMessageSpecV0;
|
|
19
|
+
|
|
20
|
+
interface ArgsEntry <T extends WithArgs> extends NamedEntry {
|
|
21
|
+
args: GetArgsType<T>['args'][0][];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const ARG_TYPES = {
|
|
25
|
+
ContractConstructorSpec: 'ContractMessageParamSpecV2',
|
|
26
|
+
ContractEventSpec: 'ContractEventParamSpecV2',
|
|
27
|
+
ContractMessageSpec: 'ContractMessageParamSpecV2'
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
30
|
+
function v1ToV2Label (entry: NamedEntry): { label: Text } {
|
|
31
|
+
return objectSpread({}, entry, {
|
|
32
|
+
label: Array.isArray(entry.name)
|
|
33
|
+
? entry.name.join('::')
|
|
34
|
+
: entry.name
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function v1ToV2Labels <T extends WithArgs> (registry: Registry, outType: T, all: ArgsEntry<T>[]): unknown[] {
|
|
39
|
+
return all.map((e) =>
|
|
40
|
+
registry.createType(`${outType}V2`, objectSpread(v1ToV2Label(e), {
|
|
41
|
+
args: e.args.map((a) =>
|
|
42
|
+
registry.createType(ARG_TYPES[outType], v1ToV2Label(a))
|
|
43
|
+
)
|
|
44
|
+
}))
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function v1ToV2 (registry: Registry, v1: ContractMetadataV1): ContractMetadataV2 {
|
|
49
|
+
return registry.createType('ContractMetadataV2', objectSpread({}, v1, {
|
|
50
|
+
spec: objectSpread({}, v1.spec, {
|
|
51
|
+
constructors: v1ToV2Labels(registry, 'ContractConstructorSpec', v1.spec.constructors),
|
|
52
|
+
events: v1ToV2Labels(registry, 'ContractEventSpec', v1.spec.events),
|
|
53
|
+
messages: v1ToV2Labels(registry, 'ContractMessageSpec', v1.spec.messages)
|
|
54
|
+
})
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
import type { ContractMetadataV2, ContractMetadataV3 } from 'https://deno.land/x/pezkuwi/types/interfaces/index.ts';
|
|
3
|
+
import type { Registry } from 'https://deno.land/x/pezkuwi/types/types/index.ts';
|
|
4
|
+
|
|
5
|
+
import { objectSpread } from 'https://deno.land/x/pezkuwi/util/mod.ts';
|
|
6
|
+
|
|
7
|
+
export function v2ToV3 (registry: Registry, v2: ContractMetadataV2): ContractMetadataV3 {
|
|
8
|
+
return registry.createType('ContractMetadataV3', objectSpread({}, v2, {
|
|
9
|
+
spec: objectSpread({}, v2.spec, {
|
|
10
|
+
constructors: v2.spec.constructors.map((c) =>
|
|
11
|
+
// V3 introduces the payable flag on constructors, for <V3, it is always true
|
|
12
|
+
registry.createType('ContractConstructorSpecV3', objectSpread({}, c, { payable: true }))
|
|
13
|
+
)
|
|
14
|
+
})
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
import type { ContractMetadataV3, ContractMetadataV4 } from 'https://deno.land/x/pezkuwi/types/interfaces/index.ts';
|
|
3
|
+
import type { Registry } from 'https://deno.land/x/pezkuwi/types/types/index.ts';
|
|
4
|
+
|
|
5
|
+
import { objectSpread } from 'https://deno.land/x/pezkuwi/util/mod.ts';
|
|
6
|
+
|
|
7
|
+
export function v3ToV4 (registry: Registry, v3: ContractMetadataV3): ContractMetadataV4 {
|
|
8
|
+
return registry.createType('ContractMetadataV4', objectSpread({}, v3, {
|
|
9
|
+
spec: objectSpread({}, v3.spec, {
|
|
10
|
+
constructors: v3.spec.constructors.map((c) =>
|
|
11
|
+
registry.createType('ContractConstructorSpecV4', objectSpread({}, c))
|
|
12
|
+
),
|
|
13
|
+
messages: v3.spec.messages.map((m) =>
|
|
14
|
+
registry.createType('ContractMessageSpecV3', objectSpread({}, m))
|
|
15
|
+
)
|
|
16
|
+
}),
|
|
17
|
+
version: registry.createType('Text', '4')
|
|
18
|
+
}));
|
|
19
|
+
}
|