diff --git a/.github/workflows/test-sui.yaml b/.github/workflows/test-sui.yaml index 31cd0fa2..e097cb51 100644 --- a/.github/workflows/test-sui.yaml +++ b/.github/workflows/test-sui.yaml @@ -107,6 +107,9 @@ jobs: ###### Command: Deploy Contract ###### + - name: Deploy Utils + run: node sui/deploy-contract deploy Utils + - name: Deploy AxelarGateway run: node sui/deploy-contract deploy AxelarGateway --signers wallet diff --git a/package-lock.json b/package-lock.json index 3cfb3c64..087d6d0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@axelar-network/axelar-cgp-solidity": "6.3.1", - "@axelar-network/axelar-cgp-sui": "^0.6.1", + "@axelar-network/axelar-cgp-sui": "^0.6.3", "@axelar-network/axelar-gmp-sdk-solidity": "5.10.0", "@axelar-network/interchain-token-service": "1.2.4", "@cosmjs/cosmwasm-stargate": "^0.32.1", @@ -144,10 +144,9 @@ } }, "node_modules/@axelar-network/axelar-cgp-sui": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-sui/-/axelar-cgp-sui-0.6.1.tgz", - "integrity": "sha512-rKQXsGTPC7FLz9OaKZw7u4Ch12w949vd7ahbzOvjVGUeWrAusmHz6qF0SKEGpwLdWktWBTeWHixcWMbaJeDsdw==", - "license": "MIT", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-sui/-/axelar-cgp-sui-0.6.3.tgz", + "integrity": "sha512-0oL5X+cR443dEXoTY8pEbFH1S9Ivbx5Qjh2Wc8EOJPK4nJOyJ0jiKl/evZfmXRrU8KCRy78bhCLnUlaa1tEUng==", "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.2", "@mysten/sui": "^1.3.0", diff --git a/package.json b/package.json index 7ad255f0..a5c291a2 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "homepage": "https://github.com/axelarnetwork/axelar-contract-deployments#readme", "dependencies": { "@axelar-network/axelar-cgp-solidity": "6.3.1", - "@axelar-network/axelar-cgp-sui": "^0.6.1", + "@axelar-network/axelar-cgp-sui": "^0.6.3", "@axelar-network/axelar-gmp-sdk-solidity": "5.10.0", "@axelar-network/interchain-token-service": "1.2.4", "@cosmjs/cosmwasm-stargate": "^0.32.1", diff --git a/sui/README.md b/sui/README.md index ef5f4a74..64faeac5 100644 --- a/sui/README.md +++ b/sui/README.md @@ -53,6 +53,8 @@ node sui/faucet.js Deploy the gateway package: +> Run `node sui/deploy-contract.js deploy Utils` before deploying the gateway package. + - By querying the signer set from the Amplifier contract (this only works if Amplifier contracts have been setup): ```bash @@ -91,6 +93,12 @@ policy should be one of the following: Provide `--txFilePath` with `--offline` to generate tx data file for offline signing. +Deploy the Utils package: + +```bash +node sui/deploy-contract.js deploy Utils +``` + Deploy the Gas Service package: ```bash diff --git a/sui/deploy-contract.js b/sui/deploy-contract.js index 1890126b..95b31c7c 100644 --- a/sui/deploy-contract.js +++ b/sui/deploy-contract.js @@ -1,5 +1,5 @@ const { Command, Option } = require('commander'); -const { updateMoveToml, TxBuilder, bcsStructs } = require('@axelar-network/axelar-cgp-sui'); +const { TxBuilder, bcsStructs } = require('@axelar-network/axelar-cgp-sui'); const { ethers } = require('hardhat'); const { toB64 } = require('@mysten/sui/utils'); const { bcs } = require('@mysten/sui/bcs'); @@ -41,7 +41,7 @@ const { * 2. Ensure the corresponding folder exists in the specified path * */ -const PACKAGE_DIRS = ['gas_service', 'example', 'axelar_gateway', 'operators', 'abi', 'governance', 'its', 'squid']; +const PACKAGE_DIRS = ['utils', 'gas_service', 'example', 'axelar_gateway', 'operators', 'abi', 'governance', 'its', 'squid']; /** * Package Mapping Object for Command Options and Post-Deployment Functions @@ -49,21 +49,12 @@ const PACKAGE_DIRS = ['gas_service', 'example', 'axelar_gateway', 'operators', ' const PACKAGE_CONFIGS = { cmdOptions: { AxelarGateway: () => GATEWAY_CMD_OPTIONS, - GasService: () => [], - Example: () => [], - Operators: () => [], - Abi: () => [], - Governance: () => [], - ITS: () => [], - Squid: () => [], }, postDeployFunctions: { AxelarGateway: postDeployAxelarGateway, GasService: postDeployGasService, Example: postDeployExample, Operators: postDeployOperators, - Abi: {}, - Governance: {}, ITS: postDeployIts, Squid: postDeploySquid, }, @@ -251,13 +242,15 @@ async function deploy(keypair, client, supportedContract, config, chain, options // Execute post-deployment function const executePostDeploymentFn = PACKAGE_CONFIGS.postDeployFunctions[packageName]; - await executePostDeploymentFn(published, keypair, client, config, chain, options); + + if (executePostDeploymentFn) { + await executePostDeploymentFn(published, keypair, client, config, chain, options); + } printInfo(`${packageName} Configuration Updated`, JSON.stringify(chain.contracts[packageName], null, 2)); } async function upgrade(keypair, client, supportedPackage, policy, config, chain, options) { - const { packageDependencies } = options; const { packageName } = supportedPackage; options.policy = policy; @@ -270,12 +263,7 @@ async function upgrade(keypair, client, supportedPackage, policy, config, chain, validateParameters({ isNonEmptyString: { packageName } }); - if (packageDependencies) { - for (const dependencies of packageDependencies) { - const packageId = contractsConfig[dependencies]?.address; - updateMoveToml(dependencies, packageId); - } - } + // TODO: Synchronize dependencies with `sui/move` folder and update `published-at` field if necessary const builder = new TxBuilder(client); await upgradePackage(client, keypair, supportedPackage, contractConfig, builder, options); @@ -331,10 +319,13 @@ const addDeployOptions = (program) => { // Get the package name from the program name const packageName = program.name(); // Find the corresponding options for the package - const options = PACKAGE_CONFIGS.cmdOptions[packageName](); + const cmdOptions = PACKAGE_CONFIGS.cmdOptions[packageName]; - // Add the options to the program - options.forEach((option) => program.addOption(option)); + if (cmdOptions) { + const options = cmdOptions(); + // Add the options to the program + options.forEach((option) => program.addOption(option)); + } // Add the base deploy options to the program DEPLOY_CMD_OPTIONS.forEach((option) => program.addOption(option)); diff --git a/sui/utils/upgrade-utils.js b/sui/utils/upgrade-utils.js index ee5f3606..de7f9c2f 100644 --- a/sui/utils/upgrade-utils.js +++ b/sui/utils/upgrade-utils.js @@ -1,7 +1,7 @@ const { bcs } = require('@mysten/bcs'); const { fromB64 } = require('@mysten/bcs'); const { printInfo, validateParameters } = require('../../common/utils'); -const { getObjectIdsByObjectTypes, suiPackageAddress } = require('./utils'); +const { getObjectIdsByObjectTypes, suiPackageAddress, moveDir } = require('./utils'); const UPGRADE_POLICIES = { code_upgrade: 'only_additive_upgrades', dependency_upgrade: 'only_dep_upgrades', @@ -22,7 +22,7 @@ function getUpgradePolicyId(policy) { async function upgradePackage(client, keypair, packageToUpgrade, contractConfig, builder, options) { const { packageDir, packageName } = packageToUpgrade; - const { modules, dependencies, digest } = await builder.getContractBuild(packageDir); + const { modules, dependencies, digest } = await builder.getContractBuild(packageDir, moveDir); const { offline } = options; const sender = options.sender || keypair.toSuiAddress(); const upgradeCap = contractConfig.objects?.UpgradeCap; diff --git a/sui/utils/utils.js b/sui/utils/utils.js index eb90aab3..0fcc8993 100644 --- a/sui/utils/utils.js +++ b/sui/utils/utils.js @@ -23,6 +23,7 @@ const { const suiPackageAddress = '0x2'; const suiClockAddress = '0x6'; const suiCoinId = '0x2::sui::SUI'; +const moveDir = `${__dirname}/../move`; const getAmplifierSigners = async (config, chain) => { const client = await CosmWasmClient.connect(config.axelar.rpc); @@ -60,17 +61,15 @@ const getBcsBytesByObjectId = async (client, objectId) => { }; const deployPackage = async (packageName, client, keypair, options = {}) => { - const compileDir = `${__dirname}/../move`; - - copyMovePackage(packageName, null, compileDir); + copyMovePackage(packageName, null, moveDir); const builder = new TxBuilder(client); - await builder.publishPackageAndTransferCap(packageName, options.owner || keypair.toSuiAddress(), compileDir); + await builder.publishPackageAndTransferCap(packageName, options.owner || keypair.toSuiAddress(), moveDir); const publishTxn = await builder.signAndExecute(keypair); const packageId = (publishTxn.objectChanges?.find((a) => a.type === 'published') ?? []).packageId; - updateMoveToml(packageName, packageId, compileDir); + updateMoveToml(packageName, packageId, moveDir); return { packageId, publishTxn }; }; @@ -249,4 +248,5 @@ module.exports = { getSquidChannelId, getSigners, getBagContentId, + moveDir, };