From 7692c7c749c7291fa20ebc9f5d6f592ac14570db Mon Sep 17 00:00:00 2001 From: AlexD10S Date: Wed, 17 Sep 2025 17:27:49 +0200 Subject: [PATCH 1/6] fix: remove 0 placeholder --- src/ui/components/form/InputBn.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/components/form/InputBn.tsx b/src/ui/components/form/InputBn.tsx index acf44624..48451e93 100644 --- a/src/ui/components/form/InputBn.tsx +++ b/src/ui/components/form/InputBn.tsx @@ -36,7 +36,7 @@ function getMinMax(type: string): [bigint, bigint] { } export function InputBn({ onChange, typeDef: { type } }: Props): React.ReactElement { - const [displayValue, setDisplayValue] = useState('0'); + const [displayValue, setDisplayValue] = useState(''); const [min, max] = getMinMax(type); const handleChange = useCallback( From 94a8369355f5610e6b0dd29e479ce7907ebee658 Mon Sep 17 00:00:00 2001 From: AlexD10S Date: Wed, 17 Sep 2025 17:49:55 +0200 Subject: [PATCH 2/6] fix: display address as H160 for inkv6 --- src/ui/components/account/Select.tsx | 12 +++++++++--- src/ui/util/dropdown.tsx | 9 +++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/ui/components/account/Select.tsx b/src/ui/components/account/Select.tsx index ad42dde0..0b8362f8 100644 --- a/src/ui/components/account/Select.tsx +++ b/src/ui/components/account/Select.tsx @@ -7,7 +7,7 @@ import { Dropdown } from '../common/Dropdown'; import { Account } from './Account'; import { createAccountOptions } from 'ui/util/dropdown'; import type { DropdownOption, DropdownProps, ValidFormField } from 'types'; -import { useApi, useDatabase } from 'ui/contexts'; +import { useApi, useDatabase, useVersion } from 'ui/contexts'; import { classes } from 'lib/util'; import { useDbQuery } from 'ui/hooks'; @@ -43,15 +43,21 @@ function Select({ export function AccountSelect({ placeholder = 'Select account', ...props }: Props) { const { accounts } = useApi(); + const { version } = useVersion(); return ( - ); } export function AddressSelect({ placeholder = 'Select account', onChange, ...props }: Props) { const { accounts } = useApi(); const { db } = useDatabase(); + const { version } = useVersion(); const [contracts] = useDbQuery(() => db.contracts.toArray(), [db]); const [recent, setRecent] = useState[]>([]); @@ -63,7 +69,7 @@ export function AddressSelect({ placeholder = 'Select account', onChange, ...pro }, { label: 'My Accounts', - options: createAccountOptions(accounts || []), + options: createAccountOptions(accounts || [], version), }, { label: 'Uploaded Contracts', diff --git a/src/ui/util/dropdown.tsx b/src/ui/util/dropdown.tsx index 9da06f3a..87c899cd 100644 --- a/src/ui/util/dropdown.tsx +++ b/src/ui/util/dropdown.tsx @@ -1,6 +1,7 @@ // Copyright 2022-2024 use-ink/contracts-ui authors & contributors // SPDX-License-Identifier: GPL-3.0-only +import { InkVersion } from 'ui/contexts'; import { MessageSignature } from '../components/message/MessageSignature'; import { AbiConstructor, @@ -10,6 +11,7 @@ import { Registry, Account, } from 'types'; +import { toEthAddress } from 'lib/address'; export function createConstructorOptions( registry: Registry, @@ -31,10 +33,13 @@ export function createMessageOptions( })); } -export function createAccountOptions(data: Account[]): DropdownOption[] { +export function createAccountOptions( + data: Account[], + version: InkVersion, +): DropdownOption[] { return data.map(pair => ({ label: pair.meta?.name as string, - value: pair.address || '', + value: (version === 'v6' ? toEthAddress(pair.address) : pair.address) || '', })); } From 2375049da0fe6350205e701895cb05c11af52ab9 Mon Sep 17 00:00:00 2001 From: AlexD10S Date: Thu, 18 Sep 2025 13:16:28 +0200 Subject: [PATCH 3/6] chore: improve code and replace test --- cypress/e2e/contracts/erc20.spec.ts | 43 ++++-------------------- src/lib/callOptions.ts | 4 +++ src/ui/components/account/Select.tsx | 9 ++--- src/ui/components/form/findComponent.tsx | 1 + src/ui/util/dropdown.tsx | 15 ++++++--- 5 files changed, 24 insertions(+), 48 deletions(-) diff --git a/cypress/e2e/contracts/erc20.spec.ts b/cypress/e2e/contracts/erc20.spec.ts index 5426a3f2..bd40a790 100644 --- a/cypress/e2e/contracts/erc20.spec.ts +++ b/cypress/e2e/contracts/erc20.spec.ts @@ -23,7 +23,6 @@ describe('ERC20 Contract ', () => { }); it('contract file uploads', () => { - // TODO: In the contract, replaced Address with H160. Fix https://github.com/use-ink/contracts-ui/issues/582 assertUpload('erc20.contract'); }); @@ -54,54 +53,30 @@ describe('ERC20 Contract ', () => { it(`transfers ${transferValue} Units to another account`, () => { selectMessage('transfer', 3); - cy.get('.form-field.to') - .find("input[type='text']") - .clear() - .type('0x60afa252b554aabc4b3253ca2be60dc1d536ec10') - .should('have.value', '0x60afa252b554aabc4b3253ca2be60dc1d536ec10'); + cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(3).click(); cy.get('.form-field.value').find('input[type="number"]').type(`${transferValue}`); assertCall(); selectMessage('balanceOf', 1); - cy.get('.form-field.owner') - .find("input[type='text']") - .clear() - .type('0x9621dde636de098b43efb0fa9b61facfe328f99d') - .should('have.value', '0x9621dde636de098b43efb0fa9b61facfe328f99d'); + cy.get('.form-field.owner').find('.dropdown').click().find('.dropdown__option').eq(3).click(); + assertReturnValue('balanceOf', `${initialSupply - transferValue}`); }); it(`successfully approves allowance`, () => { selectMessage('approve', 4); - cy.get('.form-field.spender') - .find("input[type='text']") - .clear() - .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); + cy.get('.form-field.spender').find('.dropdown').click().find('.dropdown__option').eq(2).click(); cy.get('.form-field.value').find('input[type="number"]').type(`${allowance}`); assertCall(); selectMessage('allowance', 2); - cy.get('.form-field.owner') - .find("input[type='text']") - .clear() - .type('0x9621dde636de098b43efb0fa9b61facfe328f99d') - .should('have.value', '0x9621dde636de098b43efb0fa9b61facfe328f99d'); - cy.get('.form-field.spender') - .find("input[type='text']") - .clear() - .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); + cy.get('.form-field.spender').find('.dropdown').click().find('.dropdown__option').eq(2).click(); assertReturnValue('allowance', `${allowance}`); }); it(`transfers ${transferValue} on behalf of alice`, () => { cy.get('.form-field.caller').click().find('.dropdown__option').eq(2).click(); selectMessage('transferFrom', 5); - cy.get('.form-field.from') - .find("input[type='text']") - .clear() - .type('0x9621dde636de098b43efb0fa9b61facfe328f99d') - .should('have.value', '0x9621dde636de098b43efb0fa9b61facfe328f99d'); + cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(2).click(); cy.get('.form-field.to') .find("input[type='text']") .clear() @@ -110,11 +85,7 @@ describe('ERC20 Contract ', () => { cy.get('.form-field.value').find('input[type="number"]').type(`${transferValue}`); assertCall(); selectMessage('balanceOf', 1); - cy.get('.form-field.owner') - .find("input[type='text']") - .clear() - .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); + cy.get('.form-field.owner').find('.dropdown').click().find('.dropdown__option').eq(2).click(); assertReturnValue('balanceOf', `${transferValue}`); }); }); diff --git a/src/lib/callOptions.ts b/src/lib/callOptions.ts index 269efbbe..c88673fe 100644 --- a/src/lib/callOptions.ts +++ b/src/lib/callOptions.ts @@ -66,6 +66,10 @@ export function transformUserInput( if (type === 'U256') { return registry.createType('U256', value); } + // TODO: CHeck this, not getting value for Address. + // if (type === 'Address') { + // return registry.createType('H160', value); + // } return value; }); diff --git a/src/ui/components/account/Select.tsx b/src/ui/components/account/Select.tsx index 0b8362f8..47bb6627 100644 --- a/src/ui/components/account/Select.tsx +++ b/src/ui/components/account/Select.tsx @@ -43,14 +43,9 @@ function Select({ export function AccountSelect({ placeholder = 'Select account', ...props }: Props) { const { accounts } = useApi(); - const { version } = useVersion(); return ( - ); } @@ -79,7 +74,7 @@ export function AddressSelect({ placeholder = 'Select account', onChange, ...pro })), }, ]; - }, [accounts, contracts, recent]); + }, [accounts, contracts, recent, version]); const handleCreate = (inputValue: string) => { setRecent([...recent, { label: inputValue, value: inputValue }]); diff --git a/src/ui/components/form/findComponent.tsx b/src/ui/components/form/findComponent.tsx index 18853af9..e79c72b3 100644 --- a/src/ui/components/form/findComponent.tsx +++ b/src/ui/components/form/findComponent.tsx @@ -131,6 +131,7 @@ export function findComponent( switch (type.type) { case 'AccountId': case 'Address': + case 'H160': return AddressSelect; case 'Balance': diff --git a/src/ui/util/dropdown.tsx b/src/ui/util/dropdown.tsx index 87c899cd..247a9f8e 100644 --- a/src/ui/util/dropdown.tsx +++ b/src/ui/util/dropdown.tsx @@ -1,6 +1,7 @@ // Copyright 2022-2024 use-ink/contracts-ui authors & contributors // SPDX-License-Identifier: GPL-3.0-only +import { decodeAddress } from '@polkadot/keyring'; import { InkVersion } from 'ui/contexts'; import { MessageSignature } from '../components/message/MessageSignature'; import { @@ -35,12 +36,16 @@ export function createMessageOptions( export function createAccountOptions( data: Account[], - version: InkVersion, + version?: InkVersion, ): DropdownOption[] { - return data.map(pair => ({ - label: pair.meta?.name as string, - value: (version === 'v6' ? toEthAddress(pair.address) : pair.address) || '', - })); + return data.map(pair => { + const address = version === 'v6' ? toEthAddress(decodeAddress(pair.address)) : pair.address; + + return { + label: pair.meta?.name as string, + value: address || '', + }; + }); } export function createContractOptions(data: ContractDocument[]): DropdownOption[] { From 96e4d8eeaafca496ae55d2249c03832a668f1464 Mon Sep 17 00:00:00 2001 From: AlexD10S Date: Sat, 8 Nov 2025 11:06:47 +0100 Subject: [PATCH 4/6] fix: update erc20 test --- cypress/fixtures/erc20.contract | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/fixtures/erc20.contract b/cypress/fixtures/erc20.contract index 8be24e25..a982e8d5 100644 --- a/cypress/fixtures/erc20.contract +++ b/cypress/fixtures/erc20.contract @@ -1 +1 @@ -{"source":{"hash":"0x79c43bfe10bc6215318e5a12861089c2573f0ea2329f3d8b91e6f9fe668fb30e","language":"ink! 6.0.0-beta","compiler":"rustc 1.90.0","contract_binary":"0x50564d0000a129000000000000010780d0d01840a0000280d03a00ffff5c00ffff5200ffff5600ffff3c00ffff6000ffffb721a0ec63616c6ce7dc2326011ecb48b1e08876a3b5a17f9ce1350cbc5e4f264b3162dbc757be9de4b15f1e8301e4c2a1aef088c9f187a0e3f8016deaf4bdeb7954fb410c32bf8a6a033ecc3b5b0000000000000000000000000000000000000900000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0d00000001000000020000000300000004000000050000000c00000007000000080000000c0000000c0000000b00000004808108000000000e00000014000000210000002e00000039000000440000004f00000063616c6c5f646174615f636f707963616c6c657264656c65676174655f63616c6c6465706f7369745f6576656e746765745f73746f726167657365616c5f72657475726e7365745f73746f7261676576616c75655f7472616e7366657272656405110281cc0463616c6c8b2b066465706c6f7906a81d80aa02a275e10107028d02a602b402c402d402e4020e032703350345035503650399039905ef05010610061e062e063d06590668068106a806d10636074f0776078f07c707d707e9072508370847086d088408b608cf08ff08020913095409600991099809b109060a130a310a4a0a590a700a890a960aa80ad00a1f0b400b7d0b9b0ba90bb80b950caf0cba0ce60c1e0d420d660d8d0de40d0c0e290e370e3a0e840e920ecb0ee20eed0e030f0e0f3e0f520f820fad0fc20fce0fdf0f041071109c10ae10cf101a11291148115111571184119711fc11191268128c12d512e212fe1241136a13dd13ee13f513fe134c14ce14ea14f81417155415c415df152e169c168d19da19991aa31aa61a5f1b8f1b9a1bb01bbd1bc91b3e1c501c641c841cd51c001d121d231d2c1d321d5f1d721dd51df61d1a1e321e1f1f2a1f4b1f9d1f00201f2042205a20a120cc20de20ff2006214e2162218f219511c87b10307b15287b1620016472531910bb008d2c84c407c842056487642aae52107c7b95770178ab95aa01ac5af6c8480cc949068469f884cb07c8950a510b19017b197b16087b1c1033054911189ab608951918846701d4b90351070e8217107c77783733050101846702510714821710c857077f77c8530979979555020184670497b603510711821710c857078177c853037a37018219188d67847038c9b808958308642701c8470c95cb08c84308d06905aeab198289953308cf0908d458087bc895770828e1642a28693306821b1084b70449111851070c81877a17183306040184b702510717c84607c837077f77951818d4680879879566020184b701510714c86404c843037c37951818d46808788701821718cf0707d457077bc78216088219c89b088469072809c89b0884690701c8a909ae9a107c8795880178a795aa01ac9af66427821030821528821620951138320064c764cbaea5d282789577087b58955508aea5c528f3330a10aca9488d7b84bb07c8b70a647caea70b78c895cc01acacfbc9b9028483ff00330908330c4001cf930b979901d43b03acc9f7842cf8c8ac0caeca0b7ba395aa08accafb8429072805647c01c8c909ae9c0b78c895cc01ac9cfb32009511e8fd951700027b70107b75087b765010028d0b8477ff00521705cd083309491128d43f33050000133308004095560433070000133300040a01821c28805795c8287b16e8017b18f001977930977828847aff00989938988838987718511a0bf602511a0f240295ab98510b3595ab96510b2e0195ab7cff510ba50095aa25ff520a530395999d52094c0395888b52084503957758ff52073d03330628db03521912340395889a52082c03957760ff52072403951778019518e8015010061e168217780152070f039518800195163633093864675010085ffd95178600330938646850100a51fd9517d6003309389518860050100c41fd951718019518d00033092750100e31fd9518a7009517780133091750101021fd330604285d0395995fff5209b2029588a35208ab0295775fff5207a302951778019518e8015010129d158217780152078e02951880019516363309386467501014defc951786003309386468501016d0fc9517d60033093895188600501018c0fc951718019518d00033092750101ab0fc9518a7009517780133091750101ca0fc33060328dc025209350252181631029577a2520729027c57047b172095c7147b17f00195172b01955818330914645650101e6cfc7c54157c59167c57177b17287c50057c5a067c55077c67087c63097c6c0a7c6b0b7c680c97990897aa08975510977718d449097b1918d40a00d457027c6a0d7c650e7c670f7c691097cc0897bb10978818975508977710979918d43c04d4b808d4a5037c6b117c6512d479097c67137c6c14975508d45b0b646597761097cc18d46c0cd4020ad44808d43907d4cb0b978820d4a80897bb20d4b7077b1818017b1720018217208218187918280182182878182a0133060228f40195998b52094a019588a6520843019577aa52073c017c58157c591664577c5a177b1a287c56057c55067c7b077c7c087c73097c720a7c7a0b979908975508d48904d465007c760c7c750d7c780e7c790f97bb1097cc1897220897aa10976618978808d4cb0bd43203d46a0ad458027c7c107c76117c75127c781397991097cc18d4c9097c7c14975508d465057c760497881097cc18d48c0cd40b0bd43a0ad42908d45c0c647597aa20d4ba0a97c720d487077b1a18017b17200164677914280182182878182a013306012827019599c752097d9588915208775217187480570480580880590c805a10955b2c7b1be8017b1cf00197aa20d4a909815a14805b18805c1c805620978820d4870780582497cc20d4cb0b7b1528815c28978820d468087b1740017b1948017a1a50017b1bc8017b18d0017a1cd801951718019518e80150102020088217180151070a3300fe0028f910821720018218280182193001821a3801821b4001821c4801811650017b1800017b1908017b1a10017b1bd0007b1cd8007a16e0007b17f8009517e4009518c80133091450102216fa95167e019518d000330948646750102404fa95153633094864576468501026f5f9951786003309486458501028e7f9951718019518800033092750102ad7f99518579517780133092750102cc8f9330605821528017816307817319517329518180133092750102eacf9951759951878013309275010309df97b1578014921800100404921880195187801330750103277078219800182188801ac89290482177801c98909c8870a7b1ac8017b19d0019519c8015010344c138377511703080452170d03048217c8018218d0017b17d0007b18d800951778019518d000501036e806821778015207dd0380178801801884018112800180198c01977720d4870780189001801a9401801b9801811c9c01978820d4980897bb20d4ba0a8219d8007b1780007b1888007b1a90007a1c980052099303951744019518800033091c7b1228501038cff89766023307000001c876068168c887078218287a1840013207821740018218480182195001821a58017b1778017b1880017b1988017b1a90019517780128e012951838951740017b17800095168800330938646750103e76f864570a01805780580480590c805a08815b10978820979920d48707d4a9097b17c8017b19d0017a1bd8019517c8016468951950501040d914951798019518c8013309145010422ef89516ac0195181e0133091464675010441cf8821750821858821960821a687b1778017b1880017b1988017b1a90017b15d0004921d80000404921e0003309460001951760019518d000501046b008951760019518980133004833022401280f1a95176001646833004a3302240128ff198217680182167001ac676302821860017b1818c967077b1710986505330820645750104c98097b17d0007b18d8004921e0009517d000645850104eb009821be0008219d8007b16088467e09a7a97b5057b19c85906821518017b1b28510ac3017b1a20330920646764585010504ff7821b28511bfff90195552095bb01956620821a2095aa2028d395177801951840019519313300549511987b10607b15587b165064967b177b18089517103309286468330008012804f7289200951838951680013309386467501058f2f66457951840017b1878010a018057805804805a08805b0c95199801815c1097882097bb20d48707d4ba0a7b1780007b1a88007a1c900095178000646850105a1e128478ff005118029e0128ff00951778019518400195193133005e9511c87b10307b15287b1620649a64757b18951608330914646764a8330004012872f69517780128be10951838951740017b17780195168001330948646750106254f66457821860821968821a70821b787b18c8017b19d0017b1ad8017b1be0010a01805780580480590c805a08815b10978820979920d48707d4a9097b17e8017b19f0017a1bf8019517d0009519e80164685010649c139517d0009518c801501066451451071033080133070133003c01287e1595184c9519a801646750106841118478ff0052180227951780009518d0009519c80150106a44149518e80195198000646750106c4712289d0033070133003c01283b15330801330750106e95077b17d0007b18d8004921e0009518d00095179801501070520a9518d0009517ac01501072450a951778019518d0003300743302d800287f178215e000821710ae5704008217d0007b17208218d800821608821718c876066467645950107635f5821764699518e801821a2897aa20975520821b20951cd000dbb80c98a820985a207bcb0a0301821740018218480182195001821a58017b1778017b1880017b1988017b1a9001951778015010782e05330802330733003c01287614951120ff7b10d8007b15d0007b16c80050107a2e028477ff00521705ab01330933050000133308004095560433070000130a0139070000137b1660491168fc3f52479bae9d5e1895177895186050107c3c0282177851070a3300fe0028160b9518800095163e330920646750107e6af49517163309206468502080005df495177e330920951816502082004ef464577e1896007e1998007e1b9a007e1c9c007e148e007e1090007e1a92007e16940097991097bb2097cc30d498087b1808d4cb0b7b1b7e1886007e1988007e1b8a007e1c8c0097001097aa2097663097991097bb2097cc30d44004d46a0ad489007e187e7e128000d4bc037e1982007e1b8400972210d48208330620000197992097bb30d4b909821b08821cd4cb0bd44a0ad4030cd498087b18387b1c407b1a487b1b500a018057805804805908805a0c7b1678815b1097882097aa20d48707d4a9097b17607b19687a1b7095168000330914646764585020840071f37b151049111800404911203307e7dc2326951810502086004a019518106467502088006001821718821620ac672f821510c96707c865087b18107b171849112095173895181033008a0033029c00284115821718821920ae97040033076458821a10976620979b2098692098bb200a06462198004621ad00019517ae0095186033091450208c00e8f2821738821840821948821a507b17787b1880007b1988007b1a900095177850208e005901821738821840821948821a507b17787b1880007b1988007b1a900095177850209000e802284e039511c87b10307b15287b1620330500001333070000130a07641764166458502092003009330705330805019588ff51080f82699566085109f53307040182103082152882162095113832009511f07b10087b15828a083309206475ae9a08330701281d828995aae09597207b877b8a08955708649850209400d9083307017b57821008821595111032009511f07b1008648a7a170495180433090464a750209600270782100895111032009511c87b10307b152864856478641750209800d806821808821910645750209a00fc0628871333020401827a95770898a33898ac3098a52898a62098a91898ab10788604788505788c0678830798ac08788a788c01788b027889039588089522ff5202c995172895180850209e00670482183082193882175020a000a106281013951168ff7b1090007b1588007b168000647595763533070000137b1760491168004049117033092500019517489518605020a2000b027c57205107169558219517483300a4003302c800286413280b9517485020a600db027c675107169558369517483300a8003302c800284313280b9517485020aa00ba027b1628821750821658ac6730018218487b18307b15209558207b1810c967077b171898650533082064575020ac00c8027b17607b186849117095176064585020ae00e302821b708219687b16088467e09a7a97b6057b19c86905821630017b1b40510a2c7b1a38330920645764685020b00084f0821b40511bffc200956620821a3895aa2095bb0195552028d38217607b17383307023308015020b20059027b17607b18684911709518608217105020b4008c029518608217285020b60080029518608217203300b8003302d800284812821570821718ac57628217607b1728821868821608821730c87606646764595020ba0002f082176469951678951b60821840978820975a20821c28dbc60b98882098aa207bbc0a03821738951860db76089777057b87821090008215880082168000951198003200009511c87b10307b15287b16207b1733070000137b1708491110004049111895180833075020bc0088fd821710821518ac573c821608c95707c856087b18087b171049111895180882173300be0033029c00288b11821810821718ac7811821a085022c0004a110a06282611003300c2009511f87b1033080000131f0300001333090233070a0500009511e07b10187b15107b160864866475510941826808826710ac785e649ac9780954191f569599e0330b63ae9b4c5517e0499579207b19ac98408268c8870733092064a85020c400ecee82177b6710280a64675020c6009f0082678268088269107b577b58087b5910821018821510821608951120320000ac68795022ca00b9105020cc00c3fc821c28acc56795c71facc7618477e0957a44ac7a58c9c505aca552551c211495173882181064c95020ce0082ee2813821710c8c709951b3864c85020d000c703821738821840821948821a50330be07b17187b18207b19287b1a30aeb60f956520821708ac570628c20f009511e87b10107b15087b166475827808827710ac782aaa8727c9870955199c215517e01d957620ac68168258c8870733092033085020d20078ef286910009511f07b10087b156475ca780757071151050f5020d400250264785207080033080101645782100882159511103200827a827910c99a0aac8a053200648b330a20649864b9282f019511e87b10107b15087b167c79648551092395760133080164575020d6005702646764588210108215088216951118285f0264573308821010821508821695111828300233020401827a95770898a33898ac3098a52898a62098a91898ab10788604788505788c0678830798ac08788a788c01788b027889039588089522ff5202c99517289518085020da001582183082193882175020dc003b28c00e9511d07b10287b15207b1618648664753307205020de0040015107194901207b170849111064173309206468330052012803009511e07b10187b15107b160864758277825610c96707ac972c825708c867077b1564955020e000c5ecc85607ac672f82187b87108210188215108216089511203200330a0164577b18646864965020e2000f8218646982561028c0009511c07b10387b15307b1628c88909ac89b4006475827895a7ff330c08947c04978701e4c909e4790bd6ba0752079700caba0757079000510812825c08caa808491120019519182806951920017b988218207b1b105108277b15088215185105277b1c5020e400870064765107266467821864595020e60018ec28175020e80048647628125020ea003f6476821508280682150801330701db660751060d8218107b587b5708280f14080100000000000080ab87118210388215308216289511403200009511f07b10087b15647551070c64575020ec00172806330701016458821008821595111032003309004013340800401351080a3a0808401328223308000003958a000010ac8a3c330b013b0b0040133e080840133e0a104013019588015108239588ffc88707ac87113a0a104013ac7a123e0708401301d88707947864873200009511f07b10087818079518073309015020ee0050fe82100895111032009511c87b10307b15286485647864175020f0001682180882191064575020f20026fe28c60c9511d07b10287b15207b1618648664753307143308015020f400effc7b177b1808491110641733091464683300520128eefd9511e87b10107b15087b166475827710c89706ac7617825a08ac6a11825ac8a7075020f600b2ea28110d009511b87b10407b15387b16306495541a033501330286003303f695891f4605c700461501df00785302785203ac8917018499e0959c40ac9c0d0195a6fcacc606017b1c7b17187b18207b1b0854161ff7009557044615204615214615224615232033091c33085020f800b0eb7b161054163fd4008217206f7695572433091833085020fa0095eb986738986830986928986a20986218986c10986b08785a4078594178584278574382192095974078563c785b3d785c3e78523fac978900821818821a10ac7a7f9577c0ab97799557445020fc00d8e982170897772033086600018219979920975520951c2c330a80000198762048112c20978720985520140b000000000400000097cc20987720d45b0bd46c0cd49b0b3308ff3309ff0a020181182c56182020837833090cae981784770f520711821040821538821630951148320000009511f87b1033080000133307011f0300001301013309020a0500951158ff7b10a0007b1598007b1690007b17487c89187c8a197c8b1a7c8c1b7c821c7c861d7c851e7c871f97aa0897bb1097cc18d4a9097b1940d4cb0b7b1b387c89107c8a117c8b127c831397660897551097771897aa08d4260c7b1c30d457077b1728d4a9097b19207c87157c89167c861797bb10973a18d4ba0a7b1a187c8b14977708979910976518d4b7077b1710d459097b19087c86097c89087c8a0a7c870b976608d469097b1997aa10977718d4a7037c820d7c8a0c7c870e7c840f972208d4a20c977710974418d474027c89017c847c80027c8703979908d44904970010977718d407007c89057c8a047c87067c8807979908d4a90b977710978818d48707821840821938d49808821930821a28d49a0a821920821518d45909821510821608d465058216d46306d4c20cd44002d4b70797aa20d48a0a975520d49505491170491178492180004921880097cc20d46c0c951850977720d427079512707b17507b1c587b15607b1a68330a04017c87017c8b027c8c037c8697770897bb1097cc18d467077c86047c8505d4cb0b7c8c067c8907975508d4650597cc10979918d4c909958808d4b707d45909979920d497077b2795220895aaff520ab482177082187882198000821a8800821b487bb77bb8087bb9107bba188210a00082159800821690009511a8003200828908330a13ac9a0a3308017b783200951160ff7b1098007b1590007b1688007b17088287959aec9576147c75107c79117c73127c70137c747c72017c7b027c7c037b867b8a08979908d459097b197c7a047c79057c75067c760797331097001897220897bb1097cc18979908d43003d44202d4bc00d4a9047c7a087c7b097c790a7c7c0b97551097661897bb0897991097cc18d46505d4ba0a7c7b0c7c760dd4c9097c7c0e7c770f976608d46b0b97cc10977718d4c707821cd4c30cd42006d44505d4a909d4b707975520977720d46505d497077b15487b17507a1c58951760502000012df482176051070d3307018218087b872842821768821870821978821a8000821b48821c508116587b18307b19387b1a407b1b107b1c187a16207b1728821508955708951810330938502002012ce64905018210980082159000821688009511a00032009511d87b10207b15187b16106495647c829608829a9788209889207a160c951b0c330764c87b1a0a040180180cac86368379330a0b821b7b5b7b5808ac9a1584770f9777023308a00001c887078177280633070c018210208215188216109511283200009511d89518088279827a08827b1082771848017b19087b1a107b1b187b172064879511d8827818827910827a8277087b182048017b1a087b17107b1918641733004e01287106645764685020060138052833077c67247c6b257c62267c6a277c631c7c681d7c691e7c6c1f97bb08d47b047c6b207c67217c60227c652397221097aa1897880897991097cc18977708d42a02d43803d49c0ad47b0b7c67147c69157c6c167c681797001097551897990897cc10978818d40505d479007c69187c6719d4c8087c6c1a7c661b977708d4970797cc10976618d46c0cd44209d43a0ad45b0bd40808d4c70797bb20977720d4ba0ad487077b17387b1a407a1948951938821795181050200a0144028210608215588216509511683200951148ff7b10b0007b15a8007b16a00064957b18086476951710646850200c014c04951710645850200e01bf02510708330728e900951750951810645950201001df029518507b16646750201201c404951730821808502014011204821930821a388257825808c87906c8a808d8a80bae960d958801888901c89b0b01821a40825910c8a909d8a90a821708510b0fc89b0bd89b09c89a0a64b901821c48825b18c8cb0bd8cb0c510a10520c8300c8ba0ad8ba0c64ab01520c767b16507b18587b19607b1b68951850647650201601430446117001951771330914821850201801b6e3462185000195178600330914646850201a01a2e38257825808825910825a187b17507b18587b19607b1a6895175050201c0117f2330702018210b0008215a8008216a0009511b8003200009511b07b10487b15407b16387b193309180001330a000013330b00407b19087b17107b18187b1a207b1b2849113095170895182050201e013702821728821530ac5747821620c95707c856087b18207b172849113095182082173300200133029c00282705821828821730ac781c821a2050222201e6040a06821048821540821638951150320000ac687950222601de0450202801e8f0821c28acc56795c71facc7618477e0957a44ac7a58c9c505aca552551c211495173882181064c950202a01a7e22813821710c8c709951b3864c850202c01ecf7821738821840821948821a50330be07b17187b18207b19287b1a30aeb60f956520821708ac570628e703009511887b10707b15687b166064753307180001330a000013330b00407b177b18087b19107b1a287b1b30491138641795182850202e013701821930821838ac8977821728c98909c8870a7b1a187b192095191850203001fffb8377330803aa873b52170d548217188218207b17507b1858951728951850502032011e0182172852073581163095183495570433091c50203401d4e17a5628103307490549150849151049151801821070821568821660951178320000958a20957718330ce00164c2510c1b827982abf895a3f89577f8952c08643aaab9ebd8b90a2807330a648301d338078e77db2a0732009511f87b158293829b08829a108284828c08ae3417d8bc0585b2ffd3cb0bc8c20288bc01c85c0c2809c9bc02d8bc0c01828510829b18c9a509d8a50a510c0dd8c905c9c909c85a0a01828518c93408c9b50c510a11d8b50bd8ac05c9ac0cd45b0a2806d8b50a017b787b72087b79107b7c18520a0a82159511083200009511e87b10107b15087b16647582778177648650203601daee825708646850203801f0ee825710646828b5029511a07b10587b15507b16486486647595172050203a016fee821720520720821728821830821938821a40826b087b177b18087b19107b1a18510b17330701017b57821058821550821648951160320033078218821908821a10821b187b58087b59107b5a187b5b2028d700848bff00330a0000133309021e03000013ab9b0a330833090128091e0301001301019511f87b10c89a0b95990178b833080000130a05009511a07b10587b15507b16486489647533070000137b17104911180040491120951810649750203e01ea00821918821820ac8974821710c98909c8870a7b1a7b1908641950204001d6f98377330803aa873a52170d5382178218087b17387b184095171095183850204201f6fe82171052073581161895181c95570433091c50204401acdf7a56281033074905491508491510491518018210588215508216489511603200009511c87b10307b15287b16207b1833080000137b180849111000404911189518085020460148821710821518ac573c821608c95707c856087b18087b171049111895180882173300480133029c00285b01821810821718ac7811821a0850224a011a010a0628f600009511e87b10107b15087b16648564763307e7dc232650204c01faec6467645828e100009511e07b101881793308000013330a00407b187b1a085109181f03000013010133090201330800001333070a05009577081e030000134911100164183300500133029c0028d90082191052090b33080133070a050053290140cf0082178218088219107b577b58087b591082102882152082161895113032009518183309208217105020540177de82177b75108210688215608216589511703200821728951840951948db78097b9782106082155882165095116832008217951818951920db78097b978210308215289511383200821030821528821620951138320082101082150882169511182825ec975920989920977720987b203307646832027b1782777b1808c96805c867077b17107b17187b1520491128951818649732029511987b10607b15587b16507b1849110849111049111849112095180832029511907b10687b15607b1658648982780882761049113849114049114849115032027b56108210108215088216951118320049b250522925499228294992542649299324a529499324252955495232494aca242969925252322925254995525252524a12c9244952929a9414911422144224e49488249284902422221289881212111121229242a410891091109190442422224244248548211221222122218990481291149224499224499224499224499224494a922449129144224924124949922449922449922449922449922449929224a2482449124992882449922449121111111122918888888888888888848814920a91424442222199241212091144142222928808851011111122222292888824898888884842424aa288888888482222852a49922422a28488848814922422228208112122912891888824492122a21091949289a4424292a48824492a4991245228a29244922422a21021114992544945228988144a9288884a9224898888424448124914222222441492480a11111122424422918c44920a154912496a444444448414898808110a917048082421894452480a92044544444424495244449224491289484292942449524992244912a9202141821424499224894892952429422441922422122449222241922484aa2099946492949494545252d0524a4a529094a40a928264499224495292244990142422a28484842448928894a02411294192489224494192142449299924152424494a92204912244112912449925450499224a9242922a2495248480a9224499222922441192984d4495249522249a49414940a4a4a92a409822449924452509282244992244926a9244944525290492509ca2ca592542a49aa240595945452922549922449499224212924492a419294a2495249920a929224a52a549a24894a9224914812294b92a4a05441a1422993a4144092a449a5509652080985908410264942c25493244152922a240549924a829252244925494a9049528824421249244a129224529090928224499224499244922441124a121249004992a4899224493a8504d288882449922449922449922449922449922449922425499224494a922449922449922449929224499288244992249394244992244992a42449444a121151925444444a92a424252949922449922449922449922449499224499220492a492449922449123422a224a9942455935249125299244d4a529294a4a424452a489224499224499224499224499224499224499224495282242922a2948214a42405a9200992922449264992a44992489a24494124052152509224499011114d924288244992204992242922491294244d102449922492829214244992244932490a214a9294204992244149244912244912542599244db2942425d5945249499224259324492649929425496992aa8214a4244925489224254996245592246984849482292934492a2424054992948292284912244912542599244d92424212922449922292244199a40a82caa41025810c35218a48921a969424494982922425494952494a52929494244955499224952425494a92922429490900","build_info":{"rust_toolchain":"stable-aarch64-apple-darwin","cargo_contract_version":"6.0.0-beta","build_mode":"Release"}},"contract":{"name":"erc20","version":"6.0.0-beta","authors":["Use Ink "]},"image":null,"version":6,"types":[{"id":0,"type":{"path":["primitive_types","U256"],"def":{"composite":{"fields":[{"type":1,"typeName":"[u64; 4]"}]}}}},{"id":1,"type":{"def":{"array":{"len":4,"type":2}}}},{"id":2,"type":{"def":{"primitive":"u64"}}},{"id":3,"type":{"path":["ink_storage","lazy","mapping","Mapping"],"params":[{"name":"K","type":4},{"name":"V","type":0},{"name":"KeyType","type":7}],"def":{"composite":{}}}},{"id":4,"type":{"path":["primitive_types","H160"],"def":{"composite":{"fields":[{"type":5,"typeName":"[u8; 20]"}]}}}},{"id":5,"type":{"def":{"array":{"len":20,"type":6}}}},{"id":6,"type":{"def":{"primitive":"u8"}}},{"id":7,"type":{"path":["ink_storage_traits","impls","ResolverKey"],"params":[{"name":"L","type":8},{"name":"R","type":9}],"def":{"composite":{}}}},{"id":8,"type":{"path":["ink_storage_traits","impls","AutoKey"],"def":{"composite":{}}}},{"id":9,"type":{"path":["ink_storage_traits","impls","ManualKey"],"params":[{"name":"ParentKey","type":10}],"def":{"composite":{}}}},{"id":10,"type":{"def":{"tuple":[]}}},{"id":11,"type":{"path":["ink_storage","lazy","mapping","Mapping"],"params":[{"name":"K","type":12},{"name":"V","type":0},{"name":"KeyType","type":13}],"def":{"composite":{}}}},{"id":12,"type":{"def":{"tuple":[4,4]}}},{"id":13,"type":{"path":["ink_storage_traits","impls","ResolverKey"],"params":[{"name":"L","type":8},{"name":"R","type":14}],"def":{"composite":{}}}},{"id":14,"type":{"path":["ink_storage_traits","impls","ManualKey"],"params":[{"name":"ParentKey","type":10}],"def":{"composite":{}}}},{"id":15,"type":{"path":["erc20","erc20","Erc20"],"def":{"composite":{"fields":[{"name":"total_supply","type":0,"typeName":",>>::Type"},{"name":"balances","type":3,"typeName":" as::ink::storage::traits::AutoStorableHint<\n::ink::storage::traits::ManualKey<639884519u32, ()>,>>::Type"},{"name":"allowances","type":11,"typeName":" as::ink::storage::traits::\nAutoStorableHint<::ink::storage::traits::ManualKey<3969917367u32,\n()>,>>::Type"}]}}}},{"id":16,"type":{"path":["Result"],"params":[{"name":"T","type":10},{"name":"E","type":17}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":10}],"index":0},{"name":"Err","fields":[{"type":17}],"index":1}]}}}},{"id":17,"type":{"path":["ink_primitives","LangError"],"def":{"variant":{"variants":[{"name":"CouldNotReadInput","index":1}]}}}},{"id":18,"type":{"path":["Result"],"params":[{"name":"T","type":0},{"name":"E","type":17}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":0}],"index":0},{"name":"Err","fields":[{"type":17}],"index":1}]}}}},{"id":19,"type":{"path":["Result"],"params":[{"name":"T","type":20},{"name":"E","type":17}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":20}],"index":0},{"name":"Err","fields":[{"type":17}],"index":1}]}}}},{"id":20,"type":{"path":["Result"],"params":[{"name":"T","type":10},{"name":"E","type":21}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":10}],"index":0},{"name":"Err","fields":[{"type":21}],"index":1}]}}}},{"id":21,"type":{"path":["erc20","erc20","Error"],"def":{"variant":{"variants":[{"name":"InsufficientBalance","index":0},{"name":"InsufficientAllowance","index":1}]}}}},{"id":22,"type":{"path":["Option"],"params":[{"name":"T","type":4}],"def":{"variant":{"variants":[{"name":"None","index":0},{"name":"Some","fields":[{"type":4}],"index":1}]}}}},{"id":23,"type":{"path":["ink_primitives","types","AccountId"],"def":{"composite":{"fields":[{"type":24,"typeName":"[u8; 32]"}]}}}},{"id":24,"type":{"def":{"array":{"len":32,"type":6}}}},{"id":25,"type":{"def":{"primitive":"u128"}}},{"id":26,"type":{"path":["ink_primitives","types","Hash"],"def":{"composite":{"fields":[{"type":24,"typeName":"[u8; 32]"}]}}}},{"id":27,"type":{"def":{"primitive":"u32"}}}],"storage":{"root":{"root_key":"0x00000000","layout":{"struct":{"name":"Erc20","fields":[{"name":"total_supply","layout":{"leaf":{"key":"0x00000000","ty":0}}},{"name":"balances","layout":{"root":{"root_key":"0xe7dc2326","layout":{"leaf":{"key":"0xe7dc2326","ty":0}},"ty":3}}},{"name":"allowances","layout":{"root":{"root_key":"0xb721a0ec","layout":{"leaf":{"key":"0xb721a0ec","ty":0}},"ty":11}}}]}},"ty":15}},"spec":{"constructors":[{"label":"new","selector":"0x9bae9d5e","payable":false,"args":[{"label":"total_supply","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":16,"displayName":["ink_primitives","ConstructorResult"]},"docs":["Creates a new ERC-20 contract with the specified initial supply."],"default":false}],"messages":[{"label":"total_supply","selector":"0xdb6375a8","mutates":false,"payable":false,"args":[],"returnType":{"type":18,"displayName":["ink","MessageResult"]},"docs":[" Returns the total token supply."],"default":false},{"label":"balance_of","selector":"0x0f755a56","mutates":false,"payable":false,"args":[{"label":"owner","type":{"type":4,"displayName":["H160"]}}],"returnType":{"type":18,"displayName":["ink","MessageResult"]},"docs":[" Returns the account balance for the specified `owner`.",""," Returns `0` if the account is non-existent."],"default":false},{"label":"allowance","selector":"0x6a00165e","mutates":false,"payable":false,"args":[{"label":"owner","type":{"type":4,"displayName":["H160"]}},{"label":"spender","type":{"type":4,"displayName":["H160"]}}],"returnType":{"type":18,"displayName":["ink","MessageResult"]},"docs":[" Returns the amount which `spender` is still allowed to withdraw from `owner`.",""," Returns `0` if no allowance has been set."],"default":false},{"label":"transfer","selector":"0x84a15da1","mutates":true,"payable":false,"args":[{"label":"to","type":{"type":4,"displayName":["H160"]}},{"label":"value","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":19,"displayName":["ink","MessageResult"]},"docs":[" Transfers `value` amount of tokens from the caller's account to account `to`.",""," On success a `Transfer` event is emitted.",""," # Errors",""," Returns `InsufficientBalance` error if there are not enough tokens on"," the caller's account balance."],"default":false},{"label":"approve","selector":"0x681266a0","mutates":true,"payable":false,"args":[{"label":"spender","type":{"type":4,"displayName":["H160"]}},{"label":"value","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":19,"displayName":["ink","MessageResult"]},"docs":[" Allows `spender` to withdraw from the caller's account multiple times, up to"," the `value` amount.",""," If this function is called again it overwrites the current allowance with"," `value`.",""," An `Approval` event is emitted."],"default":false},{"label":"transfer_from","selector":"0x0b396f18","mutates":true,"payable":false,"args":[{"label":"from","type":{"type":4,"displayName":["H160"]}},{"label":"to","type":{"type":4,"displayName":["H160"]}},{"label":"value","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":19,"displayName":["ink","MessageResult"]},"docs":[" Transfers `value` tokens on the behalf of `from` to the account `to`.",""," This can be used to allow a contract to transfer tokens on ones behalf and/or"," to charge fees in sub-currencies, for example.",""," On success a `Transfer` event is emitted.",""," # Errors",""," Returns `InsufficientAllowance` error if there are not enough tokens allowed"," for the caller to withdraw from `from`.",""," Returns `InsufficientBalance` error if there are not enough tokens on"," the account balance of `from`."],"default":false}],"events":[{"label":"Transfer","module_path":"erc20::erc20","signature_topic":"0x1ecb48b1e08876a3b5a17f9ce1350cbc5e4f264b3162dbc757be9de4b15f1e83","args":[{"label":"from","indexed":true,"type":{"type":22,"displayName":["Option"]},"docs":[]},{"label":"to","indexed":true,"type":{"type":22,"displayName":["Option"]},"docs":[]},{"label":"value","indexed":false,"type":{"type":0,"displayName":["U256"]},"docs":[]}],"docs":["Event emitted when a token transfer occurs."]},{"label":"Approval","module_path":"erc20::erc20","signature_topic":"0xe4c2a1aef088c9f187a0e3f8016deaf4bdeb7954fb410c32bf8a6a033ecc3b5b","args":[{"label":"owner","indexed":true,"type":{"type":4,"displayName":["H160"]},"docs":[]},{"label":"spender","indexed":true,"type":{"type":4,"displayName":["H160"]},"docs":[]},{"label":"value","indexed":false,"type":{"type":0,"displayName":["U256"]},"docs":[]}],"docs":["Event emitted when an approval occurs that `spender` is allowed to withdraw","up to the amount of `value` tokens from `owner`."]}],"docs":[],"lang_error":{"type":17,"displayName":["ink","LangError"]},"environment":{"accountId":{"type":23,"displayName":["AccountId"]},"balance":{"type":25,"displayName":["Balance"]},"hash":{"type":26,"displayName":["Hash"]},"timestamp":{"type":2,"displayName":["Timestamp"]},"blockNumber":{"type":27,"displayName":["BlockNumber"]},"nativeToEthRatio":100000000,"staticBufferSize":16384}}} \ No newline at end of file +{"source":{"hash":"0x3d42e66fcabd3a24c56bbdcd7f04e2e17a486ea28ff6244bf90741b791e5b6ef","language":"ink! 6.0.0-beta","compiler":"rustc 1.90.0","contract_binary":"0x50564d0000a129000000000000010780d0d01840a0000280d03a00ffff5c00ffff5200ffff5600ffff3c00ffff6000ffffb721a0ec63616c6ce7dc2326012bf04b1fcc64de43ce9704e9ccdc0657018c43d01c3e88bceed23cba23a10f5c01a1d96b3a6e369c8b0ee68c99cb4406104190a21b35f7ef8fa2bcef30a78efc1a0000000000000000000000000000000000000900000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0d00000001000000020000000300000004000000050000000c00000007000000080000000c0000000c0000000b00000004808108000000000e00000014000000210000002e00000039000000440000004f00000063616c6c5f646174615f636f707963616c6c657264656c65676174655f63616c6c6465706f7369745f6576656e746765745f73746f726167657365616c5f72657475726e7365745f73746f7261676576616c75655f7472616e7366657272656405110281cc0463616c6c8b2b066465706c6f7906a81d80aa02a275e10107028d02a602b402c402d402e4020e032703350345035503650399039905ef05010610061e062e063d06590668068106a806d10636074f0776078f07c707d707e9072508370847086d088408b608cf08ff08020913095409600991099809b109060a130a310a4a0a590a700a890a960aa80ad00a1f0b400b7d0b9b0ba90bb80b950caf0cba0ce60c1e0d420d660d8d0de40d0c0e290e370e3a0e840e920ecb0ee20eed0e030f0e0f3e0f520f820fad0fc20fce0fdf0f041071109c10ae10cf101a11291148115111571184119711fc11191268128c12d512e212fe1241136a13dd13ee13f513fe134c14ce14ea14f81417155415c415df152e169c168d19da19991aa31aa61a5f1b8f1b9a1bb01bbd1bc91b3e1c501c641c841cd51c001d121d231d2c1d321d5f1d721dd51df61d1a1e321e1f1f2a1f4b1f9d1f00201f2042205a20a120cc20de20ff2006214e2162218f219511c87b10307b15287b1620016472531910bb008d2c84c407c842056487642aae52107c7b95770178ab95aa01ac5af6c8480cc949068469f884cb07c8950a510b19017b197b16087b1c1033054911189ab608951918846701d4b90351070e8217107c77783733050101846702510714821710c857077f77c8530979979555020184670497b603510711821710c857078177c853037a37018219188d67847038c9b808958308642701c8470c95cb08c84308d06905aeab198289953308cf0908d458087bc895770828e1642a28693306821b1084b70449111851070c81877a17183306040184b702510717c84607c837077f77951818d4680879879566020184b701510714c86404c843037c37951818d46808788701821718cf0707d457077bc78216088219c89b088469072809c89b0884690701c8a909ae9a107c8795880178a795aa01ac9af66427821030821528821620951138320064c764cbaea5d282789577087b58955508aea5c528f3330a10aca9488d7b84bb07c8b70a647caea70b78c895cc01acacfbc9b9028483ff00330908330c4001cf930b979901d43b03acc9f7842cf8c8ac0caeca0b7ba395aa08accafb8429072805647c01c8c909ae9c0b78c895cc01ac9cfb32009511e8fd951700027b70107b75087b765010028d0b8477ff00521705cd083309491128d43f33050000133308004095560433070000133300040a01821c28805795c8287b16e8017b18f001977930977828847aff00989938988838987718511a0bf602511a0f240295ab98510b3595ab96510b2e0195ab7cff510ba50095aa25ff520a530395999d52094c0395888b52084503957758ff52073d03330628db03521912340395889a52082c03957760ff52072403951778019518e8015010061e168217780152070f039518800195163633093864675010085ffd95178600330938646850100a51fd9517d6003309389518860050100c41fd951718019518d00033092750100e31fd9518a7009517780133091750101021fd330604285d0395995fff5209b2029588a35208ab0295775fff5207a302951778019518e8015010129d158217780152078e02951880019516363309386467501014defc951786003309386468501016d0fc9517d60033093895188600501018c0fc951718019518d00033092750101ab0fc9518a7009517780133091750101ca0fc33060328dc025209350252181631029577a2520729027c57047b172095c7147b17f00195172b01955818330914645650101e6cfc7c54157c59167c57177b17287c50057c5a067c55077c67087c63097c6c0a7c6b0b7c680c97990897aa08975510977718d449097b1918d40a00d457027c6a0d7c650e7c670f7c691097cc0897bb10978818975508977710979918d43c04d4b808d4a5037c6b117c6512d479097c67137c6c14975508d45b0b646597761097cc18d46c0cd4020ad44808d43907d4cb0b978820d4a80897bb20d4b7077b1818017b1720018217208218187918280182182878182a0133060228f40195998b52094a019588a6520843019577aa52073c017c58157c591664577c5a177b1a287c56057c55067c7b077c7c087c73097c720a7c7a0b979908975508d48904d465007c760c7c750d7c780e7c790f97bb1097cc1897220897aa10976618978808d4cb0bd43203d46a0ad458027c7c107c76117c75127c781397991097cc18d4c9097c7c14975508d465057c760497881097cc18d48c0cd40b0bd43a0ad42908d45c0c647597aa20d4ba0a97c720d487077b1a18017b17200164677914280182182878182a013306012827019599c752097d9588915208775217187480570480580880590c805a10955b2c7b1be8017b1cf00197aa20d4a909815a14805b18805c1c805620978820d4870780582497cc20d4cb0b7b1528815c28978820d468087b1740017b1948017a1a50017b1bc8017b18d0017a1cd801951718019518e80150102020088217180151070a3300fe0028f910821720018218280182193001821a3801821b4001821c4801811650017b1800017b1908017b1a10017b1bd0007b1cd8007a16e0007b17f8009517e4009518c80133091450102216fa95167e019518d000330948646750102404fa95153633094864576468501026f5f9951786003309486458501028e7f9951718019518800033092750102ad7f99518579517780133092750102cc8f9330605821528017816307817319517329518180133092750102eacf9951759951878013309275010309df97b1578014921800100404921880195187801330750103277078219800182188801ac89290482177801c98909c8870a7b1ac8017b19d0019519c8015010344c138377511703080452170d03048217c8018218d0017b17d0007b18d800951778019518d000501036e806821778015207dd0380178801801884018112800180198c01977720d4870780189001801a9401801b9801811c9c01978820d4980897bb20d4ba0a8219d8007b1780007b1888007b1a90007a1c980052099303951744019518800033091c7b1228501038cff89766023307000001c876068168c887078218287a1840013207821740018218480182195001821a58017b1778017b1880017b1988017b1a90019517780128e012951838951740017b17800095168800330938646750103e76f864570a01805780580480590c805a08815b10978820979920d48707d4a9097b17c8017b19d0017a1bd8019517c8016468951950501040d914951798019518c8013309145010422ef89516ac0195181e0133091464675010441cf8821750821858821960821a687b1778017b1880017b1988017b1a90017b15d0004921d80000404921e0003309460001951760019518d000501046b008951760019518980133004833022401280f1a95176001646833004a3302240128ff198217680182167001ac676302821860017b1818c967077b1710986505330820645750104c98097b17d0007b18d8004921e0009517d000645850104eb009821be0008219d8007b16088467e09a7a97b5057b19c85906821518017b1b28510ac3017b1a20330920646764585010504ff7821b28511bfff90195552095bb01956620821a2095aa2028d395177801951840019519313300549511987b10607b15587b165064967b177b18089517103309286468330008012804f7289200951838951680013309386467501058f2f66457951840017b1878010a018057805804805a08805b0c95199801815c1097882097bb20d48707d4ba0a7b1780007b1a88007a1c900095178000646850105a1e128478ff005118029e0128ff00951778019518400195193133005e9511c87b10307b15287b1620649a64757b18951608330914646764a8330004012872f69517780128be10951838951740017b17780195168001330948646750106254f66457821860821968821a70821b787b18c8017b19d0017b1ad8017b1be0010a01805780580480590c805a08815b10978820979920d48707d4a9097b17e8017b19f0017a1bf8019517d0009519e80164685010649c139517d0009518c801501066451451071033080133070133003c01287e1595184c9519a801646750106841118478ff0052180227951780009518d0009519c80150106a44149518e80195198000646750106c4712289d0033070133003c01283b15330801330750106e95077b17d0007b18d8004921e0009518d00095179801501070520a9518d0009517ac01501072450a951778019518d0003300743302d800287f178215e000821710ae5704008217d0007b17208218d800821608821718c876066467645950107635f5821764699518e801821a2897aa20975520821b20951cd000dbb80c98a820985a207bcb0a0301821740018218480182195001821a58017b1778017b1880017b1988017b1a9001951778015010782e05330802330733003c01287614951120ff7b10d8007b15d0007b16c80050107a2e028477ff00521705ab01330933050000133308004095560433070000130a0139070000137b1660491168fc3f52479bae9d5e1895177895186050107c3c0282177851070a3300fe0028160b9518800095163e330920646750107e6af49517163309206468502080005df495177e330920951816502082004ef464577e1896007e1998007e1b9a007e1c9c007e148e007e1090007e1a92007e16940097991097bb2097cc30d498087b1808d4cb0b7b1b7e1886007e1988007e1b8a007e1c8c0097001097aa2097663097991097bb2097cc30d44004d46a0ad489007e187e7e128000d4bc037e1982007e1b8400972210d48208330620000197992097bb30d4b909821b08821cd4cb0bd44a0ad4030cd498087b18387b1c407b1a487b1b500a018057805804805908805a0c7b1678815b1097882097aa20d48707d4a9097b17607b19687a1b7095168000330914646764585020840071f37b151049111800404911203307e7dc2326951810502086004a019518106467502088006001821718821620ac672f821510c96707c865087b18107b171849112095173895181033008a0033029c00284115821718821920ae97040033076458821a10976620979b2098692098bb200a06462198004621ad00019517ae0095186033091450208c00e8f2821738821840821948821a507b17787b1880007b1988007b1a900095177850208e005901821738821840821948821a507b17787b1880007b1988007b1a900095177850209000e802284e039511c87b10307b15287b1620330500001333070000130a07641764166458502092003009330705330805019588ff51080f82699566085109f53307040182103082152882162095113832009511f07b10087b15828a083309206475ae9a08330701281d828995aae09597207b877b8a08955708649850209400d9083307017b57821008821595111032009511f07b1008648a7a170495180433090464a750209600270782100895111032009511c87b10307b152864856478641750209800d806821808821910645750209a00fc0628871333020401827a95770898a33898ac3098a52898a62098a91898ab10788604788505788c0678830798ac08788a788c01788b027889039588089522ff5202c995172895180850209e00670482183082193882175020a000a106281013951168ff7b1090007b1588007b168000647595763533070000137b1760491168004049117033092500019517489518605020a2000b027c57205107169558219517483300a4003302c800286413280b9517485020a600db027c675107169558369517483300a8003302c800284313280b9517485020aa00ba027b1628821750821658ac6730018218487b18307b15209558207b1810c967077b171898650533082064575020ac00c8027b17607b186849117095176064585020ae00e302821b708219687b16088467e09a7a97b6057b19c86905821630017b1b40510a2c7b1a38330920645764685020b00084f0821b40511bffc200956620821a3895aa2095bb0195552028d38217607b17383307023308015020b20059027b17607b18684911709518608217105020b4008c029518608217285020b60080029518608217203300b8003302d800284812821570821718ac57628217607b1728821868821608821730c87606646764595020ba0002f082176469951678951b60821840978820975a20821c28dbc60b98882098aa207bbc0a03821738951860db76089777057b87821090008215880082168000951198003200009511c87b10307b15287b16207b1733070000137b1708491110004049111895180833075020bc0088fd821710821518ac573c821608c95707c856087b18087b171049111895180882173300be0033029c00288b11821810821718ac7811821a085022c0004a110a06282611003300c2009511f87b1033080000131f0300001333090233070a0500009511e07b10187b15107b160864866475510941826808826710ac785e649ac9780954191f569599e0330b63ae9b4c5517e0499579207b19ac98408268c8870733092064a85020c400ecee82177b6710280a64675020c6009f0082678268088269107b577b58087b5910821018821510821608951120320000ac68795022ca00b9105020cc00c3fc821c28acc56795c71facc7618477e0957a44ac7a58c9c505aca552551c211495173882181064c95020ce0082ee2813821710c8c709951b3864c85020d000c703821738821840821948821a50330be07b17187b18207b19287b1a30aeb60f956520821708ac570628c20f009511e87b10107b15087b166475827808827710ac782aaa8727c9870955199c215517e01d957620ac68168258c8870733092033085020d20078ef286910009511f07b10087b156475ca780757071151050f5020d400250264785207080033080101645782100882159511103200827a827910c99a0aac8a053200648b330a20649864b9282f019511e87b10107b15087b167c79648551092395760133080164575020d6005702646764588210108215088216951118285f0264573308821010821508821695111828300233020401827a95770898a33898ac3098a52898a62098a91898ab10788604788505788c0678830798ac08788a788c01788b027889039588089522ff5202c99517289518085020da001582183082193882175020dc003b28c00e9511d07b10287b15207b1618648664753307205020de0040015107194901207b170849111064173309206468330052012803009511e07b10187b15107b160864758277825610c96707ac972c825708c867077b1564955020e000c5ecc85607ac672f82187b87108210188215108216089511203200330a0164577b18646864965020e2000f8218646982561028c0009511c07b10387b15307b1628c88909ac89b4006475827895a7ff330c08947c04978701e4c909e4790bd6ba0752079700caba0757079000510812825c08caa808491120019519182806951920017b988218207b1b105108277b15088215185105277b1c5020e400870064765107266467821864595020e60018ec28175020e80048647628125020ea003f6476821508280682150801330701db660751060d8218107b587b5708280f14080100000000000080ab87118210388215308216289511403200009511f07b10087b15647551070c64575020ec00172806330701016458821008821595111032003309004013340800401351080a3a0808401328223308000003958a000010ac8a3c330b013b0b0040133e080840133e0a104013019588015108239588ffc88707ac87113a0a104013ac7a123e0708401301d88707947864873200009511f07b10087818079518073309015020ee0050fe82100895111032009511c87b10307b15286485647864175020f0001682180882191064575020f20026fe28c60c9511d07b10287b15207b1618648664753307143308015020f400effc7b177b1808491110641733091464683300520128eefd9511e87b10107b15087b166475827710c89706ac7617825a08ac6a11825ac8a7075020f600b2ea28110d009511b87b10407b15387b16306495541a033501330286003303f695891f4605c700461501df00785302785203ac8917018499e0959c40ac9c0d0195a6fcacc606017b1c7b17187b18207b1b0854161ff7009557044615204615214615224615232033091c33085020f800b0eb7b161054163fd4008217206f7695572433091833085020fa0095eb986738986830986928986a20986218986c10986b08785a4078594178584278574382192095974078563c785b3d785c3e78523fac978900821818821a10ac7a7f9577c0ab97799557445020fc00d8e982170897772033086600018219979920975520951c2c330a80000198762048112c20978720985520140b000000000400000097cc20987720d45b0bd46c0cd49b0b3308ff3309ff0a020181182c56182020837833090cae981784770f520711821040821538821630951148320000009511f87b1033080000133307011f0300001301013309020a0500951158ff7b10a0007b1598007b1690007b17487c89187c8a197c8b1a7c8c1b7c821c7c861d7c851e7c871f97aa0897bb1097cc18d4a9097b1940d4cb0b7b1b387c89107c8a117c8b127c831397660897551097771897aa08d4260c7b1c30d457077b1728d4a9097b19207c87157c89167c861797bb10973a18d4ba0a7b1a187c8b14977708979910976518d4b7077b1710d459097b19087c86097c89087c8a0a7c870b976608d469097b1997aa10977718d4a7037c820d7c8a0c7c870e7c840f972208d4a20c977710974418d474027c89017c847c80027c8703979908d44904970010977718d407007c89057c8a047c87067c8807979908d4a90b977710978818d48707821840821938d49808821930821a28d49a0a821920821518d45909821510821608d465058216d46306d4c20cd44002d4b70797aa20d48a0a975520d49505491170491178492180004921880097cc20d46c0c951850977720d427079512707b17507b1c587b15607b1a68330a04017c87017c8b027c8c037c8697770897bb1097cc18d467077c86047c8505d4cb0b7c8c067c8907975508d4650597cc10979918d4c909958808d4b707d45909979920d497077b2795220895aaff520ab482177082187882198000821a8800821b487bb77bb8087bb9107bba188210a00082159800821690009511a8003200828908330a13ac9a0a3308017b783200951160ff7b1098007b1590007b1688007b17088287959aec9576147c75107c79117c73127c70137c747c72017c7b027c7c037b867b8a08979908d459097b197c7a047c79057c75067c760797331097001897220897bb1097cc18979908d43003d44202d4bc00d4a9047c7a087c7b097c790a7c7c0b97551097661897bb0897991097cc18d46505d4ba0a7c7b0c7c760dd4c9097c7c0e7c770f976608d46b0b97cc10977718d4c707821cd4c30cd42006d44505d4a909d4b707975520977720d46505d497077b15487b17507a1c58951760502000012df482176051070d3307018218087b872842821768821870821978821a8000821b48821c508116587b18307b19387b1a407b1b107b1c187a16207b1728821508955708951810330938502002012ce64905018210980082159000821688009511a00032009511d87b10207b15187b16106495647c829608829a9788209889207a160c951b0c330764c87b1a0a040180180cac86368379330a0b821b7b5b7b5808ac9a1584770f9777023308a00001c887078177280633070c018210208215188216109511283200009511d89518088279827a08827b1082771848017b19087b1a107b1b187b172064879511d8827818827910827a8277087b182048017b1a087b17107b1918641733004e01287106645764685020060138052833077c67247c6b257c62267c6a277c631c7c681d7c691e7c6c1f97bb08d47b047c6b207c67217c60227c652397221097aa1897880897991097cc18977708d42a02d43803d49c0ad47b0b7c67147c69157c6c167c681797001097551897990897cc10978818d40505d479007c69187c6719d4c8087c6c1a7c661b977708d4970797cc10976618d46c0cd44209d43a0ad45b0bd40808d4c70797bb20977720d4ba0ad487077b17387b1a407a1948951938821795181050200a0144028210608215588216509511683200951148ff7b10b0007b15a8007b16a00064957b18086476951710646850200c014c04951710645850200e01bf02510708330728e900951750951810645950201001df029518507b16646750201201c404951730821808502014011204821930821a388257825808c87906c8a808d8a80bae960d958801888901c89b0b01821a40825910c8a909d8a90a821708510b0fc89b0bd89b09c89a0a64b901821c48825b18c8cb0bd8cb0c510a10520c8300c8ba0ad8ba0c64ab01520c767b16507b18587b19607b1b68951850647650201601430446117001951771330914821850201801b6e3462185000195178600330914646850201a01a2e38257825808825910825a187b17507b18587b19607b1a6895175050201c0117f2330702018210b0008215a8008216a0009511b8003200009511b07b10487b15407b16387b193309180001330a000013330b00407b19087b17107b18187b1a207b1b2849113095170895182050201e013702821728821530ac5747821620c95707c856087b18207b172849113095182082173300200133029c00282705821828821730ac781c821a2050222201e6040a06821048821540821638951150320000ac687950222601de0450202801e8f0821c28acc56795c71facc7618477e0957a44ac7a58c9c505aca552551c211495173882181064c950202a01a7e22813821710c8c709951b3864c850202c01ecf7821738821840821948821a50330be07b17187b18207b19287b1a30aeb60f956520821708ac570628e703009511887b10707b15687b166064753307180001330a000013330b00407b177b18087b19107b1a287b1b30491138641795182850202e013701821930821838ac8977821728c98909c8870a7b1a187b192095191850203001fffb8377330803aa873b52170d548217188218207b17507b1858951728951850502032011e0182172852073581163095183495570433091c50203401d4e17a5628103307490549150849151049151801821070821568821660951178320000958a20957718330ce00164c2510c1b827982abf895a3f89577f8952c08643aaab9ebd8b90a2807330a648301d338078e77db2a0732009511f87b158293829b08829a108284828c08ae3417d8bc0585b2ffd3cb0bc8c20288bc01c85c0c2809c9bc02d8bc0c01828510829b18c9a509d8a50a510c0dd8c905c9c909c85a0a01828518c93408c9b50c510a11d8b50bd8ac05c9ac0cd45b0a2806d8b50a017b787b72087b79107b7c18520a0a82159511083200009511e87b10107b15087b16647582778177648650203601daee825708646850203801f0ee825710646828b5029511a07b10587b15507b16486486647595172050203a016fee821720520720821728821830821938821a40826b087b177b18087b19107b1a18510b17330701017b57821058821550821648951160320033078218821908821a10821b187b58087b59107b5a187b5b2028d700848bff00330a0000133309021e03000013ab9b0a330833090128091e0301001301019511f87b10c89a0b95990178b833080000130a05009511a07b10587b15507b16486489647533070000137b17104911180040491120951810649750203e01ea00821918821820ac8974821710c98909c8870a7b1a7b1908641950204001d6f98377330803aa873a52170d5382178218087b17387b184095171095183850204201f6fe82171052073581161895181c95570433091c50204401acdf7a56281033074905491508491510491518018210588215508216489511603200009511c87b10307b15287b16207b1833080000137b180849111000404911189518085020460148821710821518ac573c821608c95707c856087b18087b171049111895180882173300480133029c00285b01821810821718ac7811821a0850224a011a010a0628f600009511e87b10107b15087b16648564763307e7dc232650204c01faec6467645828e100009511e07b101881793308000013330a00407b187b1a085109181f03000013010133090201330800001333070a05009577081e030000134911100164183300500133029c0028d90082191052090b33080133070a050053290140cf0082178218088219107b577b58087b591082102882152082161895113032009518183309208217105020540177de82177b75108210688215608216589511703200821728951840951948db78097b9782106082155882165095116832008217951818951920db78097b978210308215289511383200821030821528821620951138320082101082150882169511182825ec975920989920977720987b203307646832027b1782777b1808c96805c867077b17107b17187b1520491128951818649732029511987b10607b15587b16507b1849110849111049111849112095180832029511907b10687b15607b1658648982780882761049113849114049114849115032027b56108210108215088216951118320049b250522925499228294992542649299324a529499324252955495232494aca242969925252322925254995525252524a12c9244952929a9414911422144224e49488249284902422221289881212111121229242a410891091109190442422224244248548211221222122218990481291149224499224499224499224499224494a922449129144224924124949922449922449922449922449922449929224a2482449124992882449922449121111111122918888888888888888848814920a91424442222199241212091144142222928808851011111122222292888824898888884842424aa288888888482222852a49922422a28488848814922422228208112122912891888824492122a21091949289a4424292a48824492a4991245228a29244922422a21021114992544945228988144a9288884a9224898888424448124914222222441492480a11111122424422918c44920a154912496a444444448414898808110a917048082421894452480a92044544444424495244449224491289484292942449524992244912a9202141821424499224894892952429422441922422122449222241922484aa2099946492949494545252d0524a4a529094a40a928264499224495292244990142422a28484842448928894a02411294192489224494192142449299924152424494a92204912244112912449925450499224a9242922a2495248480a9224499222922441192984d4495249522249a49414940a4a4a92a409822449924452509282244992244926a9244944525290492509ca2ca592542a49aa240595945452922549922449499224212924492a419294a2495249920a929224a52a549a24894a9224914812294b92a4a05441a1422993a4144092a449a5509652080985908410264942c25493244152922a240549924a829252244925494a9049528824421249244a129224529090928224499224499244922441124a121249004992a4899224493a8504d288882449922449922449922449922449922449922425499224494a922449922449922449929224499288244992249394244992244992a42449444a121151925444444a92a424252949922449922449922449922449499224499220492a492449922449123422a224a9942455935249125299244d4a529294a4a424452a489224499224499224499224499224499224499224495282242922a2948214a42405a9200992922449264992a44992489a24494124052152509224499011114d924288244992204992242922491294244d102449922492829214244992244932490a214a9294204992244149244912244912542599244db2942425d5945249499224259324492649929425496992aa8214a4244925489224254996245592246984849482292934492a2424054992948292284912244912542599244d92424212922449922292244199a40a82caa41025810c35218a48921a969424494982922425494952494a52929494244955499224952425494a92922429490900","build_info":{"rust_toolchain":"stable-aarch64-apple-darwin","cargo_contract_version":"6.0.0-beta","build_mode":"Release"}},"contract":{"name":"erc20","version":"6.0.0-beta","authors":["Use Ink "]},"image":null,"version":6,"types":[{"id":0,"type":{"path":["primitive_types","U256"],"def":{"composite":{"fields":[{"type":1,"typeName":"[u64; 4]"}]}}}},{"id":1,"type":{"def":{"array":{"len":4,"type":2}}}},{"id":2,"type":{"def":{"primitive":"u64"}}},{"id":3,"type":{"path":["ink_storage","lazy","mapping","Mapping"],"params":[{"name":"K","type":4},{"name":"V","type":0},{"name":"KeyType","type":7}],"def":{"composite":{}}}},{"id":4,"type":{"path":["primitive_types","H160"],"def":{"composite":{"fields":[{"type":5,"typeName":"[u8; 20]"}]}}}},{"id":5,"type":{"def":{"array":{"len":20,"type":6}}}},{"id":6,"type":{"def":{"primitive":"u8"}}},{"id":7,"type":{"path":["ink_storage_traits","impls","ResolverKey"],"params":[{"name":"L","type":8},{"name":"R","type":9}],"def":{"composite":{}}}},{"id":8,"type":{"path":["ink_storage_traits","impls","AutoKey"],"def":{"composite":{}}}},{"id":9,"type":{"path":["ink_storage_traits","impls","ManualKey"],"params":[{"name":"ParentKey","type":10}],"def":{"composite":{}}}},{"id":10,"type":{"def":{"tuple":[]}}},{"id":11,"type":{"path":["ink_storage","lazy","mapping","Mapping"],"params":[{"name":"K","type":12},{"name":"V","type":0},{"name":"KeyType","type":13}],"def":{"composite":{}}}},{"id":12,"type":{"def":{"tuple":[4,4]}}},{"id":13,"type":{"path":["ink_storage_traits","impls","ResolverKey"],"params":[{"name":"L","type":8},{"name":"R","type":14}],"def":{"composite":{}}}},{"id":14,"type":{"path":["ink_storage_traits","impls","ManualKey"],"params":[{"name":"ParentKey","type":10}],"def":{"composite":{}}}},{"id":15,"type":{"path":["erc20","erc20","Erc20"],"def":{"composite":{"fields":[{"name":"total_supply","type":0,"typeName":",>>::Type"},{"name":"balances","type":3,"typeName":" as::ink::storage::traits::AutoStorableHint\n<::ink::storage::traits::ManualKey<639884519u32, ()>,>>::Type"},{"name":"allowances","type":11,"typeName":" as::ink::storage::traits::\nAutoStorableHint<::ink::storage::traits::ManualKey<3969917367u32,\n()>,>>::Type"}]}}}},{"id":16,"type":{"path":["Result"],"params":[{"name":"T","type":10},{"name":"E","type":17}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":10}],"index":0},{"name":"Err","fields":[{"type":17}],"index":1}]}}}},{"id":17,"type":{"path":["ink_primitives","LangError"],"def":{"variant":{"variants":[{"name":"CouldNotReadInput","index":1}]}}}},{"id":18,"type":{"path":["Result"],"params":[{"name":"T","type":0},{"name":"E","type":17}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":0}],"index":0},{"name":"Err","fields":[{"type":17}],"index":1}]}}}},{"id":19,"type":{"path":["Result"],"params":[{"name":"T","type":20},{"name":"E","type":17}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":20}],"index":0},{"name":"Err","fields":[{"type":17}],"index":1}]}}}},{"id":20,"type":{"path":["Result"],"params":[{"name":"T","type":10},{"name":"E","type":21}],"def":{"variant":{"variants":[{"name":"Ok","fields":[{"type":10}],"index":0},{"name":"Err","fields":[{"type":21}],"index":1}]}}}},{"id":21,"type":{"path":["erc20","erc20","Error"],"def":{"variant":{"variants":[{"name":"InsufficientBalance","index":0},{"name":"InsufficientAllowance","index":1}]}}}},{"id":22,"type":{"path":["Option"],"params":[{"name":"T","type":4}],"def":{"variant":{"variants":[{"name":"None","index":0},{"name":"Some","fields":[{"type":4}],"index":1}]}}}},{"id":23,"type":{"path":["ink_primitives","types","AccountId"],"def":{"composite":{"fields":[{"type":24,"typeName":"[u8; 32]"}]}}}},{"id":24,"type":{"def":{"array":{"len":32,"type":6}}}},{"id":25,"type":{"def":{"primitive":"u128"}}},{"id":26,"type":{"path":["ink_primitives","types","Hash"],"def":{"composite":{"fields":[{"type":24,"typeName":"[u8; 32]"}]}}}},{"id":27,"type":{"def":{"primitive":"u32"}}}],"storage":{"root":{"root_key":"0x00000000","layout":{"struct":{"name":"Erc20","fields":[{"name":"total_supply","layout":{"leaf":{"key":"0x00000000","ty":0}}},{"name":"balances","layout":{"root":{"root_key":"0xe7dc2326","layout":{"leaf":{"key":"0xe7dc2326","ty":0}},"ty":3}}},{"name":"allowances","layout":{"root":{"root_key":"0xb721a0ec","layout":{"leaf":{"key":"0xb721a0ec","ty":0}},"ty":11}}}]}},"ty":15}},"spec":{"constructors":[{"label":"new","selector":"0x9bae9d5e","payable":false,"args":[{"label":"total_supply","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":16,"displayName":["ink_primitives","ConstructorResult"]},"docs":["Creates a new ERC-20 contract with the specified initial supply."],"default":false}],"messages":[{"label":"total_supply","selector":"0xdb6375a8","mutates":false,"payable":false,"args":[],"returnType":{"type":18,"displayName":["ink","MessageResult"]},"docs":[" Returns the total token supply."],"default":false},{"label":"balance_of","selector":"0x0f755a56","mutates":false,"payable":false,"args":[{"label":"owner","type":{"type":4,"displayName":["Address"]}}],"returnType":{"type":18,"displayName":["ink","MessageResult"]},"docs":[" Returns the account balance for the specified `owner`.",""," Returns `0` if the account is non-existent."],"default":false},{"label":"allowance","selector":"0x6a00165e","mutates":false,"payable":false,"args":[{"label":"owner","type":{"type":4,"displayName":["Address"]}},{"label":"spender","type":{"type":4,"displayName":["Address"]}}],"returnType":{"type":18,"displayName":["ink","MessageResult"]},"docs":[" Returns the amount which `spender` is still allowed to withdraw from `owner`.",""," Returns `0` if no allowance has been set."],"default":false},{"label":"transfer","selector":"0x84a15da1","mutates":true,"payable":false,"args":[{"label":"to","type":{"type":4,"displayName":["Address"]}},{"label":"value","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":19,"displayName":["ink","MessageResult"]},"docs":[" Transfers `value` amount of tokens from the caller's account to account `to`.",""," On success a `Transfer` event is emitted.",""," # Errors",""," Returns `InsufficientBalance` error if there are not enough tokens on"," the caller's account balance."],"default":false},{"label":"approve","selector":"0x681266a0","mutates":true,"payable":false,"args":[{"label":"spender","type":{"type":4,"displayName":["Address"]}},{"label":"value","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":19,"displayName":["ink","MessageResult"]},"docs":[" Allows `spender` to withdraw from the caller's account multiple times, up to"," the `value` amount.",""," If this function is called again it overwrites the current allowance with"," `value`.",""," An `Approval` event is emitted."],"default":false},{"label":"transfer_from","selector":"0x0b396f18","mutates":true,"payable":false,"args":[{"label":"from","type":{"type":4,"displayName":["Address"]}},{"label":"to","type":{"type":4,"displayName":["Address"]}},{"label":"value","type":{"type":0,"displayName":["U256"]}}],"returnType":{"type":19,"displayName":["ink","MessageResult"]},"docs":[" Transfers `value` tokens on the behalf of `from` to the account `to`.",""," This can be used to allow a contract to transfer tokens on ones behalf and/or"," to charge fees in sub-currencies, for example.",""," On success a `Transfer` event is emitted.",""," # Errors",""," Returns `InsufficientAllowance` error if there are not enough tokens allowed"," for the caller to withdraw from `from`.",""," Returns `InsufficientBalance` error if there are not enough tokens on"," the account balance of `from`."],"default":false}],"events":[{"label":"Transfer","module_path":"erc20::erc20","signature_topic":"0x2bf04b1fcc64de43ce9704e9ccdc0657018c43d01c3e88bceed23cba23a10f5c","args":[{"label":"from","indexed":true,"type":{"type":22,"displayName":["Option"]},"docs":[]},{"label":"to","indexed":true,"type":{"type":22,"displayName":["Option"]},"docs":[]},{"label":"value","indexed":false,"type":{"type":0,"displayName":["U256"]},"docs":[]}],"docs":["Event emitted when a token transfer occurs."]},{"label":"Approval","module_path":"erc20::erc20","signature_topic":"0xa1d96b3a6e369c8b0ee68c99cb4406104190a21b35f7ef8fa2bcef30a78efc1a","args":[{"label":"owner","indexed":true,"type":{"type":4,"displayName":["Address"]},"docs":[]},{"label":"spender","indexed":true,"type":{"type":4,"displayName":["Address"]},"docs":[]},{"label":"value","indexed":false,"type":{"type":0,"displayName":["U256"]},"docs":[]}],"docs":["Event emitted when an approval occurs that `spender` is allowed to withdraw","up to the amount of `value` tokens from `owner`."]}],"docs":[],"lang_error":{"type":17,"displayName":["ink","LangError"]},"environment":{"accountId":{"type":23,"displayName":["AccountId"]},"balance":{"type":25,"displayName":["Balance"]},"hash":{"type":26,"displayName":["Hash"]},"timestamp":{"type":2,"displayName":["Timestamp"]},"blockNumber":{"type":27,"displayName":["BlockNumber"]},"nativeToEthRatio":100000000,"staticBufferSize":16384}}} \ No newline at end of file From 103356c450ab2495ef865115a2d5b68b6d9cf203 Mon Sep 17 00:00:00 2001 From: AlexD10S Date: Mon, 10 Nov 2025 10:41:18 +0100 Subject: [PATCH 5/6] fix: issue Address <> H160 and tests --- cypress/e2e/contracts/erc20.spec.ts | 22 +++++++++-------- cypress/e2e/contracts/mother.spec.ts | 11 +++++---- src/lib/callOptions.ts | 11 +++++---- src/lib/initValue.ts | 36 +++++++++++++++++++++------- src/ui/hooks/useArgValues.ts | 36 +++++++++++++++++++++------- src/ui/hooks/useStoredContract.ts | 18 ++++++++++++-- 6 files changed, 96 insertions(+), 38 deletions(-) diff --git a/cypress/e2e/contracts/erc20.spec.ts b/cypress/e2e/contracts/erc20.spec.ts index bd40a790..a448d523 100644 --- a/cypress/e2e/contracts/erc20.spec.ts +++ b/cypress/e2e/contracts/erc20.spec.ts @@ -54,11 +54,11 @@ describe('ERC20 Contract ', () => { it(`transfers ${transferValue} Units to another account`, () => { selectMessage('transfer', 3); cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(3).click(); - cy.get('.form-field.value').find('input[type="number"]').type(`${transferValue}`); + cy.get('.form-field.value').find('input[type="number"]').eq(0).type(`${transferValue}`); assertCall(); selectMessage('balanceOf', 1); - - cy.get('.form-field.owner').find('.dropdown').click().find('.dropdown__option').eq(3).click(); + console.log(initialSupply - transferValue); + cy.get('.form-field.owner').find('.dropdown').click().find('.dropdown__option').eq(0).click(); assertReturnValue('balanceOf', `${initialSupply - transferValue}`); }); @@ -66,9 +66,10 @@ describe('ERC20 Contract ', () => { it(`successfully approves allowance`, () => { selectMessage('approve', 4); cy.get('.form-field.spender').find('.dropdown').click().find('.dropdown__option').eq(2).click(); - cy.get('.form-field.value').find('input[type="number"]').type(`${allowance}`); + cy.get('.form-field.value').find('input[type="number"]').eq(0).type(`${allowance}`); assertCall(); selectMessage('allowance', 2); + cy.get('.form-field.owner').find('.dropdown').click().find('.dropdown__option').eq(0).click(); cy.get('.form-field.spender').find('.dropdown').click().find('.dropdown__option').eq(2).click(); assertReturnValue('allowance', `${allowance}`); }); @@ -76,13 +77,14 @@ describe('ERC20 Contract ', () => { it(`transfers ${transferValue} on behalf of alice`, () => { cy.get('.form-field.caller').click().find('.dropdown__option').eq(2).click(); selectMessage('transferFrom', 5); + cy.get('.form-field.from').find('.dropdown').click().find('.dropdown__option').eq(0).click(); cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(2).click(); - cy.get('.form-field.to') - .find("input[type='text']") - .clear() - .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); - cy.get('.form-field.value').find('input[type="number"]').type(`${transferValue}`); + // cy.get('.form-field.to') + // .find("input[type='text']") + // .clear() + // .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') + // .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); + cy.get('.form-field.value').find('input[type="number"]').eq(0).type(`${transferValue}`); assertCall(); selectMessage('balanceOf', 1); cy.get('.form-field.owner').find('.dropdown').click().find('.dropdown__option').eq(2).click(); diff --git a/cypress/e2e/contracts/mother.spec.ts b/cypress/e2e/contracts/mother.spec.ts index c65a8b37..aae24f4d 100644 --- a/cypress/e2e/contracts/mother.spec.ts +++ b/cypress/e2e/contracts/mother.spec.ts @@ -8,6 +8,7 @@ import { assertMoveToStep3, assertContractRedirect, assertInstantiate, + selectAccount, } from '../../support/util'; describe('Mother Contract ', () => { @@ -76,12 +77,14 @@ describe('Mother Contract ', () => { .within(() => { cy.get('[data-cy="switch-button"]').click(); cy.contains('0: H160').should('be.visible'); - cy.get("input[type='text']") - .clear() - .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); + // cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(3).click(); + // cy.get("input[type='text']") + // .clear() + // .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') + // .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); cy.contains('1: u128').should('be.visible'); cy.get("input[type='number']").should('have.lengthOf', 1).type('99999'); + selectAccount('bob', 2); }); }); }); diff --git a/src/lib/callOptions.ts b/src/lib/callOptions.ts index c88673fe..d9b20252 100644 --- a/src/lib/callOptions.ts +++ b/src/lib/callOptions.ts @@ -57,7 +57,7 @@ export function transformUserInput( messageArgs: AbiParam[], values?: Record, ): unknown[] { - return messageArgs.map(({ name, type: { type } }) => { + return messageArgs.map(({ name, type: { type, displayName } }) => { const value = values ? values[name] : null; if (type === 'Balance') { @@ -66,10 +66,11 @@ export function transformUserInput( if (type === 'U256') { return registry.createType('U256', value); } - // TODO: CHeck this, not getting value for Address. - // if (type === 'Address') { - // return registry.createType('H160', value); - // } + + // H160 and Address types need explicit type creation + if (type === 'H160' || type === 'Address' || displayName?.includes('Address')) { + return registry.createType('H160', value); + } return value; }); diff --git a/src/lib/initValue.ts b/src/lib/initValue.ts index 78c2360d..ea1d4430 100644 --- a/src/lib/initValue.ts +++ b/src/lib/initValue.ts @@ -6,42 +6,52 @@ import type { Registry, TypeDef } from '@polkadot/types/types'; import { getTypeDef } from '@polkadot/types'; import { TypeDefInfo } from '@polkadot/types/types'; +import { decodeAddress } from '@polkadot/keyring'; import { BN_ZERO, isBn } from './bn'; import { Account } from 'types'; +import { toEthAddress } from './address'; +import type { InkVersion } from 'ui/contexts/VersionContext'; const warnList: string[] = []; -export function getInitValue(registry: Registry, accounts: Account[], def: TypeDef): unknown { +export function getInitValue( + registry: Registry, + accounts: Account[], + def: TypeDef, + version?: InkVersion, +): unknown { if (def.info === TypeDefInfo.Si) { const lookupTypeDef = registry.lookup.getTypeDef(def.lookupIndex as number); - return getInitValue(registry, accounts, lookupTypeDef); + return getInitValue(registry, accounts, lookupTypeDef, version); } else if (def.info === TypeDefInfo.Option) { return null; } else if (def.info === TypeDefInfo.Vec) { - return [getInitValue(registry, accounts, def.sub as TypeDef)]; + return [getInitValue(registry, accounts, def.sub as TypeDef, version)]; } else if (def.info === TypeDefInfo.VecFixed) { const value = []; const length = def.length as number; for (let i = 0; i < length; i++) { - value.push(getInitValue(registry, accounts, def.sub as TypeDef)); + value.push(getInitValue(registry, accounts, def.sub as TypeDef, version)); } return value; } else if (def.info === TypeDefInfo.Tuple) { - return Array.isArray(def.sub) ? def.sub.map(def => getInitValue(registry, accounts, def)) : []; + return Array.isArray(def.sub) + ? def.sub.map(def => getInitValue(registry, accounts, def, version)) + : []; } else if (def.info === TypeDefInfo.Struct) { return Array.isArray(def.sub) ? def.sub.reduce((result: Record, def): Record => { - result[def.name as string] = getInitValue(registry, accounts, def); + result[def.name as string] = getInitValue(registry, accounts, def, version); return result; }, {}) : {}; } else if (def.info === TypeDefInfo.Enum) { return Array.isArray(def.sub) - ? { [def.sub[0].name as string]: getInitValue(registry, accounts, def.sub[0]) } + ? { [def.sub[0].name as string]: getInitValue(registry, accounts, def.sub[0], version) } : {}; } @@ -117,8 +127,16 @@ export function getInitValue(registry: Registry, accounts: Account[], def: TypeD return ''; } - case 'AccountIdOf': case 'Address': + try { + const address = accounts[0].address; + // ink v6 uses H160 (Ethereum-style) addresses + return version === 'v6' ? toEthAddress(decodeAddress(address)) : address; + } catch (e) { + return ''; + } + + case 'AccountIdOf': case 'Call': case 'CandidateReceipt': case 'Digest': @@ -151,7 +169,7 @@ export function getInitValue(registry: Registry, accounts: Account[], def: TypeD } else if ([TypeDefInfo.Struct].includes(raw.info)) { return undefined; } else if ([TypeDefInfo.Enum, TypeDefInfo.Tuple].includes(raw.info)) { - return getInitValue(registry, accounts, raw); + return getInitValue(registry, accounts, raw, version); } } catch (e) { error = (e as Error).message; diff --git a/src/ui/hooks/useArgValues.ts b/src/ui/hooks/useArgValues.ts index fbea65e0..5cd17d62 100644 --- a/src/ui/hooks/useArgValues.ts +++ b/src/ui/hooks/useArgValues.ts @@ -2,18 +2,24 @@ // SPDX-License-Identifier: GPL-3.0-only import { useEffect, useMemo, useRef, useState } from 'react'; -import { useApi } from 'ui/contexts/ApiContext'; +import { useApi, useVersion } from 'ui/contexts'; import { AbiMessage, AbiParam, Account, Registry, SetState } from 'types'; import { getInitValue } from 'lib/initValue'; import { transformUserInput } from 'lib/callOptions'; +import type { InkVersion } from 'ui/contexts/VersionContext'; type ArgValues = Record; -function fromArgs(registry: Registry, accounts: Account[], args: AbiParam[]): ArgValues { +function fromArgs( + registry: Registry, + accounts: Account[], + args: AbiParam[], + version?: InkVersion, +): ArgValues { const result: ArgValues = {}; args?.forEach(({ name, type }) => { - result[name] = getInitValue(registry, accounts, type); + result[name] = getInitValue(registry, accounts, type, version); }); return result; @@ -24,27 +30,41 @@ export function useArgValues( registry: Registry, ): [ArgValues, SetState, Uint8Array | undefined] { const { accounts } = useApi(); + const { version } = useVersion(); const [value, setValue] = useState( - accounts && message ? fromArgs(registry, accounts, message.args) : {}, + accounts && message ? fromArgs(registry, accounts, message.args, version) : {}, ); const argsRef = useRef(message?.args ?? []); const inputData = useMemo(() => { let data: Uint8Array | undefined; try { - data = message?.toU8a(transformUserInput(registry, message.args, value)); + // WORKAROUND: ink v6 Address/H160 encoding - patch args for dry run calls + if (version === 'v6' && message) { + const patchedArgs = message.args.map(arg => { + if (arg.type.type === 'Address') { + return { ...arg, type: { ...arg.type, type: 'H160' } }; + } + return arg; + }); + + const patchedMessage = { ...message, args: patchedArgs }; + data = patchedMessage.toU8a(transformUserInput(registry, patchedArgs, value)); + } else { + data = message?.toU8a(transformUserInput(registry, message.args, value)); + } } catch (e) { console.error(e); } return data; - }, [value, registry, message]); + }, [value, registry, message, version]); useEffect((): void => { if (accounts && message && argsRef.current !== message.args) { - setValue(fromArgs(registry, accounts, message.args)); + setValue(fromArgs(registry, accounts, message.args, version)); argsRef.current = message.args; } - }, [accounts, message, registry]); + }, [accounts, message, registry, version]); return [value, setValue, inputData]; } diff --git a/src/ui/hooks/useStoredContract.ts b/src/ui/hooks/useStoredContract.ts index 67d4286c..51c6d703 100644 --- a/src/ui/hooks/useStoredContract.ts +++ b/src/ui/hooks/useStoredContract.ts @@ -4,13 +4,14 @@ import { useLiveQuery } from 'dexie-react-hooks'; import { useNavigate } from 'react-router-dom'; import { useState } from 'react'; -import { useApi, useDatabase } from 'ui/contexts'; +import { useApi, useDatabase, useVersion } from 'ui/contexts'; import { ContractDocument, ContractPromise, UIContract } from 'types'; export function useStoredContract(address: string): UIContract | undefined { const navigate = useNavigate(); const { api } = useApi(); const { db } = useDatabase(); + const { version } = useVersion(); const [contract, setContract] = useState(); const [document, setDocument] = useState(); @@ -24,10 +25,23 @@ export function useStoredContract(address: string): UIContract | undefined { navigate('/'); } else { const c = new ContractPromise(api, d.abi, address); + + // WORKAROUND: ink v6 uses Address as a type alias for H160, but polkadot.js + // encodes them differently. Patch the ABI to use H160 for consistent encoding. + if (version === 'v6') { + c.abi.messages.forEach(message => { + message.args.forEach(arg => { + if (arg.type.type === 'Address') { + arg.type.type = 'H160'; + } + }); + }); + } + setDocument(d); setContract(c); } - }, [address]); + }, [address, version]); if (!document || !contract) return undefined; From cc8243043bbcf80e21ad07640be87c12467103c8 Mon Sep 17 00:00:00 2001 From: AlexD10S Date: Mon, 10 Nov 2025 10:52:13 +0100 Subject: [PATCH 6/6] refactor: clean up code --- cypress/e2e/contracts/erc20.spec.ts | 5 ----- cypress/e2e/contracts/mother.spec.ts | 5 ----- src/ui/hooks/useArgValues.ts | 1 - src/ui/hooks/useStoredContract.ts | 2 +- 4 files changed, 1 insertion(+), 12 deletions(-) diff --git a/cypress/e2e/contracts/erc20.spec.ts b/cypress/e2e/contracts/erc20.spec.ts index a448d523..5d9f1bb7 100644 --- a/cypress/e2e/contracts/erc20.spec.ts +++ b/cypress/e2e/contracts/erc20.spec.ts @@ -79,11 +79,6 @@ describe('ERC20 Contract ', () => { selectMessage('transferFrom', 5); cy.get('.form-field.from').find('.dropdown').click().find('.dropdown__option').eq(0).click(); cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(2).click(); - // cy.get('.form-field.to') - // .find("input[type='text']") - // .clear() - // .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - // .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); cy.get('.form-field.value').find('input[type="number"]').eq(0).type(`${transferValue}`); assertCall(); selectMessage('balanceOf', 1); diff --git a/cypress/e2e/contracts/mother.spec.ts b/cypress/e2e/contracts/mother.spec.ts index aae24f4d..8919a301 100644 --- a/cypress/e2e/contracts/mother.spec.ts +++ b/cypress/e2e/contracts/mother.spec.ts @@ -77,11 +77,6 @@ describe('Mother Contract ', () => { .within(() => { cy.get('[data-cy="switch-button"]').click(); cy.contains('0: H160').should('be.visible'); - // cy.get('.form-field.to').find('.dropdown').click().find('.dropdown__option').eq(3).click(); - // cy.get("input[type='text']") - // .clear() - // .type('0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01') - // .should('have.value', '0x41dccbd49b26c50d34355ed86ff0fa9e489d1e01'); cy.contains('1: u128').should('be.visible'); cy.get("input[type='number']").should('have.lengthOf', 1).type('99999'); selectAccount('bob', 2); diff --git a/src/ui/hooks/useArgValues.ts b/src/ui/hooks/useArgValues.ts index 5cd17d62..53858fe3 100644 --- a/src/ui/hooks/useArgValues.ts +++ b/src/ui/hooks/useArgValues.ts @@ -39,7 +39,6 @@ export function useArgValues( const inputData = useMemo(() => { let data: Uint8Array | undefined; try { - // WORKAROUND: ink v6 Address/H160 encoding - patch args for dry run calls if (version === 'v6' && message) { const patchedArgs = message.args.map(arg => { if (arg.type.type === 'Address') { diff --git a/src/ui/hooks/useStoredContract.ts b/src/ui/hooks/useStoredContract.ts index 51c6d703..a47e9240 100644 --- a/src/ui/hooks/useStoredContract.ts +++ b/src/ui/hooks/useStoredContract.ts @@ -26,7 +26,7 @@ export function useStoredContract(address: string): UIContract | undefined { } else { const c = new ContractPromise(api, d.abi, address); - // WORKAROUND: ink v6 uses Address as a type alias for H160, but polkadot.js + // TODO: Temporary workaround: ink v6 uses Address as a type alias for H160, but polkadot.js // encodes them differently. Patch the ABI to use H160 for consistent encoding. if (version === 'v6') { c.abi.messages.forEach(message => {