From 4beb05bd8ca5467c12ed79ddf5571146e11dafea Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 10:23:53 +0700 Subject: [PATCH 01/13] chore: init bcs test --- test/bcs.js | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 test/bcs.js diff --git a/test/bcs.js b/test/bcs.js new file mode 100644 index 00000000..5bbd9ab2 --- /dev/null +++ b/test/bcs.js @@ -0,0 +1,9 @@ +const { getITSChannelId } = require('./testutils'); +const { bcsStructs } = require('../dist/bcs'); +const { expect } = require('chai'); +describe('BCS', () => { + it('should decode ITS_V0 object successfully', async () => { + //const itsV0 = + const channelId = await getITSChannelId(client, objectIds.itsv0); + }); +}); From 583aa7ebb4da7e1e8ed3edf9fdb446cdd72e839b Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 15:30:48 +0700 Subject: [PATCH 02/13] feat: update its types --- src/bcs.ts | 25 +++++++++++++++++++++---- test/bcs.js | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/bcs.ts b/src/bcs.ts index 4339d6e0..93d123d5 100644 --- a/src/bcs.ts +++ b/src/bcs.ts @@ -26,11 +26,19 @@ function getCommonStructs() { fields: DiscoveryTable, }); + const VecSet = bcs.struct('VecSet', { + contents: bcs.vector(bcs.string()), + }); + const Table = bcs.struct('Table', { id: UID, size: bcs.U64, }); + const VersionControl = bcs.struct('VersionControl', { + allowed_functions: bcs.vector(VecSet), + }); + return { Bytes32, Channel, @@ -39,6 +47,8 @@ function getCommonStructs() { DiscoveryTable, Discovery, Table, + VersionControl, + VecSet, }; } @@ -187,7 +197,7 @@ function getSquidStructs() { } function getITSStructs() { - const { Table, Bag, Channel } = getCommonStructs(); + const { Table, Bag, Channel, VersionControl } = getCommonStructs(); const InterchainAddressTracker = bcs.struct('InterchainAddressTracker', { trusted_addresses: Table, @@ -198,14 +208,21 @@ function getITSStructs() { trusted_addresses: bcs.vector(bcs.string()), }); - const ITS = bcs.struct('ITS', { - id: UID, + const ITSV0 = bcs.struct('ITSV0', { channel: Channel, address_tracker: InterchainAddressTracker, unregistered_coin_types: Table, - unregistered_coin_info: Bag, + unregistered_coins: Bag, registered_coin_types: Table, registered_coins: Bag, + relayer_discovery_id: bcs.Address, + version_control: VersionControl, + }); + + const ITS = bcs.struct('ITS', { + id: UID, + name: bcs.u64(), + value: ITSV0, }); return { diff --git a/test/bcs.js b/test/bcs.js index 5bbd9ab2..fb02dcb2 100644 --- a/test/bcs.js +++ b/test/bcs.js @@ -1,9 +1,40 @@ -const { getITSChannelId } = require('./testutils'); const { bcsStructs } = require('../dist/bcs'); +const { fromHEX } = require('@mysten/bcs'); const { expect } = require('chai'); -describe('BCS', () => { - it('should decode ITS_V0 object successfully', async () => { - //const itsV0 = - const channelId = await getITSChannelId(client, objectIds.itsv0); + +// The following hex data is derived from the bcs bytes from the client.getObject() call. +const hexData = { + ITSV0: '7d262a840033c9b6bc7a31d8ddf12bff891c6db6253dd5b8cf331bccd531a81e00000000000000006ccb9729af3569630b9171a0c1fd3eae9797d8122794be5d8cd01061b1dfcb86270c7f8b9757b05777d3cbf98fa1bb197e1f5a18c8ff7a8ef16e80bedf39a67f000000000000000000c101dbc800d8cf853e6d21c916aba7c92e4c2692527dc951c777dae15cf474000000000000000044bacbed87a2d5f871ce96f3245a293b936fb287605330b3859649f3a2697668000000000000000013bd4dc87b61a82ce5959e3ea8c3fed1e03d9c1f7246eef82722354d8e3c0d540000000000000000e5855b758d21f521071672cbce153167d49b4d15f11f5ca47528117312c2c1fa00000000000000000000000000000000000000000000000000000000000000000000000000000000010c0d72656769737465725f636f696e1e6465706c6f795f72656d6f74655f696e746572636861696e5f746f6b656e1873656e645f696e746572636861696e5f7472616e736665721b726563656976655f696e746572636861696e5f7472616e7366657225726563656976655f696e746572636861696e5f7472616e736665725f776974685f646174611f726563656976655f6465706c6f795f696e746572636861696e5f746f6b656e16676976655f756e726567697374657265645f636f696e136d696e745f61735f6469737472696275746f72166d696e745f746f5f61735f6469737472696275746f72136275726e5f61735f6469737472696275746f72157365745f747275737465645f6164647265737365731472656769737465725f7472616e73616374696f6e', +}; + +describe.only('BCS', () => { + it('should decode ITS_V0 object successfully', () => { + const its = bcsStructs.its.ITS.parse(fromHEX(hexData.ITSV0)).value; + + const checkIdAndSize = (obj, expectedId) => { + expect(obj).to.deep.include({ id: expectedId, size: '0' }); + }; + + checkIdAndSize(its.address_tracker.trusted_addresses, '270c7f8b9757b05777d3cbf98fa1bb197e1f5a18c8ff7a8ef16e80bedf39a67f'); + checkIdAndSize(its.unregistered_coin_types, '00c101dbc800d8cf853e6d21c916aba7c92e4c2692527dc951c777dae15cf474'); + checkIdAndSize(its.unregistered_coins, '44bacbed87a2d5f871ce96f3245a293b936fb287605330b3859649f3a2697668'); + checkIdAndSize(its.registered_coin_types, '13bd4dc87b61a82ce5959e3ea8c3fed1e03d9c1f7246eef82722354d8e3c0d54'); + checkIdAndSize(its.registered_coins, 'e5855b758d21f521071672cbce153167d49b4d15f11f5ca47528117312c2c1fa'); + + expect(its.channel.id).to.equal('6ccb9729af3569630b9171a0c1fd3eae9797d8122794be5d8cd01061b1dfcb86'); + expect(its.relayer_discovery_id).to.equal('0x0000000000000000000000000000000000000000000000000000000000000000'); + + const allowedFunctions = its.version_control.allowed_functions[0].contents; + expect(allowedFunctions) + .to.be.an('array') + .that.includes( + 'register_coin', + 'deploy_remote_interchain_token', + 'send_interchain_transfer', + 'receive_interchain_transfer', + 'receive_interchain_transfer_with_data', + 'receive_deploy_interchain_token', + ); + expect(allowedFunctions).to.have.lengthOf(12); }); }); From c4e84cff4805797aca4ff387eb6fb0ee5ec26b21 Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 15:32:57 +0700 Subject: [PATCH 03/13] chore: move structs --- src/bcs.ts | 26 ++++++++++++++++---------- test/bcs.js | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/bcs.ts b/src/bcs.ts index 93d123d5..52ed161e 100644 --- a/src/bcs.ts +++ b/src/bcs.ts @@ -26,19 +26,11 @@ function getCommonStructs() { fields: DiscoveryTable, }); - const VecSet = bcs.struct('VecSet', { - contents: bcs.vector(bcs.string()), - }); - const Table = bcs.struct('Table', { id: UID, size: bcs.U64, }); - const VersionControl = bcs.struct('VersionControl', { - allowed_functions: bcs.vector(VecSet), - }); - return { Bytes32, Channel, @@ -47,8 +39,20 @@ function getCommonStructs() { DiscoveryTable, Discovery, Table, + }; +} + +function getVersionControlStructs() { + const VecSet = bcs.struct('VecSet', { + contents: bcs.vector(bcs.string()), + }); + + const VersionControl = bcs.struct('VersionControl', { + allowed_functions: bcs.vector(VecSet), + }); + + return { VersionControl, - VecSet, }; } @@ -197,7 +201,8 @@ function getSquidStructs() { } function getITSStructs() { - const { Table, Bag, Channel, VersionControl } = getCommonStructs(); + const { Table, Bag, Channel } = getCommonStructs(); + const { VersionControl } = getVersionControlStructs(); const InterchainAddressTracker = bcs.struct('InterchainAddressTracker', { trusted_addresses: Table, @@ -261,6 +266,7 @@ export const bcsStructs = { gateway: getGatewayStructs(), squid: getSquidStructs(), gmp: getGMPStructs(), + versionControl: getVersionControlStructs(), gasService: getGasServiceStructs(), its: getITSStructs(), }; diff --git a/test/bcs.js b/test/bcs.js index fb02dcb2..22a3b7a9 100644 --- a/test/bcs.js +++ b/test/bcs.js @@ -7,7 +7,7 @@ const hexData = { ITSV0: '7d262a840033c9b6bc7a31d8ddf12bff891c6db6253dd5b8cf331bccd531a81e00000000000000006ccb9729af3569630b9171a0c1fd3eae9797d8122794be5d8cd01061b1dfcb86270c7f8b9757b05777d3cbf98fa1bb197e1f5a18c8ff7a8ef16e80bedf39a67f000000000000000000c101dbc800d8cf853e6d21c916aba7c92e4c2692527dc951c777dae15cf474000000000000000044bacbed87a2d5f871ce96f3245a293b936fb287605330b3859649f3a2697668000000000000000013bd4dc87b61a82ce5959e3ea8c3fed1e03d9c1f7246eef82722354d8e3c0d540000000000000000e5855b758d21f521071672cbce153167d49b4d15f11f5ca47528117312c2c1fa00000000000000000000000000000000000000000000000000000000000000000000000000000000010c0d72656769737465725f636f696e1e6465706c6f795f72656d6f74655f696e746572636861696e5f746f6b656e1873656e645f696e746572636861696e5f7472616e736665721b726563656976655f696e746572636861696e5f7472616e7366657225726563656976655f696e746572636861696e5f7472616e736665725f776974685f646174611f726563656976655f6465706c6f795f696e746572636861696e5f746f6b656e16676976655f756e726567697374657265645f636f696e136d696e745f61735f6469737472696275746f72166d696e745f746f5f61735f6469737472696275746f72136275726e5f61735f6469737472696275746f72157365745f747275737465645f6164647265737365731472656769737465725f7472616e73616374696f6e', }; -describe.only('BCS', () => { +describe('BCS', () => { it('should decode ITS_V0 object successfully', () => { const its = bcsStructs.its.ITS.parse(fromHEX(hexData.ITSV0)).value; From 9f7f3e23dca05644234bab620da5c5d4037af531 Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 15:57:06 +0700 Subject: [PATCH 04/13] feat: add AxelarGateway and GasService structs --- src/bcs.ts | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/bcs.ts b/src/bcs.ts index 52ed161e..2dcf1785 100644 --- a/src/bcs.ts +++ b/src/bcs.ts @@ -57,7 +57,8 @@ function getVersionControlStructs() { } function getGatewayStructs() { - const { Bytes32, Bag } = getCommonStructs(); + const { Bytes32, Bag, Table } = getCommonStructs(); + const { VersionControl } = getVersionControlStructs(); const Message = bcs.struct('Message', { source_chain: bcs.String, @@ -138,6 +139,28 @@ function getGatewayStructs() { payload: bcs.vector(bcs.U8), }); + const AxelarSigners = bcs.struct('AxelarSigners', { + epoch: bcs.U64, + epoch_by_signers_hash: Table, + domain_separator: Bytes32, + minimum_rotation_delay: bcs.U64, + last_rotation_timestamp: bcs.U64, + previous_signers_retention: bcs.U64, + }); + + const GatewayV0 = bcs.struct('GatewayV0', { + operator: bcs.Address, + messages: Table, + signers: AxelarSigners, + version_control: VersionControl, + }); + + const Gateway = bcs.struct('Gateway', { + id: UID, + name: bcs.U64, + value: GatewayV0, + }); + return { Bytes32, Message, @@ -154,6 +177,7 @@ function getGatewayStructs() { Operators, ExecuteData, ApprovedMessage, + Gateway, }; } @@ -251,9 +275,17 @@ function getGMPStructs() { } function getGasServiceStructs() { + const { VersionControl } = getVersionControlStructs(); + + const GasServiceV0 = bcs.struct('GasServiceV0', { + balance: bcs.U64, + version_control: VersionControl, + }); + const GasService = bcs.struct('GasService', { id: UID, - balance: bcs.U64, + name: bcs.U64, + value: GasServiceV0, }); return { From 80269d0347bb3ba2d84736a7841f6caae9b860ea Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 16:38:35 +0700 Subject: [PATCH 05/13] chore: update tests to cover gateway and gas service --- test/bcs.js | 73 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/test/bcs.js b/test/bcs.js index 22a3b7a9..96daf08d 100644 --- a/test/bcs.js +++ b/test/bcs.js @@ -1,20 +1,26 @@ const { bcsStructs } = require('../dist/bcs'); -const { fromHEX } = require('@mysten/bcs'); +const { SuiClient, getFullnodeUrl } = require('@mysten/sui/client'); +const { fromHEX, toHEX } = require('@mysten/bcs'); +const { getBcsBytesByObjectId } = require('./testutils'); const { expect } = require('chai'); // The following hex data is derived from the bcs bytes from the client.getObject() call. const hexData = { ITSV0: '7d262a840033c9b6bc7a31d8ddf12bff891c6db6253dd5b8cf331bccd531a81e00000000000000006ccb9729af3569630b9171a0c1fd3eae9797d8122794be5d8cd01061b1dfcb86270c7f8b9757b05777d3cbf98fa1bb197e1f5a18c8ff7a8ef16e80bedf39a67f000000000000000000c101dbc800d8cf853e6d21c916aba7c92e4c2692527dc951c777dae15cf474000000000000000044bacbed87a2d5f871ce96f3245a293b936fb287605330b3859649f3a2697668000000000000000013bd4dc87b61a82ce5959e3ea8c3fed1e03d9c1f7246eef82722354d8e3c0d540000000000000000e5855b758d21f521071672cbce153167d49b4d15f11f5ca47528117312c2c1fa00000000000000000000000000000000000000000000000000000000000000000000000000000000010c0d72656769737465725f636f696e1e6465706c6f795f72656d6f74655f696e746572636861696e5f746f6b656e1873656e645f696e746572636861696e5f7472616e736665721b726563656976655f696e746572636861696e5f7472616e7366657225726563656976655f696e746572636861696e5f7472616e736665725f776974685f646174611f726563656976655f6465706c6f795f696e746572636861696e5f746f6b656e16676976655f756e726567697374657265645f636f696e136d696e745f61735f6469737472696275746f72166d696e745f746f5f61735f6469737472696275746f72136275726e5f61735f6469737472696275746f72157365745f747275737465645f6164647265737365731472656769737465725f7472616e73616374696f6e', + GatewayV0: + 'c15879de64dc6678674e5ad1a32c47319a1e9100bf21408173590455d01f9d160000000000000000196e295da7fe769ff56d2627c38252ee603f90829ea777bce36ce676b5e3d9d5a7f4b2d4c193987e5f01122bc9cce22a791447d10bc58299ced9e4e18db4c2c503000000000000000100000000000000537d294cfaa7dc649e43cab6a2d829674ea9c11c86517fec9e3984cdedaee42501000000000000000e59feaeb543924fabfbeb667efe707290cf4de9e667796b132260f33a84c26ee803000000000000b23c626b920100000f00000000000000010610617070726f76655f6d657373616765730e726f746174655f7369676e6572731369735f6d6573736167655f617070726f7665641369735f6d6573736167655f65786563757465641574616b655f617070726f7665645f6d6573736167650c73656e645f6d657373616765', + GasServiceV0: + '0178ed64520e2e76bfbfc5551ac9b60acc59b00d6148c9db446a9d7462a96eba000000000000000000000000000000000104077061795f676173076164645f6761730b636f6c6c6563745f67617306726566756e64', }; -describe('BCS', () => { +describe.only('BCS', () => { + const checkIdAndSize = (obj, expectedId, size = '0') => { + expect(obj).to.deep.include({ id: expectedId, size }); + }; + it('should decode ITS_V0 object successfully', () => { const its = bcsStructs.its.ITS.parse(fromHEX(hexData.ITSV0)).value; - const checkIdAndSize = (obj, expectedId) => { - expect(obj).to.deep.include({ id: expectedId, size: '0' }); - }; - checkIdAndSize(its.address_tracker.trusted_addresses, '270c7f8b9757b05777d3cbf98fa1bb197e1f5a18c8ff7a8ef16e80bedf39a67f'); checkIdAndSize(its.unregistered_coin_types, '00c101dbc800d8cf853e6d21c916aba7c92e4c2692527dc951c777dae15cf474'); checkIdAndSize(its.unregistered_coins, '44bacbed87a2d5f871ce96f3245a293b936fb287605330b3859649f3a2697668'); @@ -37,4 +43,59 @@ describe('BCS', () => { ); expect(allowedFunctions).to.have.lengthOf(12); }); + + it('should decode GatewayV0 object successfully', () => { + const gatewayV0 = bcsStructs.gateway.Gateway.parse(fromHEX(hexData.GatewayV0)); + + expect(gatewayV0.id).to.equal('c15879de64dc6678674e5ad1a32c47319a1e9100bf21408173590455d01f9d16'); + expect(gatewayV0.name).to.equal('0'); + expect(gatewayV0.value.operator).to.equal('0x196e295da7fe769ff56d2627c38252ee603f90829ea777bce36ce676b5e3d9d5'); + + checkIdAndSize(gatewayV0.value.messages, 'a7f4b2d4c193987e5f01122bc9cce22a791447d10bc58299ced9e4e18db4c2c5', '3'); + + expect(gatewayV0.value.signers).to.deep.include({ + epoch: '1', + domain_separator: '0x0e59feaeb543924fabfbeb667efe707290cf4de9e667796b132260f33a84c26e', + minimum_rotation_delay: '1000', + last_rotation_timestamp: '1728378453170', + previous_signers_retention: '15', + }); + + checkIdAndSize( + gatewayV0.value.signers.epoch_by_signers_hash, + '537d294cfaa7dc649e43cab6a2d829674ea9c11c86517fec9e3984cdedaee425', + '1', + ); + + expect(gatewayV0.value.version_control.allowed_functions[0].contents) + .to.be.an('array') + .with.lengthOf(6) + .that.includes( + 'approve_messages', + 'rotate_signers', + 'is_message_approved', + 'is_message_executed', + 'take_approved_message', + 'send_message', + ); + }); + + it('should decode GasServiceV0 object successfully', () => { + const gasServiceV0 = bcsStructs.gasService.GasService.parse(fromHEX(hexData.GasServiceV0)); + + expect(gasServiceV0.id).to.equal('0178ed64520e2e76bfbfc5551ac9b60acc59b00d6148c9db446a9d7462a96eba'); + expect(gasServiceV0.name).to.equal('0'); + expect(gasServiceV0.value.balance).to.equal('0'); + expect(gasServiceV0.value.version_control.allowed_functions[0].contents) + .to.be.an('array') + .with.lengthOf(4) + .that.includes('pay_gas', 'add_gas', 'collect_gas', 'refund'); + }); }); + +// This function is used by getting the test data in bytes from the object id +async function printBytesToDebug(objectId) { + const client = new SuiClient({ url: getFullnodeUrl('localnet') }); + const bytes = await getBcsBytesByObjectId(client, objectId); + console.log('bytes', toHEX(bytes)); +} From 3d1c17a35bafc72763459200ecd884cab3814ff3 Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 19:34:06 +0700 Subject: [PATCH 06/13] feat: add relayer discovery structs --- src/bcs.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/bcs.ts b/src/bcs.ts index 2dcf1785..3f3e48e8 100644 --- a/src/bcs.ts +++ b/src/bcs.ts @@ -224,6 +224,26 @@ function getSquidStructs() { }; } +function getRelayerDiscoveryStructs() { + const { Table } = getCommonStructs(); + const { VersionControl } = getVersionControlStructs(); + + const RelayerDiscoveryV0 = bcs.struct('RelayerDiscoveryV0', { + configurations: Table, + version_control: VersionControl, + }); + + const RelayerDiscovery = bcs.struct('RelayerDiscovery', { + id: UID, + name: bcs.U64, + value: RelayerDiscoveryV0, + }); + + return { + RelayerDiscovery, + }; +} + function getITSStructs() { const { Table, Bag, Channel } = getCommonStructs(); const { VersionControl } = getVersionControlStructs(); @@ -301,4 +321,5 @@ export const bcsStructs = { versionControl: getVersionControlStructs(), gasService: getGasServiceStructs(), its: getITSStructs(), + relayerDiscovery: getRelayerDiscoveryStructs(), }; From 6bef44aba965fbdf4bf6ae7a3aeee32742c3a672 Mon Sep 17 00:00:00 2001 From: npty Date: Tue, 8 Oct 2024 19:39:22 +0700 Subject: [PATCH 07/13] chore: add tests for relayer discovery v0 --- test/bcs.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/bcs.js b/test/bcs.js index 96daf08d..35485938 100644 --- a/test/bcs.js +++ b/test/bcs.js @@ -11,6 +11,8 @@ const hexData = { 'c15879de64dc6678674e5ad1a32c47319a1e9100bf21408173590455d01f9d160000000000000000196e295da7fe769ff56d2627c38252ee603f90829ea777bce36ce676b5e3d9d5a7f4b2d4c193987e5f01122bc9cce22a791447d10bc58299ced9e4e18db4c2c503000000000000000100000000000000537d294cfaa7dc649e43cab6a2d829674ea9c11c86517fec9e3984cdedaee42501000000000000000e59feaeb543924fabfbeb667efe707290cf4de9e667796b132260f33a84c26ee803000000000000b23c626b920100000f00000000000000010610617070726f76655f6d657373616765730e726f746174655f7369676e6572731369735f6d6573736167655f617070726f7665641369735f6d6573736167655f65786563757465641574616b655f617070726f7665645f6d6573736167650c73656e645f6d657373616765', GasServiceV0: '0178ed64520e2e76bfbfc5551ac9b60acc59b00d6148c9db446a9d7462a96eba000000000000000000000000000000000104077061795f676173076164645f6761730b636f6c6c6563745f67617306726566756e64', + RelayerDiscoveryV0: + '5dcab278dc93438e0705fc32023808927e09a29b1ae52eef6cb33b9250d9b87100000000000000005339d11ffc9ae10e448b36b776533e1f08c646ad0441c7a0d410b1e0e5d28e58010000000000000001031472656769737465725f7472616e73616374696f6e1272656d6f76655f7472616e73616374696f6e0f6765745f7472616e73616374696f6e', }; describe.only('BCS', () => { @@ -91,6 +93,18 @@ describe.only('BCS', () => { .with.lengthOf(4) .that.includes('pay_gas', 'add_gas', 'collect_gas', 'refund'); }); + + it('should decode RelayerDiscoveryV0 object successfully', async () => { + const relayerDiscoveryV0 = bcsStructs.relayerDiscovery.RelayerDiscovery.parse(fromHEX(hexData.RelayerDiscoveryV0)); + + expect(relayerDiscoveryV0.id).to.equal('5dcab278dc93438e0705fc32023808927e09a29b1ae52eef6cb33b9250d9b871'); + expect(relayerDiscoveryV0.name).to.equal('0'); + checkIdAndSize(relayerDiscoveryV0.value.configurations, '5339d11ffc9ae10e448b36b776533e1f08c646ad0441c7a0d410b1e0e5d28e58', '1'); + expect(relayerDiscoveryV0.value.version_control.allowed_functions[0].contents) + .to.be.an('array') + .with.lengthOf(3) + .that.includes('register_transaction', 'remove_transaction', 'get_transaction'); + }); }); // This function is used by getting the test data in bytes from the object id From 24bcf16e896db069bc3a514e27a6739e7178d07a Mon Sep 17 00:00:00 2001 From: npty Date: Wed, 9 Oct 2024 09:16:19 +0700 Subject: [PATCH 08/13] feat: added squid struct --- src/bcs.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/bcs.ts b/src/bcs.ts index 3f3e48e8..e6252c88 100644 --- a/src/bcs.ts +++ b/src/bcs.ts @@ -183,6 +183,7 @@ function getGatewayStructs() { function getSquidStructs() { const { Channel, CoinBag } = getCommonStructs(); + const { VersionControl } = getVersionControlStructs(); const DeepbookV2SwapData = bcs.struct('DeepbookV2SwapData', { swap_type: bcs.U8, @@ -210,10 +211,16 @@ function getSquidStructs() { metadata: bcs.vector(bcs.U8), }); - const Squid = bcs.struct('Squid', { - id: UID, + const SquidV0 = bcs.struct('SquidV0', { channel: Channel, coin_bag: CoinBag, + version_control: VersionControl, + }); + + const Squid = bcs.struct('Squid', { + id: UID, + name: bcs.U64, + value: SquidV0, }); return { From 18c35196c5b0c14fd936b6bb927c330556bbead6 Mon Sep 17 00:00:00 2001 From: npty Date: Wed, 9 Oct 2024 09:18:30 +0700 Subject: [PATCH 09/13] chore: rename --- src/bcs.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/bcs.ts b/src/bcs.ts index e6252c88..9fcb04a1 100644 --- a/src/bcs.ts +++ b/src/bcs.ts @@ -148,7 +148,7 @@ function getGatewayStructs() { previous_signers_retention: bcs.U64, }); - const GatewayV0 = bcs.struct('GatewayV0', { + const GatewayV0 = bcs.struct('Gateway_v0', { operator: bcs.Address, messages: Table, signers: AxelarSigners, @@ -211,7 +211,7 @@ function getSquidStructs() { metadata: bcs.vector(bcs.U8), }); - const SquidV0 = bcs.struct('SquidV0', { + const SquidV0 = bcs.struct('Squid_v0', { channel: Channel, coin_bag: CoinBag, version_control: VersionControl, @@ -235,7 +235,7 @@ function getRelayerDiscoveryStructs() { const { Table } = getCommonStructs(); const { VersionControl } = getVersionControlStructs(); - const RelayerDiscoveryV0 = bcs.struct('RelayerDiscoveryV0', { + const RelayerDiscoveryV0 = bcs.struct('RelayerDiscovery_v0', { configurations: Table, version_control: VersionControl, }); @@ -264,7 +264,7 @@ function getITSStructs() { trusted_addresses: bcs.vector(bcs.string()), }); - const ITSV0 = bcs.struct('ITSV0', { + const ITSv0 = bcs.struct('ITS_v0', { channel: Channel, address_tracker: InterchainAddressTracker, unregistered_coin_types: Table, @@ -278,7 +278,7 @@ function getITSStructs() { const ITS = bcs.struct('ITS', { id: UID, name: bcs.u64(), - value: ITSV0, + value: ITSv0, }); return { @@ -304,7 +304,7 @@ function getGMPStructs() { function getGasServiceStructs() { const { VersionControl } = getVersionControlStructs(); - const GasServiceV0 = bcs.struct('GasServiceV0', { + const GasServiceV0 = bcs.struct('GasService_v0', { balance: bcs.U64, version_control: VersionControl, }); From 511196f8ec6551709bfb8eb511cde1a38dd6123e Mon Sep 17 00:00:00 2001 From: npty Date: Wed, 9 Oct 2024 09:21:41 +0700 Subject: [PATCH 10/13] chore: ignore lint --- test/bcs.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/bcs.js b/test/bcs.js index 35485938..6bb6cbdc 100644 --- a/test/bcs.js +++ b/test/bcs.js @@ -15,7 +15,7 @@ const hexData = { '5dcab278dc93438e0705fc32023808927e09a29b1ae52eef6cb33b9250d9b87100000000000000005339d11ffc9ae10e448b36b776533e1f08c646ad0441c7a0d410b1e0e5d28e58010000000000000001031472656769737465725f7472616e73616374696f6e1272656d6f76655f7472616e73616374696f6e0f6765745f7472616e73616374696f6e', }; -describe.only('BCS', () => { +describe('BCS', () => { const checkIdAndSize = (obj, expectedId, size = '0') => { expect(obj).to.deep.include({ id: expectedId, size }); }; @@ -108,6 +108,7 @@ describe.only('BCS', () => { }); // This function is used by getting the test data in bytes from the object id +// eslint-disable-next-line @typescript-eslint/no-unused-vars async function printBytesToDebug(objectId) { const client = new SuiClient({ url: getFullnodeUrl('localnet') }); const bytes = await getBcsBytesByObjectId(client, objectId); From b0a4d8d81aba553073de8880adb9bef83fc9cc8d Mon Sep 17 00:00:00 2001 From: npty Date: Wed, 9 Oct 2024 09:22:47 +0700 Subject: [PATCH 11/13] chore: add changeset file --- .changeset/friendly-chefs-itch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/friendly-chefs-itch.md diff --git a/.changeset/friendly-chefs-itch.md b/.changeset/friendly-chefs-itch.md new file mode 100644 index 00000000..4ac1e2c2 --- /dev/null +++ b/.changeset/friendly-chefs-itch.md @@ -0,0 +1,5 @@ +--- +'@axelar-network/axelar-cgp-sui': patch +--- + +feat: added structs for versioned contracts From 660c2c280a1d129c9166ecedb10f55883de4527a Mon Sep 17 00:00:00 2001 From: npty Date: Wed, 9 Oct 2024 10:19:21 +0700 Subject: [PATCH 12/13] chore: rename RelayerDiscoveryV0 to RelayerDiscovery_v0 --- move/relayer_discovery/sources/discovery.move | 12 +++++------ .../versioned/relayer_discovery_v0.move | 20 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/move/relayer_discovery/sources/discovery.move b/move/relayer_discovery/sources/discovery.move index b50b38c5..de73cfd7 100644 --- a/move/relayer_discovery/sources/discovery.move +++ b/move/relayer_discovery/sources/discovery.move @@ -7,7 +7,7 @@ module relayer_discovery::discovery; use axelar_gateway::channel::Channel; -use relayer_discovery::relayer_discovery_v0::{Self, RelayerDiscoveryV0}; +use relayer_discovery::relayer_discovery_v0::{Self, RelayerDiscovery_v0}; use relayer_discovery::transaction::Transaction; use std::ascii; use sui::versioned::{Self, Versioned}; @@ -18,7 +18,7 @@ use version_control::version_control::{Self, VersionControl}; /// ------- /// This is the version of the package that should change every package upgrade. const VERSION: u64 = 0; -/// This is the version of the data that should change when we need to migrate `Versioned` type (e.g. from `RelayerDiscoveryV0` to `RelayerDiscoveryV1`) +/// This is the version of the data that should change when we need to migrate `Versioned` type (e.g. from `RelayerDiscovery_v0` to `RelayerDiscoveryV1`) const DATA_VERSION: u64 = 0; /// ------- @@ -50,9 +50,9 @@ fun init(ctx: &mut TxContext) { macro fun value( $self: &RelayerDiscovery, $function_name: vector, -): &RelayerDiscoveryV0 { +): &RelayerDiscovery_v0 { let relayer_discovery = $self; - let value = relayer_discovery.inner.load_value(); + let value = relayer_discovery.inner.load_value(); value.version_control().check(VERSION, ascii::string($function_name)); value } @@ -60,9 +60,9 @@ macro fun value( macro fun value_mut( $self: &mut RelayerDiscovery, $function_name: vector, -): &mut RelayerDiscoveryV0 { +): &mut RelayerDiscovery_v0 { let relayer_discovery = $self; - let value = relayer_discovery.inner.load_value_mut(); + let value = relayer_discovery.inner.load_value_mut(); value.version_control().check(VERSION, ascii::string($function_name)); value } diff --git a/move/relayer_discovery/sources/versioned/relayer_discovery_v0.move b/move/relayer_discovery/sources/versioned/relayer_discovery_v0.move index 134461fc..2b1586eb 100644 --- a/move/relayer_discovery/sources/versioned/relayer_discovery_v0.move +++ b/move/relayer_discovery/sources/versioned/relayer_discovery_v0.move @@ -10,7 +10,7 @@ use version_control::version_control::VersionControl; /// A central shared object that stores discovery configuration for the /// Relayer. The Relayer will use this object to discover and execute the /// transactions when a message is targeted at specific channel. -public struct RelayerDiscoveryV0 has store { +public struct RelayerDiscovery_v0 has store { /// A map of channel IDs to the target that needs to be executed by the /// relayer. There can be only one configuration per channel. configurations: Table, @@ -30,15 +30,15 @@ const EChannelNotFound: vector = b"channel not found"; public(package) fun new( version_control: VersionControl, ctx: &mut TxContext, -): RelayerDiscoveryV0 { - RelayerDiscoveryV0 { +): RelayerDiscovery_v0 { + RelayerDiscovery_v0 { configurations: table::new(ctx), version_control, } } public(package) fun set_transaction( - self: &mut RelayerDiscoveryV0, + self: &mut RelayerDiscovery_v0, id: ID, transaction: Transaction, ) { @@ -49,7 +49,7 @@ public(package) fun set_transaction( } public(package) fun remove_transaction( - self: &mut RelayerDiscoveryV0, + self: &mut RelayerDiscovery_v0, id: ID, ): Transaction { assert!(self.configurations.contains(id), EChannelNotFound); @@ -57,7 +57,7 @@ public(package) fun remove_transaction( } public(package) fun get_transaction( - self: &RelayerDiscoveryV0, + self: &RelayerDiscovery_v0, id: ID, ): Transaction { assert!(self.configurations.contains(id), EChannelNotFound); @@ -65,7 +65,7 @@ public(package) fun get_transaction( } public(package) fun version_control( - self: &RelayerDiscoveryV0, + self: &RelayerDiscovery_v0, ): &VersionControl { &self.version_control } @@ -74,13 +74,13 @@ public(package) fun version_control( // Test Only // --------- #[test_only] -public(package) fun destroy_for_testing(self: RelayerDiscoveryV0) { +public(package) fun destroy_for_testing(self: RelayerDiscovery_v0) { sui::test_utils::destroy(self); } #[test_only] -fun dummy(ctx: &mut TxContext): RelayerDiscoveryV0 { - RelayerDiscoveryV0 { +fun dummy(ctx: &mut TxContext): RelayerDiscovery_v0 { + RelayerDiscovery_v0 { configurations: table::new(ctx), version_control: version_control::version_control::new(vector[]), } From 26da0dc2038db710e73d6bb99a0ee53490640a5e Mon Sep 17 00:00:00 2001 From: npty Date: Wed, 9 Oct 2024 10:21:49 +0700 Subject: [PATCH 13/13] chore: update tests --- test/bcs.js | 18 +++++++++--------- ...ce_axelar_gateway_relayer_discovery_v0.json | 4 ++-- ...relayer_discovery_relayer_discovery_v0.json | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/bcs.js b/test/bcs.js index 6bb6cbdc..2c556a34 100644 --- a/test/bcs.js +++ b/test/bcs.js @@ -20,7 +20,7 @@ describe('BCS', () => { expect(obj).to.deep.include({ id: expectedId, size }); }; - it('should decode ITS_V0 object successfully', () => { + it('should decode ITS_v0 object successfully', () => { const its = bcsStructs.its.ITS.parse(fromHEX(hexData.ITSV0)).value; checkIdAndSize(its.address_tracker.trusted_addresses, '270c7f8b9757b05777d3cbf98fa1bb197e1f5a18c8ff7a8ef16e80bedf39a67f'); @@ -46,7 +46,7 @@ describe('BCS', () => { expect(allowedFunctions).to.have.lengthOf(12); }); - it('should decode GatewayV0 object successfully', () => { + it('should decode Gateway_v0 object successfully', () => { const gatewayV0 = bcsStructs.gateway.Gateway.parse(fromHEX(hexData.GatewayV0)); expect(gatewayV0.id).to.equal('c15879de64dc6678674e5ad1a32c47319a1e9100bf21408173590455d01f9d16'); @@ -82,7 +82,7 @@ describe('BCS', () => { ); }); - it('should decode GasServiceV0 object successfully', () => { + it('should decode GasService_v0 object successfully', () => { const gasServiceV0 = bcsStructs.gasService.GasService.parse(fromHEX(hexData.GasServiceV0)); expect(gasServiceV0.id).to.equal('0178ed64520e2e76bfbfc5551ac9b60acc59b00d6148c9db446a9d7462a96eba'); @@ -94,13 +94,13 @@ describe('BCS', () => { .that.includes('pay_gas', 'add_gas', 'collect_gas', 'refund'); }); - it('should decode RelayerDiscoveryV0 object successfully', async () => { - const relayerDiscoveryV0 = bcsStructs.relayerDiscovery.RelayerDiscovery.parse(fromHEX(hexData.RelayerDiscoveryV0)); + it('should decode RelayerDiscovery_v0 object successfully', async () => { + const RelayerDiscoveryV0 = bcsStructs.relayerDiscovery.RelayerDiscovery.parse(fromHEX(hexData.RelayerDiscoveryV0)); - expect(relayerDiscoveryV0.id).to.equal('5dcab278dc93438e0705fc32023808927e09a29b1ae52eef6cb33b9250d9b871'); - expect(relayerDiscoveryV0.name).to.equal('0'); - checkIdAndSize(relayerDiscoveryV0.value.configurations, '5339d11ffc9ae10e448b36b776533e1f08c646ad0441c7a0d410b1e0e5d28e58', '1'); - expect(relayerDiscoveryV0.value.version_control.allowed_functions[0].contents) + expect(RelayerDiscoveryV0.id).to.equal('5dcab278dc93438e0705fc32023808927e09a29b1ae52eef6cb33b9250d9b871'); + expect(RelayerDiscoveryV0.name).to.equal('0'); + checkIdAndSize(RelayerDiscoveryV0.value.configurations, '5339d11ffc9ae10e448b36b776533e1f08c646ad0441c7a0d410b1e0e5d28e58', '1'); + expect(RelayerDiscoveryV0.value.version_control.allowed_functions[0].contents) .to.be.an('array') .with.lengthOf(3) .that.includes('register_transaction', 'remove_transaction', 'get_transaction'); diff --git a/test/testdata/interface_axelar_gateway_relayer_discovery_v0.json b/test/testdata/interface_axelar_gateway_relayer_discovery_v0.json index 64e02959..d0adec00 100644 --- a/test/testdata/interface_axelar_gateway_relayer_discovery_v0.json +++ b/test/testdata/interface_axelar_gateway_relayer_discovery_v0.json @@ -1,7 +1,7 @@ { "structs": { - "RelayerDiscoveryV0": { - "name": "RelayerDiscoveryV0", + "RelayerDiscovery_v0": { + "name": "RelayerDiscovery_v0", "abilities": [ "store" ], diff --git a/test/testdata/interface_relayer_discovery_relayer_discovery_v0.json b/test/testdata/interface_relayer_discovery_relayer_discovery_v0.json index 64e02959..d0adec00 100644 --- a/test/testdata/interface_relayer_discovery_relayer_discovery_v0.json +++ b/test/testdata/interface_relayer_discovery_relayer_discovery_v0.json @@ -1,7 +1,7 @@ { "structs": { - "RelayerDiscoveryV0": { - "name": "RelayerDiscoveryV0", + "RelayerDiscovery_v0": { + "name": "RelayerDiscovery_v0", "abilities": [ "store" ],