diff --git a/packages/api-contract/src/Abi/Abi.spec.ts b/packages/api-contract/src/Abi/Abi.spec.ts index 514c37b41e..d9a9d0840a 100644 --- a/packages/api-contract/src/Abi/Abi.spec.ts +++ b/packages/api-contract/src/Abi/Abi.spec.ts @@ -32,6 +32,9 @@ interface JSONAbi { }, V2: { spec: SpecDef; + }, + V3: { + spec: SpecDef; } } @@ -56,7 +59,7 @@ describe('Abi', (): void => { it(`initializes from a contract ABI (${abiName})`, (): void => { try { - const messageIds = (abi.V2 || abi.V1 || abi).spec.messages.map(({ label, name }) => + const messageIds = (abi.V3 || abi.V2 || abi.V1 || abi).spec.messages.map(({ label, name }) => label || ( Array.isArray(name) ? name[0] diff --git a/packages/api-contract/src/Abi/toLatest.spec.ts b/packages/api-contract/src/Abi/toLatest.spec.ts index 8be2005ba7..ddde59c1b8 100644 --- a/packages/api-contract/src/Abi/toLatest.spec.ts +++ b/packages/api-contract/src/Abi/toLatest.spec.ts @@ -1,7 +1,7 @@ // Copyright 2017-2022 @polkadot/api-contract authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { v0ToLatest, v1ToLatest, v2ToLatest } from '@polkadot/api-contract/Abi/toLatest'; +import { v0ToLatest, v1ToLatest, v2ToLatest, v3ToLatest } from '@polkadot/api-contract/Abi/toLatest'; import { TypeRegistry } from '@polkadot/types'; import abis from '../test/contracts'; @@ -83,3 +83,18 @@ describe('v2ToLatest', (): void => { ).toEqual(true); }); }); + +describe('v3ToLatest', (): void => { + const registry = new TypeRegistry(); + const contract = registry.createType('ContractMetadata', { V3: abis.ink_v3_flipper.V3 }); + const latest = v3ToLatest(registry, contract.asV3); + + it('has the correct constructor flags', (): void => { + expect( + latest.spec.constructors[0].payable.isTrue + ).toEqual(false); + expect( + latest.spec.constructors[1].payable.isTrue + ).toEqual(true); + }); +}); diff --git a/packages/api-contract/src/test/compare/ink_v3_flipper.test.json b/packages/api-contract/src/test/compare/ink_v3_flipper.test.json new file mode 100644 index 0000000000..e7e9211fa2 --- /dev/null +++ b/packages/api-contract/src/test/compare/ink_v3_flipper.test.json @@ -0,0 +1,9 @@ +[ + { + "info": "Plain", + "lookupIndex": 0, + "type": "bool", + "docs": [], + "namespace": "" + } +] \ No newline at end of file diff --git a/packages/api-contract/src/test/contracts/ink/index.ts b/packages/api-contract/src/test/contracts/ink/index.ts index c258083a69..2b3b947232 100644 --- a/packages/api-contract/src/test/contracts/ink/index.ts +++ b/packages/api-contract/src/test/contracts/ink/index.ts @@ -5,5 +5,6 @@ import { createVersionedExport } from '../util'; import * as v0 from './v0'; import * as v1 from './v1'; import * as v2 from './v2'; +import * as v3 from './v3'; -export default createVersionedExport({ v0, v1, v2 }); +export default createVersionedExport({ v0, v1, v2, v3 }); diff --git a/packages/api-contract/src/test/contracts/ink/v3/flipper.contract.json b/packages/api-contract/src/test/contracts/ink/v3/flipper.contract.json new file mode 100644 index 0000000000..ac88e6253d --- /dev/null +++ b/packages/api-contract/src/test/contracts/ink/v3/flipper.contract.json @@ -0,0 +1,105 @@ +{ + "source": { + "hash": "0xbb381c2fc980121b17c7b2bf2756d5964a12151cb846e0a9eff9cc337806456d", + "language": "ink! 3.0.0-rc7", + "compiler": "rustc 1.60.0-nightly", + "wasm": "0x0061736d0100000001280860027f7f0060000060037f7f7f0060017f006000017f60017f017f60037f7f7f017f60017f017e02880106057365616c30107365616c5f7365745f73746f726167650002057365616c30107365616c5f6765745f73746f726167650006057365616c300a7365616c5f696e7075740000057365616c300b7365616c5f72657475726e0002057365616c30167365616c5f76616c75655f7472616e73666572726564000003656e76066d656d6f727902010210030a090400050103070001000608017f01418080040b071102066465706c6f7900080463616c6c000c0ac40b096102027f027e230041206b22002400200041106a22014200370300200042003703082000411036021c200041086a2000411c6a1004200028021c41114f0440000b2001290300210220002903082103200041206a2400410541042002200384501b0bc20101027f230041306b220224004101210302402000027f20014101714504404104100541ff01714105470d011a0b200241106a4200370300200241186a4200370300200241206a42003703002002420037030820024201370300200241808001360228200241086a41808004200241286a100120022802282201418180014f720d012002200136022c200241808004360228200241286a100741ff017122014102460d014100210320014100470b3a0001200020033a0000200241306a24000f0b000b4201027f230041106b22012400200141086a2000100d20012d0009210020012d00082102200141106a240041024101410220004101461b410020001b20024101711b0bd30202057f027e230041306b2200240020004180800136020c200041808004360208200041086a1009200020002903083703100240200041106a100a22054201832206a70d00200542807e8342002006501b22064280feffffff1f832205422088a721012005421888a721022005421088a7210302402006a741087641ff0171220441ed014704402004419b0147200341ff017141ae014772200241ff0171419d0147200141de004772720d02200041106a100741ff017122014102460d02100541ff01714105470d02200041286a4200370300200041206a4200370300200041186a4200370300200042003703102001410171200041106a100b0c010b200341ff017141cb0047200241ff0171419d0147722001411b47720d01200041286a4200370300200041206a4200370300200041186a4200370300200042003703104100200041106a100b0b200041306a24000f0b000b4101027f230041106b2201240020012000280204220236020c20002802002001410c6a10022002200128020c2202490440000b20002002360204200141106a24000b850102027f017e230041106b220124002001420437030841042102027f02400240034020012000100d20012d00004101710d01200141086a20026a20012d00013a0000200241016a22024108470d000b20012903082203a741044f0d01000b4101210241000c010b410021022003422088a70b2100200141106a24002002ad2000ad420886840b6b01017f230041306b220224004180800420003a0000200241286a200141186a290000370300200241206a200141106a290000370300200241186a200141086a2900003703002002420137030820022001290000370310200241106a4180800441011000200241306a24000b910302057f027e230041406a22002400024002400240100541ff01714105470d0020004180800136021c200041808004360218200041186a100920002000290318370320027f0240200041206a100a22054201832206a70d00200542807e8342002006501b22064280feffffff1f832205422088a721022005421888a721012005421088a721032006a741087641ff01712204412f470440200441e30047200341ff0171413a4772200141ff017141a50147200241d1004772720d014101210141000c020b200341ff017141860147200141ff017141db0047720d00410021014100200241d901460d011a0b4101210141010b0d00024020010440200041086a418002100620002d0009210120002d00084101710d01200041386a4200370300200041306a4200370300200041286a4200370300200042003703202001417f73410171200041206a100b0c040b200041106a4100100620002d0011210120002d0010410171450d020b20014105460d020b000b4180800420014101713a000041004180800441011003000b200041406b24000b3c01017f200020012802042202047f2001200241016b36020420012001280200220141016a36020020012d00000520010b3a000120002002453a00000b" + }, + "contract": { + "name": "flipper", + "version": "3.0.0-rc7", + "authors": [ + "Parity Technologies " + ] + }, + "V3": { + "spec": { + "constructors": [ + { + "args": [ + { + "label": "init_value", + "type": { + "displayName": [ + "bool" + ], + "type": 0 + } + } + ], + "docs": [ + "Creates a new flipper smart contract initialized with the given value." + ], + "label": "new", + "payable": false, + "selector": "0x9bae9d5e" + }, + { + "args": [], + "docs": [ + "Creates a new flipper smart contract initialized to `false`." + ], + "label": "default", + "payable": true, + "selector": "0xed4b9d1b" + } + ], + "docs": [], + "events": [], + "messages": [ + { + "args": [], + "docs": [ + " Flips the current value of the Flipper's boolean." + ], + "label": "flip", + "mutates": true, + "payable": false, + "returnType": null, + "selector": "0x633aa551" + }, + { + "args": [], + "docs": [ + " Returns the current value of the Flipper's boolean." + ], + "label": "get", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "bool" + ], + "type": 0 + }, + "selector": "0x2f865bd9" + } + ] + }, + "storage": { + "struct": { + "fields": [ + { + "layout": { + "cell": { + "key": "0x0000000000000000000000000000000000000000000000000000000000000000", + "ty": 0 + } + }, + "name": "value" + } + ] + } + }, + "types": [ + { + "id": 0, + "type": { + "def": { + "primitive": "bool" + } + } + } + ] + } +} diff --git a/packages/api-contract/src/test/contracts/ink/v3/index.ts b/packages/api-contract/src/test/contracts/ink/v3/index.ts new file mode 100644 index 0000000000..0ae845f277 --- /dev/null +++ b/packages/api-contract/src/test/contracts/ink/v3/index.ts @@ -0,0 +1,4 @@ +// Copyright 2017-2022 @polkadot/api-contract authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export { default as flipper } from './flipper.contract.json';