From f7aaa3b851e706adc81c41e63aa04515a6365841 Mon Sep 17 00:00:00 2001 From: Nikolaos Kamarinakis Date: Thu, 27 Mar 2025 14:19:19 -0400 Subject: [PATCH 01/71] feat: add XRPL scripts, release docs, & deployments (#564) Co-authored-by: Milap Sheth Co-authored-by: Blockchain Guy Co-authored-by: Canh Trinh --- README.md | 1 + .../info/devnet-amplifier.json | 78 ++++ axelar-chains-config/info/testnet.json | 94 ++++ cosmwasm/deploy-contract.js | 2 +- cosmwasm/utils.js | 259 +++++++++++ package-lock.json | 121 ++++- package.json | 3 +- releases/cosmwasm/2025-02-XRPL-v1.0.0.md | 431 ++++++++++++++++++ releases/xrpl/2025-02-v1.0.0.md | 277 +++++++++++ xrpl/README.md | 406 +++++++++++++++++ xrpl/account-set.js | 44 ++ xrpl/add-gas.js | 37 ++ xrpl/add-reserves.js | 33 ++ xrpl/balances.js | 21 + xrpl/broadcast.js | 32 ++ xrpl/call-contract.js | 46 ++ xrpl/cli-utils.js | 48 ++ xrpl/decode-address.js | 25 + xrpl/decode-tx-blob.js | 28 ++ xrpl/deploy-multisig.js | 120 +++++ xrpl/faucet.js | 76 +++ xrpl/generate-wallet.js | 24 + xrpl/interchain-transfer.js | 40 ++ xrpl/payment.js | 39 ++ xrpl/rotate-signers.js | 50 ++ xrpl/ticket-create.js | 38 ++ xrpl/trust-set.js | 36 ++ xrpl/utils.js | 390 ++++++++++++++++ 28 files changed, 2796 insertions(+), 3 deletions(-) create mode 100644 releases/cosmwasm/2025-02-XRPL-v1.0.0.md create mode 100644 releases/xrpl/2025-02-v1.0.0.md create mode 100644 xrpl/README.md create mode 100644 xrpl/account-set.js create mode 100644 xrpl/add-gas.js create mode 100644 xrpl/add-reserves.js create mode 100644 xrpl/balances.js create mode 100644 xrpl/broadcast.js create mode 100644 xrpl/call-contract.js create mode 100644 xrpl/cli-utils.js create mode 100644 xrpl/decode-address.js create mode 100644 xrpl/decode-tx-blob.js create mode 100644 xrpl/deploy-multisig.js create mode 100644 xrpl/faucet.js create mode 100644 xrpl/generate-wallet.js create mode 100644 xrpl/interchain-transfer.js create mode 100644 xrpl/payment.js create mode 100644 xrpl/rotate-signers.js create mode 100644 xrpl/ticket-create.js create mode 100644 xrpl/trust-set.js create mode 100644 xrpl/utils.js diff --git a/README.md b/README.md index 8d3ac6670..15a2dd16e 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,5 @@ Install dependencies via - [Cosmwasm](./cosmwasm/README.md) - [Sui](./sui/README.md) - [Stellar](./stellar/README.md) +- [XRPL](./xrpl/README.md) diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 152fb2969..346bd6405 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -942,6 +942,49 @@ "name": "Suiscan", "url": "https://suiscan.xyz/testnet" } + }, + "xrpl-dev": { + "name": "XRPL", + "axelarId": "xrpl-dev", + "rpc": "wss://s.devnet.rippletest.net:51233", + "wssRpc": "wss://s.devnet.rippletest.net:51233", + "tokenSymbol": "XRP", + "networkType": "testnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://devnet.xrpl.org" + }, + "contracts": { + "AxelarGateway": { + "address": "rGAbJZEzU6WaYv5y1LfyN7LBBcQJ3TxsKC", + "initialSigner": "rpqRL9c13HYuCLefSrqkqHPPV4FgxTazQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14 + ] + }, + "InterchainTokenService": { + "address": "rGAbJZEzU6WaYv5y1LfyN7LBBcQJ3TxsKC", + "initialSigner": "rpqRL9c13HYuCLefSrqkqHPPV4FgxTazQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14 + ] + } + } } }, "axelar": { @@ -1161,6 +1204,21 @@ "address": "axelar1tatg2n9gsq6vkkafm6pv8hsunr236wgdk4gdc7lw0hs2e3cnspmsw75rld" } }, + "XrplMultisigProver": { + "xrpl-dev": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "adminAddress": "axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs", + "signingThreshold": [ + "2", + "3" + ], + "serviceName": "validators", + "verifierSetDiffThreshold": 1, + "address": "axelar1ys83sedjffmqh70aksejmx3fy3q2d7twm3msurk7wn3l6nkwxp0sfelzhl", + "xrplTransactionFee": 300, + "ticketCountThreshold": 5 + } + }, "MultisigProver": { "avalanche-fuji": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", @@ -1259,6 +1317,26 @@ }, "storeCodeProposalId": "82", "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a" + }, + "XrplVotingVerifier": { + "xrpl-dev": { + "address": "axelar1w0cwqtytmjuhak4v0rd4fy65pugqcxz4g48n6puw55zcy896e6ksn9gkj2", + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "serviceName": "validators", + "votingThreshold": [ + "2", + "3" + ], + "blockExpiry": 5, + "confirmationHeight": 1 + } + }, + "XrplGateway": { + "xrpl-dev": { + "address": "axelar1fqy77ptzsspmewy547dappss2j7scy9asju8qqjts67r2tl4k5cqg6zfxa", + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "adminAddress": "axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs" + } } }, "axelarId": "axelar", diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 287ee6183..df32de240 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2546,6 +2546,53 @@ } } }, + "xrpl": { + "name": "XRPL", + "axelarId": "xrpl", + "rpc": "https://s.altnet.rippletest.net:51234", + "wssRpc": "wss://s.altnet.rippletest.net:51233", + "tokenSymbol": "XRP", + "networkType": "testnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://testnet.xrpl.org" + }, + "contracts": { + "InterchainTokenService": { + "address": "rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2", + "initialSigner": "rJJAmTa5f9rNmBtvUMmFKn2KoX2o8QhiQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ] + }, + "AxelarGateway": { + "address": "rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2", + "initialSigner": "rJJAmTa5f9rNmBtvUMmFKn2KoX2o8QhiQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ] + } + } + }, "xrpl-evm-test-1": { "name": "XRPL EVM", "axelarId": "xrpl-evm-test-1", @@ -3133,6 +3180,53 @@ "address": "axelar1kq687tszm67hr5ws5pqhtchc8uatxur8r4rm4xgclyghetthtlzs9pnqfl" }, "lastUploadedCodeId": 17 + }, + "XrplMultisigProver": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", + "signingThreshold": [ + "51", + "100" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 1, + "xrplTransactionFee": 5000, + "ticketCountThreshold": 5, + "codeId": 33, + "address": "axelar1k82qfzu3l6rvc7twlp9lpwsnav507czl6xyrk0xv287t4439ymvsl6n470" + }, + "storeCodeProposalId": "247", + "storeCodeProposalCodeHash": "5bfc4d78765c25c85b1e93fb9d693b7ff2805620db8987d8181cc9600caec912", + "lastUploadedCodeId": 33 + }, + "XrplVotingVerifier": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "serviceName": "amplifier", + "votingThreshold": [ + "51", + "100" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "codeId": 31, + "address": "axelar1pnynr6wnmchutkv6490mdqqxkz54fnrtmq8krqhvglhsqhmu7wzsnc86sy" + }, + "storeCodeProposalCodeHash": "bd408b0d152ab460e53f2ca4107153df7a169cec9e501fc058f242abaaf0e23e", + "lastUploadedCodeId": 31, + "storeCodeProposalId": "245" + }, + "XrplGateway": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", + "codeId": 32, + "address": "axelar18qltw4382s5qz0rgzfxz67mr83smk580hewlkfd33l5tmcdp8unqw35glh" + }, + "storeCodeProposalId": "246", + "storeCodeProposalCodeHash": "2de0624fa2ba2fbd9e97da61a832a471f3cfd0a4d333286fe248e36938ecb5f2", + "lastUploadedCodeId": 32 } }, "axelarId": "axelar", diff --git a/cosmwasm/deploy-contract.js b/cosmwasm/deploy-contract.js index 3b93a942d..5721a4a72 100644 --- a/cosmwasm/deploy-contract.js +++ b/cosmwasm/deploy-contract.js @@ -57,7 +57,7 @@ const instantiate = async (client, wallet, config, options) => { contractConfig.codeId = codeId; - const initMsg = CONTRACTS[contractName].makeInstantiateMsg(config, options, contractConfig); + const initMsg = await CONTRACTS[contractName].makeInstantiateMsg(config, options, contractConfig); const contractAddress = await instantiateContract(client, wallet, initMsg, config, options); contractConfig.address = contractAddress; diff --git a/cosmwasm/utils.js b/cosmwasm/utils.js index 008c8b588..cae041999 100644 --- a/cosmwasm/utils.js +++ b/cosmwasm/utils.js @@ -39,6 +39,8 @@ const { } = require('../common/utils'); const { normalizeBech32 } = require('@cosmjs/encoding'); +const { XRPLClient } = require('../xrpl/utils'); + const DEFAULT_MAX_UINT_BITS_EVM = 256; const DEFAULT_MAX_DECIMALS_WHEN_TRUNCATING_EVM = 255; @@ -291,6 +293,69 @@ const makeRouterInstantiateMsg = (config, _options, contractConfig) => { return { admin_address: adminAddress, governance_address: governanceAddress, axelarnet_gateway: axelarnetGateway }; }; +const makeXrplVotingVerifierInstantiateMsg = (config, options, contractConfig) => { + const { chainName } = options; + const { + axelar: { contracts }, + chains: { + [chainName]: { + contracts: { + AxelarGateway: { address: sourceGatewayAddress }, + }, + }, + }, + } = config; + const { + ServiceRegistry: { address: serviceRegistryAddress }, + Rewards: { address: rewardsAddress }, + } = contracts; + const { governanceAddress, serviceName, votingThreshold, blockExpiry, confirmationHeight } = contractConfig; + + if (!validateAddress(serviceRegistryAddress)) { + throw new Error('Missing or invalid ServiceRegistry.address in axelar info'); + } + + if (!validateAddress(rewardsAddress)) { + throw new Error('Missing or invalid Rewards.address in axelar info'); + } + + if (!validateAddress(governanceAddress)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].governanceAddress in axelar info`); + } + + if (!isString(serviceName)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].serviceName in axelar info`); + } + + if (!isString(sourceGatewayAddress)) { + throw new Error(`Missing or invalid [${chainName}].contracts.AxelarGateway.address in axelar info`); + } + + if (!isStringArray(votingThreshold)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].votingThreshold in axelar info`); + } + + if (!isNumber(blockExpiry)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].blockExpiry in axelar info`); + } + + if (!isNumber(confirmationHeight)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].confirmationHeight in axelar info`); + } + + return { + service_registry_address: serviceRegistryAddress, + rewards_address: rewardsAddress, + governance_address: governanceAddress, + service_name: serviceName, + source_gateway_address: sourceGatewayAddress, + voting_threshold: votingThreshold, + block_expiry: toBigNumberString(blockExpiry), + confirmation_height: confirmationHeight, + source_chain: chainName, + }; +}; + const makeVotingVerifierInstantiateMsg = (config, options, contractConfig) => { const { chainName } = options; const { @@ -366,6 +431,65 @@ const makeVotingVerifierInstantiateMsg = (config, options, contractConfig) => { }; }; +const makeXrplGatewayInstantiateMsg = (config, options, contractConfig) => { + const { chainName } = options; + const { + chains: { + [chainName]: { + contracts: { + AxelarGateway: { address: xrplMultisigAddress }, + }, + }, + }, + axelar: { + contracts: { + Router: { address: routerAddress }, + InterchainTokenService: { address: itsHubAddress }, + XrplVotingVerifier: { + [chainName]: { address: verifierAddress }, + }, + }, + axelarId: itsHubChainName, + }, + } = config; + const { governanceAddress, adminAddress } = contractConfig; + + if (!validateAddress(governanceAddress)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].governanceAddress in axelar info`); + } + + if (!validateAddress(adminAddress)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].adminAddress in axelar info`); + } + + if (!validateAddress(routerAddress)) { + throw new Error('Missing or invalid Router.address in axelar info'); + } + + if (!validateAddress(itsHubAddress)) { + throw new Error('Missing or invalid InterchainTokenService.address in axelar info'); + } + + if (!validateAddress(verifierAddress)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].address in axelar info`); + } + + if (!isString(xrplMultisigAddress)) { + throw new Error(`Missing or invalid [${chainName}].contracts.AxelarGateway.address in axelar info`); + } + + return { + admin_address: adminAddress, + governance_address: governanceAddress, + its_hub_address: itsHubAddress, + its_hub_chain_name: itsHubChainName, + router_address: routerAddress, + verifier_address: verifierAddress, + chain_name: chainName, + xrpl_multisig_address: xrplMultisigAddress, + }; +}; + const makeGatewayInstantiateMsg = (config, options, _contractConfig) => { const { chainName } = options; const { @@ -390,6 +514,129 @@ const makeGatewayInstantiateMsg = (config, options, _contractConfig) => { return { router_address: routerAddress, verifier_address: verifierAddress }; }; +const makeXrplMultisigProverInstantiateMsg = async (config, options, contractConfig) => { + const { chainName } = options; + const { + axelar: { contracts, chainId: axelarChainId }, + chains: { + [chainName]: { + wssRpc, + contracts: { + AxelarGateway: { address: xrplMultisigAddress }, + }, + }, + }, + } = config; + const { + Router: { address: routerAddress }, + Coordinator: { address: coordinatorAddress }, + Multisig: { address: multisigAddress }, + ServiceRegistry: { address: serviceRegistryAddress }, + XrplVotingVerifier: { + [chainName]: { address: verifierAddress }, + }, + XrplGateway: { + [chainName]: { address: gatewayAddress }, + }, + } = contracts; + const { + adminAddress, + governanceAddress, + signingThreshold, + serviceName, + verifierSetDiffThreshold, + xrplTransactionFee, + ticketCountThreshold, + } = contractConfig; + + if (!validateAddress(routerAddress)) { + throw new Error('Missing or invalid Router.address in axelar info'); + } + + if (!isString(axelarChainId)) { + throw new Error(`Missing or invalid chain ID`); + } + + if (!validateAddress(adminAddress)) { + throw new Error(`Missing or invalid XrplMultisigProver[${chainName}].adminAddress in axelar info`); + } + + if (!validateAddress(governanceAddress)) { + throw new Error(`Missing or invalid XrplMultisigProver[${chainName}].governanceAddress in axelar info`); + } + + if (!validateAddress(gatewayAddress)) { + throw new Error(`Missing or invalid XrplGateway[${chainName}].address in axelar info`); + } + + if (!validateAddress(coordinatorAddress)) { + throw new Error('Missing or invalid Coordinator.address in axelar info'); + } + + if (!validateAddress(multisigAddress)) { + throw new Error('Missing or invalid Multisig.address in axelar info'); + } + + if (!validateAddress(serviceRegistryAddress)) { + throw new Error('Missing or invalid ServiceRegistry.address in axelar info'); + } + + if (!validateAddress(verifierAddress)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].address in axelar info`); + } + + if (!isStringArray(signingThreshold)) { + throw new Error(`Missing or invalid XrplMultisigProver[${chainName}].signingThreshold in axelar info`); + } + + if (!isString(serviceName)) { + throw new Error(`Missing or invalid XrplMultisigProver[${chainName}].serviceName in axelar info`); + } + + if (!isNumber(verifierSetDiffThreshold)) { + throw new Error(`Missing or invalid XrplMultisigProver[${chainName}].verifierSetDiffThreshold in axelar info`); + } + + if (!isString(xrplMultisigAddress)) { + throw new Error(`Missing or invalid [${chainName}].contracts.AxelarGateway.address in axelar info`); + } + + const client = new XRPLClient(wssRpc); + await client.connect(); + const availableTickets = (await client.tickets(xrplMultisigAddress)).sort(); + const lastAssignedTicketNumber = Math.min(...availableTickets) - 1; + const accountInfo = await client.accountInfo(xrplMultisigAddress); + const nextSequenceNumber = accountInfo.sequence + 1; // 1 sequence number reserved for the genesis signer set rotation + const initialFeeReserve = Number(accountInfo.balance); + const reserveRequirements = await client.reserveRequirements(); + const baseReserve = reserveRequirements.baseReserve * 1e6; + const ownerReserve = reserveRequirements.ownerReserve * 1e6; + await client.disconnect(); + + return { + admin_address: adminAddress, + governance_address: governanceAddress, + gateway_address: gatewayAddress, + coordinator_address: coordinatorAddress, + multisig_address: multisigAddress, + service_registry_address: serviceRegistryAddress, + voting_verifier_address: verifierAddress, + signing_threshold: signingThreshold, + service_name: serviceName, + chain_name: chainName, + verifier_set_diff_threshold: verifierSetDiffThreshold, + xrpl_multisig_address: xrplMultisigAddress, + xrpl_transaction_fee: xrplTransactionFee, + xrpl_base_reserve: baseReserve, + xrpl_owner_reserve: ownerReserve, + initial_fee_reserve: initialFeeReserve, + ticket_count_threshold: ticketCountThreshold, + available_tickets: availableTickets, + next_sequence_number: nextSequenceNumber, + last_assigned_ticket_number: lastAssignedTicketNumber, + }; +}; + const makeMultisigProverInstantiateMsg = (config, options, contractConfig) => { const { chainName } = options; const { @@ -895,14 +1142,26 @@ const CONTRACTS = { scope: CONTRACT_SCOPE_CHAIN, makeInstantiateMsg: makeVotingVerifierInstantiateMsg, }, + XrplVotingVerifier: { + scope: CONTRACT_SCOPE_CHAIN, + makeInstantiateMsg: makeXrplVotingVerifierInstantiateMsg, + }, Gateway: { scope: CONTRACT_SCOPE_CHAIN, makeInstantiateMsg: makeGatewayInstantiateMsg, }, + XrplGateway: { + scope: CONTRACT_SCOPE_CHAIN, + makeInstantiateMsg: makeXrplGatewayInstantiateMsg, + }, MultisigProver: { scope: CONTRACT_SCOPE_CHAIN, makeInstantiateMsg: makeMultisigProverInstantiateMsg, }, + XrplMultisigProver: { + scope: CONTRACT_SCOPE_CHAIN, + makeInstantiateMsg: makeXrplMultisigProverInstantiateMsg, + }, AxelarnetGateway: { scope: CONTRACT_SCOPE_GLOBAL, makeInstantiateMsg: makeAxelarnetGatewayInstantiateMsg, diff --git a/package-lock.json b/package-lock.json index f0921d96a..f1eb5955d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,8 @@ "axios": "^1.7.2", "csv-parser": "^3.0.0", "path": "^0.12.7", - "toml": "^3.0.0" + "toml": "^3.0.0", + "xrpl": "^4.2.0" }, "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", @@ -2682,6 +2683,57 @@ "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "dev": true }, + "node_modules/@xrplf/isomorphic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz", + "integrity": "sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.0.0", + "eventemitter3": "5.0.1", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@xrplf/isomorphic/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/@xrplf/isomorphic/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@xrplf/secret-numbers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz", + "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==", + "license": "ISC", + "dependencies": { + "@xrplf/isomorphic": "^1.0.0", + "ripple-keypairs": "^2.0.0" + } + }, "node_modules/abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -9117,6 +9169,47 @@ "inherits": "^2.0.1" } }, + "node_modules/ripple-address-codec": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.0.tgz", + "integrity": "sha512-de7osLRH/pt5HX2xw2TRJtbdLLWHu0RXirpQaEeCnWKY5DYHykh3ETSkofvm0aX0LJiV7kwkegJxQkmbO94gWw==", + "license": "ISC", + "dependencies": { + "@scure/base": "^1.1.3", + "@xrplf/isomorphic": "^1.0.0" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/ripple-binary-codec": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.3.0.tgz", + "integrity": "sha512-CPMzkknXlgO9Ow5Qa5iqQm0vOIlJyN8M1bc8etyhLw2Xfrer6bPzLA8/apuKlGQ+XdznYSKPBz5LAhwYjaDAcA==", + "license": "ISC", + "dependencies": { + "@xrplf/isomorphic": "^1.0.1", + "bignumber.js": "^9.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ripple-keypairs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", + "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", + "license": "ISC", + "dependencies": { + "@noble/curves": "^1.0.0", + "@xrplf/isomorphic": "^1.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 16" + } + }, "node_modules/rlp": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", @@ -11498,6 +11591,32 @@ } } }, + "node_modules/xrpl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.2.0.tgz", + "integrity": "sha512-RR6lJhRyQHPoI/rZGuKBzUc45KSC3thpYVzn3ATu78GXDZ6vsyn8SXmNveMhAJ2AVRvpRiyyztbU2TmGRUp2Xg==", + "license": "ISC", + "dependencies": { + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", + "@xrplf/isomorphic": "^1.0.1", + "@xrplf/secret-numbers": "^1.0.0", + "bignumber.js": "^9.0.0", + "eventemitter3": "^5.0.1", + "ripple-address-codec": "^5.0.0", + "ripple-binary-codec": "^2.3.0", + "ripple-keypairs": "^2.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/xrpl/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/xstream": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz", diff --git a/package.json b/package.json index ca02435b2..43c1f733e 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "axios": "^1.7.2", "csv-parser": "^3.0.0", "path": "^0.12.7", - "toml": "^3.0.0" + "toml": "^3.0.0", + "xrpl": "^4.2.0" }, "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", diff --git a/releases/cosmwasm/2025-02-XRPL-v1.0.0.md b/releases/cosmwasm/2025-02-XRPL-v1.0.0.md new file mode 100644 index 000000000..b0c75d678 --- /dev/null +++ b/releases/cosmwasm/2025-02-XRPL-v1.0.0.md @@ -0,0 +1,431 @@ +# XRPL Amplifier + +| | **Owner** | +| -------------- | ---------------------------------------------------------------------------------------------------------- | +| **Created By** | @k4m4 | +| **Deployment** | @blockchainguyy , @canhtrinh , @k4m4 | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-01-29 | +| **Stagenet** | - | TBD | +| **Testnet** | Deployed | 2025-02-20 | +| **Mainnet** | - | TBD | + +- [Amplifier Releases](https://github.com/commonprefix/axelar-amplifier/releases) +- [XRPLVotingVerifier v1.0.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-voting-verifier-v1.0.0) +- [XRPLGateway v1.0.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.0.0) +- [XRPLMultisigProver v1.0.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.0.0) + +## Background + +These are the instructions for deploying Amplifier contracts for the XRPL connection. + +### Pre-requisites + +Ensure that the [XRPL multisig account](../xrpl/2025-02-v1.0.0.md) is created and configured first, as `XRPLVotingVerifier` needs the XRPL multisig account's address as `sourceGatewayAddress` and the `XRPLGateway` and `XRPLMultisigProver` contracts need it as `xrplMultisigAddress`. + +## Deployment + +| Network | `DEPOSIT_VALUE` | +| -------------------- | --------------- | +| **Devnet-amplifier** | `100000000` | +| **Stagenet** | `100000000` | +| **Testnet** | `2000000000` | +| **Mainnet** | `2000000000` | + +- Create an `.env` config. + +```yaml +MNEMONIC=xyz +ENV=xyz +CHAIN=xrpl +RELEASES_BASE_URL=https://pub-7233af746dc8432f8d9547af0133309d.r2.dev +ARTIFACT_PATH=wasm +DEPOSIT_VALUE= +``` + +| Network | `governanceAddress` | `adminAddress` | +| -------------------- | ----------------------------------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs` | +| **Stagenet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | +| **Mainnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + +| Network | `serviceName` | `votingThreshold` | `signingThreshold` | `confirmationHeight` | `xrplTransactionFee` | `ticketCountThreshold` | +| -------------------- | ------------- | ----------------- | ------------------ | -------------------- | -------------------- | ---------------------- | +| **Devnet-amplifier** | `validators` | `["2", "3"]` | `["2", "3"]` | `1` | `300` | `5` | +| **Stagenet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | `5000` | `5` | +| **Testnet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | `5000` | `5` | +| **Mainnet** | `amplifier` | `["2", "3"]` | `["2", "3"]` | `1` | `TBD` | `TBD` | + +```bash +# Add under `config.axelar.contracts.XrplGateway` based on Network +\"$CHAIN\" : { + "governanceAddress": "[governance address]", + "adminAddress": "[admin address]" +} + +# Add under `config.axelar.contracts.XrplVotingVerifier` based on Network +\"$CHAIN\" : { + "governanceAddress": "[governance address]", + "serviceName": "[service name]", + "votingThreshold": [voting threshold], + "blockExpiry": 10, + "confirmationHeight": 1, +} + +# Add under `config.axelar.contracts.XrplMultisigProver` based on Network +\"$CHAIN\" : { + "governanceAddress": "[governance address]", + "adminAddress": "[admin address]", + "signingThreshold": "[signing threshold]", + "serviceName": "[service name]", + "verifierSetDiffThreshold": 0, + "xrplTransactionFee": [xrpl transaction fee], + "ticketCountThreshold": [ticket count threshold], +} +``` + +### Store Amplifier contracts + +1. Download the XRPL CosmWasm smart contracts' wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.0.0/xrpl_voting_verifier.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.0.0/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.0.0/xrpl_gateway.wasm --directory-prefix=$ARTIFACT_PATH +``` + +2. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.0.0/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_voting_verifier.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_voting_verifier.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.0.0/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_multisig_prover.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_multisig_prover.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.0.0/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_gateway.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_gateway.wasm | grep $CHECKSUM +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +bd408b0d152ab460e53f2ca4107153df7a169cec9e501fc058f242abaaf0e23e wasm/xrpl_voting_verifier.wasm +5bfc4d78765c25c85b1e93fb9d693b7ff2805620db8987d8181cc9600caec912 wasm/xrpl_multisig_prover.wasm +2de0624fa2ba2fbd9e97da61a832a471f3cfd0a4d333286fe248e36938ecb5f2 wasm/xrpl_gateway.wasm +``` + +4. Add `INIT_ADDRESSES` to `.env`. + +| Network | `INIT_ADDRESSES` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| **Devnet-amplifier** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | + +```yaml +INIT_ADDRESSES= +``` + +5. Store `XRPLVotingVerifier`. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplVotingVerifier \ + -t "Upload XRPLVotingVerifier contract v1.0.0" \ + -d "Upload XRPLVotingVerifier contract v1.0.0" \ + -a "$ARTIFACT_PATH/xrpl_voting_verifier.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +6. Store `XRPLGateway`. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplGateway \ + -t "Upload XRPLGateway contract v1.0.0" \ + -d "Upload XRPLGateway contract v1.0.0" \ + -a "$ARTIFACT_PATH/xrpl_gateway.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +7. Store `XRPLMultisigProver`. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplMultisigProver \ + -t "Upload XRPLMultisigProver contract v1.0.0" \ + -d "Upload XRPLMultisigProver contract v1.0.0" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +### Instantiate Amplifier contracts + +- Confirm `XrplVotingVerifier(v1.0.0)`, `XrplGateway(v1.0.0)` and `XrplMultisigProver(v1.0.0)` contracts are already stored in `$ENV.json`: + +```bash +XrplVotingVerifier(v1.0.0) -> "storeCodeProposalCodeHash": "bd408b0d152ab460e53f2ca4107153df7a169cec9e501fc058f242abaaf0e23e" +XrplGateway(v1.0.0) -> "storeCodeProposalCodeHash": "2de0624fa2ba2fbd9e97da61a832a471f3cfd0a4d333286fe248e36938ecb5f2" +XrplMultisigProver(v1.0.0) -> "storeCodeProposalCodeHash": "5bfc4d78765c25c85b1e93fb9d693b7ff2805620db8987d8181cc9600caec912" +``` + +| Network | `CONTRACT_ADMIN` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs` | +| **Stagenet** | `axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | +| **Testnet** | `axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | +| **Mainnet** | `axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | + +```bash +CONTRACT_ADMIN=[wasm contract admin address for the upgrade and migration based on network] +``` + +1. Instantiate `XRPLVotingVerifier`. + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c XrplVotingVerifier --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +2. Instantiate `XRPLGateway`. + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c XrplGateway --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +3. Instantiate `XRPLMultisigProver`. + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c XrplMultisigProver --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +4. Set environment variables. + +- Network-specific environment variables: These variables need to be updated by the network. + +```bash +XRPL_VOTING_VERIFIER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.XrplVotingVerifier[\"$CHAIN\"].address" | tr -d '"') +XRPL_GATEWAY=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.XrplGateway[\"$CHAIN\"].address" | tr -d '"') +XRPL_MULTISIG_PROVER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.XrplMultisigProver[\"$CHAIN\"].address" | tr -d '"') +MULTISIG=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Multisig.address | tr -d '"') +REWARDS=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Rewards.address | tr -d '"') +``` + +- Gov proposal environment variables. Update these for each network + +| Network | `PROVER_ADMIN` | `REWARD_AMOUNT` | +| -------------------- | ----------------------------------------------- | ------------------- | +| **Devnet-amplifier** | `axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs` | `1000000uamplifier` | +| **Stagenet** | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | `1000000uaxl` | +| **Testnet** | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | `1000000uaxl` | +| **Mainnet** | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | `1000000uaxl` | + +```bash +PROVER_ADMIN=[prover admin who is responsible for the contract's operations] +REWARD_AMOUNT=[reward amount] +RUN_AS_ACCOUNT=[wasm deployer/governance address] +ROUTER=[router contract address] +MULTISIG=[multisig contract address] +``` + +> **_NOTE:_** > `--runAs $RUN_AS_ACCOUNT` is only required for Devnet-amplifier. Do not use `--runAs` for Stagenet, Testnet, or Mainnet. + +5. Register `XRPLGateway` on the Router. + +> **_NOTE:_** +> Add a community post for the Mainnet Proposal. e.g., https://www.mintscan.io/axelar/proposals/274 + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Router \ + -t "Register Gateway for $CHAIN" \ + -d "Register Gateway address for $CHAIN at Router contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"register_chain\": { + \"chain\": \"$CHAIN\", + \"gateway_address\": \"$XRPL_GATEWAY\", + \"msg_id_format\": \"hex_tx_hash\" + } + }" +``` + +```bash +axelard q wasm contract-state smart $ROUTER "{\"chain_info\": \"$CHAIN\"}" --output json | jq . + +# You should see something like this: +{ + "data": { + "name": "", + "gateway": { + "address": "axelar1hzz0s0ucrhdp6tue2lxk3c03nj6f60qy463we7lgx0wudd72ctmsee8enx" + }, + "frozen_status": 0, + "msg_id_format": "hex_tx_hash" + } +} +``` + +6. Update `ampd` with the XRPL chain configuration. Verifiers should use their own `rippled` RPC node for the `chain_rpc_url` in production. + +| Network | `http_url` | +| -------------------- | ---------------------------------------- | +| **Devnet-amplifier** | `https://s.devnet.rippletest.net:51234/` | +| **Stagenet** | `https://s.altnet.rippletest.net:51234/` | +| **Testnet** | `https://s.altnet.rippletest.net:51234/` | +| **Mainnet** | `https://s1.ripple.com:51234/` | + +```bash +[[handlers]] +type="XRPLMsgVerifier" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$XRPL_VOTING_VERIFIER" + +[[handlers]] +type="XRPLMultisigSigner" +multisig_contract="$MULTISIG" +multisig_prover_contract="$XRPL_MULTISIG_PROVER" +``` + +7. Verifiers should register their ECDSA public key (if they haven't already) and register XRPL chain support. + +```bash +ampd register-public-key ecdsa + +ampd register-chain-support "[service name]" $CHAIN +``` + +8. Register `XRPLMultisigProver` contract on coordinator. + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Coordinator \ + -t "Register Multisig Prover for XRPL" \ + -d "Register Multisig Prover address for $CHAIN at Coordinator contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"register_prover_contract\": { + \"chain_name\": \"$CHAIN\", + \"new_prover_addr\": \"$XRPL_MULTISIG_PROVER\" + } + }" +``` + +9. Authorize `XRPLMultisigProver` on Multisig. + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Multisig \ + -t "Authorize Multisig Prover for $CHAIN" \ + -d "Authorize Multisig Prover address for $CHAIN at Multisig contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"authorize_callers\": { + \"contracts\": { + \"$XRPL_MULTISIG_PROVER\": \"$CHAIN\" + } + } + }" +``` + +```bash +axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"contract_address\": \"$XRPL_MULTISIG_PROVER\", \"chain_name\": \"$CHAIN\"}}' --output json | jq . + +# Result should look like: +{ + "data": true +} +``` + +10. Create reward pool for `XRPLVotingVerifier`. + +#### Rewards + +| Network | `epoch_duration` | `participation_threshold` | `rewards_per_epoch` | +| -------------------- | ---------------- | ------------------------- | ------------------- | +| **Devnet-amplifier** | `100` | `["7", "10"]` | `100` | +| **Stagenet** | `600` | `["7", "10"]` | `100` | +| **Testnet** | `14845` | `["7", "10"]` | `100` | +| **Mainnet** | `14845` | `["8", "10"]` | `TBD` | + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN Voting Verifier" \ + -d "Create pool for $CHAIN Voting Verifier" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"[epoch duration]\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$XRPL_VOTING_VERIFIER\" + } + } + }" +``` + +11. Create reward pool for Multisig. + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in Axelar Multisig" \ + -d "Create pool for $CHAIN in Axelar Multisig" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"[epoch duration]\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$MULTISIG\" + } + } + }" +``` + +12. Add funds to reward pools from a wallet with `$REWARD_AMOUNT`. + +```bash +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET + +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$XRPL_VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET +``` + +13. Ensure the reward pools were created correctly. + +```bash +axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\", \"contract\":\"$MULTISIG\"}}}" --output json | jq . + +axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\", \"contract\":\"$XRPL_VOTING_VERIFIER\"}}}" --output json | jq . +``` + +## Checklist + +The [XRPL checklist](../xrpl/2025-02-v1.0.0.md) will test GMP & ITS calls. diff --git a/releases/xrpl/2025-02-v1.0.0.md b/releases/xrpl/2025-02-v1.0.0.md new file mode 100644 index 000000000..831061777 --- /dev/null +++ b/releases/xrpl/2025-02-v1.0.0.md @@ -0,0 +1,277 @@ +# XRPL v1.0.0 + +| | **Owner** | +| -------------- | -------------------------------- | +| **Created By** | @k4m4 | +| **Deployment** | @k4m4 | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-01-29 | +| **Stagenet** | - | TBD | +| **Testnet** | Deployed | 2025-02-20 | +| **Mainnet** | - | TBD | + +## Background + +Changes in the release: + +This is the v1.0.0 initial release. + +## Deployment + +Create an `.env` config. `CHAIN` should be set to `xrpl`. + +```yaml +ENV=xyz +CHAIN=xyz +PRIVATE_KEY_TYPE=seed + +INITIAL_SIGNER_PRIVATE_KEY=abc # 1st fresh XRPL wallet seed +INITIAL_SIGNER_ADDRESS=r123 # 1st wallet address + +MULTISIG_PRIVATE_KEY=xyz # 2nd fresh XRPL wallet seed +MULTISIG_ADDRESS=r789 # 2nd wallet address +``` + +Since XRPL does not support smart contracts yet, this multisig account acts as both the AxelarGateway and InterchainTokenService contract. + +To create an XRPL multisig account, you must first generate an ordinary key pair, +and once a signer set has been set (via the `SignerListSet` transaction), +you can ['disable the master key pair'](https://xrpl.org/docs/tutorials/how-tos/manage-account-settings/disable-master-key-pair), such that only a quorum of the signer set +can perform transactions on the multisig's behalf. + +The `MULTISIG_PRIVATE_KEY` account will ultimately be transformed into the XRPL multisig account, +and the `INITIAL_SIGNER_PRIVATE_KEY` account will be set as the multisig's initial signer set. + +You can generate new XRPL accounts by running: + +```bash +node xrpl/generate-wallet.js +``` + +An initial XRPL chain config needs to be added to `${ENV}.json` file under `chains` key. + +#### Devnet-Amplifier + +```bash +\"$CHAIN\": { + "name": "XRPL", + "axelarId": \"$CHAIN\", + "rpc": "https://s.devnet.rippletest.net:51234", + "wssRpc": "wss://s.devnet.rippletest.net:51233", + "tokenSymbol": "XRP", + "networkType": "testnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://devnet.xrpl.org" + }, + "contracts": {} +} +``` + +#### Stagenet / Testnet + +```bash +\"$CHAIN\": { + "name": "XRPL", + "axelarId": \"$CHAIN\", + "rpc": "https://s.altnet.rippletest.net:51234", + "wssRpc": "wss://s.altnet.rippletest.net:51233", + "tokenSymbol": "XRP", + "networkType": "testnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://testnet.xrpl.org" + }, + "contracts": {} +} +``` + +#### Mainnet + +```bash +"xrpl": { + "name": "XRPL", + "axelarId": "xrpl", + "rpc": "https://s1.ripple.com:51234", + "wssRpc": "wss://s1.ripple.com", + "tokenSymbol": "XRP", + "networkType": "mainnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://livenet.xrpl.org" + }, + "contracts": {} +} +``` + +1. Fund accounts with XRP + +Fund both the multisig and initial signer accounts with XRP. + +The multisig wallet should be funded with (1) the [minimum reserve XRP amount](https://xrpl.org/docs/concepts/accounts/reserves) to cover the multisig account's base reserve and owner reserve (251 * unit owner reserve), plus (2) some extra XRP to cover the deployment transaction fees. + +For Devnet-Amplifier, Staging, and Testnet, you can use the faucet script: + +```bash +node xrpl/faucet.js --minBalance 100 --amount 100 --privateKey $MULTISIG_PRIVATE_KEY +node xrpl/faucet.js --minBalance 100 --amount 100 --privateKey $INITIAL_SIGNER_PRIVATE_KEY +``` + +2. Deploy XRPL Multisig account (edge AxelarGateway & InterchainTokenService equivalent) + +```bash +node xrpl/deploy-multisig.js --initialSigner $INITIAL_SIGNER_ADDRESS --privateKey $MULTISIG_PRIVATE_KEY +``` + +This script will convert the wallet into a multisig account and configure it appropriately (e.g., disable the master key pair). + +3. After creating the XRPL Multisig, ensure that you deployed the [XRPL Amplifier contracts](../cosmwasm/2025-02-XRPL-v1.0.0.md) + +Update your `.env` file to include the following: + +```bash +RPC_URL= +PROVER_ADMIN=[prover admin defined in the XRPL CosmWasm release doc] +ARGS=(--from $PROVER_ADMIN --gas auto --gas-adjustment 1.5 --node $RPC_URL) +XRPL_GATEWAY= +XRPL_VOTING_VERIFIER= +XRPL_MULTISIG_PROVER= +AXELARNET_GATEWAY= +``` + +4. Set genesis verifier set as admin + +```bash +axelard tx wasm execute $XRPL_MULTISIG_PROVER '"update_verifier_set"' "${ARGS[@]}" +``` + +5. Rotate the XRPL multisig signer set + +Query the genesis verifier set's public keys and weights: + +```bash +CURRENT_VERIFIER_SET=$(axelard query wasm contract-state smart $XRPL_MULTISIG_PROVER '"current_verifier_set"' --node $RPC_URL --output json) +PUB_KEYS=$(echo "$CURRENT_VERIFIER_SET" | jq -r '.data.signers[].pub_key.ecdsa') +WEIGHTS=$(echo "$CURRENT_VERIFIER_SET" | jq -r '.data.signers[].weight') +QUORUM=$(echo "$CURRENT_VERIFIER_SET" | jq -r '.data.threshold') +``` + +Rotate the XRPL multisig's signers: + +```bash +node xrpl/rotate-signers.js --signerPublicKeys $(echo "$PUB_KEYS" | xargs) --signerWeights $(echo "$WEIGHTS" | xargs) --quorum $QUORUM --privateKey $INITIAL_SIGNER_PRIVATE_KEY +``` + +6. Register XRPL Multisig on ITS Hub + +ITS hub contract configuration in `$ENV.json` must include the following attributes per chain: + +```bash +"axelar": { + "contracts": { + ... + "InterchainTokenService": { + ... + \"$CHAIN\": { + "maxUintBits": 256, + "maxDecimalsWhenTruncating": 255 + } + } + ... + } +} +``` + +Please refer to `$DEPOSIT_VALUE` and `$RUN_AS_ACCOUNT` from the [XRPL CosmWasm release doc](../cosmwasm/2025-02-XRPL-v1.0.0.md). + +```bash +node cosmwasm/submit-proposal.js \ + its-hub-register-chains $CHAIN \ + -t "Register $CHAIN on ITS Hub" \ + -d "Register $CHAIN on ITS Hub" \ + --deposit $DEPOSIT_VALUE \ + --runAs $RUN_AS_ACCOUNT +``` + +7. Set XRPL as trusted chain on EVM ITS. Similarly, set XRPL as a trusted chain for every other non EVM ITS contract + +```bash +# Change `PRIVATE_KEY and `ENV` in `.env` from XRPL to EVM +node evm/its.js -n all --action setTrustedAddress --trustedChain $CHAIN --trustedAddress hub +``` + +8. Register XRP's token metadata as admin + +> **_NOTE:_** > *Do not* register and link XRP on Stagenet. +Since both Amplifier Stagenet and Testnet connect to the same XRPL EVM Sidechain Testnet, +only one token manager will be able to have XRP mint/burn permissions. + +```bash +axelard tx wasm execute $XRPL_GATEWAY '{"register_token_metadata":{"xrpl_token":"xrp"}}' "${ARGS[@]}" +# copy the message ID and payload from the response +axelard tx wasm execute $AXELARNET_GATEWAY '{"execute":{"cc_id":{"source_chain":'"$CHAIN'","message_id":""},"payload":""}}' "${ARGS[@]}" +``` + +9. Link XRP token with XRPL EVM Sidechain's XRP as admin + +```bash +XRP_TOKEN_ID=$(axelard query wasm contract-state smart $XRPL_GATEWAY '"xrp_token_id"' --node $RPC_URL --output json | jq -r '.data') +XRPL_EVM_SIDECHAIN_CHAIN_NAME= # chain name of the XRPL EVM Sidechain +XRPL_EVM_SIDECHAIN_XRP_ADDRESS= # address of the XRP ERC20 on the XRPL EVM Sidechain, WITHOUT the 0x-prefix +TOKEN_MANAGER_TYPE=4 # MINT_BURN token manager type +axelard tx wasm execute $XRPL_GATEWAY '{"link_token":{"token_id":"'$XRP_TOKEN_ID'","destination_chain":"'$XRPL_EVM_SIDECHAIN_CHAIN_NAME'","link_token":{"token_manager_type":"'$TOKEN_MANAGER_TYPE'","destination_token_address":"'$XRPL_EVM_SIDECHAIN_XRP_ADDRESS'"}}}' "${ARGS[@]}" +# copy the message ID and payload from the response +axelard tx wasm execute $AXELARNET_GATEWAY '{"execute":{"cc_id":{"source_chain":"'$CHAIN_NAME'","message_id":""},"payload":""}}' "${ARGS[@]}" +# the rest of the relaying should be handled by the XRPL EVM Sidechain relayer +``` + +Ensure that the token linking transaction was executed successfully on the XRPL EVM Sidechain ITS contract. + +## Checklist + +The following checks should be performed after the rollout: + +### XRPL → EVM GMP/ITS call + +1. Send a GMP and ITS call + +```bash +node xrpl/interchain-transfer.js [token] [amount] [destination-chain] [destination-address] --gasFeeAmount --payload +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +# Change `PRIVATE_KEY and `ENV` in `.env` from XRPL to EVM +node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress [source-address] --destination [destination-address] --payloadHash 0x1ac7d1b81b7ba1025b36ccb86723da6ee5a87259f1c2fd5abe69d3200b512ec8 +``` + +### EVM → XRPL ITS call + +1. Interchain Token Transfer for Native Interchain Token + +```bash +node xrpl/decode-address.js [xrpl-address] +node evm/its.js --action interchainTransfer -n [source-chain] --destinationChain $CHAIN --destinationAddress [decoded-recipient-address] --tokenId [token-id] --amount [amount] +``` diff --git a/xrpl/README.md b/xrpl/README.md new file mode 100644 index 000000000..4dc081f0d --- /dev/null +++ b/xrpl/README.md @@ -0,0 +1,406 @@ +# XRPL deployments + +## Table of Contents + +- [Installation](#installation) +- [Deployment](#deployment) +- [Contract Interactions](#contract-interactions) +- [Helpers](#helpers) + +## Installation + +1. Install npm dependencies. + +```sh +npm ci +``` + +2. Create a new XRPL keypair via the [`generate-wallet.js` script](#generate-wallet). + +3. Set `PRIVATE_KEY` in `.env` to the generated wallet's `seed` value. + +4. Claim devnet and testnet funds via the [`faucet.js` script](#claim-funds-from-faucet), if applicable. + +5. Set `ENV` and `CHAIN` in `.env` to the environment ("devnet-amplifier", "stagenet", "testnet", or "mainnet") and chain name (`xrpl`), respectively, to avoid having to specify these on every command. + +## Deployment + +### XRPL Multisig Account Deployment + +Deploy a new XRPL multisig account (the equivalent of the edge AxelarGateway on XRPL): + +```bash +node xrpl/deploy-multisig.js -e -n --initialSigner +``` + +This will transform the environment wallet into an XRPL multisig account and configure it appropriately. + +### Rotate XRPL Multisig Signers + +Rotate the XRPL multisig account's signer set (via a `SignerListSet` transaction): + +```bash +node xrpl/rotate-signers.js -e -n --signerPublicKeys --signerWeights --quorum +``` + +The environment wallet must be the initial signer of the multisig account, with enough weight to reach quorum. + +Here's an example signer set rotation: + +```bash +node xrpl/rotate-signers.js -e testnet -n xrpl --signerPublicKeys 028E425D6F75EC61C8568B7E1C29D3085E210A90A0CE6491E7A249747D34431F6C 02D904B083B855A5AE1DAB39ACE60227E110E0490AAA74DE18F5806121369DBB48 02F77F629E38433F6D2CE5EE46B7E8E1724444163FB08B99CF2C1B117A0E8578F1 0285737FE8BA5D8E8F2A10CB39E814D5E72DADF8FF05BDFABCCF1EF20C51279EC8 --signerWeights 1 1 1 1 --quorum 3 +``` + +## Contract Interactions + +Since there's no smart contracts on XRPL, all interactions happen as `Payment` transactions towards the XRPL multisig account. +The XRPL multisig account is used in place of both AxelarGateway and InterchainTokenService. + +### ITS Interchain Transfers + +Interchain token transfers from XRPL are initiated via a `Payment` transaction that respects the following format: + +```js +{ + TransactionType: "Payment", + Account: user.address, // sender's account address + Amount: "1000000", // amount of XRP to send, in drops (in this case, 1 XRP), *including* gas fee amount + // Amount: { // alternatively, an IOU token amount can be specified, when transferring some IOU rather than XRP + // currency: "ABC", // IOU's currency code + // issuer: "r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1", // IOU issuer's account address + // value: "1" // IOU amount to bridge (in this case, 1 ABC.r4DVH), *including* gas fee amount + // }, + Destination: multisig.address, // Axelar multisig's account address + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("type") + MemoData: "696e746572636861696e5f7472616e73666572" // hex("interchain_transfer") + }, + }, + { + Memo: { + MemoType: "64657374696e6174696f6e5f61646472657373", // hex("destination_address") + // recipient's address, without the 0x prefix (in the EVM case), hex-encoded - hex("0A90c0Af1B07f6AC34f3520348Dbfae73BDa358E"), in this case: + MemoData: "30413930633041663142303766364143333466333532303334384462666165373342446133353845" + }, + }, + { + Memo: { + MemoType: "64657374696E6174696F6E5F636861696E", // hex("destination_chain") + MemoData: "7872706c2d65766d2d6465766e6574", // destination chain, hex encoded - hex("xrpl-evm-devnet"), in this case + }, + }, + { + Memo: { + MemoType: "6761735f6665655f616d6f756e74", // hex("gas_fee_amount") + // the amount to be deducted from the total payment amount to cover gas fee - + // this amount is denominated in the same token that's being transferred + // (i.e., if you're bridging XRP, this value corresponds to the amount of XRP drops that will be used to cover gas fees, + // while if you're bridging some IOU, it's the amount of IOU tokens that will be allocated to gas fees) + MemoData: "30", // amount of tokens to allocate to gas fees, out of the amount being sent to the multisig, hex encoded - hex("0"), in this case + }, + }, + { // Only include this Memo object when performing a GMP call: + Memo: { + MemoType: "7061796c6f6164", // hex("payload") + // abi-encoded payload/data with which to call the Executable destination contract address: + MemoData: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e474d5020776f726b7320746f6f3f000000000000000000000000000000000000", + }, + }, + ], + ... +} +``` + +Interchain token transfers can be performed via the `interchain-transfer.js` script: + +```bash +node xrpl/interchain-transfer.js -e -n [token] [amount] [destination-chain] [destination-address] --gasFeeAmount --payload +``` + +Here's an example of an interchain transfer that also performs GMP: + +```bash +node xrpl/interchain-transfer.js -e devnet-amplifier -n xrpl XRP 1 xrpl-evm-sidechain 0x0A90c0Af1B07f6AC34f3520348Dbfae73BDa358E --gasFeeAmount 0 --payload 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e474d5020776f726b7320746f6f3f000000000000000000000000000000000000 +``` + +### General Message Passing + +GMP contract calls from XRPL are initiated via a `Payment` transaction that respects the following format: + +```js +{ + TransactionType: "Payment", + Account: user.address, // sender's account address + Amount: "1000000", // amount of XRP used to cover gas fees, in drops (in this case, 1 XRP) + // Amount: { // alternatively, an IOU token amount can be used to cover gas fees + // currency: "ABC", // IOU's currency code + // issuer: "r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1", // IOU issuer's account address + // value: "1" // IOU amount to allocated to gas fees (in this case, 1 ABC.r4DVH) + // }, + Destination: multisig.address, // Axelar multisig's account address + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("type") + MemoData: "63616c6c5f636f6e7472616374" // hex("call_contract") + }, + }, + { + Memo: { + MemoType: "64657374696e6174696f6e5f61646472657373", // hex("destination_address") + // // destination smart contract address, without the 0x prefix (in the EVM case), hex-encoded - + // hex("0A90c0Af1B07f6AC34f3520348Dbfae73BDa358E"), in this case: + MemoData: "30413930633041663142303766364143333466333532303334384462666165373342446133353845" + }, + }, + { + Memo: { + MemoType: "64657374696E6174696F6E5F636861696E", // hex("destination_chain") + MemoData: "7872706c2d65766d2d6465766e6574", // destination chain, hex encoded - hex("xrpl-evm-devnet"), in this case + }, + }, + { + Memo: { + MemoType: "7061796c6f6164", // hex("payload") + // abi-encoded payload/data with which to call the Executable destination contract address: + MemoData: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e474d5020776f726b7320746f6f3f000000000000000000000000000000000000", + }, + }, + ], + ... +} +``` + +Pure GMP (without token transfers) can be performed via the `call-contract.js` script: + +```bash +node xrpl/call-contract.js -e -n [destination-chain] [destination-address] --gasFeeAmount --gasFeeToken --payload +``` + +Here's an example: + +```bash +node xrpl/call-contract.js -e devnet-amplifier -n xrpl-dev xrpl-evm-devnet 0x0A90c0Af1B07f6AC34f3520348Dbfae73BDa358E --gasFeeAmount 1 --gasFeeToken XRP --payload 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000B48656C6C6F20576F726C64000000000000000000000000000000000000000000 -y +``` + +### Add Gas + +A pending GMP/ITS message can be topped up from XRPL via a `Payment` transaction that respects the following format: + +```js +{ + TransactionType: "Payment", + Account: user.address, // sender's account address + Amount: "1000000", // amount of XRP, in drops (in this case, 1 XRP), to top-up gas fees with + // Amount: { // alternatively, an IOU token amount can be used to top up gas fees + // currency: "ABC", // IOU's currency code + // issuer: "r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1", // IOU issuer's account address + // value: "1" // IOU amount to top up gas fees with (in this case, 1 ABC.r4DVH) + // }, + Destination: multisig.address, // Axelar multisig's account address + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("type") + MemoData: "6164645f676173" // hex("add_gas") + }, + }, + { + Memo: { + MemoType: "6d73675f6964", // hex("msg_id") + // message ID of the pending GMP or ITS transaction whose gas to top up, hex encoded - hex("c7c653d2df83622c277da55df7fe6466098f5bc2e466e1251f42772d07016c8c"), in this case: + MemoData: "63376336353364326466383336323263323737646135356466376665363436363039386635626332653436366531323531663432373732643037303136633863" + }, + }, + ], + ... +} +``` + +You can use the `add-gas.js` script to top-up an ITS or GMP message's gas amount: + +```bash +node xrpl/add-gas.js -e -n --token --amount --msgId +``` + +Here's an example: + +```bash +node xrpl/add-gas.js -e devnet-amplifier -n xrpl-dev --amount 0.1 --token XRP --msgId C7C653D2DF83622C277DA55DF7FE6466098F5BC2E466E1251F42772D07016C8C +``` + +### Add XRP to Fee Reserve + +A fee reserve is used to cover the XRPL multisig account's reserve requirements as well as +Proof transaction fees (i.e., gas fees of transactions generated by the XRPL Multisig Prover). +These fee reserve top-ups are intended to be performed by the XRPL relayer. + +XRP fee reserve top-ups are initiated from XRPL via a `Payment` transaction that respects the following format: + +```js +{ + TransactionType: "Payment", + Account: user.address, // sender's account address + Amount: "1000000", // amount of XRP, in drops (in this case, 1 XRP), to top-up the fee reserve with + Destination: multisig.address, // Axelar multisig's account address + Memos: [ + { + Memo: { + MemoType: "74797065", // hex("type") + MemoData: "6164645f7265736572766573" // hex("add_reserves") + }, + }, + ], + ... +} +``` + +You can use the `add-reserves.js` script to top up the XRP fee reserve: + +```bash +node xrpl/add-reserves.js -e -n --amount +``` + +Here's an example: + +```bash +node xrpl/add-reserves.js -e devnet-amplifier -n xrpl-dev --amount 10 +``` + +## Helpers + +These scripts are intended to help with interactions with the XRPL. + +### Generate Wallet + +Generate a new XRPL wallet: + +```bash +node xrpl/generate-wallet.js +``` + +Set `SEED` in `.env` to the generated `seed` to use this wallet for performing other actions. + +### Claim Funds from Faucet + +Claim funds using the XRPL faucet: + +```bash +node xrpl/faucet.js -e -n --minBalance --amount --recipient +``` + +Here's an example: + +```bash +node xrpl/faucet.js --minBalance 100 --amount 100 +``` + +### Broadcast Raw Transaction Blob + +Broadcast a raw, signed transaction blob (e.g., a completed Multisig Prover proof) to XRPL: + +```bash +node xrpl/broadcast.js -e -n [blob] +``` + +Here's an example: + +```bash +node xrpl/broadcast.js -e testnet -n xrpl 12000C220000000024004C8592201B005199CE20230000000168400000000000000C730081140ACC2A59A96BEC485157E9841606C9AD844BA207F3E0107321028E425D6F75EC61C8568B7E1C29D3085E210A90A0CE6491E7A249747D34431F6C74463044022076E3EE68B9653C592D50DEFC885A6957A14B5924ECE3F61D42CD0056299DB428022029DE562319B3A4BC611B9EF1B0EE512438A48B25FAAD3D22E354BE14C780BE338114462757093D0F1DAD8F75922B19BE3AA5D9AC6B9DE1F1F4EB1300018114462757093D0F1DAD8F75922B19BE3AA5D9AC6B9DE1EB1300018114026EA26A49F2D5F2752BB15FE72C5812B7863824E1EB13000181141A1CC32118C7C7A156A889841A5E49A210B71342E1EB13000181141E88A08547159640ECCB53A52587987006D81A10E1EB130001811444B9500EB378468F8585F2275EABCC41252FC7CFE1EB130001811449E6787D8AE8AC5B1760B98585466EC09CF1E590E1EB13000181144A24EFF7061CE3D81B5C3FD6C1C74542B8055E64E1EB13000181144D85D4DC50B6CAA6797C4988D3B9ED9F9FB758A7E1EB13000181144E5C67BB4948F5959FEB1B7D23CB9A626D558F03E1EB13000181147462D3DEEF5F2EA11D3303C5ACF365BFB31CCA2FE1EB13000181148B71CE3A3EF0FAD3DF56F2B40673814E41B4287CE1EB13000181148D83D8D3F03A40B3A053F7C749652450720512C2E1EB13000181149196F13C2EFBAF8F8883F462FA98AD1041B4F3F2E1EB1300018114944FF4E33F562F654C37D7003D51E33F2D314D2EE1EB13000181149D9F9F164FC5B2401DF537E7DC13B4FCDC9A11F2E1EB1300018114AA9B0641CC13BF6182E3263BC4E7B7C7E6152654E1EB1300018114B4B3D25493774F58966937A098A07690691F2681E1EB1300018114C794445AA5F6E84A585A9738CFD2276AE89B0346E1EB1300018114CD17B9A2AA9EB6F6734E026325F9BE73D4146101E1EB1300018114D3D541E7C5DFE6CA530E1CBB29E2C1FF884D2B0CE1EB1300018114E3875AEFB4FEC31D93A1DECAB733A70DC4203530E1EB1300018114F1F517C9E934ACA53AC90FDB4187F03DEA735CDDE1EB1300018114FDDB12153E54A22CB125A3FDEF3FD650F0AD7C41E1F1 +``` + +### Decode XRPL Address + +Convert an XRPL Address (aka Account ID) into raw bytes (e.g., to be used when specifying an XRPL destination address on ITS): + +```bash +node xrpl/decode-address.js [account-id] +``` + +Here's an example: + +```bash +node xrpl/decode-address.js r9m9uUCAwMLSnRryXYuUB3cGXojpRznaAo +# Account ID raw bytes: 0x601abcea746a193f32ed460dd933f15441142d6b +``` + +### Decode Raw Transaction Blob + +Deserialize a raw transaction blob into a readable transaction object: + +```bash +node xrpl/decode-tx-blob.js +``` + +Here's a truncated example: + +```bash +node xrpl/decode-tx-blob.js 120000220000000024000000002029004c6ce7614[...]738623034353436656239322d3732393935e1f1 +# Decoded transaction: { +# "TransactionType": "Payment", +# "Flags": 0, +# "Sequence": 0, +# "TicketSequence": 5008615, +# "Amount": "1000000", +# "Fee": "5000", +# [...] +# } +``` + +### Make a Payment + +Perform a token transfer (via a Payment transaction). + +```bash +node xrpl/payment.js -e -n --multisign --from --to --amount --token +``` + +Here's an example: + +```bash +node xrpl/payment.js -e devnet-amplifier -n xrpl-dev --to rNY3vQMxmrKWnAboNtKdthPmqL4TD7ak3m --amount 1 --token "ABC.r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1" +``` + +### Create a Trust Line + +Create a trust line between your account and a token issuer (via a TrustSet transaction). + +```bash +node xrpl/trust-set.js -e -n --multisign --account [token-currency] [token-issuer-address] +``` + +Here's an example: + +```bash +node xrpl/trust-set.js -e devnet-amplifier -n xrpl XYZ r4DVHyEisbgQRAXCiMtP2xuz5h3dDkwqf1 +``` + +### Create Tickets + +Create tickets (via a TicketCreate transaction). + +```bash +node xrpl/ticket-create.js -e -n --multisign --account --ticketCount +``` + +Here's an example: + +```bash +node xrpl/ticket-create.js -e devnet-amplifier -n xrpl-dev --multisign --account rGAbJZEzU6WaYv5y1LfyN7LBBcQJ3TxsKC --ticketCount 250 +``` + +### Modify Account Properties + +Modify an account's properties (via an AccountSet transaction). + +```bash +node xrpl/account-set.js -e -n --multisign --account --transferRate --tickSize --domain --flag +``` + +Here's an example: + +```bash +node xrpl/account-set.js -e testnet -n xrpl --multisign --account rsCPY4vwEiGogSraV9FeRZXca6gUBWZkhg --transferRate 0 --tickSize 6 --domain axelar.foundation --flag 14 +``` diff --git a/xrpl/account-set.js b/xrpl/account-set.js new file mode 100644 index 000000000..e02e654ae --- /dev/null +++ b/xrpl/account-set.js @@ -0,0 +1,44 @@ +const { Command, Option } = require('commander'); +const { mainProcessor, hex } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); +const { printInfo } = require('../common'); + +async function accountSet(_config, wallet, client, _chain, options) { + printInfo('Updating account properties'); + await client.sendAccountSet( + wallet, + { + account: options.account, + transferRate: options.transferRate ? Number(options.transferRate) : undefined, + tickSize: options.tickSize ? Number(options.tickSize) : undefined, + domain: options.domain ? hex(options.domain) : undefined, + flag: options.flag ? Number(options.flag) : undefined, + }, + options, + ); + + printInfo('Successfully updated account properties'); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('account-set') + .description("Configure an XRPL account's properties") + .addOption(new Option('-m, --multisign', 'active wallet is a signer of the XRPL multisig account being configured').default(false)) + .addOption(new Option('--account ', 'XRPL account to configure (default: active wallet)')) + .addOption(new Option('--transferRate ', 'account transfer rate')) + .addOption(new Option('--tickSize ', 'account tick size')) + .addOption(new Option('--domain ', 'account domain')) + .addOption(new Option('--flag ', 'account flag')); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.action((options) => { + mainProcessor(accountSet, options); + }); + + program.parse(); +} diff --git a/xrpl/add-gas.js b/xrpl/add-gas.js new file mode 100644 index 000000000..c518aa8b7 --- /dev/null +++ b/xrpl/add-gas.js @@ -0,0 +1,37 @@ +const { Command, Option } = require('commander'); +const { mainProcessor, hex, parseTokenAmount } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); + +async function addGas(_config, wallet, client, chain, options, _args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.AxelarGateway.address, + amount: parseTokenAmount(options.token, options.amount), + memos: [ + { memoType: hex('type'), memoData: hex('add_gas') }, + { memoType: hex('msg_id'), memoData: hex(options.msgId.toLowerCase().replace('0x', '')) }, + ], + }, + options, + ); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('add-gas') + .description('Top up more gas to an XRPL message.') + .addOption(new Option('--token ', 'token to use').makeOptionMandatory(true)) + .addOption(new Option('--amount ', 'amount of gas to add').makeOptionMandatory(true)) + .addOption(new Option('--msgId ', 'message ID whose gas to top up').makeOptionMandatory(true)) + .action((options) => { + mainProcessor(addGas, options); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/add-reserves.js b/xrpl/add-reserves.js new file mode 100644 index 000000000..f6e881381 --- /dev/null +++ b/xrpl/add-reserves.js @@ -0,0 +1,33 @@ +const { Command, Option } = require('commander'); +const xrpl = require('xrpl'); +const { mainProcessor, hex } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); + +async function addReserves(_config, wallet, client, chain, options, _args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.AxelarGateway.address, + amount: xrpl.xrpToDrops(options.amount), + memos: [{ memoType: hex('type'), memoData: hex('add_reserves') }], + }, + options, + ); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('add-reserves') + .description('Top up the XRPL multisig fee reserve with XRP.') + .addOption(new Option('--amount ', 'amount of XRP to deposit into the fee reserve').makeOptionMandatory(true)) + .action((options) => { + mainProcessor(addReserves, options); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/balances.js b/xrpl/balances.js new file mode 100644 index 000000000..97b9e7106 --- /dev/null +++ b/xrpl/balances.js @@ -0,0 +1,21 @@ +const { Command } = require('commander'); +const { mainProcessor, printWalletInfo } = require('./utils'); +const { addBaseOptions } = require('./cli-utils'); + +async function balances(_config, wallet, client, chain) { + await printWalletInfo(client, wallet, chain); +} + +if (require.main === module) { + const program = new Command(); + + program.name('balances').description('Display balances of the wallet on XRPL.'); + + addBaseOptions(program); + + program.action((options) => { + mainProcessor(balances, options); + }); + + program.parse(); +} diff --git a/xrpl/broadcast.js b/xrpl/broadcast.js new file mode 100644 index 000000000..9af05c9fc --- /dev/null +++ b/xrpl/broadcast.js @@ -0,0 +1,32 @@ +const { Command } = require('commander'); +const { mainProcessor, printInfo, prompt, decodeTxBlob } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); + +async function broadcast(_config, _wallet, client, _chain, options, args) { + const { txBlob } = args; + const tx = decodeTxBlob(txBlob); + printInfo('Preparing to broadcast transaction', tx); + + if (prompt(`Submit ${tx.TransactionType} transaction?`, options.yes)) { + process.exit(0); + } + + await client.submitTx(txBlob); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('broadcast') + .description('Broadcast encoded signed transaction to XRPL.') + .argument('', 'signed transaction blob to broadcast') + .action((txBlob, options) => { + mainProcessor(broadcast, options, { txBlob }); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/call-contract.js b/xrpl/call-contract.js new file mode 100644 index 000000000..2ca1d7e28 --- /dev/null +++ b/xrpl/call-contract.js @@ -0,0 +1,46 @@ +const { Command, Option } = require('commander'); +const { mainProcessor, hex, parseTokenAmount } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); + +async function callContract(_config, wallet, client, chain, options, args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.AxelarGateway.address, + amount: parseTokenAmount(options.gasFeeToken, options.gasFeeAmount), // token is either "XRP" or "." + memos: [ + { memoType: hex('type'), memoData: hex('call_contract') }, + { memoType: hex('destination_address'), memoData: hex(args.destinationAddress.replace('0x', '')) }, + { memoType: hex('destination_chain'), memoData: hex(args.destinationChain) }, + { memoType: hex('payload'), memoData: options.payload }, + ], + }, + options, + ); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('call-contract') + .description('Initiate a GMP call from XRPL.') + .arguments(' ') + .addOption(new Option('--payload ', 'payload to call contract at destination address with').makeOptionMandatory(true)) + .addOption( + new Option('--gasFeeToken ', 'token to pay gas in ("XRP" or ".")').makeOptionMandatory(true), + ) + .addOption( + new Option('--gasFeeAmount ', 'amount of the deposited tokens that will be used to pay gas').makeOptionMandatory( + true, + ), + ) + .action((destinationChain, destinationAddress, options) => { + mainProcessor(callContract, options, { destinationChain, destinationAddress }); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/cli-utils.js b/xrpl/cli-utils.js new file mode 100644 index 000000000..4191c3b6f --- /dev/null +++ b/xrpl/cli-utils.js @@ -0,0 +1,48 @@ +'use strict'; + +const xrpl = require('xrpl'); +const { Option } = require('commander'); +const { addEnvOption } = require('../common/cli-utils'); + +const addWalletOptions = (program, _options = {}) => { + program.addOption( + new Option('--walletKeyType ', 'wallet key type') + .makeOptionMandatory(true) + .choices([xrpl.ECDSA.secp256k1]) + .default(xrpl.ECDSA.secp256k1) + .env('WALLET_KEY_TYPE'), + ); + + return program; +}; + +const addSkipPromptOption = (program, _options = {}) => { + program.addOption(new Option('-y, --yes', 'skip prompt confirmation').env('YES')); + return program; +}; + +const addBaseOptions = (program, _options = {}) => { + addEnvOption(program); + addWalletOptions(program); + + program.addOption(new Option('-n, --chainName ', 'chain to run the script over').makeOptionMandatory(true).env('CHAIN')); + + program.addOption(new Option('-p, --privateKey ', 'private key').makeOptionMandatory(true).env('PRIVATE_KEY')); + + program.addOption( + new Option('--privateKeyType ', 'private key type') + .makeOptionMandatory(true) + .choices(['seed']) + .default('seed') + .env('PRIVATE_KEY_TYPE'), + ); + + return program; +}; + +module.exports = { + ...require('../common/cli-utils'), + addBaseOptions, + addWalletOptions, + addSkipPromptOption, +}; diff --git a/xrpl/decode-address.js b/xrpl/decode-address.js new file mode 100644 index 000000000..5e1325f00 --- /dev/null +++ b/xrpl/decode-address.js @@ -0,0 +1,25 @@ +const { Command } = require('commander'); +const { decodeAccountIDToHex } = require('./utils'); +const { printInfo, printError } = require('../common'); + +function processCommand(address) { + try { + const decodedAddressHex = decodeAccountIDToHex(address); + printInfo('Account ID raw bytes', `0x${decodedAddressHex}`); + } catch (error) { + printError('Failed to decode account ID', error.message); + process.exit(1); + } +} + +if (require.main === module) { + const program = new Command(); + + program.name('decode-address').description('Decode XRPL account ID to raw bytes.').argument('
', 'XRPL account ID to decode'); + + program.action((address) => { + processCommand(address); + }); + + program.parse(); +} diff --git a/xrpl/decode-tx-blob.js b/xrpl/decode-tx-blob.js new file mode 100644 index 000000000..03d5e08a2 --- /dev/null +++ b/xrpl/decode-tx-blob.js @@ -0,0 +1,28 @@ +const { Command } = require('commander'); +const { decodeTxBlob } = require('./utils'); +const { printInfo, printError } = require('../common'); + +function processCommand(address) { + try { + const tx = decodeTxBlob(address); + printInfo('Decoded transaction', tx); + } catch (error) { + printError('Failed to decode account ID', error.message); + process.exit(1); + } +} + +if (require.main === module) { + const program = new Command(); + + program + .name('decode-tx-blob') + .description('Decode XRPL serialized transaction blob into transaction object.') + .argument('', 'XRPL serialized transaction blob to decode'); + + program.action((address) => { + processCommand(address); + }); + + program.parse(); +} diff --git a/xrpl/deploy-multisig.js b/xrpl/deploy-multisig.js new file mode 100644 index 000000000..79590d20c --- /dev/null +++ b/xrpl/deploy-multisig.js @@ -0,0 +1,120 @@ +const xrpl = require('xrpl'); +const { Command, Option } = require('commander'); +const { mainProcessor, generateWallet, hex } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); +const { printInfo, printWarn, prompt } = require('../common'); + +const DISABLE_MASTER_FLAG = xrpl.AccountSetAsfFlags.asfDisableMaster; + +const DEFAULTS = { + TRANSFER_RATE: 0, // Don't charge a fee for transferring currencies issued by the multisig + TICK_SIZE: 6, // Determines truncation for order book entries, not payments + DOMAIN: 'axelar.foundation', + FLAGS: [ + xrpl.AccountSetAsfFlags.asfDisallowIncomingNFTokenOffer, + xrpl.AccountSetAsfFlags.asfDisallowIncomingCheck, + xrpl.AccountSetAsfFlags.asfDisallowIncomingPayChan, + xrpl.AccountSetAsfFlags.asfDefaultRipple, + xrpl.AccountSetAsfFlags.asfNoFreeze, + ], +}; + +const MAX_TICKET_COUNT = 250; + +const INITIAL_QUORUM = 1; +const INITIAL_SIGNER_WEIGHT = 1; + +async function deployMultisig(_config, wallet, client, chain, options) { + const { balance } = await client.accountInfo(wallet.address); + const { baseReserve, ownerReserve } = await client.reserveRequirements(); + const multisigReserve = Math.ceil(baseReserve + (MAX_TICKET_COUNT + 1) * ownerReserve); + + if (balance < Number(multisigReserve)) { + printWarn(`Wallet XRP balance (${balance} XRP) is less than required multisig account reserve (${multisigReserve} XRP)`); + process.exit(0); + } + + let multisig; + + if (options.generateWallet) { + multisig = generateWallet(options); + printInfo('Generated new multisig account', multisig); + printInfo(`Funding multisig account with ${multisigReserve} XRP from wallet`); + await client.sendPayment(wallet, { destination: multisig.address, amount: xrpl.xrpToDrops(multisigReserve) }); + printInfo('Funded multisig account'); + } else { + if (prompt(`Proceed with turning ${wallet.address} into a multisig account?`, options.yes)) { + return; + } + + multisig = wallet; + } + + printInfo('Setting initial multisig signer', options.initialSigner); + await client.sendSignerListSet( + multisig, + { + quorum: INITIAL_QUORUM, + signers: [{ address: options.initialSigner, weight: INITIAL_SIGNER_WEIGHT }], + }, + options, + ); + + printInfo('Creating tickets'); + await client.sendTicketCreate(multisig, { ticketCount: MAX_TICKET_COUNT }, options); + + for (const flag of options.flags) { + printInfo(`Setting flag ${flag}`); + await client.sendAccountSet(multisig, { flag }, options); + } + + printInfo('Configuring remaining account settings'); + await client.sendAccountSet( + multisig, + { + transferRate: options.transferRate, + tickSize: options.tickSize, + domain: hex(options.domain), + flag: DISABLE_MASTER_FLAG, + }, + options, + ); + + chain.contracts.AxelarGateway = chain.contracts.InterchainTokenService = { + address: multisig.address, + initialSigner: options.initialSigner, + transferRate: options.transferRate, + tickSize: options.tickSize, + domain: options.domain, + flags: [DISABLE_MASTER_FLAG, ...options.flags], + }; + + printInfo('Successfully created and configured XRPL multisig account', multisig.address); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('deploy-multisig') + .description('Converts a wallet into an XRPL multisig account.') + .addOption( + new Option('--generateWallet', 'convert a new wallet (instead of the active wallet) into an XRPL multisig account').default( + false, + ), + ) + .addOption(new Option('--transferRate ', 'account transfer rate').default(DEFAULTS.TRANSFER_RATE)) + .addOption(new Option('--tickSize ', 'account tick size').default(DEFAULTS.TICK_SIZE)) + .addOption(new Option('--domain ', 'account domain').default(DEFAULTS.DOMAIN)) + .addOption(new Option('--flags ', 'extra account flags (beyond asfDisableMaster)').default(DEFAULTS.FLAGS)) + .addOption(new Option('--initialSigner ', "XRPL address of the multisig's initial signer").makeOptionMandatory(true)); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.action((options) => { + mainProcessor(deployMultisig, options); + }); + + program.parse(); +} diff --git a/xrpl/faucet.js b/xrpl/faucet.js new file mode 100644 index 000000000..b2836f998 --- /dev/null +++ b/xrpl/faucet.js @@ -0,0 +1,76 @@ +const xrpl = require('xrpl'); +const { Command, Option } = require('commander'); +const { mainProcessor, roundUpToNearestXRP } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); +const { printInfo, printWarn } = require('../common'); + +const MAX_CLAIMABLE_DROPS = 1000000000; + +async function faucet(_config, wallet, client, _chain, options) { + const recipient = options.recipient || wallet.address; + const { balance: recipientBalance } = await client.accountInfo(recipient); + const amountInDrops = xrpl.xrpToDrops(options.amount); + const recipientBalanceInXrp = xrpl.dropsToXrp(recipientBalance); + const isDifferentRecipient = wallet.address.toLowerCase() !== recipient.toLowerCase(); + + let fee = '0'; + + if (isDifferentRecipient) { + printInfo(`Requesting funds for`, recipient); + fee = await client.fee(); + } + + if (Number(recipientBalanceInXrp) >= Number(options.minBalance)) { + printWarn(`Recipient balance (${recipientBalanceInXrp} XRP) above minimum, skipping faucet request`); + process.exit(0); + } + + const amountToClaim = roundUpToNearestXRP(Number(amountInDrops) + Number(fee)); + + if (amountToClaim > MAX_CLAIMABLE_DROPS) { + printWarn(`Amount too high, maximum is ${(MAX_CLAIMABLE_DROPS - fee) / 1e6} XRP`); + process.exit(0); + } + + printInfo(`Funding active wallet ${wallet.address} with`, `${amountToClaim / 1e6} XRP`); + await client.fundWallet(wallet, String(amountToClaim / 1e6)); + + if (isDifferentRecipient) { + printInfo(`Transferring ${options.amount} XRP from active wallet to recipient`, recipient); + await client.sendPayment( + wallet, + { + destination: recipient, + amount: amountInDrops, + fee, + }, + options, + ); + } + + printInfo('Funds sent', recipient); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('faucet') + .addOption(new Option('--recipient ', 'recipient to request funds for (default: wallet address)')) + .addOption(new Option('--amount ', 'amount of XRP tokens to request from the faucet').default('100')) + .addOption( + new Option( + '--minBalance ', + 'tokens will only be requested from the faucet if recipient XRP balance is below the amount provided', + ).default('1'), + ) + .description('Query the faucet for funds.') + .action((options) => { + mainProcessor(faucet, options); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/generate-wallet.js b/xrpl/generate-wallet.js new file mode 100644 index 000000000..be5a7c5cd --- /dev/null +++ b/xrpl/generate-wallet.js @@ -0,0 +1,24 @@ +const { Command } = require('commander'); +const { addWalletOptions } = require('./cli-utils'); +const { generateWallet } = require('./utils'); +const { printInfo } = require('../common'); + +function processCommand(options) { + const wallet = generateWallet(options); + printInfo('Generated new XRPL wallet', wallet); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('generate-wallet') + .description('Generate a new XRPL wallet.') + .action((options) => { + processCommand(options); + }); + + addWalletOptions(program); + + program.parse(); +} diff --git a/xrpl/interchain-transfer.js b/xrpl/interchain-transfer.js new file mode 100644 index 000000000..14ae8833e --- /dev/null +++ b/xrpl/interchain-transfer.js @@ -0,0 +1,40 @@ +const { Command, Option } = require('commander'); +const { mainProcessor, hex, parseTokenAmount } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); + +async function interchainTransfer(_config, wallet, client, chain, options, args) { + await client.sendPayment( + wallet, + { + destination: chain.contracts.InterchainTokenService.address, + amount: parseTokenAmount(args.token, args.amount), // token is either "XRP" or "." + memos: [ + { memoType: hex('type'), memoData: hex('interchain_transfer') }, + { memoType: hex('destination_address'), memoData: hex(args.destinationAddress.replace('0x', '')) }, + { memoType: hex('destination_chain'), memoData: hex(args.destinationChain) }, + { memoType: hex('gas_fee_amount'), memoData: hex(options.gasFeeAmount) }, + ...(options.payload ? [{ memoType: hex('payload'), memoData: options.payload }] : []), + ], + }, + options, + ); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('interchain-transfer') + .description('Initiate an interchain token transfer from XRPL.') + .arguments(' ') + .addOption(new Option('--payload ', 'payload to call contract at destination address with')) + .addOption(new Option('--gasFeeAmount ', 'gas fee amount').makeOptionMandatory(true)) + .action((token, amount, destinationChain, destinationAddress, options) => { + mainProcessor(interchainTransfer, options, { token, amount, destinationChain, destinationAddress }); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/payment.js b/xrpl/payment.js new file mode 100644 index 000000000..b6363933b --- /dev/null +++ b/xrpl/payment.js @@ -0,0 +1,39 @@ +const { Command, Option } = require('commander'); +const { mainProcessor, parseTokenAmount } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); +const { printInfo } = require('../common'); + +async function payment(_config, wallet, client, _chain, options) { + printInfo('Transferring tokens'); + await client.sendPayment( + wallet, + { + account: options.from, + amount: parseTokenAmount(options.token, options.amount), // token is either "XRP" or "." + destination: options.to, + }, + options, + ); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('payment') + .description("Configure an XRPL account's properties") + .addOption(new Option('-m, --multisign', 'active wallet is a signer of the sender XRPL multisig account').default(false)) + .addOption(new Option('--from ', 'account to send from (default: active wallet)')) + .addOption(new Option('--to ', 'destination account').makeOptionMandatory(true)) + .addOption(new Option('--token ', 'token to send ("XRP" or ".")').default('XRP')) + .addOption(new Option('--amount ', 'amount of tokens to send').makeOptionMandatory(true)); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.action((options) => { + mainProcessor(payment, options); + }); + + program.parse(); +} diff --git a/xrpl/rotate-signers.js b/xrpl/rotate-signers.js new file mode 100644 index 000000000..a9d4cbae1 --- /dev/null +++ b/xrpl/rotate-signers.js @@ -0,0 +1,50 @@ +const { Command, Option } = require('commander'); +const { mainProcessor, deriveAddress } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); +const { printInfo } = require('../common'); + +async function rotateSigners(_config, wallet, client, chain, options) { + // Wallet must be the initial signer of the multisig account, + // with enough weight to reach quorum. + const multisig = chain.contracts.AxelarGateway.address; + + if (options.signerPublicKeys.length !== options.signerWeights.length) { + throw new Error('Number of signer public keys must match number of signer weights'); + } + + printInfo('Updating multisig signer set'); + await client.sendSignerListSet( + wallet, + { + account: multisig, + quorum: Number(options.quorum), + signers: options.signerPublicKeys.map((signedPubKey, i) => ({ + address: deriveAddress(signedPubKey), + weight: Number(options.signerWeights[i]), + })), + }, + { multisign: true, ...options }, + ); + + printInfo('Successfully rotated signers'); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('rotate-signers') + .description('Rotate signers of the XRPL multisig account.') + .addOption(new Option('--signerPublicKeys ', 'public keys of the new signers').makeOptionMandatory(true)) + .addOption(new Option('--signerWeights ', 'weights of the new signers').makeOptionMandatory(true)) + .addOption(new Option('--quorum ', 'new quorum for the multisig account').makeOptionMandatory(true)); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.action((options) => { + mainProcessor(rotateSigners, options); + }); + + program.parse(); +} diff --git a/xrpl/ticket-create.js b/xrpl/ticket-create.js new file mode 100644 index 000000000..3ade24f0a --- /dev/null +++ b/xrpl/ticket-create.js @@ -0,0 +1,38 @@ +const { Command, Option } = require('commander'); +const { mainProcessor } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); +const { printInfo } = require('../common'); + +async function ticketCreate(_config, wallet, client, _chain, options) { + printInfo(`Creating ${options.ticketCount} tickets`); + await client.sendTicketCreate( + wallet, + { + account: options.account, + ticketCount: Number(options.ticketCount), + }, + options, + ); + + printInfo('Successfully created tickets'); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('ticket-create') + .description('Create tickets for an XRPL account.') + .addOption(new Option('-m, --multisign', 'active wallet is a signer of the target XRPL multisig account').default(false)) + .addOption(new Option('--account ', 'XRPL account to configure (default: active wallet)')) + .addOption(new Option('--ticketCount ', 'number of tickets to create').makeOptionMandatory(true)); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.action((options) => { + mainProcessor(ticketCreate, options); + }); + + program.parse(); +} diff --git a/xrpl/trust-set.js b/xrpl/trust-set.js new file mode 100644 index 000000000..981b74459 --- /dev/null +++ b/xrpl/trust-set.js @@ -0,0 +1,36 @@ +const { Command, Option } = require('commander'); +const { mainProcessor } = require('./utils'); +const { addBaseOptions, addSkipPromptOption } = require('./cli-utils'); + +async function trustSet(_config, wallet, client, _chain, options, args) { + await client.sendTrustSet( + wallet, + { + account: options.account, + value: options.limit, + currency: args.currency, + issuer: args.issuer, + }, + options, + ); +} + +if (require.main === module) { + const program = new Command(); + + program + .name('trust-set') + .description('Establish a trust line with the issuer of a given token.') + .arguments(' ') + .addOption(new Option('-m, --multisign', 'active wallet is a signer of the target XRPL multisig account').default(false)) + .addOption(new Option('--account ', 'XRPL account from which to create a trust line (default: active wallet)')) + .addOption(new Option('--limit ', 'trust line limit').default('1000000000')) + .action((currency, issuer, options) => { + mainProcessor(trustSet, options, { currency, issuer }); + }); + + addBaseOptions(program); + addSkipPromptOption(program); + + program.parse(); +} diff --git a/xrpl/utils.js b/xrpl/utils.js new file mode 100644 index 000000000..f72d2da8c --- /dev/null +++ b/xrpl/utils.js @@ -0,0 +1,390 @@ +'use strict'; + +const xrpl = require('xrpl'); +const { decodeAccountID } = require('ripple-address-codec'); +const { decode: decodeTxBlob } = require('ripple-binary-codec'); +const chalk = require('chalk'); +const { loadConfig, saveConfig, printInfo, printWarn, printError, prompt, getChainConfig } = require('../common'); + +function hex(str) { + return Buffer.from(str).toString('hex'); +} + +function roundUpToNearestXRP(amountInDrops) { + return Math.ceil(amountInDrops / 1e6) * 1e6; +} + +function generateWallet(options) { + return xrpl.Wallet.generate(options.walletKeyType); +} + +function getWallet(options) { + return xrpl.Wallet.fromSeed(options.privateKey, { + algorithm: options.walletKeyType, + }); +} + +function deriveAddress(publicKey) { + return new xrpl.Wallet(publicKey).address; +} + +function decodeAccountIDToHex(accountId) { + return hex(decodeAccountID(accountId)); +} + +// XRPL token is either: +// (1) "XRP" +// (2) "." +function parseTokenAmount(token, amount) { + let parsedAmount; + + if (token === 'XRP') { + parsedAmount = xrpl.xrpToDrops(amount); + } else { + const [currency, issuer] = token.split('.'); + parsedAmount = { + currency, + issuer, + value: amount, + }; + } + + return parsedAmount; +} + +class XRPLClient { + constructor(rpcUrl) { + this.client = new xrpl.Client(rpcUrl); + } + + async connect() { + await this.client.connect(); + } + + async disconnect() { + await this.client.disconnect(); + } + + async request(command, params = {}) { + const response = await this.client.request({ command, ...params }); + return response.result; + } + + async autofill(tx) { + return await this.client.autofill(tx); + } + + async accountInfo(account, ledgerIndex = 'validated') { + try { + const accountInfoRes = await this.request('account_info', { + account, + ledger_index: ledgerIndex, + }); + + const accountInfo = accountInfoRes.account_data; + return { + balance: accountInfo.Balance, + sequence: accountInfo.Sequence, + }; + } catch (error) { + if (error.data?.error === 'actNotFound') { + return { + balance: '0', + sequence: '-1', + }; + } + + throw error; + } + } + + async accountObjects(account, params = {}, limit = 1000, ledgerIndex = 'validated') { + const accountObjectsRes = await this.request('account_objects', { + account, + ledger_index: ledgerIndex, + limit, + ...params, + }); + + return accountObjectsRes.account_objects; + } + + async tickets(account, limit = 1000, ledgerIndex = 'validated') { + const ticketRes = await this.accountObjects(account, { type: 'ticket' }, limit, ledgerIndex); + return ticketRes.map((ticket) => ticket.TicketSequence); + } + + async accountLines(account) { + const accountLinesRes = await this.request('account_lines', { + account, + ledger_index: 'validated', + }); + + return accountLinesRes.lines; + } + + async reserveRequirements() { + const serverInfoRes = await this.request('server_info'); + const validatedLedger = serverInfoRes.info.validated_ledger; + return { + baseReserve: validatedLedger.reserve_base_xrp, + ownerReserve: validatedLedger.reserve_inc_xrp, + }; + } + + async fee(feeType = 'open_ledger_fee') { + const feeRes = await this.request('fee'); + return feeRes.drops[feeType]; + } + + async fundWallet(wallet, amount) { + return this.client.fundWallet(wallet, { amount }); + } + + handleReceipt(receipt) { + const result = receipt.engine_result; + + if (result !== 'tesSUCCESS') { + printError('Transaction failed', `${receipt.engine_result}: ${receipt.engine_result_message}`); + process.exit(1); + } + + printInfo(`Transaction sent`, receipt.tx_json.hash); + } + + async submitTx(txBlob, failHard = true) { + const result = await this.request('submit', { + tx_blob: txBlob, + fail_hard: failHard, + }); + this.handleReceipt(result); + return result; + } + + async buildTx(txType, fields = {}, args = {}) { + const tx = { + TransactionType: txType, + ...fields, + }; + + if (args.account) { + tx.Account = args.account; + } + + if (args.fee) { + tx.Fee = args.fee; + } + + return await this.autofill(tx); + } + + async signTx(signer, tx, multisign = false) { + return signer.sign(tx, multisign); + } + + async signAndSubmitTx(signer, txType, fields = {}, args = {}, options = { multisign: false, yes: false }) { + const tx = await this.buildTx(txType, fields, { + ...args, + account: args.account ?? signer.classicAddress, + // when multisigning, fee = (N + 1) * normal fee, where N is the number of signatures + fee: args.fee ?? (options.multisign ? String(Number(await this.fee()) * 2) : undefined), + }); + + printInfo(`${options.multisign ? 'Multi-' : ''}Signing transaction`, JSON.stringify(tx, null, 2)); + const signedTx = await this.signTx(signer, tx, options.multisign); + + if (prompt(`Submit ${txType} transaction?`, options.yes)) { + printWarn('Transaction cancelled by user.'); + process.exit(0); + } + + return await this.submitTx(signedTx.tx_blob); + } + + checkRequiredField(field, fieldName) { + if (!field) { + throw new Error(`Missing required field: ${fieldName}`); + } + } + + async sendPayment(signer, { destination, amount, memos = [], ...restArgs }, options = { multisign: false, yes: false }) { + this.checkRequiredField(destination, 'destination'); + this.checkRequiredField(amount, 'amount'); + return await this.signAndSubmitTx( + signer, + 'Payment', + { + Destination: destination, + Amount: amount, + Memos: + memos.length > 0 + ? memos.map((memo) => ({ + Memo: { + MemoType: memo.memoType, + MemoData: memo.memoData, + }, + })) + : undefined, + }, + restArgs, + options, + ); + } + + async sendSignerListSet(signer, { quorum, signers, ...restArgs }, options = { multisign: false, yes: false }) { + this.checkRequiredField(quorum, 'quorum'); + this.checkRequiredField(signers, 'signers'); + + if (signers.length === 0) { + throw new Error('Signers list cannot be empty'); + } + + return await this.signAndSubmitTx( + signer, + 'SignerListSet', + { + SignerQuorum: quorum, + SignerEntries: signers.map((signer) => ({ + SignerEntry: { + Account: signer.address, + SignerWeight: signer.weight, + }, + })), + }, + restArgs, + options, + ); + } + + async sendTicketCreate(signer, { ticketCount, ...restArgs }, options = { multisign: false, yes: false }) { + this.checkRequiredField(ticketCount, 'ticketCount'); + return await this.signAndSubmitTx(signer, 'TicketCreate', { TicketCount: ticketCount }, restArgs, options); + } + + async sendAccountSet(signer, { transferRate, tickSize, domain, flag, ...restArgs }, options = { multisign: false, yes: false }) { + return await this.signAndSubmitTx( + signer, + 'AccountSet', + { + TransferRate: transferRate, + TickSize: tickSize, + Domain: domain, + SetFlag: flag, + }, + restArgs, + options, + ); + } + + async sendTrustSet(signer, { currency, issuer, value, ...restArgs }, options = { multisign: false, yes: false }) { + this.checkRequiredField(currency, 'currency'); + this.checkRequiredField(issuer, 'issuer'); + this.checkRequiredField(value, 'value'); + return await this.signAndSubmitTx( + signer, + 'TrustSet', + { + LimitAmount: { + currency, + issuer, + value, + }, + }, + restArgs, + options, + ); + } +} + +async function printWalletInfo(client, wallet, chain) { + const address = wallet.address; + const { balance, sequence } = await client.accountInfo(address); + printInfo('Wallet address', address); + + if (balance === '0') { + printError('Wallet balance', '0'); + } else { + printInfo('Wallet balance', `${xrpl.dropsToXrp(balance)} ${chain.tokenSymbol || ''}`); + } + + if (sequence === '-1') { + printWarn('Wallet is not active because it does not meet the base reserve requirement'); + return; + } + + printInfo('Wallet sequence', sequence); + + const lines = await client.accountLines(address); + + if (lines.length === 0) { + printInfo('Wallet IOU balances', 'No IOU balances found'); + return; + } + + printInfo('Wallet IOU balances', lines.map((line) => `${line.balance} ${line.currency}.${line.account}`).join(' ')); +} + +async function mainProcessor(processor, options, args, save = true, catchErr = false) { + if (!options.env) { + throw new Error('Environment was not provided'); + } + + printInfo('Environment', options.env); + + const config = loadConfig(options.env); + + if (!options.chainName) { + throw new Error('Chain name was not provided'); + } + + const chainName = options.chainName.toLowerCase(); + + const chain = getChainConfig(config, chainName); + + if (!chain) { + throw new Error(`Chain ${chainName} is not defined in the info file`); + } + + if (chain.chainType !== 'xrpl') { + throw new Error(`Cannot run script for a non XRPL chain: ${chainName}`); + } + + console.log(''); + printInfo('Chain', chain.name, chalk.cyan); + + const wallet = getWallet(options); + + const client = new XRPLClient(chain.wssRpc); + await client.connect(); + + try { + await processor(config, wallet, client, chain, options, args); + } catch (error) { + printError(`Failed with error on ${chainName}`, error.message); + + if (!catchErr && !options.ignoreError) { + throw error; + } + } finally { + await client.disconnect(); + } + + if (save) { + saveConfig(config, options.env); + } +} + +module.exports = { + ...require('../common/utils'), + XRPLClient, + generateWallet, + getWallet, + printWalletInfo, + mainProcessor, + hex, + roundUpToNearestXRP, + deriveAddress, + parseTokenAmount, + decodeAccountIDToHex, + decodeTxBlob, +}; From 874638ddf75b484c433b78ce1ba32c2021cca2ed Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Mon, 31 Mar 2025 12:25:25 +0530 Subject: [PATCH 02/71] feat(releases): update Celo confirmation height (#631) --- .../axelar/2025-03-Celo-proposal-v1.0.0.md | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 releases/axelar/2025-03-Celo-proposal-v1.0.0.md diff --git a/releases/axelar/2025-03-Celo-proposal-v1.0.0.md b/releases/axelar/2025-03-Celo-proposal-v1.0.0.md new file mode 100644 index 000000000..2897e6b21 --- /dev/null +++ b/releases/axelar/2025-03-Celo-proposal-v1.0.0.md @@ -0,0 +1,77 @@ +# Update Celo confirmation height + +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @blockchainguyy | +| **Deployment** | @blockchainguyy | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | -------- | +| **Devnet Amplifier** | NA | - | +| **Stagenet** | NA | - | +| **Testnet** | Done | 2025-03-27 | +| **Mainnet** | In Progress | 2025-03-26 | + +## Param change instructions + +Create a `proposal.json` file as follows: + +```json +{ + "title": "Update Celo confirmation height", + "description": "Celo supports finalized tag now, therefore updating confirmation height to 2500", + "changes": [ + { + "subspace": "evm_celo", + "key": "confirmationHeight", + "value": "2500" + } + ], + "deposit": "2000000000uaxl" +} +``` + +```jsx +axelard tx gov submit-proposal param-change proposal.json --from validator --gas auto --gas-adjustment 1.2 +``` + +Proposal id will be in the output, but can also be seen on the explorer. + +Post in the appropriate validator announcement channel about the proposal. Vote with internal validators on `testnet`, `stagenet` and `devnet-amplifier` + +```jsx +axelard tx gov vote [yes|no] --from validator +``` + +## Checklist + +The following checks should be performed after the rollout + +1. Check if proposal is up from: + +| **Network** | Explorer | +| -------------------- | --------------------- | +| **Testnet** | https://testnet.axelarscan.io/proposal/${proposal-id} | +| **Mainnet** | https://axelarscan.io/proposal/${proposal-id} | + +2. Check if proposal can be passed: + +| **Network** | Explorer | +| -------------------- | --------------------- | +| **Testnet** | https://www.mintscan.io/axelar-testnet/proposals/${proposal-id} | +| **Mainnet** | https://www.mintscan.io/axelar/proposals/${proposal-id} | + +Can also be checked from + +```jsx +axelard query gov proposal [proposal-id] +``` + +3. Check if the param was updated on the network + +```jsx +axelard query evm params celo +``` + +4. Check if GMP calls are being executed from: https://axelarscan.io/gmp/search?sourceChain=celo + From 8469e31b85ca63035e58e8ab55b7d33ca93319c6 Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Mon, 31 Mar 2025 12:46:46 +0530 Subject: [PATCH 03/71] feat: update code ID for testnet Xrplgateway contract (#635) --- axelar-chains-config/info/testnet.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index df32de240..5c3862ce7 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -3224,9 +3224,9 @@ "codeId": 32, "address": "axelar18qltw4382s5qz0rgzfxz67mr83smk580hewlkfd33l5tmcdp8unqw35glh" }, - "storeCodeProposalId": "246", - "storeCodeProposalCodeHash": "2de0624fa2ba2fbd9e97da61a832a471f3cfd0a4d333286fe248e36938ecb5f2", - "lastUploadedCodeId": 32 + "storeCodeProposalId": "255", + "storeCodeProposalCodeHash": "695eac10df3b5e5c571047ddab1bc64b92e80938d424907d7e2039c86883fd51", + "lastUploadedCodeId": 34 } }, "axelarId": "axelar", From 0879986df8ae10b586c7954f1b2c73a2d474178b Mon Sep 17 00:00:00 2001 From: ahramy Date: Mon, 31 Mar 2025 08:04:14 -0700 Subject: [PATCH 04/71] chore(stellar): use encoded its destination and remove unused encode recipient (#634) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Noah B. 🥂 <15343884+nbayindirli@users.noreply.github.com> --- common/its.js | 36 ++++++++++++++++++++++++++ common/utils.js | 4 +++ evm/its.js | 12 +++------ releases/stellar/2025-01-ITS-v1.0.0.md | 8 +----- releases/stellar/2025-03-ITS-v1.1.0.md | 8 +----- stellar/README.md | 6 ----- stellar/its.js | 22 +++++----------- 7 files changed, 53 insertions(+), 43 deletions(-) create mode 100644 common/its.js diff --git a/common/its.js b/common/its.js new file mode 100644 index 000000000..286cc794f --- /dev/null +++ b/common/its.js @@ -0,0 +1,36 @@ +'use strict'; + +const { Command } = require('commander'); +const { addBaseOptions, addOptionsToCommands, encodeITSDestination, loadConfig, printInfo } = require('../common'); + +async function encodeRecipient(config, args, _) { + const [destinationChain, destinationAddress] = args; + + const itsDestinationAddress = encodeITSDestination(config, destinationChain, destinationAddress); + + printInfo('Human-readable destination address', destinationAddress); + printInfo('Encoded ITS destination address', itsDestinationAddress); +} + +async function mainProcessor(processor, args, options) { + const config = loadConfig(options.env); + + await processor(config, args, options); +} + +if (require.main === module) { + const program = new Command(); + + program.name('its').description('Interchain Token Service common operations.'); + + program + .command('encode-recipient { + mainProcessor(encodeRecipient, [destinationChain, destinationAddress], options); + }); + + addOptionsToCommands(program, addBaseOptions, { ignoreChainNames: true }); + + program.parse(); +} diff --git a/common/utils.js b/common/utils.js index 77b150a40..cf8fbaede 100644 --- a/common/utils.js +++ b/common/utils.js @@ -591,6 +591,10 @@ function encodeITSDestination(config, destinationChain, destinationAddress) { const chainType = getChainConfig(config, destinationChain, { skipCheck: true })?.chainType; switch (chainType) { + case undefined: + printWarn(`destinationChain ${destinationChain} not found in config`); + return destinationAddress; + case 'stellar': validateParameters({ isValidStellarAddress: { destinationAddress } }); return asciiToBytes(destinationAddress); diff --git a/evm/its.js b/evm/its.js index a0e53812a..accd0b4f3 100644 --- a/evm/its.js +++ b/evm/its.js @@ -347,18 +347,14 @@ async function processCommand(config, chain, action, options) { await token.approve(interchainTokenService.address, amountInUnits, gasOptions).then((tx) => tx.wait()); } - const destinationAddressEncoded = encodeITSDestination(config, destinationChain, destinationAddress); - - if (destinationAddressEncoded !== destinationAddress) { - printInfo( - `The destination address "${destinationAddress}" was encoded as "${destinationAddressEncoded}" for "${destinationChain}".`, - ); - } + const itsDestinationAddress = encodeITSDestination(config, destinationChain, destinationAddress); + printInfo('Human-readable destination address', destinationAddress); + printInfo('Encoded ITS destination address', itsDestinationAddress); const tx = await interchainTokenService.interchainTransfer( tokenIdBytes32, destinationChain, - destinationAddressEncoded, + itsDestinationAddress, amountInUnits, metadata, gasValue, diff --git a/releases/stellar/2025-01-ITS-v1.0.0.md b/releases/stellar/2025-01-ITS-v1.0.0.md index 770d3a76f..88d6dd42b 100644 --- a/releases/stellar/2025-01-ITS-v1.0.0.md +++ b/releases/stellar/2025-01-ITS-v1.0.0.md @@ -155,18 +155,12 @@ node stellar/its.js interchain-transfer [token-id] [destination-chain] [destinat ### EVM to Stellar -- Note: Execute encode-recipient to get the encoded destination address +- Note: The final execute step of the GMP call on Stellar can be performed via: ```bash # Change `PRIVATE_KEY in `.env` to Stellar PRIVATE_KEY= -node stellar/its.js encode-recipient [stellar-its-address] -``` - -- Note: The final execute step of the GMP call on Stellar can be performed via: - -```bash node stellar/its.js execute [source-chain] [message-id] [source-address] [payload] ``` diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.0.md index e68e9b45f..471e3b4b2 100644 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ b/releases/stellar/2025-03-ITS-v1.1.0.md @@ -147,18 +147,12 @@ node stellar/its.js interchain-transfer [token-id] [destination-chain] [destinat ### EVM to Stellar -- Note: Execute encode-recipient to get the encoded destination address +- Note: The final execute step of the GMP call on Stellar can be performed via: ```bash # Change `PRIVATE_KEY in `.env` to Stellar PRIVATE_KEY= -node stellar/its.js encode-recipient [stellar-its-address] -``` - -- Note: The final execute step of the GMP call on Stellar can be performed via: - -```bash node stellar/its.js execute [destination-chain] [message-id] [source-address] [payload] ``` diff --git a/stellar/README.md b/stellar/README.md index 76ada5c8b..5f8e625c1 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -282,12 +282,6 @@ node stellar/its.js deploy-remote-canonical-token [token-address] [destination-c node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --data [data] --gas-token-address [address] --gas-amount [amount] ``` -#### Encode stellar recipient address to bytes - -```bash -node stellar/its.js encode-recipient 'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF' -``` - #### Execute ```bash diff --git a/stellar/its.js b/stellar/its.js index 3ef86cd35..537090eca 100644 --- a/stellar/its.js +++ b/stellar/its.js @@ -23,7 +23,7 @@ const { saltToBytes32, serializeValue, } = require('./utils'); -const { prompt, parseTrustedChains, asciiToBytes } = require('../common/utils'); +const { prompt, parseTrustedChains, encodeITSDestination } = require('../common/utils'); async function manageTrustedChains(action, wallet, config, chain, contract, args, options) { const trustedChains = parseTrustedChains(config, args); @@ -139,7 +139,7 @@ async function deployRemoteCanonicalToken(wallet, _, chain, contract, args, opti printInfo('tokenId', serializeValue(returnValue.value())); } -async function interchainTransfer(wallet, _, chain, contract, args, options) { +async function interchainTransfer(wallet, config, chain, contract, args, options) { const caller = addressToScVal(wallet.publicKey()); const [tokenId, destinationChain, destinationAddress, amount] = args; const data = options.data === '' ? nativeToScVal(null, { type: 'null' }) : hexToScVal(options.data); @@ -151,12 +151,16 @@ async function interchainTransfer(wallet, _, chain, contract, args, options) { isValidNumber: { gasAmount }, }); + const itsDestinationAddress = encodeITSDestination(config, destinationChain, destinationAddress); + printInfo('Human-readable destination address', destinationAddress); + printInfo('Encoded ITS destination address', itsDestinationAddress); + const operation = contract.call( 'interchain_transfer', caller, hexToScVal(tokenId), nativeToScVal(destinationChain, { type: 'string' }), - hexToScVal(destinationAddress), + hexToScVal(itsDestinationAddress), nativeToScVal(amount, { type: 'i128' }), data, tokenToScVal(gasTokenAddress, gasAmount), @@ -179,11 +183,6 @@ async function execute(wallet, _, chain, contract, args, options) { await broadcast(operation, wallet, chain, 'Executed', options); } -async function encodeRecipient(wallet, _, chain, contract, args, options) { - const [recipient] = args; - printInfo('Encoded Recipient', asciiToBytes(recipient)); -} - async function mainProcessor(processor, args, options) { const { yes } = options; const config = loadConfig(options.env); @@ -279,13 +278,6 @@ if (require.main === module) { mainProcessor(execute, [sourceChain, messageId, sourceAddress, payload], options); }); - program - .command('encode-recipient ') - .description('Encode stellar address as bytes for ITS recipient') - .action((recipient, options) => { - mainProcessor(encodeRecipient, [recipient], options); - }); - addOptionsToCommands(program, addBaseOptions); program.parse(); From 9e2a0556fa079133ca12267acf65333e50d5e194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Mon, 31 Mar 2025 14:36:33 -0400 Subject: [PATCH 05/71] fix(evm): incorrect casing on commandID in gateway script (#624) --- evm/gateway.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/evm/gateway.js b/evm/gateway.js index cccff9b39..08f34bcff 100644 --- a/evm/gateway.js +++ b/evm/gateway.js @@ -287,13 +287,13 @@ async function processCommand(config, chain, options) { const payloadHash = keccak256(arrayify(payload)); const { sourceChain, sourceAddress } = options; - let commandId; + let commandID; if (options.messageId) { - // Derive commandId for Amplifier gateway - commandId = id(`${sourceChain}_${options.messageId}`); + // Derive commandID for Amplifier gateway + commandID = id(`${sourceChain}_${options.messageId}`); } else { - commandId = options.commandID.startsWith('0x') ? options.commandID : id(parseInt(options.commandID).toString()); + commandID = options.commandID.startsWith('0x') ? options.commandID : id(parseInt(options.commandID).toString()); } if (!options.destination) { @@ -303,14 +303,14 @@ async function processCommand(config, chain, options) { printInfo('Destination app contract', options.destination); printInfo('Payload Hash', payloadHash); - if (!(await gateway.isContractCallApproved(commandId, sourceChain, sourceAddress, options.destination, payloadHash))) { + if (!(await gateway.isContractCallApproved(commandID, sourceChain, sourceAddress, options.destination, payloadHash))) { printWarn('Contract call not approved at the gateway'); return; } const appContract = new Contract(options.destination, IAxelarExecutable.abi, wallet); - const tx = await appContract.execute(commandId, sourceChain, sourceAddress, payload, gasOptions); + const tx = await appContract.execute(commandID, sourceChain, sourceAddress, payload, gasOptions); printInfo('Execute tx', tx.hash); await tx.wait(chain.confirmations); @@ -318,14 +318,14 @@ async function processCommand(config, chain, options) { } case 'isContractCallApproved': { - const { commandId, destination, payloadHash, sourceChain, sourceAddress } = options; + const { commandID, destination, payloadHash, sourceChain, sourceAddress } = options; validateParameters({ - isNonEmptyString: { commandId, payloadHash, sourceChain, sourceAddress }, + isNonEmptyString: { commandID, payloadHash, sourceChain, sourceAddress }, isAddress: { destination }, }); - const isApproved = await gateway.isContractCallApproved(commandId, sourceChain, sourceAddress, destination, payloadHash); + const isApproved = await gateway.isContractCallApproved(commandID, sourceChain, sourceAddress, destination, payloadHash); if (isApproved) { printInfo('Contract call was approved at the gateway'); @@ -338,14 +338,14 @@ async function processCommand(config, chain, options) { case 'isMessageApproved': { const { messageId, destination, payloadHash, sourceChain, sourceAddress } = options; - const commandId = id(`${sourceChain}_${messageId}`); + const commandID = id(`${sourceChain}_${messageId}`); validateParameters({ - isNonEmptyString: { commandId, payloadHash, sourceChain, sourceAddress }, + isNonEmptyString: { commandID, payloadHash, sourceChain, sourceAddress }, isAddress: { destination }, }); - const isApproved = await gateway.isContractCallApproved(commandId, sourceChain, sourceAddress, destination, payloadHash); + const isApproved = await gateway.isContractCallApproved(commandID, sourceChain, sourceAddress, destination, payloadHash); if (isApproved) { printInfo('Message was approved at the gateway'); From c37606cca36add791ca1d2ab675126775929a8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Mon, 31 Mar 2025 23:57:29 -0400 Subject: [PATCH 06/71] fix(stellar): upgrade lacking symmetry with deploy script (#638) Co-authored-by: ahramy --- common/cli-utils.js | 11 ++--- releases/stellar/2025-03-GMP-v1.1.0.md | 10 ++-- releases/stellar/2025-03-ITS-v1.1.0.md | 10 +--- stellar/deploy-contract.js | 66 ++++++++++++++++++-------- stellar/utils.js | 8 ++-- 5 files changed, 62 insertions(+), 43 deletions(-) diff --git a/common/cli-utils.js b/common/cli-utils.js index 308553522..ce522abc3 100644 --- a/common/cli-utils.js +++ b/common/cli-utils.js @@ -65,18 +65,17 @@ const addOptionsToCommands = (program, optionMethod, options) => { const addStoreOptions = (program) => { program.addOption( - new Option('-a, --artifact-path ', 'Path to the contract artifact file to upload (required if --version is not used)') - .env('ARTIFACT_PATH') - .conflicts('version'), + new Option( + '-a, --artifact-path ', + 'Path to the contract artifact file to upload (required if --version is not used)', + ).env('ARTIFACT_PATH'), ); program.addOption( new Option( '-v, --version ', 'Specify a released version (X.Y.Z) or a commit hash to upload (required if --artifact-path is not used)', - ) - .env('CONTRACT_VERSION') - .conflicts('artifactPath'), + ).env('CONTRACT_VERSION'), ); program.hook('preAction', async (thisCommand) => { diff --git a/releases/stellar/2025-03-GMP-v1.1.0.md b/releases/stellar/2025-03-GMP-v1.1.0.md index 39aa44203..591cf513a 100644 --- a/releases/stellar/2025-03-GMP-v1.1.0.md +++ b/releases/stellar/2025-03-GMP-v1.1.0.md @@ -76,7 +76,7 @@ node stellar/faucet.js 4. Upgrade the `AxelarGateway` contract & migrate storage schema ```bash -node stellar/deploy-contract.js upgrade AxelarGateway --version v1.1.0 --migration-data '[("", "")]' +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.0 --migration-data '[("", "")]' ``` 5. Retrieve full list of operators used by the relayer @@ -98,7 +98,7 @@ node stellar/deploy-contract.js upgrade AxelarGateway --version v1.1.0 --migrati 6. Upgrade `AxelarOperators` & migrate storage schema ```bash -node stellar/deploy-contract.js upgrade AxelarOperators --version v1.1.0 --migration-data '[""]' +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.0 --migration-data '[""]' ``` 7. Revisit the AxelarOperators storage via the explorer link above. @@ -109,13 +109,13 @@ node stellar/deploy-contract.js upgrade AxelarOperators --version v1.1.0 --migra 8. Upgrade the `AxelarGasService` contract ```bash -node stellar/deploy-contract.js upgrade AxelarGasService --version v1.1.0 +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.0 ``` -9. Deploy the `AxelarExample` contract with dummy ITS address +9. Deploy the `AxelarExample` contract - Note that the AxelarExample contract version is v1.0.0 ```bash -node stellar/deploy-contract.js deploy AxelarExample --version v1.0.0 --use-dummy-its-address +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.0 ``` ## Checklist diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.0.md index 471e3b4b2..76b9d38c6 100644 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ b/releases/stellar/2025-03-ITS-v1.1.0.md @@ -66,7 +66,7 @@ CHAIN= | **Mainnet** | `TBD` | // TODO: ADD ```bash -node stellar/deploy-contract.js upgrade InterchainTokenService --version v1.1.0 --migration-data '[("", "")]' +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.0 --migration-data '[("", "")]' ``` NOTE: InterchainToken + TokenManager contracts will be migrated automatically @@ -79,13 +79,7 @@ NOTE: InterchainToken + TokenManager contracts will be migrated automatically 6. Upgrade the `Upgrader` contract ```bash -node stellar/deploy-contract.js upgrade Upgrader --version v1.1.0 -``` - -7. Re-Deploy the `AxelarExample` contract -- Note that the AxelarExample contract version is v1.0.0 -```bash -node stellar/deploy-contract.js deploy AxelarExample --version v1.0.0 +node stellar/deploy-contract.js upgrade Upgrader --version 1.1.0 ``` ## Checklist diff --git a/stellar/deploy-contract.js b/stellar/deploy-contract.js index e902e1056..9b6a6b719 100644 --- a/stellar/deploy-contract.js +++ b/stellar/deploy-contract.js @@ -11,7 +11,7 @@ const { getNetworkPassphrase, createAuthorizedFunc, getContractCodePath, - SUPPORTED_STELLAR_CONTRACTS, + SUPPORTED_CONTRACTS, BytesToScVal, } = require('./utils'); const { getDomainSeparator, getChainConfig, addOptionsToCommands } = require('../common'); @@ -25,7 +25,7 @@ const { } = ethers; require('./cli-utils'); -const CONTRACT_CONFIGS = { +const CONTRACT_DEPLOY_CONFIGS = { AxelarGateway: () => [ new Option('--nonce ', 'optional nonce for the signer set'), new Option('--domain-separator ', 'domain separator (keccak256 hash or "offline")').default('offline'), @@ -37,11 +37,17 @@ const CONTRACT_CONFIGS = { ], }; +const CONTRACT_UPGRADE_CONFIGS = { + AxelarGateway: () => [new Option('--migration-data ', 'migration data').default(null, '()')], + AxelarOperators: () => [new Option('--migration-data ', 'migration data').default(null, '()')], + InterchainTokenService: () => [new Option('--migration-data ', 'migration data').default(null, '()')], +}; + const addDeployOptions = (program) => { // Get the package name from the program name const contractName = program.name(); // Find the corresponding options for the package - const cmdOptions = CONTRACT_CONFIGS[contractName]; + const cmdOptions = CONTRACT_DEPLOY_CONFIGS[contractName]; if (cmdOptions) { const options = cmdOptions(); @@ -52,6 +58,18 @@ const addDeployOptions = (program) => { return program; }; +const addUpgradeOptions = (program) => { + const contractName = program.name(); + const cmdOptions = CONTRACT_UPGRADE_CONFIGS[contractName]; + + if (cmdOptions) { + const options = cmdOptions(); + options.forEach((option) => program.addOption(option)); + } + + return program; +}; + async function uploadContract(contractName, options, wallet, chain) { const contractCodePath = await getContractCodePath(options, contractName); return await uploadWasm(wallet, chain, contractCodePath); @@ -196,8 +214,8 @@ async function uploadWasm(wallet, chain, filePath) { async function upgrade(options, _, chain, contractName) { const { yes } = options; - if (!options.version && !options.wasmPath) { - throw new Error('--version or --wasm-path required to upgrade'); + if (!options.version && !options.artifactPath) { + throw new Error('--version or --artifact-path required to upgrade'); } let contractAddress = chain.contracts[contractName]?.address; @@ -275,7 +293,7 @@ function main() { const upgradeCmd = new Command('upgrade').description('Upgrade a Stellar contract'); // 3rd level commands for `deploy` - const deployContractCmds = Array.from(SUPPORTED_STELLAR_CONTRACTS).map((contractName) => { + const deployContractCmds = Array.from(SUPPORTED_CONTRACTS).map((contractName) => { const command = new Command(contractName).description(`Deploy ${contractName} contract`); addStoreOptions(command); @@ -299,15 +317,10 @@ function main() { }); // 3rd level commands for `upgrade` - const upgradeContractCmds = Array.from(SUPPORTED_STELLAR_CONTRACTS).map((contractName) => { - return new Command(contractName) - .description(`Upgrade ${contractName} contract`) - .addOption(new Option('--artifact-path ', 'path to the WASM file')) - .addOption(new Option('--version ', 'new version of the contract to upgrade to (e.g., v1.1.0)')) - .addOption(new Option('--migration-data ', 'migration data').default(null, '()')) - .addHelpText( - 'after', - ` + const upgradeContractCmds = Array.from(SUPPORTED_CONTRACTS).map((contractName) => { + const command = new Command(contractName).description(`Upgrade ${contractName} contract`).addHelpText( + 'after', + ` Examples: # using Vec
as migration data: $ deploy-contract upgrade axelar-operators deploy --artifact-path {releasePath}/stellar_axelar_operators.optimized.wasm --version 2.1.7 --migration-data '["GDYBNA2LAWDKRSCIR4TKCB5LJCDRVUWKHLMSKUWMJ3YX3BD6DWTNT5FW"]' @@ -318,11 +331,24 @@ Examples: # equivalent explicit void migration data: $ deploy-contract upgrade axelar-gateway deploy --artifact-path {releasePath}/stellar_axelar_gateway.optimized.wasm --version 1.0.1 --migration-data '()' `, - ) - .action((options) => { - options.migrationData = sanitizeMigrationData(options.migrationData); - mainProcessor(options, upgrade, contractName); - }); + ); + + addStoreOptions(command); + addUpgradeOptions(command); + + command.hook('preAction', async (thisCommand) => { + const opts = thisCommand.opts(); + + const contractCodePath = await getContractCodePath(opts, contractName); + Object.assign(opts, { contractCodePath }); + }); + + command.action((options) => { + options.migrationData = sanitizeMigrationData(options.migrationData); + mainProcessor(options, upgrade, contractName); + }); + + return command; }); // Add 3rd level commands to 2nd level command `deploy` diff --git a/stellar/utils.js b/stellar/utils.js index b88233f6b..c5c33c6dc 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -25,8 +25,8 @@ const ASSET_TYPE_NATIVE = 'native'; const AXELAR_R2_BASE_URL = 'https://static.axelar.network'; -// TODO Need to be migrated to Pascal Case -const SUPPORTED_STELLAR_CONTRACTS = new Set([ +// TODO: Need to be migrated to Pascal Case +const SUPPORTED_CONTRACTS = new Set([ 'AxelarExample', 'AxelarGateway', 'AxelarOperators', @@ -380,7 +380,7 @@ function saltToBytes32(salt) { } const getContractR2Url = (contractName, version) => { - if (!SUPPORTED_STELLAR_CONTRACTS.has(contractName)) { + if (!SUPPORTED_CONTRACTS.has(contractName)) { throw new Error(`Unsupported contract ${contractName} for versioned deployment`); } @@ -484,7 +484,7 @@ module.exports = { saltToBytes32, getContractCodePath, isValidAddress, - SUPPORTED_STELLAR_CONTRACTS, + SUPPORTED_CONTRACTS, BytesToScVal, pascalToKebab, }; From f7449dc9d7b211a3f8f94d58bc08829e1387e527 Mon Sep 17 00:00:00 2001 From: Christian Gorenflo Date: Tue, 1 Apr 2025 17:27:51 -0400 Subject: [PATCH 07/71] feat: adjust upgrade command to work with new upgrader version (#630) --- stellar/deploy-contract.js | 74 +++++++++----------------------------- 1 file changed, 16 insertions(+), 58 deletions(-) diff --git a/stellar/deploy-contract.js b/stellar/deploy-contract.js index 9b6a6b719..c5da621f4 100644 --- a/stellar/deploy-contract.js +++ b/stellar/deploy-contract.js @@ -1,19 +1,9 @@ 'use strict'; -const { Address, nativeToScVal, scValToNative, Operation, xdr, authorizeInvocation, rpc } = require('@stellar/stellar-sdk'); +const { Address, nativeToScVal, scValToNative, Operation, Contract } = require('@stellar/stellar-sdk'); const { Command, Option } = require('commander'); const { loadConfig, printInfo, saveConfig } = require('../evm/utils'); -const { - getWallet, - broadcast, - serializeValue, - addBaseOptions, - getNetworkPassphrase, - createAuthorizedFunc, - getContractCodePath, - SUPPORTED_CONTRACTS, - BytesToScVal, -} = require('./utils'); +const { getWallet, broadcast, serializeValue, addBaseOptions, getContractCodePath, SUPPORTED_CONTRACTS, BytesToScVal } = require('./utils'); const { getDomainSeparator, getChainConfig, addOptionsToCommands } = require('../common'); const { prompt, validateParameters } = require('../common/utils'); const { addStoreOptions } = require('../common/cli-utils'); @@ -235,43 +225,16 @@ async function upgrade(options, _, chain, contractName) { const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath); printInfo('New Wasm hash', serializeValue(newWasmHash)); - const version = sanitizeUpgradeVersion(options.version); + const args = [contractAddress, options.version, newWasmHash, [options.migrationData]].map(nativeToScVal); - const operation = Operation.invokeContractFunction({ - contract: chain.contracts.Upgrader.address, - function: 'upgrade', - args: [contractAddress, version, newWasmHash, [options.migrationData]].map(nativeToScVal), - auth: await createUpgradeAuths(contractAddress, newWasmHash, options.migrationData, chain, wallet), - }); + const upgrader = new Contract(upgraderAddress); + const operation = upgrader.call('upgrade', ...args); await broadcast(operation, wallet, chain, 'Upgraded contract', options); chain.contracts[contractName].wasmHash = serializeValue(newWasmHash); printInfo('Contract upgraded successfully!', contractAddress); } -async function createUpgradeAuths(contractAddress, newWasmHash, migrationData, chain, wallet) { - // 20 seems a reasonable number of ledgers to allow for the upgrade to take effect - const validUntil = await new rpc.Server(chain.rpc).getLatestLedger().then((info) => info.sequence + 20); - - return Promise.all( - [ - createAuthorizedFunc(contractAddress, 'upgrade', [nativeToScVal(newWasmHash)]), - createAuthorizedFunc(contractAddress, 'migrate', [nativeToScVal(migrationData)]), - ].map((auth) => - authorizeInvocation( - wallet, - validUntil, - new xdr.SorobanAuthorizedInvocation({ - function: auth, - subInvocations: [], - }), - wallet.publicKey(), - getNetworkPassphrase(chain.networkType), - ), - ), - ); -} - async function mainProcessor(options, processor, contractName) { const config = loadConfig(options.env); const chain = getChainConfig(config, options.chainName); @@ -300,13 +263,7 @@ function main() { addDeployOptions(command); // Attach the preAction hook to this specific command - command.hook('preAction', async (thisCommand) => { - const opts = thisCommand.opts(); - - // Pass contractName directly since it's known in this scope - const contractCodePath = await getContractCodePath(opts, contractName); - Object.assign(opts, { contractCodePath }); - }); + command.hook('preAction', preActionHook(contractName)); // Main action handler command.action((options) => { @@ -368,6 +325,16 @@ Examples: program.parse(); } +function preActionHook(contractName) { + return async (thisCommand) => { + const opts = thisCommand.opts(); + + // Pass contractName directly since it's known in this scope + const contractCodePath = await getContractCodePath(opts, contractName); + Object.assign(opts, { contractCodePath }); + }; +} + function sanitizeMigrationData(migrationData) { if (migrationData === null || migrationData === '()') return null; @@ -399,15 +366,6 @@ function sanitizeMigrationData(migrationData) { return parsed; } -/* Note: Once R2 uploads for stellar use the cargo version number (does not include 'v' prefix), this will no longer be necessary. */ -function sanitizeUpgradeVersion(version) { - if (version.startsWith('v')) { - return version.slice(1); - } - - return version; -} - if (require.main === module) { main(); } From 82b070d10890036de650f58861dc9882286a90c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Tue, 1 Apr 2025 20:12:08 -0400 Subject: [PATCH 08/71] feat(stellar): add Multicall support (#640) --- releases/stellar/2025-03-GMP-v1.1.0.md | 6 ++++++ stellar/deploy-contract.js | 4 ++++ stellar/utils.js | 1 + 3 files changed, 11 insertions(+) diff --git a/releases/stellar/2025-03-GMP-v1.1.0.md b/releases/stellar/2025-03-GMP-v1.1.0.md index 591cf513a..cc71cfe60 100644 --- a/releases/stellar/2025-03-GMP-v1.1.0.md +++ b/releases/stellar/2025-03-GMP-v1.1.0.md @@ -118,6 +118,12 @@ node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.0 node stellar/deploy-contract.js deploy AxelarExample --version 1.0.0 ``` +10. Deploy the `Multicall` contract +- Note that the Multicall contract version is v1.0.0 +```bash +node stellar/deploy-contract.js deploy Multicall --version 1.0.0 +``` + ## Checklist The following checks should be performed after the rollout: diff --git a/stellar/deploy-contract.js b/stellar/deploy-contract.js index c5da621f4..52eb5e4b8 100644 --- a/stellar/deploy-contract.js +++ b/stellar/deploy-contract.js @@ -149,6 +149,10 @@ async function getInitializeArgs(config, chain, contractName, wallet, options) { return { gatewayAddress, gasServiceAddress, itsAddress }; } + case 'Multicall': { + return {}; + } + default: throw new Error(`Unknown contract: ${contractName}`); } diff --git a/stellar/utils.js b/stellar/utils.js index c5c33c6dc..501397998 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -35,6 +35,7 @@ const SUPPORTED_CONTRACTS = new Set([ 'TokenManager', 'InterchainTokenService', 'Upgrader', + 'Multicall', ]); function getNetworkPassphrase(networkType) { From 2f73a468fb173a56a15c464e18385c59a30a75d5 Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Thu, 3 Apr 2025 18:10:43 -0400 Subject: [PATCH 09/71] chore: add ampd 1.6.0 release doc (#643) --- releases/ampd/2025-04-03-ampd-v1.6.0.md | 123 ++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 releases/ampd/2025-04-03-ampd-v1.6.0.md diff --git a/releases/ampd/2025-04-03-ampd-v1.6.0.md b/releases/ampd/2025-04-03-ampd-v1.6.0.md new file mode 100644 index 000000000..79a660bb4 --- /dev/null +++ b/releases/ampd/2025-04-03-ampd-v1.6.0.md @@ -0,0 +1,123 @@ + +# Ampd v1.6.0 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 | +| **Deployment** | TBD + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 2025-04-03 | +| **Stagenet** | Deployed | 2025-04-03 | +| **Testnet** | In Progress | 2025-04-03 | +| **Mainnet** | - | TBD | + + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/ampd-v1.6.0) + +## Background +This ampd release includes support for XRPL, as well as a bug fix for case sensitivity of chain names. +A config change is introduced which is not backwards compatible. Verifiers must update their config +at the time of deployment. + +## Config change +Previously there was one config entry for signing, used by all chains. It looked like the below: + +``` +[[handlers]] +type = 'MultisigSigner' +cosmwasm_contract = 'axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqecnww6' +``` + +Now, there must be one for every chain supported, along with the chain name. The old entry should be deleted. +``` +[[handlers]] +chain_name = 'ethereum' +cosmwasm_contract = 'axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqecnww6' +type = 'MultisigSigner' + +[[handlers]] +chain_name = 'xrpl' +cosmwasm_contract = 'axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqecnww6' +type = 'MultisigSigner' +``` + +Be sure to include all supported chains. For every message verifier handler specified in the config (including ones for non-evm chains), there must be a corresponding `MultisigSigner` config entry. Each entry should have the same +`type` and `cosmwasm_contract` values, and differ only in `chain_name`. The `chain_name` must match the registered chain name. The `cosmwasm_contract` value is the address of the multisig contract. + +For mainnet, at the time of writing, the values should look like so: +``` +[[handlers]] +chain_name = 'flow' +cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' +type = 'MultisigSigner' + +[[handlers]] +chain_name = 'sui' +cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' +type = 'MultisigSigner' + +[[handlers]] +chain_name = 'stellar' +cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' +type = 'MultisigSigner' + +[[handlers]] +chain_name = 'xrpl' +cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' +type = 'MultisigSigner' + +[[handlers]] +chain_name = 'xrpl-evm' +cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' +type = 'MultisigSigner' +``` + +Be sure to delete the existing `MultisigSigner` config entry. + +### Testnet config + +Below is the update to the testnet config: +``` +[[handlers]] +chain_name="flow" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +chain_name="hedera" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +chain_name="sui" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +chain_name="stellar" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +chain_name="xrpl" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +chain_name="xrpl-evm" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +``` + +Be sure to delete the existing `MultisigSigner` config entry. + +## Deployment +Update the config, and then restart ampd with the new binary. Binaries can be found [here](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/ampd-v1.6.0) + +### Post Deployment Checklist +Check `ampd` logs to ensure it restarts fine. Monitor voting and signing for your verifier on axelarscan to verify it's operating correctly. + + From 998a1619a91d031194c86cd91e78ec75ba9d51f4 Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Fri, 4 Apr 2025 18:20:29 +0530 Subject: [PATCH 10/71] feat: add script for rotating verifiers (#639) Co-authored-by: isi8787 <38940784+isi8787@users.noreply.github.com> --- cosmwasm/README.md | 34 ++++++++++ cosmwasm/rotate-signers.js | 125 +++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 cosmwasm/rotate-signers.js diff --git a/cosmwasm/README.md b/cosmwasm/README.md index 4a3441cbe..62fdb8359 100644 --- a/cosmwasm/README.md +++ b/cosmwasm/README.md @@ -308,3 +308,37 @@ node cosmwasm/submit-proposal.js migrate \ --fetchCodeId \ --deposit 100000000 ``` + +### Rotating verifier set +1. Create a .env for rotation, containing mnemonic for multisig-prover-admin and environment: +``` +MNEMONIC="" +ENV="" +``` + +2. Register/Deregister verifiers for the chain in scope: +```bash +ampd register-chain-support +or +ampd deregister-chain-support +``` + +3. Update verifier set +```bash +node cosmwasm/rotate-signers.js update-verifier-set +``` + +4. Using multisig session id output in last command, submit proof on destination chain. For example: +- Sui: +```bash +node sui/gateway.js submitProof +``` +- EVM: +```bash +node evm/gateway.js --action submitProof --multisigSessionId -n +``` + +4. Confirm verifier rotation +```bash +node cosmwasm/rotate-signers.js confirm-verifier-rotation +``` \ No newline at end of file diff --git a/cosmwasm/rotate-signers.js b/cosmwasm/rotate-signers.js new file mode 100644 index 000000000..2df7b0b74 --- /dev/null +++ b/cosmwasm/rotate-signers.js @@ -0,0 +1,125 @@ +'use strict'; + +require('dotenv').config(); + +const { Command } = require('commander'); +const { addAmplifierOptions } = require('./cli-utils'); +const { GasPrice, calculateFee } = require('@cosmjs/stargate'); + +const { loadConfig, getCurrentVerifierSet, printInfo, sleep, printError } = require('../common'); +const { prepareWallet, prepareClient } = require('./utils'); + +const executeTransaction = async (client, account, contractAddress, message, fee) => { + const tx = await client.execute(account.address, contractAddress, message, fee, ''); + return tx; +}; + +const getNextVerifierSet = async (config, chain, client) => { + return await client.queryContractSmart(config.axelar.contracts.MultisigProver[chain].address, 'next_verifier_set'); +}; + +const getVerifierSetStatus = async (config, chain, client, verifierStatus) => { + return await client.queryContractSmart(config.axelar.contracts.VotingVerifier[chain].address, { verifier_set_status: verifierStatus }); +}; + +const updateVerifierSet = async (config, [chain], wallet, client, fee) => { + const [account] = await wallet.getAccounts(); + + const currentVerifierSet = await getCurrentVerifierSet(config, chain, client); + printInfo('Current verifier set', currentVerifierSet); + + const { transactionHash, events } = await executeTransaction( + client, + account, + config.axelar.contracts.MultisigProver[chain].address, + 'update_verifier_set', + fee, + ); + printInfo('Update Verifier set', transactionHash); + const multisigSessionId = events + .find((e) => e.type === 'wasm-proof_under_construction') + .attributes.find((a) => a.key === 'multisig_session_id').value; + printInfo('Mutisig session ID', multisigSessionId); +}; + +const confirmVerifierRotation = async (config, [chain, txHash], wallet, client, fee) => { + const [account] = await wallet.getAccounts(); + + const nextVerifierSet = (await getNextVerifierSet(config, chain, client)).verifier_set; + printInfo('Next verifier set', nextVerifierSet); + + const verificationSet = { + verify_verifier_set: { + message_id: `${txHash}-0`, + new_verifier_set: nextVerifierSet, + }, + }; + let { transactionHash } = await executeTransaction( + client, + account, + config.axelar.contracts.VotingVerifier[chain].address, + verificationSet, + fee, + ); + printInfo('Initiate verifier set verification', transactionHash); + + let rotationPollStatus = await getVerifierSetStatus(config, chain, client, nextVerifierSet); + + while (rotationPollStatus === 'in_progress') { + await sleep(1000); + rotationPollStatus = await getVerifierSetStatus(config, chain, client, nextVerifierSet); + } + + if (rotationPollStatus !== 'succeeded_on_source_chain') { + printError('Poll failed for verifier set rotation with message', rotationPollStatus); + process.exit(0); + } + + printInfo('Poll passed for verifier set rotation'); + + transactionHash = ( + await executeTransaction(client, account, config.axelar.contracts.MultisigProver[chain].address, 'confirm_verifier_set', fee) + ).transactionHash; + printInfo('Confirm verifier set rotation', transactionHash); +}; + +const processCommand = async (processCmd, options, args) => { + const config = loadConfig(options.env); + const wallet = await prepareWallet(options); + const client = await prepareClient(config, wallet); + const { + axelar: { gasPrice, gasLimit }, + } = config; + + const fee = gasLimit === 'auto' ? 'auto' : calculateFee(gasLimit, GasPrice.fromString(gasPrice)); + + await processCmd(config, args, wallet, client, fee); +}; + +const programHandler = () => { + const program = new Command(); + + program.name('rotate-signers').description('Rotate signers'); + + const updateVerifiersCmd = program + .command('update-verifier-set ') + .description('Update verifier set') + .action((chain, options) => { + processCommand(updateVerifierSet, options, [chain]); + }); + addAmplifierOptions(updateVerifiersCmd, {}); + + const confirmVerifiersCmd = program + .command('confirm-verifier-rotation ') + .description('Confirm verifier rotation') + .action((chain, txHash, options) => { + processCommand(confirmVerifierRotation, options, [chain, txHash]); + }); + addAmplifierOptions(confirmVerifiersCmd, {}); + + program.parse(); +}; + +if (require.main === module) { + programHandler(); +} From 9a82ae7aa1697e26d98b32608e4764fc8dc767ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:28:57 -0600 Subject: [PATCH 11/71] feat(stellar): add custom migration data type support (#641) --- releases/stellar/2025-01-ITS-v1.0.0.md | 2 +- releases/stellar/2025-03-GMP-v1.1.0.md | 28 ++++++++----- releases/stellar/2025-03-ITS-v1.1.0.md | 6 ++- stellar/deploy-contract.js | 55 ++++++++++++++++++++------ stellar/type-utils.js | 16 ++++++++ 5 files changed, 81 insertions(+), 26 deletions(-) diff --git a/releases/stellar/2025-01-ITS-v1.0.0.md b/releases/stellar/2025-01-ITS-v1.0.0.md index 88d6dd42b..cef105812 100644 --- a/releases/stellar/2025-01-ITS-v1.0.0.md +++ b/releases/stellar/2025-01-ITS-v1.0.0.md @@ -37,7 +37,7 @@ CHAIN= Ensure that `initializeArgs` are correct in `$ENV.json` after deployment. ```bash -node stellar/deploy-contract.js deploy InterchainTokenService --version v1.0.0 +node stellar/deploy-contract.js deploy InterchainTokenService --version 1.0.0 ``` 2. Re-deploy Axelar Example with ITS support diff --git a/releases/stellar/2025-03-GMP-v1.1.0.md b/releases/stellar/2025-03-GMP-v1.1.0.md index cc71cfe60..3b2bf7b16 100644 --- a/releases/stellar/2025-03-GMP-v1.1.0.md +++ b/releases/stellar/2025-03-GMP-v1.1.0.md @@ -42,13 +42,17 @@ A Stellar chain config should already exist under a `${ENV}.json` file under `ch ### Steps -1. Request Tokens from Faucet +1. Run `git revert f7449dc` to use the v1.0.0 Upgrader script for the below upgrades. + +- Note: The revert commit will need to be excluded from your final PR. + +2. Request Tokens from Faucet ```bash node stellar/faucet.js ``` -2. Verify deployer address +3. Verify deployer address | Network | `deployer address` | | -------------------- | ---------------------------------------------------------- | @@ -57,7 +61,7 @@ node stellar/faucet.js | **Testnet** | `GBAPBVQIFCOMGYHFUIXIEGGATEQMVSVQGVZNN5WWFAVKET6M3M4644EG` | | **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | -3. Retrieve full list of messages sent via the gateway +4. Retrieve full list of messages sent via the gateway | Network | `AxelarGateway storage` | | -------------------- | ---------------------------------------------------------- | @@ -73,13 +77,13 @@ node stellar/faucet.js | **Testnet** | `TBD` | // TODO: ADD | **Mainnet** | `TBD` | // TODO: ADD -4. Upgrade the `AxelarGateway` contract & migrate storage schema +5. Upgrade the `AxelarGateway` contract & migrate storage schema ```bash node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.0 --migration-data '[("", "")]' ``` -5. Retrieve full list of operators used by the relayer +6. Retrieve full list of operators used by the relayer | Network | `AxelarOperators storage` | | -------------------- | ---------------------------------------------------------- | @@ -95,31 +99,35 @@ node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.0 --migratio | **Testnet** | `TBD` | // TODO: ADD | **Mainnet** | `TBD` | // TODO: ADD -6. Upgrade `AxelarOperators` & migrate storage schema +7. Upgrade `AxelarOperators` & migrate storage schema ```bash node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.0 --migration-data '[""]' ``` -7. Revisit the AxelarOperators storage via the explorer link above. +8. Revisit the AxelarOperators storage via the explorer link above. - The value `Operators` should now read `Operator`. - Its key(s) should be set the the operator address retrieved above. -8. Upgrade the `AxelarGasService` contract +9. Upgrade the `AxelarGasService` contract ```bash node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.0 ``` -9. Deploy the `AxelarExample` contract +10. Deploy the `AxelarExample` contract + - Note that the AxelarExample contract version is v1.0.0 + ```bash node stellar/deploy-contract.js deploy AxelarExample --version 1.0.0 ``` -10. Deploy the `Multicall` contract +11. Deploy the `Multicall` contract + - Note that the Multicall contract version is v1.0.0 + ```bash node stellar/deploy-contract.js deploy Multicall --version 1.0.0 ``` diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.0.md index 76b9d38c6..e72c56644 100644 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ b/releases/stellar/2025-03-ITS-v1.1.0.md @@ -40,7 +40,7 @@ CHAIN= | Network | `InterchainTokenService storage` | | -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CCD7JXLHOJKQDPKOXQTK6PYACFYQPRC25IVKHQDOMP3ANFMBWO5FZZAN/storage) | +| **Devnet-amplifier** | `TBD` | // TODO: ADD | **Stagenet** | `TBD` | // TODO: ADD | **Testnet** | `TBD` | // TODO: ADD | **Mainnet** | `TBD` | // TODO: ADD @@ -66,7 +66,7 @@ CHAIN= | **Mainnet** | `TBD` | // TODO: ADD ```bash -node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.0 --migration-data '[("", "")]' +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.0 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' ``` NOTE: InterchainToken + TokenManager contracts will be migrated automatically @@ -82,6 +82,8 @@ NOTE: InterchainToken + TokenManager contracts will be migrated automatically node stellar/deploy-contract.js upgrade Upgrader --version 1.1.0 ``` +7. Run `git revert ` to reapply the new Upgrader script changes. + ## Checklist The following checks should be performed after the rollout diff --git a/stellar/deploy-contract.js b/stellar/deploy-contract.js index 52eb5e4b8..089da9ada 100644 --- a/stellar/deploy-contract.js +++ b/stellar/deploy-contract.js @@ -7,7 +7,7 @@ const { getWallet, broadcast, serializeValue, addBaseOptions, getContractCodePat const { getDomainSeparator, getChainConfig, addOptionsToCommands } = require('../common'); const { prompt, validateParameters } = require('../common/utils'); const { addStoreOptions } = require('../common/cli-utils'); -const { weightedSignersToScVal } = require('./type-utils'); +const { weightedSignersToScVal, itsCustomMigrationDataToScValV110 } = require('./type-utils'); const { ethers } = require('hardhat'); const { readFileSync } = require('fs'); const { @@ -15,7 +15,7 @@ const { } = ethers; require('./cli-utils'); -const CONTRACT_DEPLOY_CONFIGS = { +const CONTRACT_DEPLOY_OPTIONS = { AxelarGateway: () => [ new Option('--nonce ', 'optional nonce for the signer set'), new Option('--domain-separator ', 'domain separator (keccak256 hash or "offline")').default('offline'), @@ -27,20 +27,28 @@ const CONTRACT_DEPLOY_CONFIGS = { ], }; -const CONTRACT_UPGRADE_CONFIGS = { +const CONTRACT_UPGRADE_OPTIONS = { AxelarGateway: () => [new Option('--migration-data ', 'migration data').default(null, '()')], AxelarOperators: () => [new Option('--migration-data ', 'migration data').default(null, '()')], InterchainTokenService: () => [new Option('--migration-data ', 'migration data').default(null, '()')], }; +const CustomMigrationDataTypeToScValV110 = { + InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV110(migrationData), +}; + +const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { + '1.1.0': CustomMigrationDataTypeToScValV110, +}; + const addDeployOptions = (program) => { // Get the package name from the program name const contractName = program.name(); // Find the corresponding options for the package - const cmdOptions = CONTRACT_DEPLOY_CONFIGS[contractName]; + const contractDeployOptions = CONTRACT_DEPLOY_OPTIONS[contractName]; - if (cmdOptions) { - const options = cmdOptions(); + if (contractDeployOptions) { + const options = contractDeployOptions(); // Add the options to the program options.forEach((option) => program.addOption(option)); } @@ -50,10 +58,10 @@ const addDeployOptions = (program) => { const addUpgradeOptions = (program) => { const contractName = program.name(); - const cmdOptions = CONTRACT_UPGRADE_CONFIGS[contractName]; + const contractUpgradeOptions = CONTRACT_UPGRADE_OPTIONS[contractName]; - if (cmdOptions) { - const options = cmdOptions(); + if (contractUpgradeOptions) { + const options = contractUpgradeOptions(); options.forEach((option) => program.addOption(option)); } @@ -305,7 +313,7 @@ Examples: }); command.action((options) => { - options.migrationData = sanitizeMigrationData(options.migrationData); + options.migrationData = sanitizeMigrationData(options.migrationData, options.version, contractName); mainProcessor(options, upgrade, contractName); }); @@ -339,7 +347,7 @@ function preActionHook(contractName) { }; } -function sanitizeMigrationData(migrationData) { +function sanitizeMigrationData(migrationData, version, contractName) { if (migrationData === null || migrationData === '()') return null; try { @@ -358,11 +366,17 @@ function sanitizeMigrationData(migrationData) { } if (Array.isArray(parsed)) { - return parsed.map(sanitizeMigrationData); + return parsed.map((value) => sanitizeMigrationData(value, version, contractName)); + } + + const custom = customMigrationData(parsed, version, contractName); + + if (custom) { + return custom; } if (parsed !== null && typeof parsed === 'object') { - return Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, sanitizeMigrationData(value)])); + return Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, sanitizeMigrationData(value, version, contractName)])); } printInfo('Sanitized migration data', parsed); @@ -370,6 +384,21 @@ function sanitizeMigrationData(migrationData) { return parsed; } +function customMigrationData(migrationDataObj, version, contractName) { + if (!version || !VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version] || !VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version][contractName]) { + return null; + } + + const customMigrationDataTypeToScVal = VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version][contractName]; + + try { + printInfo(`Retrieving custom migration data for ${contractName}`); + return customMigrationDataTypeToScVal(migrationDataObj); + } catch (error) { + throw new Error(`Failed to convert custom migration data for ${contractName}: ${error}`); + } +} + if (require.main === module) { main(); } diff --git a/stellar/type-utils.js b/stellar/type-utils.js index d177e4351..81b3f945a 100644 --- a/stellar/type-utils.js +++ b/stellar/type-utils.js @@ -96,9 +96,25 @@ function proofToScVal(proof) { ); } +function itsCustomMigrationDataToScValV110(migrationData) { + return nativeToScVal( + { + new_token_manager_wasm_hash: Buffer.from(migrationData.newTokenManagerWasmHash, 'hex'), + new_interchain_token_wasm_hash: Buffer.from(migrationData.newInterchainTokenWasmHash, 'hex'), + }, + { + type: { + new_token_manager_wasm_hash: ['symbol', 'bytes'], + new_interchain_token_wasm_hash: ['symbol', 'bytes'], + }, + }, + ); +} + module.exports = { commandTypeToScVal, messagesToScVal, weightedSignersToScVal, proofToScVal, + itsCustomMigrationDataToScValV110, }; From 7f99e7163f60a670ae22a758307c2a87915a2bb5 Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Fri, 4 Apr 2025 13:14:18 -0400 Subject: [PATCH 12/71] fix: update stellar chain name in release doc (#646) --- releases/ampd/2025-04-03-ampd-v1.6.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releases/ampd/2025-04-03-ampd-v1.6.0.md b/releases/ampd/2025-04-03-ampd-v1.6.0.md index 79a660bb4..461942827 100644 --- a/releases/ampd/2025-04-03-ampd-v1.6.0.md +++ b/releases/ampd/2025-04-03-ampd-v1.6.0.md @@ -96,7 +96,7 @@ cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6z type="MultisigSigner" [[handlers]] -chain_name="stellar" +chain_name="stellar-2025-q1" cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" type="MultisigSigner" From a3d5977135cc063ba9cf40c096372e91ed6c5fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Fri, 4 Apr 2025 12:32:55 -0600 Subject: [PATCH 13/71] refactor(stellar): modularize deploy-contract.js functionality (#644) Co-authored-by: Milap Sheth --- cosmwasm/rotate-signers.js | 4 +- cosmwasm/utils.js | 2 +- evm/deploy-its.js | 20 +- evm/sign-utils.js | 2 +- evm/utils.js | 4 +- stellar/README.md | 16 +- stellar/contract.js | 6 +- stellar/deploy-contract.js | 410 ++------------------------ stellar/deploy-contract/commands.js | 145 +++++++++ stellar/deploy-contract/processors.js | 226 ++++++++++++++ stellar/utils.js | 83 +++++- sui/contract.js | 14 +- sui/utils/LedgerSigner.js | 2 +- xrpl/utils.js | 16 +- 14 files changed, 517 insertions(+), 433 deletions(-) create mode 100644 stellar/deploy-contract/commands.js create mode 100644 stellar/deploy-contract/processors.js diff --git a/cosmwasm/rotate-signers.js b/cosmwasm/rotate-signers.js index 2df7b0b74..44654d03d 100644 --- a/cosmwasm/rotate-signers.js +++ b/cosmwasm/rotate-signers.js @@ -15,11 +15,11 @@ const executeTransaction = async (client, account, contractAddress, message, fee }; const getNextVerifierSet = async (config, chain, client) => { - return await client.queryContractSmart(config.axelar.contracts.MultisigProver[chain].address, 'next_verifier_set'); + return client.queryContractSmart(config.axelar.contracts.MultisigProver[chain].address, 'next_verifier_set'); }; const getVerifierSetStatus = async (config, chain, client, verifierStatus) => { - return await client.queryContractSmart(config.axelar.contracts.VotingVerifier[chain].address, { verifier_set_status: verifierStatus }); + return client.queryContractSmart(config.axelar.contracts.VotingVerifier[chain].address, { verifier_set_status: verifierStatus }); }; const updateVerifierSet = async (config, [chain], wallet, client, fee) => { diff --git a/cosmwasm/utils.js b/cosmwasm/utils.js index cae041999..c78845145 100644 --- a/cosmwasm/utils.js +++ b/cosmwasm/utils.js @@ -1111,7 +1111,7 @@ const getContractCodePath = async (options, contractName) => { if (options.version) { const url = getContractR2Url(contractName, options.version); - return await downloadContractCode(url, contractName, options.version); + return downloadContractCode(url, contractName, options.version); } throw new Error('Either --artifact-path or --version must be provided'); diff --git a/evm/deploy-its.js b/evm/deploy-its.js index 6cbb2008d..1674601f3 100644 --- a/evm/deploy-its.js +++ b/evm/deploy-its.js @@ -188,7 +188,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Token Manager Deployer', contractName: 'TokenManagerDeployer', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('TokenManagerDeployer', artifactPath), @@ -204,7 +204,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Interchain Token', contractName: 'InterchainToken', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('InterchainToken', artifactPath), @@ -220,7 +220,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Interchain Token Deployer', contractName: 'InterchainTokenDeployer', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('InterchainTokenDeployer', artifactPath), @@ -236,7 +236,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Token Manager', contractName: 'TokenManager', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('TokenManager', artifactPath), @@ -252,7 +252,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Token Handler', contractName: 'TokenHandler', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('TokenHandler', artifactPath), @@ -268,7 +268,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Gateway Caller', contractName: 'GatewayCaller', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('GatewayCaller', artifactPath), @@ -298,7 +298,7 @@ async function deployAll(config, wallet, chain, options) { printInfo('ITS Implementation args', args); - return await deployContract( + return deployContract( proxyDeployMethod, wallet, InterchainTokenService, @@ -325,7 +325,7 @@ async function deployAll(config, wallet, chain, options) { const args = [contractConfig.implementation, wallet.address, deploymentParams]; printInfo('ITS Proxy args', args); - return await deployContract( + return deployContract( proxyDeployMethod, wallet, getContractJSON('InterchainProxy', artifactPath), @@ -341,7 +341,7 @@ async function deployAll(config, wallet, chain, options) { name: 'Interchain Token Factory Implementation', contractName: 'InterchainTokenFactory', async deploy() { - return await deployContract( + return deployContract( deployMethod, wallet, getContractJSON('InterchainTokenFactory', artifactPath), @@ -360,7 +360,7 @@ async function deployAll(config, wallet, chain, options) { const args = [itsFactoryContractConfig.implementation, wallet.address, '0x']; printInfo('ITS Factory Proxy args', args); - return await deployContract( + return deployContract( proxyDeployMethod, wallet, getContractJSON('InterchainProxy', artifactPath), diff --git a/evm/sign-utils.js b/evm/sign-utils.js index b1991cb53..9be265056 100644 --- a/evm/sign-utils.js +++ b/evm/sign-utils.js @@ -148,7 +148,7 @@ function storeSignedTx(filePath, signedTx) { } const getNonceFromProvider = async (provider, address) => { - return await provider.getTransactionCount(address); + return provider.getTransactionCount(address); }; function getSignedTx(filePath) { diff --git a/evm/utils.js b/evm/utils.js index c6be00e7e..859938d15 100644 --- a/evm/utils.js +++ b/evm/utils.js @@ -426,7 +426,7 @@ const getDeployedAddress = async (deployer, deployMethod, options = {}) => { if (!options.offline) { const deployerInterface = new Contract(deployerContract, IDeployer.abi, options.provider); - return await deployerInterface.deployedAddress(initCode, deployer, salt); + return deployerInterface.deployedAddress(initCode, deployer, salt); } salt = keccak256(defaultAbiCoder.encode(['address', 'bytes32'], [deployer, salt])); @@ -446,7 +446,7 @@ const getDeployedAddress = async (deployer, deployMethod, options = {}) => { const deployerInterface = new Contract(deployerContract, IDeployer.abi, options.provider); - return await deployerInterface.deployedAddress('0x', deployer, salt); + return deployerInterface.deployedAddress('0x', deployer, salt); } const createDeployer = await getDeployedAddress(deployer, 'create2', { diff --git a/stellar/README.md b/stellar/README.md index 5f8e625c1..a46a388f5 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -104,7 +104,7 @@ Note that example contract should use `--artifact-path` or `--version` option to - `node stellar/deploy-contract.js deploy AxelarExample --version 1.0.0` -### Contract upgrades +## Upgrades To facilitate contract upgrades, the `Upgrader` contract needs to be deployed first. @@ -160,6 +160,20 @@ For migration data of type `bool`, omit the `--migration-data` flag and pass the node stellar/deploy-contract.js upgrade --version --migration-data true ``` +## Uploads + +In order to upload contracts directly to the Stellar network, use the following commands: + +```bash +npm run stellar:upload -- --version +``` + +```bash +npm run stellar:upload -- --artifact-path ./axelar-amplifier-stellar/target/wasm32-unknown-unknown/release/.optimized.wasm +``` + +--- + ## Generate bindings Generate TypeScript bindings for the contract diff --git a/stellar/contract.js b/stellar/contract.js index 30916c9df..fcea11ad4 100644 --- a/stellar/contract.js +++ b/stellar/contract.js @@ -29,11 +29,11 @@ async function submitOperation(wallet, chain, _contractName, contract, args, opt } async function transferOwnership(wallet, chain, _contractName, contract, args, options) { - return await submitOperation(wallet, chain, _contractName, contract, [addressToScVal(args)], options, 'transfer_ownership'); + return submitOperation(wallet, chain, _contractName, contract, [addressToScVal(args)], options, 'transfer_ownership'); } async function transferOperatorship(wallet, chain, _contractName, contract, args, options) { - return await submitOperation(wallet, chain, _contractName, contract, [addressToScVal(args)], options, 'transfer_operatorship'); + return submitOperation(wallet, chain, _contractName, contract, [addressToScVal(args)], options, 'transfer_operatorship'); } async function getTtl(_wallet, chain, contractName, contract, _args, _options) { @@ -46,7 +46,7 @@ async function getTtl(_wallet, chain, contractName, contract, _args, _options) { async function getLedgerEntry(chain, contract) { const instance = contract.getFootprint(); const server = new SorobanRpc.Server(chain.rpc); - return await server.getLedgerEntries(...[instance]); + return server.getLedgerEntries(...[instance]); } async function extendInstance(_wallet, chain, contractName, _contract, _args, options) { diff --git a/stellar/deploy-contract.js b/stellar/deploy-contract.js index 089da9ada..cd21b0809 100644 --- a/stellar/deploy-contract.js +++ b/stellar/deploy-contract.js @@ -1,402 +1,36 @@ 'use strict'; -const { Address, nativeToScVal, scValToNative, Operation, Contract } = require('@stellar/stellar-sdk'); -const { Command, Option } = require('commander'); -const { loadConfig, printInfo, saveConfig } = require('../evm/utils'); -const { getWallet, broadcast, serializeValue, addBaseOptions, getContractCodePath, SUPPORTED_CONTRACTS, BytesToScVal } = require('./utils'); -const { getDomainSeparator, getChainConfig, addOptionsToCommands } = require('../common'); -const { prompt, validateParameters } = require('../common/utils'); -const { addStoreOptions } = require('../common/cli-utils'); -const { weightedSignersToScVal, itsCustomMigrationDataToScValV110 } = require('./type-utils'); -const { ethers } = require('hardhat'); -const { readFileSync } = require('fs'); -const { - utils: { arrayify, id }, -} = ethers; -require('./cli-utils'); - -const CONTRACT_DEPLOY_OPTIONS = { - AxelarGateway: () => [ - new Option('--nonce ', 'optional nonce for the signer set'), - new Option('--domain-separator ', 'domain separator (keccak256 hash or "offline")').default('offline'), - new Option('--previous-signers-retention ', 'previous signer retention').default(15).argParser(Number), - new Option('--minimum-rotation-delay ', 'minimum rotation delay').default(0).argParser(Number), - ], - AxelarExample: () => [ - new Option('--use-dummy-its-address', 'use dummy its address for AxelarExample contract to test a GMP call').default(false), - ], -}; - -const CONTRACT_UPGRADE_OPTIONS = { - AxelarGateway: () => [new Option('--migration-data ', 'migration data').default(null, '()')], - AxelarOperators: () => [new Option('--migration-data ', 'migration data').default(null, '()')], - InterchainTokenService: () => [new Option('--migration-data ', 'migration data').default(null, '()')], -}; - -const CustomMigrationDataTypeToScValV110 = { - InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV110(migrationData), -}; - -const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { - '1.1.0': CustomMigrationDataTypeToScValV110, -}; - -const addDeployOptions = (program) => { - // Get the package name from the program name - const contractName = program.name(); - // Find the corresponding options for the package - const contractDeployOptions = CONTRACT_DEPLOY_OPTIONS[contractName]; - - if (contractDeployOptions) { - const options = contractDeployOptions(); - // Add the options to the program - options.forEach((option) => program.addOption(option)); - } - - return program; -}; - -const addUpgradeOptions = (program) => { - const contractName = program.name(); - const contractUpgradeOptions = CONTRACT_UPGRADE_OPTIONS[contractName]; - - if (contractUpgradeOptions) { - const options = contractUpgradeOptions(); - options.forEach((option) => program.addOption(option)); - } - - return program; -}; - -async function uploadContract(contractName, options, wallet, chain) { - const contractCodePath = await getContractCodePath(options, contractName); - return await uploadWasm(wallet, chain, contractCodePath); -} - -async function getInitializeArgs(config, chain, contractName, wallet, options) { - const owner = nativeToScVal(Address.fromString(wallet.publicKey()), { type: 'address' }); - const operator = nativeToScVal(Address.fromString(wallet.publicKey()), { type: 'address' }); - - switch (contractName) { - case 'AxelarGateway': { - const domainSeparator = nativeToScVal(Buffer.from(arrayify(await getDomainSeparator(config, chain, options)))); - const minimumRotationDelay = nativeToScVal(options.minimumRotationDelay); - const previousSignersRetention = nativeToScVal(options.previousSignersRetention); - const nonce = options.nonce ? arrayify(id(options.nonce)) : Array(32).fill(0); - const initialSigners = nativeToScVal([ - weightedSignersToScVal({ - nonce, - signers: [ - { - signer: wallet.publicKey(), - weight: 1, - }, - ], - threshold: 1, - }), - ]); - - return { - owner, - operator, - domainSeparator, - minimumRotationDelay, - previousSignersRetention, - initialSigners, - }; - } - - case 'InterchainTokenService': { - const gatewayAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGateway?.address), { type: 'address' }); - const gasServiceAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGasService?.address), { type: 'address' }); - const itsHubAddress = nativeToScVal(config.axelar?.contracts?.InterchainTokenService?.address, { type: 'string' }); - const chainName = nativeToScVal(chain.axelarId, { type: 'string' }); - const nativeTokenAddress = nativeToScVal(Address.fromString(chain?.tokenAddress), { type: 'address' }); - const interchainTokenWasmHash = BytesToScVal(await uploadContract('InterchainToken', options, wallet, chain)); - const tokenManagerWasmHash = BytesToScVal(await uploadContract('TokenManager', options, wallet, chain)); - - return { - owner, - operator, - gatewayAddress, - gasServiceAddress, - itsHubAddress, - chainName, - nativeTokenAddress, - interchainTokenWasmHash, - tokenManagerWasmHash, - }; - } - - case 'AxelarOperators': - return { owner }; - - case 'AxelarGasService': { - const operatorsAddress = chain.contracts?.AxelarOperators?.address; - - validateParameters({ - isValidStellarAddress: { operatorsAddress }, - }); - - const operator = operatorsAddress ? nativeToScVal(Address.fromString(operatorsAddress), { type: 'address' }) : owner; - - return { owner, operator }; - } - - case 'Upgrader': { - return {}; - } - - case 'AxelarExample': { - const gatewayAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGateway?.address), { type: 'address' }); - const gasServiceAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGasService?.address), { type: 'address' }); - const itsAddress = options.useDummyItsAddress - ? gatewayAddress - : nativeToScVal(chain.contracts?.InterchainTokenService?.address, { type: 'address' }); - - return { gatewayAddress, gasServiceAddress, itsAddress }; - } - - case 'Multicall': { - return {}; - } - - default: - throw new Error(`Unknown contract: ${contractName}`); - } -} - -async function deploy(options, config, chain, contractName) { - const { yes } = options; - const wallet = await getWallet(chain, options); - - if (prompt(`Proceed with deployment on ${chain.name}?`, yes)) { - return; - } - - const wasmHash = await uploadWasm(wallet, chain, options.contractCodePath); - const initializeArgs = await getInitializeArgs(config, chain, contractName, wallet, options); - const serializedArgs = Object.fromEntries( - Object.entries(initializeArgs).map(([key, value]) => [key, serializeValue(scValToNative(value))]), - ); - const operation = Operation.createCustomContract({ - wasmHash, - address: Address.fromString(wallet.publicKey()), - // requires that initializeArgs returns the parameters in the appropriate order - constructorArgs: Object.values(initializeArgs), - }); - printInfo('Initializing contract with args', JSON.stringify(serializedArgs, null, 2)); - - const deployResponse = await broadcast(operation, wallet, chain, 'Initialized contract', options); - const contractAddress = Address.fromScAddress(deployResponse.address()).toString(); - - validateParameters({ - isValidStellarAddress: { contractAddress }, - }); - - printInfo('Contract initialized at address', contractAddress); - - chain.contracts[contractName] = { - address: contractAddress, - deployer: wallet.publicKey(), - wasmHash: serializeValue(wasmHash), - initializeArgs: serializedArgs, - }; - - printInfo(contractName, JSON.stringify(chain.contracts[contractName], null, 2)); -} - -async function uploadWasm(wallet, chain, filePath) { - const bytecode = readFileSync(filePath); - const operation = Operation.uploadContractWasm({ wasm: bytecode }); - const wasmResponse = await broadcast(operation, wallet, chain, 'Uploaded wasm'); - return wasmResponse.value(); -} - -async function upgrade(options, _, chain, contractName) { - const { yes } = options; - - if (!options.version && !options.artifactPath) { - throw new Error('--version or --artifact-path required to upgrade'); - } - - let contractAddress = chain.contracts[contractName]?.address; - const upgraderAddress = chain.contracts.Upgrader?.address; - const wallet = await getWallet(chain, options); +const { Command } = require('commander'); +const { addBaseOptions } = require('./utils'); +const { addOptionsToCommands } = require('../common'); +const { getDeployContractCommands, getUpgradeContractCommands, getUploadContractCommands } = require('./deploy-contract/commands'); - if (prompt(`Proceed with upgrade on ${chain.name}?`, yes)) { - return; - } - - validateParameters({ - isValidStellarAddress: { contractAddress, upgraderAddress }, - }); - - contractAddress = Address.fromString(contractAddress); - - const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath); - printInfo('New Wasm hash', serializeValue(newWasmHash)); - - const args = [contractAddress, options.version, newWasmHash, [options.migrationData]].map(nativeToScVal); - - const upgrader = new Contract(upgraderAddress); - const operation = upgrader.call('upgrade', ...args); - - await broadcast(operation, wallet, chain, 'Upgraded contract', options); - chain.contracts[contractName].wasmHash = serializeValue(newWasmHash); - printInfo('Contract upgraded successfully!', contractAddress); -} - -async function mainProcessor(options, processor, contractName) { - const config = loadConfig(options.env); - const chain = getChainConfig(config, options.chainName); - - if (!chain.contracts) { - chain.contracts = {}; - } - - await processor(options, config, chain, contractName); - saveConfig(config, options.env); -} +require('./cli-utils'); function main() { - // 1st level command - const program = new Command('deploy-contract').description('Deploy/Upgrade Stellar contracts'); - - // 2nd level commands - const deployCmd = new Command('deploy').description('Deploy a Stellar contract'); - const upgradeCmd = new Command('upgrade').description('Upgrade a Stellar contract'); - - // 3rd level commands for `deploy` - const deployContractCmds = Array.from(SUPPORTED_CONTRACTS).map((contractName) => { - const command = new Command(contractName).description(`Deploy ${contractName} contract`); - - addStoreOptions(command); - addDeployOptions(command); - - // Attach the preAction hook to this specific command - command.hook('preAction', preActionHook(contractName)); - - // Main action handler - command.action((options) => { - mainProcessor(options, deploy, contractName); - }); - - return command; - }); - - // 3rd level commands for `upgrade` - const upgradeContractCmds = Array.from(SUPPORTED_CONTRACTS).map((contractName) => { - const command = new Command(contractName).description(`Upgrade ${contractName} contract`).addHelpText( - 'after', - ` -Examples: - # using Vec
as migration data: - $ deploy-contract upgrade axelar-operators deploy --artifact-path {releasePath}/stellar_axelar_operators.optimized.wasm --version 2.1.7 --migration-data '["GDYBNA2LAWDKRSCIR4TKCB5LJCDRVUWKHLMSKUWMJ3YX3BD6DWTNT5FW"]' - - # default void migration data: - $ deploy-contract upgrade axelar-gateway deploy --artifact-path {releasePath}/stellar_axelar_gateway.optimized.wasm --version 1.0.1 - - # equivalent explicit void migration data: - $ deploy-contract upgrade axelar-gateway deploy --artifact-path {releasePath}/stellar_axelar_gateway.optimized.wasm --version 1.0.1 --migration-data '()' -`, - ); - - addStoreOptions(command); - addUpgradeOptions(command); + const command = new Command('deploy-contract').description('Deploy/Upgrade Stellar contracts'); - command.hook('preAction', async (thisCommand) => { - const opts = thisCommand.opts(); + const deployCommand = new Command('deploy').description('Deploy a Stellar contract'); + const upgradeCommand = new Command('upgrade').description('Upgrade a Stellar contract'); + const uploadCommand = new Command('upload').description('Upload a Stellar contract'); - const contractCodePath = await getContractCodePath(opts, contractName); - Object.assign(opts, { contractCodePath }); - }); + const deployContractCommand = getDeployContractCommands(); + const upgradeContractCommands = getUpgradeContractCommands(); + const uploadContractCommands = getUploadContractCommands(); - command.action((options) => { - options.migrationData = sanitizeMigrationData(options.migrationData, options.version, contractName); - mainProcessor(options, upgrade, contractName); - }); - - return command; - }); - - // Add 3rd level commands to 2nd level command `deploy` - deployContractCmds.forEach((cmd) => deployCmd.addCommand(cmd)); - - // Add 3rd level commands to 2nd level command `upgrade` - upgradeContractCmds.forEach((cmd) => upgradeCmd.addCommand(cmd)); - - // Add base options to all 3rd level commands - addOptionsToCommands(deployCmd, addBaseOptions); - addOptionsToCommands(upgradeCmd, addBaseOptions); - - // Add 2nd level commands to 1st level command - program.addCommand(deployCmd); - program.addCommand(upgradeCmd); - - program.parse(); -} - -function preActionHook(contractName) { - return async (thisCommand) => { - const opts = thisCommand.opts(); - - // Pass contractName directly since it's known in this scope - const contractCodePath = await getContractCodePath(opts, contractName); - Object.assign(opts, { contractCodePath }); - }; -} - -function sanitizeMigrationData(migrationData, version, contractName) { - if (migrationData === null || migrationData === '()') return null; - - try { - return Address.fromString(migrationData); - } catch (_) { - // not an address, continue to next parsing attempt - } - - let parsed; - - try { - parsed = JSON.parse(migrationData); - } catch (_) { - // not json, keep as string - return migrationData; - } - - if (Array.isArray(parsed)) { - return parsed.map((value) => sanitizeMigrationData(value, version, contractName)); - } - - const custom = customMigrationData(parsed, version, contractName); - - if (custom) { - return custom; - } - - if (parsed !== null && typeof parsed === 'object') { - return Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, sanitizeMigrationData(value, version, contractName)])); - } - - printInfo('Sanitized migration data', parsed); - - return parsed; -} + deployContractCommand.forEach((command) => deployCommand.addCommand(command)); + upgradeContractCommands.forEach((command) => upgradeCommand.addCommand(command)); + uploadContractCommands.forEach((command) => uploadCommand.addCommand(command)); -function customMigrationData(migrationDataObj, version, contractName) { - if (!version || !VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version] || !VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version][contractName]) { - return null; - } + addOptionsToCommands(deployCommand, addBaseOptions); + addOptionsToCommands(upgradeCommand, addBaseOptions); + addOptionsToCommands(uploadCommand, addBaseOptions); - const customMigrationDataTypeToScVal = VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version][contractName]; + command.addCommand(deployCommand); + command.addCommand(upgradeCommand); + command.addCommand(uploadCommand); - try { - printInfo(`Retrieving custom migration data for ${contractName}`); - return customMigrationDataTypeToScVal(migrationDataObj); - } catch (error) { - throw new Error(`Failed to convert custom migration data for ${contractName}: ${error}`); - } + command.parse(); } if (require.main === module) { diff --git a/stellar/deploy-contract/commands.js b/stellar/deploy-contract/commands.js new file mode 100644 index 000000000..2268b819e --- /dev/null +++ b/stellar/deploy-contract/commands.js @@ -0,0 +1,145 @@ +'use strict'; + +const { Command, Option } = require('commander'); +const { getContractCodePath, SUPPORTED_CONTRACTS, sanitizeMigrationData } = require('../utils'); +const { addStoreOptions } = require('../../common/cli-utils'); +const { mainProcessor, upgrade, upload, deploy } = require('./processors'); + +require('../cli-utils'); + +const CONTRACT_DEPLOY_OPTIONS = { + AxelarGateway: () => [ + new Option('--nonce ', 'optional nonce for the signer set'), + new Option('--domain-separator ', 'domain separator (keccak256 hash or "offline")').default('offline'), + new Option('--previous-signers-retention ', 'previous signer retention').default(15).argParser(Number), + new Option('--minimum-rotation-delay ', 'minimum rotation delay').default(0).argParser(Number), + ], + AxelarExample: () => [ + new Option('--use-dummy-its-address', 'use dummy its address for AxelarExample contract to test a GMP call').default(false), + ], +}; + +const CONTRACT_UPGRADE_OPTIONS = { + AxelarGateway: () => [new Option('--migration-data ', 'migration data').default(null, '()')], + AxelarOperators: () => [new Option('--migration-data ', 'migration data').default(null, '()')], + InterchainTokenService: () => [new Option('--migration-data ', 'migration data').default(null, '()')], +}; + +const CONTRACT_UPLOAD_OPTIONS = {}; + +const addDeployOptions = (command) => { + addStoreOptions(command); + + const contractName = command.name(); + const contractDeployOptions = CONTRACT_DEPLOY_OPTIONS[contractName]; + + if (contractDeployOptions) { + const options = contractDeployOptions(); + // Add the options to the program + options.forEach((option) => command.addOption(option)); + } + + return command; +}; + +const addUpgradeOptions = (command) => { + addStoreOptions(command); + + const contractName = command.name(); + const contractUpgradeOptions = CONTRACT_UPGRADE_OPTIONS[contractName]; + + if (contractUpgradeOptions) { + const options = contractUpgradeOptions(); + options.forEach((option) => command.addOption(option)); + } + + return command; +}; + +const addUploadOptions = (command) => { + addStoreOptions(command); + + const contractName = command.name(); + const contractUploadOptions = CONTRACT_UPLOAD_OPTIONS[contractName]; + + if (contractUploadOptions) { + const options = contractUploadOptions(); + options.forEach((option) => command.addOption(option)); + } + + return command; +}; + +function preActionHook(contractName) { + return async (thisCommand) => { + const opts = thisCommand.opts(); + + const contractCodePath = await getContractCodePath(opts, contractName); + Object.assign(opts, { contractCodePath }); + }; +} + +const getDeployContractCommands = () => { + return Array.from(SUPPORTED_CONTRACTS).map((contractName) => { + const command = new Command(contractName).description(`Deploy ${contractName} contract`); + + addDeployOptions(command); + + command.hook('preAction', preActionHook(contractName)); + command.action((options) => { + mainProcessor(options, deploy, contractName); + }); + + return command; + }); +}; + +const getUpgradeContractCommands = () => { + return Array.from(SUPPORTED_CONTRACTS).map((contractName) => { + const command = new Command(contractName).description(`Upgrade ${contractName} contract`).addHelpText( + 'after', + ` +Examples: + # using Vec
as migration data: + $ deploy-contract upgrade axelar-operators deploy --artifact-path {releasePath}/stellar_axelar_operators.optimized.wasm --version 2.1.7 --migration-data '["GDYBNA2LAWDKRSCIR4TKCB5LJCDRVUWKHLMSKUWMJ3YX3BD6DWTNT5FW"]' + + # default void migration data: + $ deploy-contract upgrade axelar-gateway deploy --artifact-path {releasePath}/stellar_axelar_gateway.optimized.wasm --version 1.0.1 + + # equivalent explicit void migration data: + $ deploy-contract upgrade axelar-gateway deploy --artifact-path {releasePath}/stellar_axelar_gateway.optimized.wasm --version 1.0.1 --migration-data '()' +`, + ); + + addUpgradeOptions(command); + + command.hook('preAction', preActionHook(contractName)); + command.action((options) => { + options.migrationData = sanitizeMigrationData(options.migrationData, options.version, contractName); + mainProcessor(options, upgrade, contractName); + }); + + return command; + }); +}; + +const getUploadContractCommands = () => { + return Array.from(SUPPORTED_CONTRACTS).map((contractName) => { + const command = new Command(contractName).description(`Upload ${contractName} contract`); + + addUploadOptions(command); + + command.hook('preAction', preActionHook(contractName)); + command.action((options) => { + mainProcessor(options, upload, contractName); + }); + + return command; + }); +}; + +module.exports = { + getDeployContractCommands, + getUpgradeContractCommands, + getUploadContractCommands, +}; diff --git a/stellar/deploy-contract/processors.js b/stellar/deploy-contract/processors.js new file mode 100644 index 000000000..aae448595 --- /dev/null +++ b/stellar/deploy-contract/processors.js @@ -0,0 +1,226 @@ +'use strict'; + +const { Address, nativeToScVal, scValToNative, Operation, Contract } = require('@stellar/stellar-sdk'); +const { loadConfig, printInfo, saveConfig } = require('../../evm/utils'); +const { getWallet, broadcast, serializeValue, getContractCodePath, BytesToScVal, getUploadContractCodePath } = require('../utils'); +const { getDomainSeparator, getChainConfig } = require('../../common'); +const { prompt, validateParameters } = require('../../common/utils'); +const { weightedSignersToScVal } = require('../type-utils'); +const { ethers } = require('hardhat'); +const { readFileSync } = require('fs'); +const { + utils: { arrayify, id }, +} = ethers; + +require('../cli-utils'); + +const deploy = async (options, config, chain, contractName) => { + const { yes } = options; + const wallet = await getWallet(chain, options); + + if (prompt(`Proceed with deployment on ${chain.name}?`, yes)) { + return; + } + + const wasmHash = await uploadWasm(wallet, chain, options.contractCodePath); + const initializeArgs = await getInitializeArgs(config, chain, contractName, wallet, options); + const serializedArgs = Object.fromEntries( + Object.entries(initializeArgs).map(([key, value]) => [key, serializeValue(scValToNative(value))]), + ); + const operation = Operation.createCustomContract({ + wasmHash, + address: Address.fromString(wallet.publicKey()), + // requires that initializeArgs returns the parameters in the appropriate order + constructorArgs: Object.values(initializeArgs), + }); + printInfo('Initializing contract with args', JSON.stringify(serializedArgs, null, 2)); + + const deployResponse = await broadcast(operation, wallet, chain, 'Initialized contract', options); + const contractAddress = Address.fromScAddress(deployResponse.address()).toString(); + + validateParameters({ + isValidStellarAddress: { contractAddress }, + }); + + printInfo('Contract initialized at address', contractAddress); + + chain.contracts[contractName] = { + address: contractAddress, + deployer: wallet.publicKey(), + wasmHash: serializeValue(wasmHash), + initializeArgs: serializedArgs, + }; + + printInfo('Contract deployed successfully', { + contractName, + contractAddress, + deployer: wallet.publicKey(), + wasmHash: serializeValue(wasmHash), + initializeArgs: serializedArgs, + }); +}; + +const upgrade = async (options, _, chain, contractName) => { + const { yes } = options; + + if (!options.version && !options.artifactPath) { + throw new Error('--version or --artifact-path required to upgrade'); + } + + let contractAddress = chain.contracts[contractName]?.address; + const upgraderAddress = chain.contracts.Upgrader?.address; + const wallet = await getWallet(chain, options); + + if (prompt(`Proceed with upgrade on ${chain.name}?`, yes)) { + return; + } + + validateParameters({ + isValidStellarAddress: { contractAddress, upgraderAddress }, + }); + + contractAddress = Address.fromString(contractAddress); + + const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath); + printInfo('New Wasm hash', serializeValue(newWasmHash)); + + const args = [contractAddress, options.version, newWasmHash, [options.migrationData]].map(nativeToScVal); + + const upgrader = new Contract(upgraderAddress); + const operation = upgrader.call('upgrade', ...args); + + await broadcast(operation, wallet, chain, 'Upgraded contract', options); + chain.contracts[contractName].wasmHash = serializeValue(newWasmHash); + printInfo('Contract upgraded successfully', { contractName, contractAddress, wasmHash: serializeValue(newWasmHash) }); +}; + +const upload = async (options, _, chain, contractName) => { + const wallet = await getWallet(chain, options); + const contractCodePath = await getUploadContractCodePath(options, contractName); + const newWasmHash = await uploadWasm(wallet, chain, contractCodePath); + printInfo('Contract uploaded successfully', { contractName, wasmHash: serializeValue(newWasmHash) }); +}; + +const getInitializeArgs = async (config, chain, contractName, wallet, options) => { + const owner = nativeToScVal(Address.fromString(wallet.publicKey()), { type: 'address' }); + const operator = nativeToScVal(Address.fromString(wallet.publicKey()), { type: 'address' }); + + switch (contractName) { + case 'AxelarGateway': { + const domainSeparator = nativeToScVal(Buffer.from(arrayify(await getDomainSeparator(config, chain, options)))); + const minimumRotationDelay = nativeToScVal(options.minimumRotationDelay); + const previousSignersRetention = nativeToScVal(options.previousSignersRetention); + const nonce = options.nonce ? arrayify(id(options.nonce)) : Array(32).fill(0); + const initialSigners = nativeToScVal([ + weightedSignersToScVal({ + nonce, + signers: [ + { + signer: wallet.publicKey(), + weight: 1, + }, + ], + threshold: 1, + }), + ]); + + return { + owner, + operator, + domainSeparator, + minimumRotationDelay, + previousSignersRetention, + initialSigners, + }; + } + + case 'InterchainTokenService': { + const gatewayAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGateway?.address), { type: 'address' }); + const gasServiceAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGasService?.address), { type: 'address' }); + const itsHubAddress = nativeToScVal(config.axelar?.contracts?.InterchainTokenService?.address, { type: 'string' }); + const chainName = nativeToScVal(chain.axelarId, { type: 'string' }); + const nativeTokenAddress = nativeToScVal(Address.fromString(chain?.tokenAddress), { type: 'address' }); + const interchainTokenWasmHash = BytesToScVal(await uploadContract('InterchainToken', options, wallet, chain)); + const tokenManagerWasmHash = BytesToScVal(await uploadContract('TokenManager', options, wallet, chain)); + + return { + owner, + operator, + gatewayAddress, + gasServiceAddress, + itsHubAddress, + chainName, + nativeTokenAddress, + interchainTokenWasmHash, + tokenManagerWasmHash, + }; + } + + case 'AxelarOperators': + return { owner }; + + case 'AxelarGasService': { + const operatorsAddress = chain.contracts?.AxelarOperators?.address; + + validateParameters({ + isValidStellarAddress: { operatorsAddress }, + }); + + const operator = operatorsAddress ? nativeToScVal(Address.fromString(operatorsAddress), { type: 'address' }) : owner; + + return { owner, operator }; + } + + case 'Upgrader': { + return {}; + } + + case 'AxelarExample': { + const gatewayAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGateway?.address), { type: 'address' }); + const gasServiceAddress = nativeToScVal(Address.fromString(chain.contracts?.AxelarGasService?.address), { type: 'address' }); + const itsAddress = options.useDummyItsAddress + ? gatewayAddress + : nativeToScVal(chain.contracts?.InterchainTokenService?.address, { type: 'address' }); + + return { gatewayAddress, gasServiceAddress, itsAddress }; + } + + case 'Multicall': { + return {}; + } + + default: + throw new Error(`Unknown contract: ${contractName}`); + } +}; + +const uploadContract = async (contractName, options, wallet, chain) => { + const contractCodePath = await getContractCodePath(options, contractName); + return uploadWasm(wallet, chain, contractCodePath); +}; + +const uploadWasm = async (wallet, chain, filePath) => { + const bytecode = readFileSync(filePath); + const operation = Operation.uploadContractWasm({ wasm: bytecode }); + const wasmResponse = await broadcast(operation, wallet, chain, 'Uploaded wasm'); + return wasmResponse.value(); +}; + +const mainProcessor = async (options, processor, contractName) => { + const config = loadConfig(options.env); + const chain = getChainConfig(config, options.chainName); + + if (!chain.contracts) { + chain.contracts = {}; + } + + await processor(options, config, chain, contractName); + saveConfig(config, options.env); +}; + +module.exports = { + deploy, + upgrade, + upload, + mainProcessor, +}; diff --git a/stellar/utils.js b/stellar/utils.js index 501397998..31424cf4f 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -12,10 +12,11 @@ const { xdr, nativeToScVal, } = require('@stellar/stellar-sdk'); -const { downloadContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX } = require('../common/utils'); +const { downloadContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX, isValidStellarAddress } = require('../common/utils'); const { printInfo, sleep, addEnvOption, getCurrentVerifierSet } = require('../common'); const { Option } = require('commander'); const { ethers } = require('hardhat'); +const { itsCustomMigrationDataToScValV110 } = require('./type-utils'); const { utils: { arrayify, hexZeroPad, id, isHexString, keccak256 }, BigNumber, @@ -38,6 +39,14 @@ const SUPPORTED_CONTRACTS = new Set([ 'Multicall', ]); +const CustomMigrationDataTypeToScValV110 = { + InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV110(migrationData), +}; + +const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { + '1.1.0': CustomMigrationDataTypeToScValV110, +}; + function getNetworkPassphrase(networkType) { switch (networkType) { case 'local': @@ -186,7 +195,7 @@ async function broadcast(operation, wallet, chain, action, options = {}, simulat } const tx = await prepareTransaction(operation, server, wallet, chain.networkType, options); - return await sendTransaction(tx, server, action, options); + return sendTransaction(tx, server, action, options); } function getAssetCode(balance, chain) { @@ -295,7 +304,7 @@ const getNewSigners = async (wallet, config, chain, options) => { }; } - return await getAmplifierVerifiers(config, chain.axelarId); + return getAmplifierVerifiers(config, chain.axelarId); }; function serializeValue(value) { @@ -417,7 +426,18 @@ const getContractCodePath = async (options, contractName) => { if (options.version) { const url = getContractR2Url(contractName, options.version); - return await downloadContractCode(url, contractName, options.version); + return downloadContractCode(url, contractName, options.version); + } + + throw new Error('Either --artifact-path or --version must be provided'); +}; + +const getUploadContractCodePath = async (options, contractName) => { + if (options.artifactPath) return options.artifactPath; + + if (options.version) { + const url = getContractR2Url(contractName, options.version); + return downloadContractCode(url, contractName, options.version); } throw new Error('Either --artifact-path or --version must be provided'); @@ -463,6 +483,59 @@ function pascalToKebab(str) { return str.replace(/([A-Z])/g, (match, _, offset) => (offset > 0 ? `-${match.toLowerCase()}` : match.toLowerCase())); } +function sanitizeMigrationData(migrationData, version, contractName) { + if (migrationData === null || migrationData === '()') return null; + + if (isValidStellarAddress(migrationData)) { + return migrationData; + } + + if (typeof migrationData === 'string') { + return migrationData; + } + + let parsed; + + try { + parsed = JSON.parse(migrationData); + } catch (_) { + // not json, continue + } + + if (Array.isArray(parsed)) { + return parsed.map((value) => sanitizeMigrationData(value, version, contractName)); + } + + const custom = customMigrationData(parsed, version, contractName); + + if (custom) { + return custom; + } + + if (parsed !== null && typeof parsed === 'object') { + return Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, sanitizeMigrationData(value, version, contractName)])); + } + + printInfo('Sanitized migration data', parsed); + + return parsed; +} + +function customMigrationData(migrationDataObj, version, contractName) { + if (!version || !VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version] || !VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version][contractName]) { + return null; + } + + const customMigrationDataTypeToScVal = VERSIONED_CUSTOM_MIGRATION_DATA_TYPES[version][contractName]; + + try { + printInfo(`Retrieving custom migration data for ${contractName}`); + return customMigrationDataTypeToScVal(migrationDataObj); + } catch (error) { + throw new Error(`Failed to convert custom migration data for ${contractName}: ${error}`); + } +} + module.exports = { stellarCmd, ASSET_TYPE_NATIVE, @@ -484,8 +557,10 @@ module.exports = { tokenMetadataToScVal, saltToBytes32, getContractCodePath, + getUploadContractCodePath, isValidAddress, SUPPORTED_CONTRACTS, BytesToScVal, pascalToKebab, + sanitizeMigrationData, }; diff --git a/sui/contract.js b/sui/contract.js index e11153a00..37b2da549 100644 --- a/sui/contract.js +++ b/sui/contract.js @@ -150,17 +150,7 @@ async function pause(keypair, client, chain, args, options) { contract.disallowedFunctions.versions = contract.disallowedFunctions.versions.concat(versionsArg); contract.disallowedFunctions.functionNames = contract.disallowedFunctions.functionNames.concat(allowedFunctionsArg); - return await disallowFunctions( - keypair, - client, - packageId, - moduleName, - singletonId, - ownerCapId, - versionsArg, - allowedFunctionsArg, - options, - ); + return disallowFunctions(keypair, client, packageId, moduleName, singletonId, ownerCapId, versionsArg, allowedFunctionsArg, options); } async function unpause(keypair, client, chain, args, options) { @@ -199,7 +189,7 @@ async function unpause(keypair, client, chain, args, options) { } } - return await allowFunctions(keypair, client, packageId, moduleName, singletonId, ownerCapId, versionsArg, allowedFunctionsArg, options); + return allowFunctions(keypair, client, packageId, moduleName, singletonId, ownerCapId, versionsArg, allowedFunctionsArg, options); } async function processCommand(command, chain, args, options) { diff --git a/sui/utils/LedgerSigner.js b/sui/utils/LedgerSigner.js index 2eeee4e62..4e4bbfd02 100644 --- a/sui/utils/LedgerSigner.js +++ b/sui/utils/LedgerSigner.js @@ -41,7 +41,7 @@ class LedgerSigner extends Signer { await this.init(); } - return await this.sui.getPublicKey(this.path); + return this.sui.getPublicKey(this.path); } async toSuiAddress() { diff --git a/xrpl/utils.js b/xrpl/utils.js index f72d2da8c..35c2438a8 100644 --- a/xrpl/utils.js +++ b/xrpl/utils.js @@ -71,7 +71,7 @@ class XRPLClient { } async autofill(tx) { - return await this.client.autofill(tx); + return this.client.autofill(tx); } async accountInfo(account, ledgerIndex = 'validated') { @@ -175,7 +175,7 @@ class XRPLClient { tx.Fee = args.fee; } - return await this.autofill(tx); + return this.autofill(tx); } async signTx(signer, tx, multisign = false) { @@ -198,7 +198,7 @@ class XRPLClient { process.exit(0); } - return await this.submitTx(signedTx.tx_blob); + return this.submitTx(signedTx.tx_blob); } checkRequiredField(field, fieldName) { @@ -210,7 +210,7 @@ class XRPLClient { async sendPayment(signer, { destination, amount, memos = [], ...restArgs }, options = { multisign: false, yes: false }) { this.checkRequiredField(destination, 'destination'); this.checkRequiredField(amount, 'amount'); - return await this.signAndSubmitTx( + return this.signAndSubmitTx( signer, 'Payment', { @@ -239,7 +239,7 @@ class XRPLClient { throw new Error('Signers list cannot be empty'); } - return await this.signAndSubmitTx( + return this.signAndSubmitTx( signer, 'SignerListSet', { @@ -258,11 +258,11 @@ class XRPLClient { async sendTicketCreate(signer, { ticketCount, ...restArgs }, options = { multisign: false, yes: false }) { this.checkRequiredField(ticketCount, 'ticketCount'); - return await this.signAndSubmitTx(signer, 'TicketCreate', { TicketCount: ticketCount }, restArgs, options); + return this.signAndSubmitTx(signer, 'TicketCreate', { TicketCount: ticketCount }, restArgs, options); } async sendAccountSet(signer, { transferRate, tickSize, domain, flag, ...restArgs }, options = { multisign: false, yes: false }) { - return await this.signAndSubmitTx( + return this.signAndSubmitTx( signer, 'AccountSet', { @@ -280,7 +280,7 @@ class XRPLClient { this.checkRequiredField(currency, 'currency'); this.checkRequiredField(issuer, 'issuer'); this.checkRequiredField(value, 'value'); - return await this.signAndSubmitTx( + return this.signAndSubmitTx( signer, 'TrustSet', { From d71c251d17a39cbedc4e82164acd3eeb8cf214d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Fri, 4 Apr 2025 12:41:09 -0600 Subject: [PATCH 14/71] docs(releases): add TM/IT upload for Stellar v1.1.0 (#647) --- releases/stellar/2025-03-ITS-v1.1.0.md | 45 ++++++++++++++++++++++++-- stellar/README.md | 4 +-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.0.md index e72c56644..1397b3cee 100644 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ b/releases/stellar/2025-03-ITS-v1.1.0.md @@ -45,7 +45,7 @@ CHAIN= | **Testnet** | `TBD` | // TODO: ADD | **Mainnet** | `TBD` | // TODO: ADD -| Network | `InterchainTokenService migration data` | +| Network | `InterchainTokenService tokenIds` | | -------------------- | ---------------------------------------------------------- | | **Devnet-amplifier** | `TBD` | // TODO: ADD | **Stagenet** | `TBD` | // TODO: ADD @@ -56,6 +56,22 @@ CHAIN= 3. Take note of the current bytes value for `TokenManagerWasmHash` via the explorer link above. +4. Upload `TokenManager` & retrieve WASM hash + +```bash +node stellar/deploy-contract.js upload TokenManager --version 1.1.0 +``` + +Save the returned TokenManager WASM hash for use in the next step. + +5. Upload `InterchainToken` & retrieve WASM hash + +```bash +node stellar/deploy-contract.js upload InterchainToken --version 1.1.0 +``` + +Save the returned InterchainToken WASM hash for use in the next step. + 4. Upgrade `InterchainTokenService` & migrate storage schema | Network | `deployer address` | @@ -69,7 +85,32 @@ CHAIN= node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.0 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' ``` -NOTE: InterchainToken + TokenManager contracts will be migrated automatically +5. Pause the InterchainTokenService contract + +```bash +node stellar/contract.js pause InterchainTokenService +``` + +5. Verify InterchainTokenService is paused + +```bash +node stellar/contract.js paused InterchainTokenService +``` + +5. Run ITS::migrate_token for all deployed tokenIds + +```bash +// TODO: Implement migrate_token support: https://axelarnetwork.atlassian.net/browse/AXE-8474 +node stellar/its.js migrate-token --token-id [token-id] --version [version] +``` + +NOTE: InterchainToken + TokenManager contracts will be migrated automatically. + +5. Unpause the InterchainTokenService contract + +```bash +node stellar/contract.js unpause InterchainTokenService +``` 5. Revisit the InterchainTokenService storage via the explorer link above. diff --git a/stellar/README.md b/stellar/README.md index a46a388f5..0fafa15fb 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -165,11 +165,11 @@ node stellar/deploy-contract.js upgrade --version In order to upload contracts directly to the Stellar network, use the following commands: ```bash -npm run stellar:upload -- --version +node stellar/deploy-contract.js upload --version ``` ```bash -npm run stellar:upload -- --artifact-path ./axelar-amplifier-stellar/target/wasm32-unknown-unknown/release/.optimized.wasm +node stellar/deploy-contract.js upload --artifact-path ./axelar-amplifier-stellar/target/wasm32-unknown-unknown/release/.optimized.wasm ``` --- From 3500a10d3b65c9edbd2a40dfc1f0468d828f6c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Sun, 6 Apr 2025 20:31:44 -0600 Subject: [PATCH 15/71] feat(stellar): add ITS::migrate_token (#648) --- releases/stellar/2025-03-GMP-v1.1.0.md | 4 ++-- releases/stellar/2025-03-ITS-v1.1.0.md | 23 +++++++++++----------- stellar/deploy-contract/processors.js | 12 ++++++------ stellar/its.js | 27 +++++++++++++++++++++++++- stellar/utils.js | 15 +++++++------- 5 files changed, 53 insertions(+), 28 deletions(-) diff --git a/releases/stellar/2025-03-GMP-v1.1.0.md b/releases/stellar/2025-03-GMP-v1.1.0.md index 3b2bf7b16..60b3391c6 100644 --- a/releases/stellar/2025-03-GMP-v1.1.0.md +++ b/releases/stellar/2025-03-GMP-v1.1.0.md @@ -42,9 +42,9 @@ A Stellar chain config should already exist under a `${ENV}.json` file under `ch ### Steps -1. Run `git revert f7449dc` to use the v1.0.0 Upgrader script for the below upgrades. +1. Manually copy the v1.0.0 Upgrader script to use `createUpgradeAuths()` just like [this commit](https://github.com/axelarnetwork/axelar-contract-deployments/commit/015f47d0d2d22fcc99ec8cf311037b597a52cd03). -- Note: The revert commit will need to be excluded from your final PR. +- Note: The old script will need to be excluded from your final PR. 2. Request Tokens from Faucet diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.0.md index 1397b3cee..90def6144 100644 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ b/releases/stellar/2025-03-ITS-v1.1.0.md @@ -45,13 +45,15 @@ CHAIN= | **Testnet** | `TBD` | // TODO: ADD | **Mainnet** | `TBD` | // TODO: ADD -| Network | `InterchainTokenService tokenIds` | +| Network | `InterchainTokenService tokenIds (hex)` | | -------------------- | ---------------------------------------------------------- | | **Devnet-amplifier** | `TBD` | // TODO: ADD | **Stagenet** | `TBD` | // TODO: ADD | **Testnet** | `TBD` | // TODO: ADD | **Mainnet** | `TBD` | // TODO: ADD +Note: You may convert using a [base64 to hex converter](https://cryptii.com/pipes/base64-to-hex). + 2. Take note of the current bytes value for `InterchainTokenWasmHash` via the explorer link above. 3. Take note of the current bytes value for `TokenManagerWasmHash` via the explorer link above. @@ -72,7 +74,7 @@ node stellar/deploy-contract.js upload InterchainToken --version 1.1.0 Save the returned InterchainToken WASM hash for use in the next step. -4. Upgrade `InterchainTokenService` & migrate storage schema +6. Upgrade `InterchainTokenService` & migrate storage schema | Network | `deployer address` | | -------------------- | ---------------------------------------------------------- | @@ -85,45 +87,44 @@ Save the returned InterchainToken WASM hash for use in the next step. node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.0 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' ``` -5. Pause the InterchainTokenService contract +7. Pause the InterchainTokenService contract ```bash node stellar/contract.js pause InterchainTokenService ``` -5. Verify InterchainTokenService is paused +8. Verify InterchainTokenService is paused ```bash node stellar/contract.js paused InterchainTokenService ``` -5. Run ITS::migrate_token for all deployed tokenIds +9. Run ITS::migrate_token for ALL deployed tokenIds (hex) ```bash -// TODO: Implement migrate_token support: https://axelarnetwork.atlassian.net/browse/AXE-8474 -node stellar/its.js migrate-token --token-id [token-id] --version [version] +node stellar/its.js migrate-token -- --tokenId [token-id] --version 1.1.0 ``` NOTE: InterchainToken + TokenManager contracts will be migrated automatically. -5. Unpause the InterchainTokenService contract +10. Unpause the InterchainTokenService contract ```bash node stellar/contract.js unpause InterchainTokenService ``` -5. Revisit the InterchainTokenService storage via the explorer link above. +11. Revisit the InterchainTokenService storage via the explorer link above. - The bytes value for `InterchainTokenWasmHash` should be replaced with a new WASM hash. - The bytes value for `TokenManagerWasmHash` should be replaced with a new WASM hash. -6. Upgrade the `Upgrader` contract +12. Upgrade the `Upgrader` contract ```bash node stellar/deploy-contract.js upgrade Upgrader --version 1.1.0 ``` -7. Run `git revert ` to reapply the new Upgrader script changes. +13. Remove the `createUpgradeAuths()` code added in the first step. ## Checklist diff --git a/stellar/deploy-contract/processors.js b/stellar/deploy-contract/processors.js index aae448595..2e8614136 100644 --- a/stellar/deploy-contract/processors.js +++ b/stellar/deploy-contract/processors.js @@ -22,7 +22,7 @@ const deploy = async (options, config, chain, contractName) => { return; } - const wasmHash = await uploadWasm(wallet, chain, options.contractCodePath); + const wasmHash = await uploadWasm(wallet, chain, options.contractCodePath, contractName); const initializeArgs = await getInitializeArgs(config, chain, contractName, wallet, options); const serializedArgs = Object.fromEntries( Object.entries(initializeArgs).map(([key, value]) => [key, serializeValue(scValToNative(value))]), @@ -81,7 +81,7 @@ const upgrade = async (options, _, chain, contractName) => { contractAddress = Address.fromString(contractAddress); - const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath); + const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath, contractName); printInfo('New Wasm hash', serializeValue(newWasmHash)); const args = [contractAddress, options.version, newWasmHash, [options.migrationData]].map(nativeToScVal); @@ -97,7 +97,7 @@ const upgrade = async (options, _, chain, contractName) => { const upload = async (options, _, chain, contractName) => { const wallet = await getWallet(chain, options); const contractCodePath = await getUploadContractCodePath(options, contractName); - const newWasmHash = await uploadWasm(wallet, chain, contractCodePath); + const newWasmHash = await uploadWasm(wallet, chain, contractCodePath, contractName); printInfo('Contract uploaded successfully', { contractName, wasmHash: serializeValue(newWasmHash) }); }; @@ -196,13 +196,13 @@ const getInitializeArgs = async (config, chain, contractName, wallet, options) = const uploadContract = async (contractName, options, wallet, chain) => { const contractCodePath = await getContractCodePath(options, contractName); - return uploadWasm(wallet, chain, contractCodePath); + return uploadWasm(wallet, chain, contractCodePath, contractName); }; -const uploadWasm = async (wallet, chain, filePath) => { +const uploadWasm = async (wallet, chain, filePath, contractName) => { const bytecode = readFileSync(filePath); const operation = Operation.uploadContractWasm({ wasm: bytecode }); - const wasmResponse = await broadcast(operation, wallet, chain, 'Uploaded wasm'); + const wasmResponse = await broadcast(operation, wallet, chain, `Uploaded ${contractName} wasm`); return wasmResponse.value(); }; diff --git a/stellar/its.js b/stellar/its.js index 537090eca..079d2f254 100644 --- a/stellar/its.js +++ b/stellar/its.js @@ -1,6 +1,6 @@ 'use strict'; -const { Contract, nativeToScVal } = require('@stellar/stellar-sdk'); +const { Contract, nativeToScVal, Address } = require('@stellar/stellar-sdk'); const { Command, Option } = require('commander'); const { saveConfig, @@ -183,6 +183,17 @@ async function execute(wallet, _, chain, contract, args, options) { await broadcast(operation, wallet, chain, 'Executed', options); } +async function migrateToken(wallet, _, chain, contract, args, options) { + const [tokenId, version] = args; + + const tokenIdScVal = nativeToScVal(Buffer.from(tokenId, 'hex')); + const upgraderAddressScVal = nativeToScVal(Address.fromString(chain.contracts.Upgrader.address), { type: 'address' }); + const newVersionScVal = nativeToScVal(version, { type: 'string' }); + + const operation = contract.call('migrate_token', tokenIdScVal, upgraderAddressScVal, newVersionScVal); + await broadcast(operation, wallet, chain, 'Migrated token', options); +} + async function mainProcessor(processor, args, options) { const { yes } = options; const config = loadConfig(options.env); @@ -278,6 +289,20 @@ if (require.main === module) { mainProcessor(execute, [sourceChain, messageId, sourceAddress, payload], options); }); + program + .command('migrate-token ') + .description("Migrates a token's TokenManager and InterchainToken to a new version") + .addOption( + new Option( + '--tokenId ', + 'The tokenId to migrate in base64 format (example: "Ti+Y+1GPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0="', + ), + ) + .addOption(new Option('--version ', 'The version to migrate to')) + .action((tokenId, version, options) => { + mainProcessor(migrateToken, [tokenId, version], options); + }); + addOptionsToCommands(program, addBaseOptions); program.parse(); diff --git a/stellar/utils.js b/stellar/utils.js index 31424cf4f..53d432e59 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -12,7 +12,7 @@ const { xdr, nativeToScVal, } = require('@stellar/stellar-sdk'); -const { downloadContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX, isValidStellarAddress } = require('../common/utils'); +const { downloadContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX } = require('../common/utils'); const { printInfo, sleep, addEnvOption, getCurrentVerifierSet } = require('../common'); const { Option } = require('commander'); const { ethers } = require('hardhat'); @@ -486,12 +486,10 @@ function pascalToKebab(str) { function sanitizeMigrationData(migrationData, version, contractName) { if (migrationData === null || migrationData === '()') return null; - if (isValidStellarAddress(migrationData)) { - return migrationData; - } - - if (typeof migrationData === 'string') { - return migrationData; + try { + return Address.fromString(migrationData); + } catch (_) { + // not an address, continue to next parsing attempt } let parsed; @@ -499,7 +497,8 @@ function sanitizeMigrationData(migrationData, version, contractName) { try { parsed = JSON.parse(migrationData); } catch (_) { - // not json, continue + // not json, keep as string + return migrationData; } if (Array.isArray(parsed)) { From 070c4e043a084fc353f30bc5277a2f5f2fffea47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Mon, 7 Apr 2025 21:04:33 -0600 Subject: [PATCH 16/71] docs(releases): add remaining Stellar v1.1.1 data (#649) --- releases/TEMPLATE.md | 6 +- releases/stellar/2025-01-GMP-v1.0.0.md | 8 +- releases/stellar/2025-01-ITS-v1.0.0.md | 8 +- releases/stellar/2025-03-GMP-v1.1.0.md | 203 ---------------- releases/stellar/2025-03-GMP-v1.1.1.md | 225 ++++++++++++++++++ ...03-ITS-v1.1.0.md => 2025-03-ITS-v1.1.1.md} | 106 +++++---- stellar/its.js | 34 +-- stellar/utils.js | 4 +- 8 files changed, 309 insertions(+), 285 deletions(-) delete mode 100644 releases/stellar/2025-03-GMP-v1.1.0.md create mode 100644 releases/stellar/2025-03-GMP-v1.1.1.md rename releases/stellar/{2025-03-ITS-v1.1.0.md => 2025-03-ITS-v1.1.1.md} (52%) diff --git a/releases/TEMPLATE.md b/releases/TEMPLATE.md index 5e4a4dbdd..0104b8e3d 100644 --- a/releases/TEMPLATE.md +++ b/releases/TEMPLATE.md @@ -4,7 +4,7 @@ Create a new branch, e.g. `chore/stellar-2025-q1-devnet-amplifier` Push the branch and open a new PR to track your progress. The PR title should follow the format: -``` +```text chore(stellar): where TYPE = deploy | update @@ -16,8 +16,8 @@ Example: `chore(stellar): deploy stellar-2025-q1 devnet-amplifier v1.0.0` | | **Owner** | |-----------|------------| -| **Created By** | @ gh_username ([email]) | -| **Deployment** | @ gh_username ([email]) | +| **Created By** | @ gh_username ([]) | +| **Deployment** | @ gh_username ([]) | | **Network** | **Deployment Status** | **Date** | |-------------|----------------------|----------| diff --git a/releases/stellar/2025-01-GMP-v1.0.0.md b/releases/stellar/2025-01-GMP-v1.0.0.md index 023cb157e..0e9c87378 100644 --- a/releases/stellar/2025-01-GMP-v1.0.0.md +++ b/releases/stellar/2025-01-GMP-v1.0.0.md @@ -2,8 +2,8 @@ | | **Owner** | | -------------- | ------------------------------------ | -| **Created By** | @ahramy (ahram@interoplabs.io) | -| **Deployment** | @RiceAndMeet (steven@interoplabs.io) | +| **Created By** | @ahramy () | +| **Deployment** | @RiceAndMeet () | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | @@ -170,7 +170,7 @@ node stellar/gmp.js send [destination-chain] [destination-address] 0x1234 --gas- 2. Route GMP call via Amplifier -- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages +- 3. Submit proof with multisig session id @@ -197,7 +197,7 @@ node evm/gateway.js -n [source-chain] --action callContract --destinationChain $ 2. Route GMP call via Amplifier -- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages +- 3. Submit proof with multisig session id diff --git a/releases/stellar/2025-01-ITS-v1.0.0.md b/releases/stellar/2025-01-ITS-v1.0.0.md index cef105812..52ae4cb10 100644 --- a/releases/stellar/2025-01-ITS-v1.0.0.md +++ b/releases/stellar/2025-01-ITS-v1.0.0.md @@ -2,8 +2,8 @@ | | **Owner** | | -------------- | ------------------------------------ | -| **Created By** | @ahramy (ahram@interoplabs.io) | -| **Deployment** | @RiceAndMeet (steven@interoplabs.io) | +| **Created By** | @ahramy () | +| **Deployment** | @RiceAndMeet () | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | @@ -69,7 +69,7 @@ ITS hub contract configuration in `$ENV.json` must include the following attribu Please refer to `$DEPOSIT_VALUE` and `$RUN_AS_ACCOUNT` from [Stellar GMP Amplifier](../cosmwasm/2025-01-Stellar-GMP-v1.0.0.md). - `--runAs $RUN_AS_ACCOUNT` is only required for devnet-amplifier. Do not use `--runAs` for stagenet, testnet, or mainnet. -- Add a community post for the mainnet proposal. i.e: https://community.axelar.network/t/proposal-add-its-hub-to-mainnet/3227 +- Add a community post for the mainnet proposal. i.e: ```bash node cosmwasm/submit-proposal.js \ @@ -108,7 +108,7 @@ ITS_HUB_ADDRESS= The GMP call needs to be routed via Amplifier before the `execute` call. -- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages +- ### Stellar to EVM diff --git a/releases/stellar/2025-03-GMP-v1.1.0.md b/releases/stellar/2025-03-GMP-v1.1.0.md deleted file mode 100644 index 60b3391c6..000000000 --- a/releases/stellar/2025-03-GMP-v1.1.0.md +++ /dev/null @@ -1,203 +0,0 @@ -# Stellar GMP v1.1.0 - -| | **Owner** | -| -------------- | ------------------------------------ | -| **Created By** | @nbayindirli (noah@interoplabs.io) | -| **Deployment** | @nbayindirli (noah@interoplabs.io) | - -| **Network** | **Deployment Status** | **Date** | -| -------------------- | --------------------- | -------- | -| **Devnet Amplifier** | - | TBD | -| **Stagenet** | - | TBD | -| **Testnet** | - | TBD | -| **Mainnet** | - | TBD | - -- [v1.1.0 Crates](https://crates.io/crates/stellar-axelar-gateway/1.1.0) -- [v1.1.0 Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-axelar-gateway-v1.1.0) - -## Background - -- This is the v1.1.0 Stellar GMP release. -- This release contains no breaking changes. - -Contract changes in the release: - -1. Add `contractstorage` attribute macro, enabling named keys, typed values, storage method specification in the storage layout, storage schema validation, and built-in TTL extension. Use this macro in lieu of Soroban's contracttype macro on storage enums and calling storage on the env. -2. Storage TTL will now be extended automatically upon storage access due to this macro. -3. Migrate the `axelar-operators` contract's storage schema key from '`Operators`' to '`Operator`'. -4. Make the `gas_token` parameter for ITS calls optional. - -## Deployment - -Create an `.env` config. `CHAIN` should be set to `stellar` for `mainnet`, and `stellar-2025-q1` for all other networks. - -```yaml -# Change `PRIVATE_KEY in `.env` to Stellar -PRIVATE_KEY= -ENV= -CHAIN= -``` - -A Stellar chain config should already exist under a `${ENV}.json` file under `chains` key. - -### Steps - -1. Manually copy the v1.0.0 Upgrader script to use `createUpgradeAuths()` just like [this commit](https://github.com/axelarnetwork/axelar-contract-deployments/commit/015f47d0d2d22fcc99ec8cf311037b597a52cd03). - -- Note: The old script will need to be excluded from your final PR. - -2. Request Tokens from Faucet - -```bash -node stellar/faucet.js -``` - -3. Verify deployer address - -| Network | `deployer address` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `GDUITDF2LI3R5HM4KYRLLNRLEWKYBFVZVOEB6HSL7EOW2KO2LD6V4GPM` | -| **Stagenet** | `GAESJFWHAL6ZJC22P32GVWTJQZ6OZ3H5WCVNQ3O2L2XR7EEOJ4PB4I6Y` | -| **Testnet** | `GBAPBVQIFCOMGYHFUIXIEGGATEQMVSVQGVZNN5WWFAVKET6M3M4644EG` | -| **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | - -4. Retrieve full list of messages sent via the gateway - -| Network | `AxelarGateway storage` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CBMFHKNH46XWDKGKQNCF446O6FB73RB22UYQYQPVOBGZ2T2EF4YDTV43/storage) | -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -| Network | `AxelarGateway migration data` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `TBD` | // TODO: ADD -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -5. Upgrade the `AxelarGateway` contract & migrate storage schema - -```bash -node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.0 --migration-data '[("", "")]' -``` - -6. Retrieve full list of operators used by the relayer - -| Network | `AxelarOperators storage` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CABRZHKAJVJFX5IZWL7KPA6ZEX6I347W7GBXAUX6WVOGUUBRWCDGOUSI/storage) | -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -| Network | `AxelarOperators migration data` | -| -------------------- | ---------------------------------------------------------------- | -| **Devnet-amplifier** | `TBD` | -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -7. Upgrade `AxelarOperators` & migrate storage schema - -```bash -node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.0 --migration-data '[""]' -``` - -8. Revisit the AxelarOperators storage via the explorer link above. - -- The value `Operators` should now read `Operator`. -- Its key(s) should be set the the operator address retrieved above. - -9. Upgrade the `AxelarGasService` contract - -```bash -node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.0 -``` - -10. Deploy the `AxelarExample` contract - -- Note that the AxelarExample contract version is v1.0.0 - -```bash -node stellar/deploy-contract.js deploy AxelarExample --version 1.0.0 -``` - -11. Deploy the `Multicall` contract - -- Note that the Multicall contract version is v1.0.0 - -```bash -node stellar/deploy-contract.js deploy Multicall --version 1.0.0 -``` - -## Checklist - -The following checks should be performed after the rollout: - -### Axelar Operators Calls - -1. Verify the `AxelarOperators` storage has migrated as expected. - -Run the following command for each `operatorN` address: - -```bash -node stellar/operators.js is-operator operatorN -``` - -Every call should return `true`. - -### Verify Stellar → EVM GMP Call - -1. Send a GMP call - -```bash -node stellar/gmp.js send [destination-chain] [destination-address] 0x1234 --gas-amount 1000000 -``` - -2. Route GMP call via Amplifier - -- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages - -3. Submit proof with multisig session id - -```bash -# Change `PRIVATE_KEY in `.env` to EVM -PRIVATE_KEY= - -node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig-session-id] -``` - -4. Confirm whether the message is approved - -```bash -node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress [source-address] --destination [destination-address] --payloadHash 0x1ac7d1b81b7ba1025b36ccb86723da6ee5a87259f1c2fd5abe69d3200b512ec8 -``` - -### Verify EVM → Stellar GMP Call - -1. Send a GMP call - -```bash -node evm/gateway.js -n [source-chain] --action callContract --destinationChain $CHAIN --destination [destination-address] --payload 0x1234 -``` - -2. Route GMP call via Amplifier - -- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages - -3. Submit proof with multisig session id - -```bash -# Change `PRIVATE_KEY in `.env` to Stellar -PRIVATE_KEY= - -node stellar/gateway.js submit-proof [multisig-session-id] -``` - -4. Call execute to validate message - -```bash -node stellar/gmp.js execute [destination-chain] [message-id] [source-address] [0x1234] -``` diff --git a/releases/stellar/2025-03-GMP-v1.1.1.md b/releases/stellar/2025-03-GMP-v1.1.1.md new file mode 100644 index 000000000..90d0e7535 --- /dev/null +++ b/releases/stellar/2025-03-GMP-v1.1.1.md @@ -0,0 +1,225 @@ +# Stellar GMP v1.1.1 + +| | **Owner** | +| -------------- | ------------------------------------ | +| **Created By** | @nbayindirli () | +| **Deployment** | @nbayindirli () | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | WIP | 2025-04-07 | +| **Stagenet** | WIP | 2025-04-07 | +| **Testnet** | WIP | 2025-04-07 | +| **Mainnet** | WIP | 2025-04-07 | + +- [v1.1.1 Crates](https://crates.io/crates/stellar-axelar-gateway/1.1.1) +- [v1.1.1 Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-axelar-gateway-v1.1.1) + +## Background + +- This is the v1.1.1 Stellar GMP release. +- This release contains no breaking changes. + +Contract changes in the release: + +1. Add `contractstorage` attribute macro, enabling named keys, typed values, storage method specification in the storage layout, storage schema validation, and built-in TTL extension. Use this macro in lieu of Soroban's contracttype macro on storage enums and calling storage on the env. +2. Storage TTL will now be extended automatically upon storage access due to this macro. +3. Migrate the `axelar-operators` contract's storage schema key from '`Operators`' to '`Operator`'. +4. Make the `gas_token` parameter for ITS calls optional. + +## Deployment + +Create an `.env` config. `CHAIN` should be set to `stellar` for `mainnet`, and `stellar-2025-q1` for all other networks. + +```yaml +# Change `PRIVATE_KEY in `.env` to Stellar +PRIVATE_KEY= +ENV= +CHAIN= +``` + +A Stellar chain config should already exist under a `${ENV}.json` file under `chains` key. + +### Steps + +1. Manually copy the v1.0.0 Upgrader script to use `createUpgradeAuths()` just like [this commit](https://github.com/axelarnetwork/axelar-contract-deployments/commit/015f47d0d2d22fcc99ec8cf311037b597a52cd03). + +- Note: The old script will need to be excluded from your final PR. + +2. Request Tokens from Faucet + +```bash +node stellar/faucet.js +``` + +3. Verify deployer address + +| Network | `deployer address` | +| -------------------- | ---------------------------------------------------------- | +| **Devnet-amplifier** | `GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q` | +| **Stagenet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | + +4. Retrieve full list of messages sent via the gateway + +| Network | `AxelarGateway storage` | +| -------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CDWXQAUFE26XOYFWW2M3RSZPBOXHWCGLUTR5NZTFEGOV6YZQJPVARUKX/storage) | +| **Stagenet** | [source](https://stellar.expert/explorer/testnet/contract/CDERZ3XLJKWZR2NFUNFO5LS7TBDFRHHLMTE2JTE6C7VXGZMGF6DEGXFC/storage) | +| **Testnet** | [source](https://stellar.expert/explorer/testnet/contract/CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I/storage) | +| **Mainnet** | [source](https://stellar.expert/explorer/public/contract/CD6VSKXB4HY2DWU7EP2PUIYTBJBJ36LDJXEZN4NSXFYF5YP37DDFX6NF/storage) | + +| Network | `AxelarGateway migrationData` | +| -------------------- | ---------------------------------------------------------- | +| **Devnet-amplifier** | `'[("axelar", "0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"),("axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"),("axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"),("axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"),("axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"),("axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"),("stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"),("axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378")]'` | +| **Stagenet** | `'[("stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"),("stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"),("stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"),("stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"),("stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"),("stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"),("stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"),("stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"),("stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"),("stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"),("stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2")]'` | +| **Testnet** | `'[("stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"),("sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"),("stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"),("stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"),("axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"),("axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"),("stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"),("stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"),("axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"),("axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"),("stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"),("axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"),("stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"),("axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"),("axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"),("sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"),("axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"),("axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"),("axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"),("axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"),("axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"),("axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"),("axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"),("axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"),("axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"),("axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"),("axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"),("axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"),("stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2")]'` | +| **Mainnet** | `'[("axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07a229a5f-250959"),("axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"),("axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"),("axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"),("stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"),("axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"),("axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"),("axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"),("axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"),("axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"),("stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"),("axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"),("axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084")]'` | + +5. Pause the `AxelarGateway` contract + +```bash +node stellar/contract.js pause AxelarGateway +``` + +6. Verify `AxelarGateway` is paused + +```bash +node stellar/contract.js paused AxelarGateway +``` + +7. Verify the `AxelarGateway` migration data is still accurate via the explorer link above. + +8. Upgrade the `AxelarGateway` contract and migrate storage schema + +```bash +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '<[("", "")]>' +``` + +- Note: Always check the `AxelarGateway` storage after running via the explorer link above to ensure the migration data is correct. + +9. Unpause the `AxelarGateway` contract + +```bash +node stellar/contract.js unpause AxelarGateway +``` + +10. Retrieve full list of operators used by the relayer + +| Network | `AxelarOperators storage` | +| -------------------- | ------------------------------------------------------------------- | +| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CDOWLXRHI3JVLTDXUZK4AA5RYT4MO53KGGHWRVTMLI6C74HJPAG5W7WO/storage) | +| **Stagenet** | [source](https://stellar.expert/explorer/testnet/contract/CBRMCHA6EEVQJVKIBDLOXGZSOPUXMYXYMKPNVNNFCDBIP7VEFQCHBLXR/storage) | +| **Testnet** | [source](https://stellar.expert/explorer/testnet/contract/CCZEQG2QFL3WV2GPXO4BRCVIEZBMRJXAHJQWCUMNPQIXNMAD4NPZBF3M/storage) | +| **Mainnet** | [source](https://stellar.expert/explorer/public/contract/CCO23C66LAPU5YO66VNXB75T7SDVZ5UZ2GHAU3M7T2YGRKHJI3B2LZPQ/storage) | + +| Network | `AxelarOperators migrationData` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| **Devnet-amplifier** | '["GBM47ULSN4OEQNPECDIMZSDMK6AH2RNICV2VGOYPBVJ4LBFCFFQP2BXM"]' | +| **Stagenet** | '["GAY6RYZLHDSYQ7Y3X2CRSOTB6PVXAQ3IRTQFIAATYSP2TX7N25HVSJEV","GBNSB3AHRLVVXBWZFCFSWBUG6RZHNSOIDIH7VGKL2GHVFXFVV3I6I5AM"]' | +| **Testnet** | '["GDIT77OPH2WST4IDQWG4AANU2ZELJGZ6FIEWTBH6GWXSKUMR2XSH24CX","GDKKJTHINMUVPTAS6DM6Z6JHKOEWWGFW3T3IIRHGGT2F2HXPIDONKRFG"]' | +| **Mainnet** | '["GBAGPWP4GXOB4PD62KLUGOWKWVBYSUQOO37XHB7PNYWKVHSDAVO4HWHD","GDK4ZR7WNQMQ43WZTZDB3YRSWIOEQGPD4CZBKQOKYNIUHLQ6PZNPMOJK"]' | + +11. Upgrade `AxelarOperators` & migrate storage schema + +```bash +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '[""]' +``` + +12. Revisit the `AxelarOperators` storage via the explorer link above. + +- The value `Operators` should now read `Operator`. +- Its key(s) should be set the the operator address retrieved above. + +13. Upgrade the `AxelarGasService` contract + +```bash +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 +``` + +14. Deploy the `AxelarExample` contract + +- Note that the AxelarExample contract version is v1.0.2 + +```bash +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.2 +``` + +15. Deploy the `Multicall` contract + +- Note that the Multicall contract version is v1.0.1 + +```bash +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 +``` + +## Checklist + +The following checks should be performed after the rollout: + +### Axelar Operators Calls + +1. Verify the `AxelarOperators` storage has migrated as expected. + +Run the following command for each `operatorN` address: + +```bash +node stellar/operators.js is-operator operatorN +``` + +Every call should return `true`. + +### Verify Stellar → EVM GMP Call + +1. Send a GMP call + +```bash +node stellar/gmp.js send [destination-chain] [destination-address] 0x1234 --gas-amount 1000000 +``` + +2. Route GMP call via Amplifier + +- + +3. Submit proof with multisig session id + +```bash +# Change `PRIVATE_KEY in `.env` to EVM +PRIVATE_KEY= + +node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig-session-id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress [source-address] --destination [destination-address] --payloadHash 0x1ac7d1b81b7ba1025b36ccb86723da6ee5a87259f1c2fd5abe69d3200b512ec8 +``` + +### Verify EVM → Stellar GMP Call + +1. Send a GMP call + +```bash +node evm/gateway.js -n [source-chain] --action callContract --destinationChain $CHAIN --destination [destination-address] --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- + +3. Submit proof with multisig session id + +```bash +# Change `PRIVATE_KEY in `.env` to Stellar +PRIVATE_KEY= + +node stellar/gateway.js submit-proof [multisig-session-id] +``` + +4. Call execute to validate message + +```bash +node stellar/gmp.js execute [destination-chain] [message-id] [source-address] [0x1234] +``` diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.1.md similarity index 52% rename from releases/stellar/2025-03-ITS-v1.1.0.md rename to releases/stellar/2025-03-ITS-v1.1.1.md index 90def6144..a76c99de1 100644 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ b/releases/stellar/2025-03-ITS-v1.1.1.md @@ -1,31 +1,31 @@ -# Stellar ITS v1.1.0 +# Stellar ITS v1.1.1 | | **Owner** | | -------------- | ------------------------------------ | -| **Created By** | @nbayindirli (noah@interoplabs.io) | -| **Deployment** | @nbayindirli (noah@interoplabs.io) | +| **Created By** | @nbayindirli () | +| **Deployment** | @nbayindirli () | -| **Network** | **Deployment Status** | **Date** | -| -------------------- | --------------------- | -------- | -| **Devnet Amplifier** | - | TBD | -| **Stagenet** | - | TBD | -| **Testnet** | - | TBD | -| **Mainnet** | - | TBD | +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | WIP | 2025-04-07 | +| **Stagenet** | WIP | 2025-04-07 | +| **Testnet** | WIP | 2025-04-07 | +| **Mainnet** | WIP | 2025-04-07 | -- [Crates](https://crates.io/crates/stellar-interchain-token-service/1.1.0) -- [Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-interchain-token-service-v1.1.0) +- [Crates](https://crates.io/crates/stellar-interchain-token-service/1.1.1) +- [Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-interchain-token-service-v1.1.1) ## Background -- This is the v1.1.0 Stellar ITS release. +- This is the v1.1.1 Stellar ITS release. Contract changes in the release: -- See changes in [GMP v1.1.0](./2025-02-GMP-v1.1.0.md) +- See changes in [GMP v1.1.1](./2025-02-GMP-v1.1.1.md) ## Deployment -Ensure that [Stellar GMP](./2025-02-GMP-v1.1.0.md) is upgraded first. +Ensure that [Stellar GMP](./2025-02-GMP-v1.1.1.md) is upgraded first. Create an `.env` config. `CHAIN` should be set to `stellar` for mainnet, and `stellar-2025-q1` for all other networks. @@ -36,23 +36,14 @@ ENV= CHAIN= ``` -1. Retrieve full list of tokenIds supported by Stellar ITS +1. Verify deployer address -| Network | `InterchainTokenService storage` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `TBD` | // TODO: ADD -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -| Network | `InterchainTokenService tokenIds (hex)` | +| Network | `deployer address` | | -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `TBD` | // TODO: ADD -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -Note: You may convert using a [base64 to hex converter](https://cryptii.com/pipes/base64-to-hex). +| **Devnet-amplifier** | `GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q` | +| **Stagenet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | 2. Take note of the current bytes value for `InterchainTokenWasmHash` via the explorer link above. @@ -61,70 +52,81 @@ Note: You may convert using a [base64 to hex converter](https://cryptii.com/pipe 4. Upload `TokenManager` & retrieve WASM hash ```bash -node stellar/deploy-contract.js upload TokenManager --version 1.1.0 +node stellar/deploy-contract.js upload TokenManager --version 1.1.1 ``` -Save the returned TokenManager WASM hash for use in the next step. +Save the returned `TokenManager` WASM hash for use in the next step. 5. Upload `InterchainToken` & retrieve WASM hash ```bash -node stellar/deploy-contract.js upload InterchainToken --version 1.1.0 +node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 ``` -Save the returned InterchainToken WASM hash for use in the next step. +Save the returned `InterchainToken` WASM hash for use in the next step. 6. Upgrade `InterchainTokenService` & migrate storage schema -| Network | `deployer address` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `GDUITDF2LI3R5HM4KYRLLNRLEWKYBFVZVOEB6HSL7EOW2KO2LD6V4GPM` | -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - ```bash -node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.0 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.1 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' ``` -7. Pause the InterchainTokenService contract +7. Retrieve full list of tokenIds supported by Stellar ITS + +| Network | `InterchainTokenService storage` | +| -------------------- | ---------------------------------------------------------- | +| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CATNQHWMG4VOWPSWF4HXVW7ASDJNX7M7F6JLFC544T7ZMMXXAE2HUDTY/storage) | +| **Stagenet** | [source](https://stellar.expert/explorer/testnet/contract/CBD5WIIZ3BR62DQWUON2SV556UYSHL3KLBTPRX54TWDYJGPMVLZUBXXP/storage) | +| **Testnet** | [source](https://stellar.expert/explorer/testnet/contract/CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK/storage) | +| **Mainnet** | [source](https://stellar.expert/explorer/public/contract/CBDBMIOFHGWUFRYH3D3STI2DHBOWGDDBCRKQEUB4RGQEBVG74SEED6C6/storage) | + +| Network | `InterchainTokenService tokenIds (base64)` | +| -------------------- | ---------------------------------------------------------- | +| **Devnet-amplifier** | `"Ti+Y+1SPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0=" "J535ZSKoVNJdPK0QfK4QNZtrlGDrRoDaTmXV59EqXq0=" "bFaSJThTT7kJQzooI+f4g992m1LpEacDWN20EBHQ3ro=" "jC5tzI2Z+ljSXkwbNbkKMnWlWo59Pk+E2K5gdYOfna4=" "25L0WIB2ChfMc3cFtRM+oOzIJaEQfs+61S9DqJ+WqAw=" "sy1A5j5i5v43b84Zvz6ed57K3Dyb5pI+T+4oKVXbl2Q=" "DLFdu9+hYIW0XgkQTMSF5lSaI/cKdmSnoTn75jZbv8A=" "caBrwGL0ROiIbKS5sn7rSVTC6idQmOvsfx7E+cUpI10=" "MJlVSFxI9myqmYe0kPZAM0DZ82x+7qMHKqijO9Lq89o=" "w3yhg24JHcNlkpZ585AEdw7pc1s3BuDlcFXtQBCoibE=" "wTusnWDmOBMA0jtpoUzBTeSCOA6CDH4yzWZVakASQtk="` | +| **Stagenet** | `"bk5TOcAqehReN14EFgsCy2nm+cXT4e+zjs+IsJ5zq6g="` | +| **Testnet** | `"hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q="` | +| **Mainnet** | `"A/cM/Lqj2/Fx22VBAjjgW1jDrnywIZy3Bo1Z1Wr5b7Q=" "dGQ0vIU2L8yyO8EEthUPrvCy0v+WpQ8tElUwREprmQ8=" "XqRV/aAChDa0fS7nCVsHUDo9emkk9vDjOrzuIaPtKv0=" "zlmGy2Rk0M/FhXFVKbDXxzQxjq33qxrvWtExvamdenI=" "pGiAIMevFALTHyQpjk+P1+e9nlgSqIEjHi9nOq0UxcE=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4="` | + +8. Pause the `InterchainTokenService` contract ```bash node stellar/contract.js pause InterchainTokenService ``` -8. Verify InterchainTokenService is paused +9. Verify `InterchainTokenService` is paused ```bash node stellar/contract.js paused InterchainTokenService ``` -9. Run ITS::migrate_token for ALL deployed tokenIds (hex) +10. Verify the `InterchainTokenService` tokenIds are still accurate via the explorer link above. + +11. Call `ITS::migrate_token` for ALL deployed tokenIds (base64) ```bash -node stellar/its.js migrate-token -- --tokenId [token-id] --version 1.1.0 +node stellar/its.js migrate-tokens "tokenId1" "tokenId2" "tokenIdN" --version 1.1.1 ``` -NOTE: InterchainToken + TokenManager contracts will be migrated automatically. +NOTE: `InterchainToken` + `TokenManager` contracts will be migrated automatically. -10. Unpause the InterchainTokenService contract +12. Unpause the 'InterchainTokenService' contract ```bash node stellar/contract.js unpause InterchainTokenService ``` -11. Revisit the InterchainTokenService storage via the explorer link above. +13. Revisit the `InterchainTokenService` storage via the explorer link above. - The bytes value for `InterchainTokenWasmHash` should be replaced with a new WASM hash. - The bytes value for `TokenManagerWasmHash` should be replaced with a new WASM hash. -12. Upgrade the `Upgrader` contract +14. Upgrade the `Upgrader` contract ```bash -node stellar/deploy-contract.js upgrade Upgrader --version 1.1.0 +node stellar/deploy-contract.js upgrade Upgrader --version 1.1.1 ``` -13. Remove the `createUpgradeAuths()` code added in the first step. +15. Remove the `createUpgradeAuths()` code added in the first step. ## Checklist @@ -138,7 +140,7 @@ ITS_HUB_ADDRESS= The GMP call needs to be routed via Amplifier before the `execute` call. -- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages +- ### Stellar to EVM diff --git a/stellar/its.js b/stellar/its.js index 079d2f254..5710c0ddb 100644 --- a/stellar/its.js +++ b/stellar/its.js @@ -183,15 +183,21 @@ async function execute(wallet, _, chain, contract, args, options) { await broadcast(operation, wallet, chain, 'Executed', options); } -async function migrateToken(wallet, _, chain, contract, args, options) { - const [tokenId, version] = args; +async function migrateTokens(wallet, _, chain, contract, args, options) { + let tokenIds = Array.isArray(args) ? args : [args]; - const tokenIdScVal = nativeToScVal(Buffer.from(tokenId, 'hex')); - const upgraderAddressScVal = nativeToScVal(Address.fromString(chain.contracts.Upgrader.address), { type: 'address' }); - const newVersionScVal = nativeToScVal(version, { type: 'string' }); + tokenIds = tokenIds.map((tokenId) => '0x'.concat(Buffer.from(tokenId, 'base64').toString('hex'))); - const operation = contract.call('migrate_token', tokenIdScVal, upgraderAddressScVal, newVersionScVal); - await broadcast(operation, wallet, chain, 'Migrated token', options); + for (const tokenId of tokenIds) { + printInfo('Migrating token', tokenId); + + const tokenIdScVal = nativeToScVal(Buffer.from(tokenId, 'hex')); + const upgraderAddressScVal = nativeToScVal(Address.fromString(chain.contracts.Upgrader.address), { type: 'address' }); + const newVersionScVal = nativeToScVal(options.version, { type: 'string' }); + + const operation = contract.call('migrate_token', tokenIdScVal, upgraderAddressScVal, newVersionScVal); + await broadcast(operation, wallet, chain, 'Migrated token', options); + } } async function mainProcessor(processor, args, options) { @@ -290,17 +296,11 @@ if (require.main === module) { }); program - .command('migrate-token ') - .description("Migrates a token's TokenManager and InterchainToken to a new version") - .addOption( - new Option( - '--tokenId ', - 'The tokenId to migrate in base64 format (example: "Ti+Y+1GPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0="', - ), - ) + .command('migrate-tokens ') + .description('Migrates token TokenManagers and InterchainTokens to a new version') .addOption(new Option('--version ', 'The version to migrate to')) - .action((tokenId, version, options) => { - mainProcessor(migrateToken, [tokenId, version], options); + .action((tokenIds, options) => { + mainProcessor(migrateTokens, tokenIds, options); }); addOptionsToCommands(program, addBaseOptions); diff --git a/stellar/utils.js b/stellar/utils.js index 53d432e59..616f4fd97 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -39,12 +39,12 @@ const SUPPORTED_CONTRACTS = new Set([ 'Multicall', ]); -const CustomMigrationDataTypeToScValV110 = { +const CustomMigrationDataTypeToScValV111 = { InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV110(migrationData), }; const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { - '1.1.0': CustomMigrationDataTypeToScValV110, + '1.1.1': CustomMigrationDataTypeToScValV111, }; function getNetworkPassphrase(networkType) { From f7b87f0e6a8ef4d0e3939b524553165a50867c81 Mon Sep 17 00:00:00 2001 From: jcs47 <11947034+jcs47@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:23:22 +0100 Subject: [PATCH 17/71] chore(its): include operator address in instantiation (#652) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: João Sousa --- cosmwasm/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cosmwasm/utils.js b/cosmwasm/utils.js index c78845145..ab3816d83 100644 --- a/cosmwasm/utils.js +++ b/cosmwasm/utils.js @@ -763,7 +763,7 @@ const makeAxelarnetGatewayInstantiateMsg = (config, _options, contractConfig) => }; const makeInterchainTokenServiceInstantiateMsg = (config, _options, contractConfig) => { - const { adminAddress, governanceAddress } = contractConfig; + const { adminAddress, governanceAddress, operatorAddress } = contractConfig; const { axelar: { contracts }, } = config; @@ -779,6 +779,7 @@ const makeInterchainTokenServiceInstantiateMsg = (config, _options, contractConf return { governance_address: governanceAddress, admin_address: adminAddress, + operator_address: operatorAddress, axelarnet_gateway_address: axelarnetGatewayAddress, }; }; From a8c6e79b2ed07f5cc9b1e9e8ba3ec1ba8bb29a0e Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Wed, 9 Apr 2025 03:46:00 +0530 Subject: [PATCH 18/71] feat: add decimals in xrpl chain (#650) Co-authored-by: Milap Sheth --- axelar-chains-config/info/testnet.json | 1 + releases/xrpl/2025-02-v1.0.0.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 5c3862ce7..91973bdca 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2555,6 +2555,7 @@ "networkType": "testnet", "chainType": "xrpl", "finality": "1", + "decimals": 6, "approxFinalityWaitTime": 1, "explorer": { "name": "XRPL Explorer", diff --git a/releases/xrpl/2025-02-v1.0.0.md b/releases/xrpl/2025-02-v1.0.0.md index 831061777..42e7c6d14 100644 --- a/releases/xrpl/2025-02-v1.0.0.md +++ b/releases/xrpl/2025-02-v1.0.0.md @@ -64,6 +64,7 @@ An initial XRPL chain config needs to be added to `${ENV}.json` file under `chai "networkType": "testnet", "chainType": "xrpl", "finality": "1", + "decimals": 6, "approxFinalityWaitTime": 1, "explorer": { "name": "XRPL Explorer", @@ -85,6 +86,7 @@ An initial XRPL chain config needs to be added to `${ENV}.json` file under `chai "networkType": "testnet", "chainType": "xrpl", "finality": "1", + "decimals": 6, "approxFinalityWaitTime": 1, "explorer": { "name": "XRPL Explorer", From 9500c9995d22a45109998ac15d3a5d8f368ce5af Mon Sep 17 00:00:00 2001 From: isi8787 <38940784+isi8787@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:19:37 -0400 Subject: [PATCH 19/71] chore: add xrpl testnet maxUintBits and maxDecimalsWhenTruncating values (#637) Co-authored-by: Blockchain Guy --- axelar-chains-config/info/testnet.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 91973bdca..4fc12d902 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -3168,6 +3168,10 @@ "stellar-2025-q1": { "maxUintBits": 127, "maxDecimalsWhenTruncating": 255 + }, + "xrpl": { + "maxUintBits": 256, + "maxDecimalsWhenTruncating": 255 } }, "AxelarnetGateway": { From d9fbf9d37f6893382fff6ae50c4220d6f4771a2c Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Wed, 9 Apr 2025 12:04:16 +0530 Subject: [PATCH 20/71] feat: add amplifier tag in non-evm (#651) Co-authored-by: Milap Sheth --- .../info/devnet-amplifier.json | 13 +++--- axelar-chains-config/info/mainnet.json | 28 +++++++++++-- axelar-chains-config/info/stagenet.json | 28 ++++++++++--- axelar-chains-config/info/testnet.json | 41 +++++++++++++++---- axelar-chains-config/tests/schema/index.js | 27 +++++++++++- 5 files changed, 114 insertions(+), 23 deletions(-) diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 346bd6405..b9a59f313 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -537,6 +537,7 @@ "chainId": 545, "rpc": "https://testnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -629,11 +630,11 @@ "rpc": "https://soroban-testnet.stellar.org", "horizonRpc": "https://horizon-testnet.stellar.org", "networkType": "testnet", - "chainType": "stellar", + "tokenSymbol": "XLM", "decimals": 7, + "chainType": "stellar", "finality": "1", "approxFinalityWaitTime": 1, - "tokenSymbol": "XLM", "tokenAddress": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "explorer": { "name": "Stellar Expert", @@ -662,7 +663,8 @@ "threshold": "1" } ] - } + }, + "connectionType": "amplifier" }, "AxelarOperators": { "address": "CDOWLXRHI3JVLTDXUZK4AA5RYT4MO53KGGHWRVTMLI6C74HJPAG5W7WO", @@ -721,9 +723,9 @@ "networkType": "testnet", "rpc": "https://sui-testnet-rpc.publicnode.com:443", "tokenSymbol": "SUI", + "decimals": 9, "chainType": "sui", "finality": "1", - "decimals": 9, "approxFinalityWaitTime": 1, "contracts": { "Utils": { @@ -788,7 +790,8 @@ }, "domainSeparator": "0xa5ea3e93481643015f6273d6938484afb463de5c25f980ec72b63d56ebd55d55", "operator": "0x1471a8acf730a05a7d720e52c7ef94024c7351502c83b80da5583db2f6b0b8df", - "minimumRotationDelay": 0 + "minimumRotationDelay": 0, + "connectionType": "amplifier" }, "RelayerDiscovery": { "address": "0x6f8472f2d4e5d6bebc620403946ad49f7ce81fe0191902640932100118cd62f9", diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 3c03d0e7f..9d668d13c 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -6,6 +6,7 @@ "chainId": 1, "rpc": "https://mainnet.infura.io/v3/a4812158fbab4a2aaa849e6f4a6dc605", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -147,6 +148,7 @@ "chainId": 43114, "rpc": "https://api.avax.network/ext/bc/C/rpc", "tokenSymbol": "AVAX", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -271,6 +273,7 @@ "chainId": 250, "rpc": "https://rpc.ftm.tools", "tokenSymbol": "FTM", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -399,6 +402,7 @@ "chainId": 137, "rpc": "https://polygon-rpc.com", "tokenSymbol": "MATIC", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -526,6 +530,7 @@ "chainId": 1284, "rpc": "https://rpc.api.moonbeam.network", "tokenSymbol": "GLMR", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -650,6 +655,7 @@ "chainId": 56, "rpc": "https://bscrpc.com", "tokenSymbol": "BNB", + "decimals": 18, "wrappedSymbol": "WBNB", "chainType": "evm", "contracts": { @@ -789,6 +795,7 @@ "chainId": 42161, "rpc": "https://arb1.arbitrum.io/rpc", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -918,6 +925,7 @@ "chainId": 42220, "rpc": "https://forno.celo.org", "tokenSymbol": "CELO", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1044,6 +1052,7 @@ "chainId": 2222, "rpc": "https://evm.kava.io", "tokenSymbol": "KAVA", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1168,6 +1177,7 @@ "chainId": 314, "rpc": "https://rpc.ankr.com/filecoin", "tokenSymbol": "FIL", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1297,6 +1307,7 @@ "chainId": 10, "rpc": "https://optimism-mainnet.public.blastapi.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1430,6 +1441,7 @@ "chainId": 59144, "rpc": "https://rpc.linea.build", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1558,6 +1570,7 @@ "chainId": 8453, "rpc": "https://developer-access-mainnet.base.org", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1688,6 +1701,7 @@ "chainId": 5000, "rpc": "https://rpc.mantle.xyz", "tokenSymbol": "MNT", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1822,6 +1836,7 @@ "chainId": 534352, "rpc": "https://rpc.scroll.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1949,6 +1964,7 @@ "chainId": 2031, "rpc": "https://fullnode.parachain.centrifuge.io", "tokenSymbol": "CFG", + "decimals": 18, "confirmations": 1, "chainType": "evm", "contracts": { @@ -2046,6 +2062,7 @@ "chainId": 13371, "rpc": "https://rpc.immutable.com/", "tokenSymbol": "IMX", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -2157,6 +2174,7 @@ "chainId": 252, "rpc": "https://rpc.frax.com", "tokenSymbol": "frxETH", + "decimals": 18, "confirmations": 2, "gasOptions": { "gasLimit": 8000000 @@ -2280,6 +2298,7 @@ "chainId": 81457, "rpc": "https://rpc.blast.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -2403,6 +2422,7 @@ "chainId": 747, "rpc": "https://mainnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -2498,10 +2518,10 @@ "networkType": "mainnet", "rpc": "https://sui-rpc.publicnode.com:443", "tokenSymbol": "SUI", + "decimals": 9, "chainType": "sui", "finality": "1", "approxFinalityWaitTime": 1, - "decimals": 9, "explorer": { "name": "Suiscan", "url": "https://suiscan.xyz/mainnet" @@ -2545,7 +2565,8 @@ }, "domainSeparator": "0xb92c62ca5a6860211b2cf0340641e8d6dffa3207c78c3055d7f708f2bfba3171", "operator": "0x980372415053fe9d09956dea38d33d295f10de3d5c5226099304fe346ce241c9", - "minimumRotationDelay": 86400000 + "minimumRotationDelay": 86400000, + "connectionType": "amplifier" }, "Utils": { "address": "0x5920750d9804267493c958bffb7fcc1aa534705fffefbeaab0314418d631550c", @@ -2749,7 +2770,8 @@ "threshold": "1" } ] - } + }, + "connectionType": "amplifier" }, "AxelarOperators": { "address": "CCO23C66LAPU5YO66VNXB75T7SDVZ5UZ2GHAU3M7T2YGRKHJI3B2LZPQ", diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 43170a4f0..96f05b574 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -6,6 +6,7 @@ "chainId": 43113, "rpc": "https://api.avax-test.network/ext/bc/C/rpc", "tokenSymbol": "AVAX", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -116,6 +117,7 @@ "chainId": 4002, "rpc": "https://rpc.testnet.fantom.network", "tokenSymbol": "FTM", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -226,6 +228,7 @@ "chainId": 1287, "rpc": "https://moonbeam-alpha.api.onfinality.io/public", "tokenSymbol": "DEV", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -339,6 +342,7 @@ "chainId": 97, "rpc": "https://data-seed-prebsc-1-s1.binance.org:8545/", "tokenSymbol": "BNB", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGasService": { @@ -377,6 +381,7 @@ "chainId": 2221, "rpc": "https://evm.testnet.kava.io", "tokenSymbol": "KAVA", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -483,6 +488,7 @@ "chainId": 11155111, "rpc": "https://1rpc.io/sepolia", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -696,6 +702,7 @@ "chainId": 2090, "rpc": "https://centrifuge-parachain.api.onfinality.io/rpc?apikey=66c3bd57-e1d5-4d22-bfc6-d63436b44a5a", "tokenSymbol": "CFG", + "decimals": 18, "confirmations": 1, "chainType": "evm", "contracts": { @@ -737,6 +744,7 @@ "chainId": 59141, "rpc": "https://rpc.sepolia.linea.build", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -845,6 +853,7 @@ "chainId": 80002, "rpc": "https://rpc-amoy.polygon.technology", "tokenSymbol": "MATIC", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -953,6 +962,7 @@ "chainId": 84532, "rpc": "https://sepolia.base.org", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1065,6 +1075,7 @@ "chainId": 168587773, "rpc": "https://sepolia.blast.io/", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1177,6 +1188,7 @@ "chainId": 2522, "rpc": "https://rpc.testnet.frax.com", "tokenSymbol": "frxETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1288,6 +1300,7 @@ "chainId": 5003, "rpc": "https://rpc.sepolia.mantle.xyz", "tokenSymbol": "MNT", + "decimals": 18, "chainType": "evm", "confirmations": 2, "explorer": { @@ -1396,6 +1409,7 @@ "chainId": 11155420, "rpc": "https://sepolia.optimism.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1508,6 +1522,7 @@ "chainId": 545, "rpc": "https://testnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1602,6 +1617,7 @@ "chainId": 296, "rpc": "https://testnet.hashio.io/api", "tokenSymbol": "HBAR", + "decimals": 8, "confirmations": 1, "finality": "finalized", "approxFinalityWaitTime": 1, @@ -1676,8 +1692,8 @@ "networkType": "testnet", "rpc": "https://sui-testnet-rpc.publicnode.com:443", "tokenSymbol": "SUI", - "chainType": "sui", "decimals": 9, + "chainType": "sui", "explorer": { "name": "Suiscan", "url": "https://suiscan.xyz/testnet" @@ -1721,7 +1737,8 @@ }, "domainSeparator": "0x254a1ae90417f8649798698e95a1140808a701c38c8f5723a930b9d0666e54b4", "operator": "0x8e3d8f44a89f6bf3573ee0d559722bef0f46c215153caca12322e1ed93046c1f", - "minimumRotationDelay": 0 + "minimumRotationDelay": 0, + "connectionType": "amplifier" }, "Utils": { "address": "0xaa789bbc9d03a48d29e950ecbc9bc78918e1696e4a76adf7230416f0f49e4838", @@ -1899,9 +1916,9 @@ "chainId": 1449000, "rpc": "https://rpc.testnet.xrplevm.org", "tokenSymbol": "XRP", + "decimals": 18, "confirmations": 1, "finality": "finalized", - "decimals": 18, "approxFinalityWaitTime": 1, "chainType": "evm", "explorer": { @@ -1989,10 +2006,10 @@ "horizonRpc": "https://horizon-testnet.stellar.org", "networkType": "testnet", "chainType": "stellar", + "tokenSymbol": "XLM", "decimals": 7, "finality": "1", "approxFinalityWaitTime": 1, - "tokenSymbol": "XLM", "tokenAddress": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "explorer": { "name": "Stellar Expert", @@ -2021,7 +2038,8 @@ "threshold": "1" } ] - } + }, + "connectionType": "amplifier" }, "AxelarOperators": { "address": "CBRMCHA6EEVQJVKIBDLOXGZSOPUXMYXYMKPNVNNFCDBIP7VEFQCHBLXR", diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 4fc12d902..9b297639a 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -129,6 +129,7 @@ "chainId": 43113, "rpc": "https://api.avax-test.network/ext/bc/C/rpc", "tokenSymbol": "AVAX", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -241,6 +242,7 @@ "chainId": 4002, "rpc": "https://rpc.testnet.fantom.network", "tokenSymbol": "FTM", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -362,6 +364,7 @@ "chainId": 1287, "rpc": "https://moonbeam-alpha.api.onfinality.io/public", "tokenSymbol": "DEV", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -479,6 +482,7 @@ "chainId": 97, "rpc": "https://bsc-testnet-rpc.publicnode.com", "tokenSymbol": "BNB", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasPriceAdjustment": 1.4 @@ -604,6 +608,7 @@ "chainId": 44787, "rpc": "https://alfajores-forno.celo-testnet.org", "tokenSymbol": "CELO", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -719,6 +724,7 @@ "chainId": 2221, "rpc": "https://evm.testnet.kava.io", "tokenSymbol": "KAVA", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -830,6 +836,7 @@ "chainId": 314159, "rpc": "https://api.calibration.node.glif.io/rpc/v1", "tokenSymbol": "FIL", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -946,6 +953,7 @@ "chainId": 534351, "rpc": "https://sepolia-rpc.scroll.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1064,6 +1072,7 @@ "chainId": 13473, "rpc": "https://rpc.testnet.immutable.com", "tokenSymbol": "IMX", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -1175,6 +1184,7 @@ "chainId": 421614, "rpc": "https://sepolia-rollup.arbitrum.io/rpc", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -1286,6 +1296,7 @@ "chainId": 2090, "rpc": "https://node-7118620155331796992.gx.onfinality.io/jsonrpc?apikey=00538f2d-6297-44e3-8812-4b9d579524b2", "tokenSymbol": "CFG", + "decimals": 18, "confirmations": 1, "chainType": "evm", "contracts": { @@ -1375,6 +1386,7 @@ "chainId": 2522, "rpc": "https://rpc.testnet.frax.com", "tokenSymbol": "frxETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1489,6 +1501,7 @@ "chainId": 11155420, "rpc": "https://sepolia.optimism.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1604,6 +1617,7 @@ "chainId": 84532, "rpc": "https://sepolia.base.org", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1719,6 +1733,7 @@ "chainId": 168587773, "rpc": "https://sepolia.blast.io/", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1834,6 +1849,7 @@ "chainId": 5003, "rpc": "https://rpc.sepolia.mantle.xyz", "tokenSymbol": "MNT", + "decimals": 18, "confirmations": 2, "chainType": "evm", "onchainGasEstimate": { @@ -1946,6 +1962,7 @@ "chainId": 80002, "rpc": "https://rpc-amoy.polygon.technology", "tokenSymbol": "MATIC", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -2057,6 +2074,7 @@ "chainId": 59141, "rpc": "https://rpc.sepolia.linea.build", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -2168,6 +2186,7 @@ "chainId": 545, "rpc": "https://testnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -2261,6 +2280,7 @@ "chainId": 296, "rpc": "https://testnet.hashio.io/api", "tokenSymbol": "HBAR", + "decimals": 8, "confirmations": 1, "finality": "finalized", "approxFinalityWaitTime": 1, @@ -2334,9 +2354,9 @@ "networkType": "testnet", "rpc": "https://sui-testnet-rpc.publicnode.com:443", "tokenSymbol": "SUI", + "decimals": 9, "chainType": "sui", "finality": "1", - "decimals": 9, "approxFinalityWaitTime": 1, "explorer": { "name": "Suiscan", @@ -2380,7 +2400,8 @@ }, "domainSeparator": "0xf221c54a1a478f48c840a24cf2b96f77c9bc369a40570744b8fedd91df001624", "operator": "0xadc53ffb50d2fc245ddb88223619b837f743fbd420745d97a3c3e14e0beb7940", - "minimumRotationDelay": 0 + "minimumRotationDelay": 0, + "connectionType": "amplifier" }, "Utils": { "address": "0x9d817589ae367cc3f3bc9ca40394be79e5853bfca98014f27acfd4da9db78421", @@ -2552,10 +2573,10 @@ "rpc": "https://s.altnet.rippletest.net:51234", "wssRpc": "wss://s.altnet.rippletest.net:51233", "tokenSymbol": "XRP", + "decimals": 6, "networkType": "testnet", "chainType": "xrpl", "finality": "1", - "decimals": 6, "approxFinalityWaitTime": 1, "explorer": { "name": "XRPL Explorer", @@ -2590,7 +2611,8 @@ 14, 8, 6 - ] + ], + "connectionType": "amplifier" } } }, @@ -2600,9 +2622,9 @@ "chainId": 1449000, "rpc": "https://rpc.testnet.xrplevm.org", "tokenSymbol": "XRP", + "decimals": 18, "confirmations": 1, "finality": "finalized", - "decimals": 18, "approxFinalityWaitTime": 1, "chainType": "evm", "explorer": { @@ -2689,9 +2711,9 @@ "chainId": 1449000, "rpc": "https://rpc.testnet.xrplevm.org", "tokenSymbol": "XRP", + "decimals": 18, "confirmations": 1, "finality": "finalized", - "decimals": 18, "approxFinalityWaitTime": 1, "chainType": "evm", "explorer": { @@ -2778,11 +2800,11 @@ "rpc": "https://soroban-testnet.stellar.org", "horizonRpc": "https://horizon-testnet.stellar.org", "networkType": "testnet", - "chainType": "stellar", + "tokenSymbol": "XLM", "decimals": 7, "finality": "1", "approxFinalityWaitTime": 1, - "tokenSymbol": "XLM", + "chainType": "stellar", "tokenAddress": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "explorer": { "name": "Stellar Expert", @@ -2811,7 +2833,8 @@ "threshold": "1" } ] - } + }, + "connectionType": "amplifier" }, "AxelarOperators": { "address": "CCZEQG2QFL3WV2GPXO4BRCVIEZBMRJXAHJQWCUMNPQIXNMAD4NPZBF3M", diff --git a/axelar-chains-config/tests/schema/index.js b/axelar-chains-config/tests/schema/index.js index 1d7a571b3..57c7f653d 100644 --- a/axelar-chains-config/tests/schema/index.js +++ b/axelar-chains-config/tests/schema/index.js @@ -21,6 +21,15 @@ export const contractValueSchema = { required: ['address'], }; +export const axelarGatewaySchema = { + id: '/info/chains.contracts.AxelarGateway', + type: 'object', + properties: { + connectionType: { type: 'string' }, + }, + required: ['connectionType'], +}; + export const contractSchema = { id: '/info.chains.contracts', type: 'object', @@ -29,6 +38,9 @@ export const contractSchema = { '(^[a-z]|[A-Z])[a-z]*': { $ref: contractValueSchema.id, }, + AxelarGateway: { + $ref: axelarGatewaySchema.id, + }, }, properties: { skipRevertTests: { @@ -78,8 +90,20 @@ export const chainValueSchema = { finality: { type: 'string' }, approxFinalityWaitTime: { type: 'number' }, timeout: { type: 'number' }, + decimals: { type: 'number' }, }, - required: ['name', 'axelarId', 'rpc', 'tokenSymbol', 'contracts', 'explorer', 'chainType', 'finality', 'approxFinalityWaitTime'], + required: [ + 'name', + 'axelarId', + 'rpc', + 'tokenSymbol', + 'contracts', + 'explorer', + 'chainType', + 'finality', + 'approxFinalityWaitTime', + 'decimals', + ], }; export const chainsSchema = { @@ -110,6 +134,7 @@ export function addAllSchema(validator) { validator.addSchema(contractSchema, contractSchema.id); validator.addSchema(explorerSchema, explorerSchema.id); validator.addSchema(gasOptionSchema, gasOptionSchema.id); + validator.addSchema(axelarGatewaySchema, axelarGatewaySchema.id); return validator; } From f95318d97e6c4d2e72b8ae55bb79eac9ff34a890 Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Thu, 10 Apr 2025 21:15:49 -0400 Subject: [PATCH 21/71] fix: update testnet config for ampd 1.6.0 (#656) --- releases/ampd/2025-04-03-ampd-v1.6.0.md | 32 ++++++++++++------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/releases/ampd/2025-04-03-ampd-v1.6.0.md b/releases/ampd/2025-04-03-ampd-v1.6.0.md index 461942827..ee6bfc1c4 100644 --- a/releases/ampd/2025-04-03-ampd-v1.6.0.md +++ b/releases/ampd/2025-04-03-ampd-v1.6.0.md @@ -38,13 +38,21 @@ cosmwasm_contract = 'axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq type = 'MultisigSigner' [[handlers]] -chain_name = 'xrpl' +chain_name = 'xrpl-evm' cosmwasm_contract = 'axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqecnww6' type = 'MultisigSigner' ``` -Be sure to include all supported chains. For every message verifier handler specified in the config (including ones for non-evm chains), there must be a corresponding `MultisigSigner` config entry. Each entry should have the same -`type` and `cosmwasm_contract` values, and differ only in `chain_name`. The `chain_name` must match the registered chain name. The `cosmwasm_contract` value is the address of the multisig contract. +The XRPL multisig signer entry is formatted differently +``` +[[handlers]] +multisig_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +multisig_prover_contract="axelar1k82qfzu3l6rvc7twlp9lpwsnav507czl6xyrk0xv287t4439ymvsl6n470" +type="XRPLMultisigSigner" +``` + +Be sure to include all supported chains. For every message verifier handler specified in the config (including ones for non-evm chains), there must be a corresponding `MultisigSigner` config entry, except XRPL, which requires an `XRPLMultisigSigner` entry. +Each entry should have the same `type` and `cosmwasm_contract` values, and differ only in `chain_name`. The `chain_name` must match the registered chain name. The `cosmwasm_contract` value is the address of the multisig contract. For mainnet, at the time of writing, the values should look like so: ``` @@ -62,16 +70,6 @@ type = 'MultisigSigner' chain_name = 'stellar' cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' type = 'MultisigSigner' - -[[handlers]] -chain_name = 'xrpl' -cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' -type = 'MultisigSigner' - -[[handlers]] -chain_name = 'xrpl-evm' -cosmwasm_contract = 'axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5' -type = 'MultisigSigner' ``` Be sure to delete the existing `MultisigSigner` config entry. @@ -101,14 +99,14 @@ cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6z type="MultisigSigner" [[handlers]] -chain_name="xrpl" +chain_name="xrpl-evm" cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" type="MultisigSigner" [[handlers]] -chain_name="xrpl-evm" -cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" -type="MultisigSigner" +multisig_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +multisig_prover_contract="axelar1k82qfzu3l6rvc7twlp9lpwsnav507czl6xyrk0xv287t4439ymvsl6n470" +type="XRPLMultisigSigner" ``` From b9e35859d54e4cb2001532456e105be750769d9d Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Fri, 11 Apr 2025 23:54:43 +0530 Subject: [PATCH 22/71] feat: add amplifier tag in xrpl devnet (#655) --- axelar-chains-config/info/devnet-amplifier.json | 10 +++++++++- axelar-chains-config/info/stagenet.json | 1 + axelar-chains-config/info/testnet.json | 1 + axelar-chains-config/tests/schema/index.js | 16 ++++++++++------ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index b9a59f313..889e7090b 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -6,6 +6,7 @@ "chainId": 43113, "rpc": "https://avalanche-fuji-c-chain-rpc.publicnode.com", "tokenSymbol": "AVAX", + "decimals": 18, "confirmations": 1, "finality": "finalized", "approxFinalityWaitTime": 1, @@ -90,6 +91,7 @@ "chainId": 11155111, "rpc": "https://1rpc.io/sepolia", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 1, "chainType": "evm", "explorer": { @@ -174,6 +176,7 @@ "chainId": 11155420, "rpc": "https://sepolia.optimism.io", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 1, "chainType": "evm", "explorer": { @@ -258,6 +261,7 @@ "chainId": 43113, "rpc": "https://avalanche-fuji-c-chain-rpc.publicnode.com", "tokenSymbol": "AVAX", + "decimals": 18, "confirmations": 1, "chainType": "evm", "explorer": { @@ -351,6 +355,7 @@ "chainId": 11155111, "rpc": "https://1rpc.io/sepolia", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 1, "chainType": "evm", "explorer": { @@ -444,6 +449,7 @@ "chainId": 11155420, "rpc": "https://sepolia.optimism.io", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 1, "chainType": "evm", "explorer": { @@ -952,6 +958,7 @@ "rpc": "wss://s.devnet.rippletest.net:51233", "wssRpc": "wss://s.devnet.rippletest.net:51233", "tokenSymbol": "XRP", + "decimals": 6, "networkType": "testnet", "chainType": "xrpl", "finality": "1", @@ -972,7 +979,8 @@ 12, 13, 14 - ] + ], + "connectionType": "amplifier" }, "InterchainTokenService": { "address": "rGAbJZEzU6WaYv5y1LfyN7LBBcQJ3TxsKC", diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 96f05b574..275659410 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -599,6 +599,7 @@ "chainId": 421614, "rpc": "https://sepolia-rollup.arbitrum.io/rpc", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 9b297639a..8c5bd61ac 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -6,6 +6,7 @@ "chainId": 11155111, "rpc": "https://1rpc.io/sepolia", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { diff --git a/axelar-chains-config/tests/schema/index.js b/axelar-chains-config/tests/schema/index.js index 57c7f653d..bebe502e9 100644 --- a/axelar-chains-config/tests/schema/index.js +++ b/axelar-chains-config/tests/schema/index.js @@ -25,24 +25,28 @@ export const axelarGatewaySchema = { id: '/info/chains.contracts.AxelarGateway', type: 'object', properties: { - connectionType: { type: 'string' }, + connectionType: { + type: 'string', + enum: ['consensus', 'amplifier'], + }, }, required: ['connectionType'], + additionalProperties: true, }; export const contractSchema = { id: '/info.chains.contracts', type: 'object', patternProperties: { - // PascalName e.g. 'AxelarGasService', 'AxelarGateway' etc. - '(^[a-z]|[A-Z])[a-z]*': { + // PascalName e.g. 'AxelarGasService' etc. + '^[a-zA-Z][a-zA-Z]*$': { $ref: contractValueSchema.id, }, + }, + properties: { AxelarGateway: { $ref: axelarGatewaySchema.id, }, - }, - properties: { skipRevertTests: { type: 'boolean', }, @@ -110,7 +114,7 @@ export const chainsSchema = { id: '/info.chains', type: 'object', patternProperties: { - '^[a-z]+$': { + '^[a-z][a-z0-9-]*$': { $ref: chainValueSchema.id, }, }, From 65d9b6d050715d8b5577e6ece5f89197bd75aaa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Sun, 13 Apr 2025 00:10:13 -0600 Subject: [PATCH 23/71] chore(stellar): upgrade stellar-2025-q1 devnet-amplifier v1.1.1 (#653) Co-authored-by: ahramy --- .gitignore | 1 - .../info/devnet-amplifier.json | 29 +- axelar-chains-config/info/stagenet.json | 29 +- releases/stellar/2025-03-GMP-v1.1.1.md | 70 ++-- releases/stellar/2025-03-ITS-v1.1.1.md | 54 +--- .../logs/v1.1.1/2025-q1/devnet-amplifier.md | 300 ++++++++++++++++++ .../stellar/logs/v1.1.1/2025-q1/stagenet.md | 143 +++++++++ stellar/deploy-contract/processors.js | 75 ++++- stellar/its.js | 109 ++++++- stellar/type-utils.js | 4 +- stellar/utils.js | 8 +- 11 files changed, 697 insertions(+), 125 deletions(-) create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/stagenet.md diff --git a/.gitignore b/.gitignore index 36fe7da63..2c00110db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # Logs -logs *.log npm-debug.log* yarn-debug.log* diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 889e7090b..0fe86bd06 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -650,7 +650,8 @@ "AxelarGateway": { "address": "CDWXQAUFE26XOYFWW2M3RSZPBOXHWCGLUTR5NZTFEGOV6YZQJPVARUKX", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", + "version": "1.1.1", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", "operator": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", @@ -675,7 +676,8 @@ "AxelarOperators": { "address": "CDOWLXRHI3JVLTDXUZK4AA5RYT4MO53KGGHWRVTMLI6C74HJPAG5W7WO", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "82acfafba05ef400104d172664e8d30dbadca6e21e97fa9ae2e1c06c9148be1d", + "wasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2", + "version": "1.1.1", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q" } @@ -683,16 +685,18 @@ "AxelarGasService": { "address": "CCBTZ4MMXSMRYYGKMRYJGP3SU6HDOUAFQULQA67BSHFPDXO2BWGGGVKO", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "aec895c6a9e13f45cc0cc273e503cc818f5a30fd6fdc732e58a7fd9b4966ecef", + "wasmHash": "5f85b5ca8888347990b7d6384a3c73dac1fc652f93086224d78dbadfc934d729", + "version": "1.1.1", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", "operator": "CDOWLXRHI3JVLTDXUZK4AA5RYT4MO53KGGHWRVTMLI6C74HJPAG5W7WO" } }, "AxelarExample": { - "address": "CCLIFKEJLZO73SU5NFP4MGUT4MN57YEBPVTGUUL7G7G34C35OJZUBPYH", + "address": "CCLP6NGSB3JFUA37IKC4FNUL7XCWPUJDLGOFLOEVSCAT5HGUYVIZ5FYX", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "a4dbe77402308e9152dfd31777519b2ff19167db81c5a15f3032a15ee3ea3bc9", + "wasmHash": "cb96e568d52b5933111d3d97c7a3c23330df1db086aad6001f67e2daaa62d73b", + "version": "1.0.3", "initializeArgs": { "gatewayAddress": "CDWXQAUFE26XOYFWW2M3RSZPBOXHWCGLUTR5NZTFEGOV6YZQJPVARUKX", "gasServiceAddress": "CCBTZ4MMXSMRYYGKMRYJGP3SU6HDOUAFQULQA67BSHFPDXO2BWGGGVKO", @@ -700,15 +704,17 @@ } }, "Upgrader": { - "address": "CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ", + "address": "CD7U4CN26Y74C3FFAOY3RHFSMMN3IDMOXR77CA32WMHCRIG5URMDIG4D", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "a29f0384e948343a4bdc11c8c640c56345cbf91acf770828219766fc6c829382", + "wasmHash": "8393a1d52cc40fc3fd37d93da56a3322109159d794ab1d0fbee120dcb3d8cbcc", + "version": "1.1.1", "initializeArgs": {} }, "InterchainTokenService": { "address": "CATNQHWMG4VOWPSWF4HXVW7ASDJNX7M7F6JLFC544T7ZMMXXAE2HUDTY", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "7ebdf38b7df81ad0deaae0d09b3123b6f1617ffae9618382c5d11acb7b991191", + "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", + "version": "1.1.2", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", "operator": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", @@ -720,6 +726,13 @@ "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" } + }, + "Multicall": { + "address": "CC2OSV5HNXFQIG6QQ6LK5L2NYXO62H4DQ3MVXXBLEXJ36KSN6Y4S7ODD", + "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} } } }, diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 275659410..e9fcf6480 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2020,7 +2020,8 @@ "AxelarGateway": { "address": "CDERZ3XLJKWZR2NFUNFO5LS7TBDFRHHLMTE2JTE6C7VXGZMGF6DEGXFC", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", + "version": "1.1.1", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2045,7 +2046,8 @@ "AxelarOperators": { "address": "CBRMCHA6EEVQJVKIBDLOXGZSOPUXMYXYMKPNVNNFCDBIP7VEFQCHBLXR", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "82acfafba05ef400104d172664e8d30dbadca6e21e97fa9ae2e1c06c9148be1d", + "wasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2", + "version": "1.1.1", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3" } @@ -2053,16 +2055,18 @@ "AxelarGasService": { "address": "CALN6JRIISOYAYOHJHGZQWCJW3QB2MECDEDAH7E6KUW7YCJGJJNVHBWH", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "aec895c6a9e13f45cc0cc273e503cc818f5a30fd6fdc732e58a7fd9b4966ecef", + "wasmHash": "5f85b5ca8888347990b7d6384a3c73dac1fc652f93086224d78dbadfc934d729", + "version": "1.1.1", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "CBRMCHA6EEVQJVKIBDLOXGZSOPUXMYXYMKPNVNNFCDBIP7VEFQCHBLXR" } }, "AxelarExample": { - "address": "CBSVACITMKBSV5ZJKF5KPE43TRQKYEDMZ3FPJ3NA23GF5H3XA5HESFJX", + "address": "CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "a4dbe77402308e9152dfd31777519b2ff19167db81c5a15f3032a15ee3ea3bc9", + "wasmHash": "cb96e568d52b5933111d3d97c7a3c23330df1db086aad6001f67e2daaa62d73b", + "version": "1.0.3", "initializeArgs": { "gatewayAddress": "CDERZ3XLJKWZR2NFUNFO5LS7TBDFRHHLMTE2JTE6C7VXGZMGF6DEGXFC", "gasServiceAddress": "CALN6JRIISOYAYOHJHGZQWCJW3QB2MECDEDAH7E6KUW7YCJGJJNVHBWH", @@ -2070,15 +2074,17 @@ } }, "Upgrader": { - "address": "CA5JVDIOAEEQ5F2S2D5OGPNM7Z27Y7ZT4ZVHMFALRE6PEAFFMFXDTSCZ", + "address": "CDHKWDHCCOMNIF2RAZ26TGMW726RGFBN6IOYYDH7RPZVSBB6MR3APBBJ", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "a29f0384e948343a4bdc11c8c640c56345cbf91acf770828219766fc6c829382", + "wasmHash": "8393a1d52cc40fc3fd37d93da56a3322109159d794ab1d0fbee120dcb3d8cbcc", + "version": "1.1.1", "initializeArgs": {} }, "InterchainTokenService": { "address": "CBD5WIIZ3BR62DQWUON2SV556UYSHL3KLBTPRX54TWDYJGPMVLZUBXXP", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "7ebdf38b7df81ad0deaae0d09b3123b6f1617ffae9618382c5d11acb7b991191", + "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", + "version": "1.1.2", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2090,6 +2096,13 @@ "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" } + }, + "Multicall": { + "address": "CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK", + "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} } } } diff --git a/releases/stellar/2025-03-GMP-v1.1.1.md b/releases/stellar/2025-03-GMP-v1.1.1.md index 90d0e7535..6d8e88844 100644 --- a/releases/stellar/2025-03-GMP-v1.1.1.md +++ b/releases/stellar/2025-03-GMP-v1.1.1.md @@ -7,10 +7,10 @@ | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | -| **Devnet Amplifier** | WIP | 2025-04-07 | -| **Stagenet** | WIP | 2025-04-07 | -| **Testnet** | WIP | 2025-04-07 | -| **Mainnet** | WIP | 2025-04-07 | +| **Devnet Amplifier** | Completed | 2025-04-08 | +| **Stagenet** | Completed | 2025-04-08 | +| **Testnet** | WIP | 2025-04-08 | +| **Mainnet** | WIP | 2025-04-08 | - [v1.1.1 Crates](https://crates.io/crates/stellar-axelar-gateway/1.1.1) - [v1.1.1 Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-axelar-gateway-v1.1.1) @@ -72,10 +72,10 @@ node stellar/faucet.js | Network | `AxelarGateway migrationData` | | -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `'[("axelar", "0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"),("axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"),("axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"),("axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"),("axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"),("axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"),("stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"),("axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378")]'` | -| **Stagenet** | `'[("stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"),("stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"),("stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"),("stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"),("stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"),("stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"),("stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"),("stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"),("stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"),("stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"),("stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2")]'` | -| **Testnet** | `'[("stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"),("sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"),("stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"),("stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"),("axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"),("axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"),("stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"),("stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"),("axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"),("axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"),("stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"),("axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"),("stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"),("axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"),("axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"),("sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"),("axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"),("axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"),("axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"),("axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"),("axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"),("axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"),("axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"),("axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"),("axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"),("axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"),("axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"),("axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"),("stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2")]'` | -| **Mainnet** | `'[("axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07a229a5f-250959"),("axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"),("axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"),("axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"),("stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"),("axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"),("axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"),("axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"),("axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"),("axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"),("stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"),("axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"),("axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084")]'` | +| **Devnet-amplifier** | `'[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]'` | +| **Stagenet** | `'[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]'` | +| **Testnet** | `'[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"]]'` | +| **Mainnet** | `'[["axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07a229a5f-250959"],["axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"],["axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"],["axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"],["stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"],["axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"],["axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"],["axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"],["axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"],["axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"],["stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"],["axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"],["axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084"]]'` | 5. Pause the `AxelarGateway` contract @@ -94,7 +94,7 @@ node stellar/contract.js paused AxelarGateway 8. Upgrade the `AxelarGateway` contract and migrate storage schema ```bash -node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '<[("", "")]>' +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '<[["", ""]]>' ``` - Note: Always check the `AxelarGateway` storage after running via the explorer link above to ensure the migration data is correct. @@ -140,10 +140,10 @@ node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 14. Deploy the `AxelarExample` contract -- Note that the AxelarExample contract version is v1.0.2 +- Note that the AxelarExample contract version is v1.0.3 ```bash -node stellar/deploy-contract.js deploy AxelarExample --version 1.0.2 +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 ``` 15. Deploy the `Multicall` contract @@ -178,24 +178,14 @@ Every call should return `true`. node stellar/gmp.js send [destination-chain] [destination-address] 0x1234 --gas-amount 1000000 ``` -2. Route GMP call via Amplifier +2. Verify message was passed successfully via the AxelarScan link below. -- - -3. Submit proof with multisig session id - -```bash -# Change `PRIVATE_KEY in `.env` to EVM -PRIVATE_KEY= - -node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig-session-id] -``` - -4. Confirm whether the message is approved - -```bash -node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress [source-address] --destination [destination-address] --payloadHash 0x1ac7d1b81b7ba1025b36ccb86723da6ee5a87259f1c2fd5abe69d3200b512ec8 -``` +| Network | `AxelarOperators storage` | +| -------------------- | ------------------------------------------------------ | +| **Devnet-amplifier** | [AxelarScan](https://devnet-amplifier.axelarscan.io/) | +| **Stagenet** | [AxelarScan](https://stagenet.axelarscan.io/) | +| **Testnet** | [AxelarScan](https://testnet.axelarscan.io/) | +| **Mainnet** | [AxelarScan](https://mainnet.axelarscan.io/) | ### Verify EVM → Stellar GMP Call @@ -205,21 +195,11 @@ node evm/gateway.js -n [destination-chain] --action isContractCallApproved --com node evm/gateway.js -n [source-chain] --action callContract --destinationChain $CHAIN --destination [destination-address] --payload 0x1234 ``` -2. Route GMP call via Amplifier - -- - -3. Submit proof with multisig session id - -```bash -# Change `PRIVATE_KEY in `.env` to Stellar -PRIVATE_KEY= - -node stellar/gateway.js submit-proof [multisig-session-id] -``` - -4. Call execute to validate message +2. Verify message was passed successfully via the AxelarScan link below. -```bash -node stellar/gmp.js execute [destination-chain] [message-id] [source-address] [0x1234] -``` +| Network | `AxelarOperators storage` | +| -------------------- | ------------------------------------------------------ | +| **Devnet-amplifier** | [AxelarScan](https://devnet-amplifier.axelarscan.io/) | +| **Stagenet** | [AxelarScan](https://stagenet.axelarscan.io/) | +| **Testnet** | [AxelarScan](https://testnet.axelarscan.io/) | +| **Mainnet** | [AxelarScan](https://mainnet.axelarscan.io/) | diff --git a/releases/stellar/2025-03-ITS-v1.1.1.md b/releases/stellar/2025-03-ITS-v1.1.1.md index a76c99de1..6cfc12ac6 100644 --- a/releases/stellar/2025-03-ITS-v1.1.1.md +++ b/releases/stellar/2025-03-ITS-v1.1.1.md @@ -7,10 +7,10 @@ | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | -| **Devnet Amplifier** | WIP | 2025-04-07 | -| **Stagenet** | WIP | 2025-04-07 | -| **Testnet** | WIP | 2025-04-07 | -| **Mainnet** | WIP | 2025-04-07 | +| **Devnet Amplifier** | Completed | 2025-04-08 | +| **Stagenet** | Completed | 2025-04-08 | +| **Testnet** | WIP | 2025-04-08 | +| **Mainnet** | WIP | 2025-04-08 | - [Crates](https://crates.io/crates/stellar-interchain-token-service/1.1.1) - [Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-interchain-token-service-v1.1.1) @@ -45,9 +45,9 @@ CHAIN= | **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | | **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | -2. Take note of the current bytes value for `InterchainTokenWasmHash` via the explorer link above. +2. Take note of the current bytes value for `TokenManagerWasmHash` via the explorer link below. -3. Take note of the current bytes value for `TokenManagerWasmHash` via the explorer link above. +3. Take note of the current bytes value for `InterchainTokenWasmHash` via the explorer link below. 4. Upload `TokenManager` & retrieve WASM hash @@ -68,7 +68,7 @@ Save the returned `InterchainToken` WASM hash for use in the next step. 6. Upgrade `InterchainTokenService` & migrate storage schema ```bash -node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.1 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"","newInterchainTokenWasmHash":""}' ``` 7. Retrieve full list of tokenIds supported by Stellar ITS @@ -109,7 +109,7 @@ node stellar/its.js migrate-tokens "tokenId1" "tokenId2" "tokenIdN" --version 1. NOTE: `InterchainToken` + `TokenManager` contracts will be migrated automatically. -12. Unpause the 'InterchainTokenService' contract +12. Unpause the `InterchainTokenService` contract ```bash node stellar/contract.js unpause InterchainTokenService @@ -120,10 +120,10 @@ node stellar/contract.js unpause InterchainTokenService - The bytes value for `InterchainTokenWasmHash` should be replaced with a new WASM hash. - The bytes value for `TokenManagerWasmHash` should be replaced with a new WASM hash. -14. Upgrade the `Upgrader` contract +14. Deploy the `Upgrader` contract ```bash -node stellar/deploy-contract.js upgrade Upgrader --version 1.1.1 +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 ``` 15. Remove the `createUpgradeAuths()` code added in the first step. @@ -132,31 +132,12 @@ node stellar/deploy-contract.js upgrade Upgrader --version 1.1.1 The following checks should be performed after the rollout -```bash -ITS_HUB_ADDRESS= -``` - -### Execute Command - -The GMP call needs to be routed via Amplifier before the `execute` call. - -- - -### Stellar to EVM - -- Note: The final execute step of the GMP call on EVM can be performed via: - -```bash -# Change `PRIVATE_KEY `.env` to EVM -PRIVATE_KEY= - -node evm/gateway.js -n [destination-chain] --action execute --payload $PAYLOAD --sourceChain axelar --sourceAddress $ITS_HUB_ADDRESS --messageId [message-id] --destination [destination-address] -``` +### Stellar → EVM 1. Deploy Native Interchain Token ```bash -node stellar/its.js deploy-interchain-token TEST test 18 0x1234 100 +node stellar/its.js deploy-interchain-token TEST2 test2 18 0x5678 100 node stellar/its.js deploy-remote-interchain-token 0x1234 [destination-chain] --gas-amount 10000000 ``` @@ -185,16 +166,7 @@ node stellar/its.js deploy-remote-canonical-token [token-address] [destination-c node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --gas-amount 10000000 ``` -### EVM to Stellar - -- Note: The final execute step of the GMP call on Stellar can be performed via: - -```bash -# Change `PRIVATE_KEY in `.env` to Stellar -PRIVATE_KEY= - -node stellar/its.js execute [destination-chain] [message-id] [source-address] [payload] -``` +### EVM → Stellar 1. Deploy Native Interchain Token diff --git a/releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md b/releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md new file mode 100644 index 000000000..61b822b54 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md @@ -0,0 +1,300 @@ +# GMP Deployments + +### Upgrade the AxelarGateway contract and migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]' + +Upgraded contract tx: dc7f63fc93a66ed5f3c9186940a92f437b3b7fc95f735b6c9384d086b45cff58 +``` + +### Upgrade AxelarOperators & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GBM47ULSN4OEQNPECDIMZSDMK6AH2RNICV2VGOYPBVJ4LBFCFFQP2BXM"]' + +Upgraded contract tx: 145d51bafa5c4a8e308b61fc4001f0e4697b35568314510103a166a48127a09f +``` + +### Upgrade the AxelarGasService contract + +``` +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: d807752dc174fc359caceb839de08eaaf13d0538f9d359bf4ca55ba293254985 +``` + +### Deploy the AxelarExample contract + +``` +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: 7efa3ad5d37bfb2a91a2f0048c14067f10ef1d70918ef5e0e2341fa3e3404a58 +``` + +### Deploy the Multicall contract + +``` +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Initialized contract tx: def777bb1acd1ac65304b2776423510a00ac571a007a7396b4a83507e76cfe68 +``` + +## Verify GMP call + +### Verify Stellar → EVM GMP Call + +``` +node stellar/gmp.js send avalanche-fuji 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://devnet-amplifier.axelarscan.io/gmp/ff297adfb3b6c28ebc744a4e4b6142a21f33a044a99dd0fe039eafbe08d122b4 +``` + +### Verify EVM → Stellar GMP Call + +``` +node evm/gateway.js -n avalanche-fuji --action callContract --destinationChain stellar-2025-q1 --destination CAYMUJY3W77TABSONTMIRWNOIMV7ZAXKA4PNDSRKEZWCBBVSG3JB2G3K --payload 0x1234 + +https://devnet-amplifier.axelarscan.io/gmp/0xfd7ec37a4536a768a97d1f3842c796af43020e21c75443f3ccba334c32ace12b +``` + +# ITS Deployments + +### Upload TokenManager & retrieve WASM hash + +``` +node stellar/deploy-contract.js upload TokenManager --version 1.1.1 + +Uploaded TokenManager wasm tx: a940b26a580c6e22ee936e52970879442705b39c64e40c38663b60cf684df200 + +Contract uploaded successfully: { +"contractName": "TokenManager", +"wasmHash": "9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c" +} +``` + +### Upload InterchainToken & retrieve WASM hash + +``` +node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 +Uploaded InterchainToken wasm tx: 4f0644d7a818571b41651c3ed82d582a5de68b401aaa7cdf2db1ad4f6c8a2e3f + +Contract uploaded successfully: { +"contractName": "InterchainToken", +"wasmHash": "71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe" +} +``` + +### Upgrade InterchainTokenService & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.1 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' + +Upgraded contract tx: 8ce3228982eff9f24a6d9c99e89c8af2a19506e54aca98e7c1caf0bf09bf31c2 +``` + +``` +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' + +Upgraded contract tx: b29172c404b3b55a8ba98441c10e2af0c2455fd8b2901ce659356791936ea7c6 + +``` + +### Call ITS::migrate_token for ALL deployed tokenIds (base64) + +``` +node stellar/its.js migrate-tokens "Ti+Y+1SPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0=" "J535ZSKoVNJdPK0QfK4QNZtrlGDrRoDaTmXV59EqXq0=" "bFaSJThTT7kJQzooI+f4g992m1LpEacDWN20EBHQ3ro=" "jC5tzI2Z+ljSXkwbNbkKMnWlWo59Pk+E2K5gdYOfna4=" "25L0WIB2ChfMc3cFtRM+oOzIJaEQfs+61S9DqJ+WqAw=" "sy1A5j5i5v43b84Zvz6ed57K3Dyb5pI+T+4oKVXbl2Q=" "DLFdu9+hYIW0XgkQTMSF5lSaI/cKdmSnoTn75jZbv8A=" "caBrwGL0ROiIbKS5sn7rSVTC6idQmOvsfx7E+cUpI10=" "MJlVSFxI9myqmYe0kPZAM0DZ82x+7qMHKqijO9Lq89o=" "w3yhg24JHcNlkpZ585AEdw7pc1s3BuDlcFXtQBCoibE=" "wTusnWDmOBMA0jtpoUzBTeSCOA6CDH4yzWZVakASQtk=" --version 1.1.1 + +Migrating token: 0x4e2f98fb548f94c97a66f49f252ab59532676bca5671ba31cd592e8e54f4fc5d + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 011c301d6462a501909ff0fac4d06cfff7b83df43a44674dfb7f4bae2cf77cdd + +TokenManager address: CCCST4JAROEIDEBGXV4XQQJU7VHUGZLST2WKQU5XKG5YSFM5IPIDQ3HO + +Retrieved InterchainToken address tx: 78bc8327d865ad67989241d32a53bf99d231a54bd9e50ef59316c6112f067f0a + +InterchainToken address: CABZ7JCQ6277GSPS6EO63PHXNC7NWOA5IUBFLFXL7RNM65M7VP6GIS6B + +Migrated token tx: ab997877a1167ff909cf3c2df9a1ffaab26873cf7db3abf8b4051f07aec3411e + +Migrating token: 0x279df96522a854d25d3cad107cae10359b6b9460eb4680da4e65d5e7d12a5ead + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: aa1c024b3a8b83c8dcaa08e249cfe8171fce2c9467540d84dd2d2173a3179856 + +TokenManager address: CDXPB6QDXODSFEZZQM4USGRHYQIPLCSEMY3M5BVAC3RWZ7L662JEK7CM + +Retrieved InterchainToken address tx: e9697fdaeaab053220f7acf19e052c2cbf4d09366648a37948c6a49290ade5cb + +InterchainToken address: CBXN4QR5QSPFH3UBL2BB233NTHO5MTFBGODEGQUE2P4WR4KIB3GO6A3X + +Migrated token tx: b1f69f35e50b86fc2feabce4795a34875004e0f61fbfe9eff6b9b3f30fbfa9af + +Migrating token: 0x6c56922538534fb909433a2823e7f883df769b52e911a70358ddb41011d0deba + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 6b165ee2caed9d7a5c9750500f93cd507e3ac6237feb124f2da5f990ffc5a2bd + +TokenManager address: CD5LKBHER62RQVJXUNVE74O3Q2IIXQEWAEQVXVU6LR6WFVTQEUOX37KO + +Retrieved InterchainToken address tx: 5dfc13869c892af1499a966e960ff1a230e475a081a1bebb9af863b4f5821ed7 + +InterchainToken address: CABAY326266EVWJP3E2NQYZZ6552ZB2ZDWOYXZLM67D6DZBQ5VJMDXIU + +Migrated token tx: 1f93753a1b15bf91b5ed0e092a378ca3ccf34a5e53495f5dd324df81746bb412 + +Migrating token: 0x8c2e6dcc8d99fa58d25e4c1b35b90a3275a55a8e7d3e4f84d8ae6075839f9dae + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 33fa60f893a31805261b69f1f9704af743534c6bd2f5f3c8b03919d98b314aa0 + +TokenManager address: CAP4YU4D45LR5EKMLHOQV3K6YZBCJTSE2AYS6LUEYWYKGTDVU54XJVPK + +Retrieved InterchainToken address tx: 7eef3c2703d5b0be2063be402f5cdbdf8a7c62c3337b97106289f921bfafdce4 + +InterchainToken address: CDBAG6WO6SJ7ANPU57YXIZNDFOOAUNPAWJSRGJA7V6G7GJBNDCA5ZKCX + +Migrated token tx: 4406c93b21eb74f4280eed57560610c2badb6fbfd1f3b69d63cec8ff8f93008b + +Migrating token: 0xdb92f45880760a17cc737705b5133ea0ecc825a1107ecfbad52f43a89f96a80c + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 9f0909d27ba6c122ba661d31c5494186701a08683f8ab4d46c15d49a71043676 + +TokenManager address: CA5QTBX2YRTYPI7XK2U2BOLH5S4YCQHNCU2JLEVCBVRJ46Z3XYGLRVBM + +Retrieved InterchainToken address tx: cec784a8e74b5f36d156b0d9fb8d93a185d7ba16fa9271858a8e833ba35309f8 + +InterchainToken address: CA74TEICYMISJGYNTGN4DNIMJUKCTBKGYKV7TM54GBZ2CPQRBPDRP3IG + +Migrated token tx: 6b23acdb31eb263643e1edfd2581e56c924012b4eed970ccf1300c055fc7457d + +Migrating token: 0xb32d40e63e62e6fe376fce19bf3e9e779ecadc3c9be6923e4fee282955db9764 + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 35ebe8e630083374340b889d53850bd9a8213e5239bbf4b2a7d44306090ee2f8 + +TokenManager address: CD4T4YW56CQA3CO6NW422WJC5AJVDA3G4G2US4MRPHRRW3PWTJKEOX3P + +Retrieved InterchainToken address tx: d838a201902f84fbf5673b292f83b9a93162bb8c2a23125bb06fa3b1fe767a53 + +InterchainToken address: CDLNR3OAANJPAGIXHJZ26BWMEN5KHL2IAIM46ZHL6C2ZVZ6VXHHF5DN4 + +Migrated token tx: a4b79b9b87ffa8d96ceb49c06e991df3046b3548a8256bbf94ce613e0989074a + +Migrating token: 0x0cb15dbbdfa16085b45e09104cc485e6549a23f70a7664a7a139fbe6365bbfc0 + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: d167e0b343813d26b3d54042a284941ead7fb1420100bb89325b3394dec556ba + +TokenManager address: CATYCPEXXQJ7SMEAPFA6N3G4YZGIHO4EP3I2EONQQ7GG7TIVPJBMHNMP + +Retrieved InterchainToken address tx: c7207797f4eb70087582a521a3449319142afe15e169aae319625d6fb98c939b + +InterchainToken address: CDK73SDGPQAS3ZMEMIL5JPZHE5Z72GTC2K64KQWHE65XA3ZUWDH6R5H7 + +Migrated token tx: b83ebd70133a100447053402091c726acf0f6f37fe13fab1cf3057fbb4b80215 + +Migrating token: 0x71a06bc062f444e8886ca4b9b27eeb4954c2ea275098ebec7f1ec4f9c529235d + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 7cd42b7c53401e5ceaadb871f2d0b2d88bae7d4b915862588988f539688e1b2e + +TokenManager address: CDJBOSCRTPISW66FX3ZA2PLSJCLGZD2KJ5RRMR5C67M57PGHI7ZIMN2P + +Retrieved InterchainToken address tx: 3b097e2cc7e74bd0703efaf3b6991e178e0baf2183d367f898b715d30b4ddf75 + +InterchainToken address: CDUEART35X26IWSY57XYKTHXF6AYUGXUWPSTFT2YPXZTOMU53NJBF2UC + +Migrated token tx: e5947a77dccc1fc40302389db25cdabc1bd485d38184e3b1d7cbad4ba60c9107 + +Migrating token: 0x309955485c48f66caa9987b490f6403340d9f36c7eeea3072aa8a33bd2eaf3da + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: b50ecc15c8063bcc4761250928af4101f31526b70a51ad46b6ba828e6435443d + +TokenManager address: CCUINMSNY6LXRUN34SKAAVF77TWZJSF577GLBL65VTZEAAH6GIK42ZGR + +Retrieved InterchainToken address tx: 499eb445d245ae5fff80e1e19d4daa8b5e43c0f4733e6a01a52d8ceb6d17322e + +InterchainToken address: CBO3VU6TBD3CY5FFQILIFNYPIYBYOJX4P77B5ZBGWMMCOMCIVZRNU3EX + +Migrated token tx: be7c5056c13f02252fbfb5cbe477f9349f906932d4c0e06865f7aae507f096c1 + +Migrating token: 0xc37ca1836e091dc365929679f39004770ee9735b3706e0e57055ed4010a889b1 + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: fe6830d07e62281d71423c1c899989f15b15c673b6f0463f8f0e92f784932002 + +TokenManager address: CBC4KZBJJDRXNO77RAOCLV3GEIAINIFXALRKRNIDQ7LLU6KP7AH3AIKL + +Retrieved InterchainToken address tx: e98a9a4fca50af057709f4b4ccab32fc7f7d29f0fd7f6c1a3a5fe93239b3d8e9 + +InterchainToken address: CDRGJ6ILQFP5JH6JHWRTPQOZDB3EWWYQQJXQCGEHNSM3I63YX74NQXRW + +Migrated token tx: 1761dca3970f65e15c921fc92371a9c8234fae4f55ce6f59cad548f8dadc1579 + +Migrating token: 0xc13bac9d60e6381300d23b69a14cc14de482380e820c7e32cd66556a401242d9 + +Upgrader address: CAB7HFMRI67WGOWO5DGVO4OUMGOW2LT2CVPSMF5ALYOA4JSNR3O2MGIQ + +Retrieved TokenManager address tx: 3eda5c436fc110a19bee23a65ae0cfc1e03276079163e23cf4c40eaef03ea418 + +TokenManager address: CC5XGSRHHYE2BX6PUQSWQUP4IG5HASD72EX7AYFOYVS57VNRWZXHQEHU + +Retrieved InterchainToken address tx: 4c4ed28dc3cd7b0231776bedab45dc1ff6bebde19959bbb1f461d24758c1badd + +InterchainToken address: CCGZCEDK6I4OXRRMR6K42RA6P6BOSTCXCLYCJGWRUIGPXUJGLE65LUVV + +Migrated token tx: e514e899c9a6505e5f780e961a82cdaeb1f5eb716d75c64defe0ca5793560160 +``` + +### Deploy Upgrader + +``` +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 + +Initialized contract tx: 1897e3904d6a9b51ce00ac38e3de2bc6b39042d358264970674b36c9d05f987b +``` + +# ITS Checklist + +## Stellar → EVM + +``` +node stellar/its.js deploy-interchain-token TEST2 test2 18 0x5678 100 + +Interchain Token Deployed tx: fe30dc0304fd49b77c96a27c683b1dc742afa7b0448c03552c05629d0d97844b +``` + +``` +node stellar/its.js deploy-remote-interchain-token 0x1234 avalanche-fuji --gas-amount 10000000 + +https://devnet-amplifier.axelarscan.io/gmp/9005da63ec6e6791f6d45ce41e46d3de8b2740c26578ca1b749c72166fbf9319 +``` + +## EVM to Stellar + +``` +node evm/interchainTokenFactory.js --action deployInterchainToken -n avalanche-fuji --destinationChain stellar-2025-q1 --salt "testa1" --name "testa1" --symbol "TESTA1" --decimals 18 + +deployInterchainToken tx: 0x92eeff8fa20fb58dd85d99934307fa67317fb95dc88ca20a9ff01293d88ffd98 +``` + +``` +Token address: 0x68F1bC3C45a9e03C148F02C33baCEd48A0a7F737 +node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n avalanche-fuji --destinationChain stellar-2025-q1 --salt "testa1" --gasValue 1000000000000000000 + +https://devnet-amplifier.axelarscan.io/gmp/0x872c1477838361e1295b19dd753394b679fd280d721ad09568b973d14588345c +``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/stagenet.md b/releases/stellar/logs/v1.1.1/2025-q1/stagenet.md new file mode 100644 index 000000000..f1fb81914 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/stagenet.md @@ -0,0 +1,143 @@ +# GMP Deployments + +### Upgrade the AxelarGateway contract and migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]' + +Upgraded contract tx: a2731a2d09ae14aa0c99c6f140322871ce0cf79b1a4bb8a0ec27f6cace35f713 +``` + +### Upgrade AxelarOperators & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GAY6RYZLHDSYQ7Y3X2CRSOTB6PVXAQ3IRTQFIAATYSP2TX7N25HVSJEV","GBNSB3AHRLVVXBWZFCFSWBUG6RZHNSOIDIH7VGKL2GHVFXFVV3I6I5AM"]' + +Upgraded contract tx: 7937e2673b8bc447cb19478fbfc4d16d421120413601bc455bb0446aa63ff236 +``` + +### Upgrade the AxelarGasService contract + +``` +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: bf40a43f69cc88bcb6ac1be1a42be4072fb77bf398fa0c70a8149ae0080d15d1 +``` + +### Deploy the AxelarExample contract + +``` +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: ae1df3153084cc432050d22185db7e1f5bc9bc25468d69d41d98ddf4e75ea6b4 +``` + +### Deploy the Multicall contract + +``` +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Contract initialized at address: CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK +``` + +## Verify GMP call + +### Verify Stellar → EVM GMP Call + +``` +node stellar/gmp.js send avalanche 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://stagenet.axelarscan.io/gmp/064a45a48c072f578b69b9b0db21079065f31d00fc752775f8f4efdf4a42714c +``` + +### Verify EVM → Stellar GMP Call + +``` +node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H --payload 0x1234 + +https://stagenet.axelarscan.io/gmp/0x005d0a518b477215cad1ffdfc1b253144451359fbc0fd620ffe2a17c21d9bd92 +``` + +# ITS Deployments + +### Upload TokenManager & retrieve WASM hash + +``` +node stellar/deploy-contract.js upload TokenManager --version 1.1.1 + +Uploaded TokenManager wasm tx: 820edbe4f401491a38c1ff001ed1443fbea61d96a5494b5be5e2b303568dc1ef +``` + +### Upload InterchainToken & retrieve WASM hash + +``` +node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 + +Uploaded InterchainToken wasm tx: b5e7eed7c5d2d8002d248275362b92fa3472fa9456a165e2602cb9ef3ccb4c64 +``` + +### Upgrade InterchainTokenService & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' + +Uploaded InterchainTokenService wasm tx: 36e9adada74f4f927c37a3269951b664f99f6af38aa9f711f6ed81edbfdf3cc1 +``` + +### Call ITS::migrate_token for ALL deployed tokenIds (base64) + +``` +node stellar/its.js migrate-tokens "bk5TOcAqehReN14EFgsCy2nm+cXT4e+zjs+IsJ5zq6g=" --version 1.1.1 + +Migrating token: 0x6e4e5339c02a7a145e375e04160b02cb69e6f9c5d3e1efb38ecf88b09e73aba8 + +Upgrader address: CA5JVDIOAEEQ5F2S2D5OGPNM7Z27Y7ZT4ZVHMFALRE6PEAFFMFXDTSCZ + +Retrieved TokenManager address tx: c470e0180d2857c59c824bf20d3318c5b17f604b1e6f360fbef342e09332fc54 + +TokenManager address: CBFVXVDMUDRL74GDCV3ZYILNXW345O22IU6I35H2M4POVYSDTWZ33ZMZ + +Retrieved InterchainToken address tx: 2471dbd08cd4e59f871232ce83da96c8e3a813e692a7d6a411b7f42ab7e4241a + +InterchainToken address: CBUZMNF6UIN4QHQLBPQX2XJTEAOUYGVVIRXGNTAPWXYVOVVSYOTGKY7U + +Migrated token tx: b8b147071de0081ca91553bd3aa17a71d67be9400678cd682b9406a9fadef87b +``` + +### Deploy Upgrader + +``` +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 + +Initialized contract tx: 174c4794d93e49ff246d99fb8563b1d6bfa7d4ef7ad9ed59c1609fcab7587518 +``` + +# ITS Checklist + +## Stellar → EVM + +``` +node stellar/its.js deploy-interchain-token TEST3 test3 18 0x8910 10000000 + +Interchain Token Deployed tx: b249f1096c8a775b3aa4b0940ec54c7043f92cdca04b1d9a2146c1b015e409e3 +``` + +``` +node stellar/its.js deploy-remote-interchain-token 0x8910 flow --gas-amount 50000000 + +https://stagenet.axelarscan.io/gmp/21f04be1f6cc5ee8773ea65e988b322df14c95a5e2d038f0af24879dd09668d5 +``` + +## EVM to Stellar + +``` +node evm/interchainTokenFactory.js --action deployInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test3" --name "test3" --symbol "TEST3" --decimals 18 + +deployInterchainToken tx: 0x9356315fa63f62f069956b1dba9dd2e5019b0029224d510278697f6b82d8c0fc +``` + +``` +node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test3" --gasValue 1000000000000000000 + +https://stagenet.axelarscan.io/gmp/0x4c5ba293957c9c08b3872c735067ea0d6bb7c60e2f83eb0560d441a971fee9c2 +``` diff --git a/stellar/deploy-contract/processors.js b/stellar/deploy-contract/processors.js index 2e8614136..8e047013d 100644 --- a/stellar/deploy-contract/processors.js +++ b/stellar/deploy-contract/processors.js @@ -1,8 +1,17 @@ 'use strict'; -const { Address, nativeToScVal, scValToNative, Operation, Contract } = require('@stellar/stellar-sdk'); +const { Address, nativeToScVal, scValToNative, Operation, authorizeInvocation, xdr, rpc } = require('@stellar/stellar-sdk'); const { loadConfig, printInfo, saveConfig } = require('../../evm/utils'); -const { getWallet, broadcast, serializeValue, getContractCodePath, BytesToScVal, getUploadContractCodePath } = require('../utils'); +const { + getWallet, + broadcast, + serializeValue, + getContractCodePath, + BytesToScVal, + getUploadContractCodePath, + createAuthorizedFunc, + getNetworkPassphrase, +} = require('../utils'); const { getDomainSeparator, getChainConfig } = require('../../common'); const { prompt, validateParameters } = require('../../common/utils'); const { weightedSignersToScVal } = require('../type-utils'); @@ -48,16 +57,11 @@ const deploy = async (options, config, chain, contractName) => { address: contractAddress, deployer: wallet.publicKey(), wasmHash: serializeValue(wasmHash), + ...(options.version && { version: options.version }), initializeArgs: serializedArgs, }; - printInfo('Contract deployed successfully', { - contractName, - contractAddress, - deployer: wallet.publicKey(), - wasmHash: serializeValue(wasmHash), - initializeArgs: serializedArgs, - }); + printInfo('Contract deployed successfully', chain.contracts[contractName]); }; const upgrade = async (options, _, chain, contractName) => { @@ -84,14 +88,25 @@ const upgrade = async (options, _, chain, contractName) => { const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath, contractName); printInfo('New Wasm hash', serializeValue(newWasmHash)); - const args = [contractAddress, options.version, newWasmHash, [options.migrationData]].map(nativeToScVal); + // TODO: Revert this after v1.1.1 release + const version = sanitizeUpgradeVersion(options.version); - const upgrader = new Contract(upgraderAddress); - const operation = upgrader.call('upgrade', ...args); + // TODO: Revert this after v1.1.1 release + const operation = Operation.invokeContractFunction({ + contract: chain.contracts.Upgrader.address, + function: 'upgrade', + args: [contractAddress, version, newWasmHash, [options.migrationData]].map(nativeToScVal), + auth: await createUpgradeAuths(contractAddress, newWasmHash, options.migrationData, chain, wallet), + }); await broadcast(operation, wallet, chain, 'Upgraded contract', options); chain.contracts[contractName].wasmHash = serializeValue(newWasmHash); - printInfo('Contract upgraded successfully', { contractName, contractAddress, wasmHash: serializeValue(newWasmHash) }); + + if (options.version) { + chain.contracts[contractName].version = options.version; + } + + printInfo('Contract upgraded successfully', { contractName, newWasmHash: serializeValue(newWasmHash) }); }; const upload = async (options, _, chain, contractName) => { @@ -218,6 +233,40 @@ const mainProcessor = async (options, processor, contractName) => { saveConfig(config, options.env); }; +// TODO: Remove this after v1.1.1 release +async function createUpgradeAuths(contractAddress, newWasmHash, migrationData, chain, wallet) { + // 20 seems a reasonable number of ledgers to allow for the upgrade to take effect + const validUntil = await new rpc.Server(chain.rpc).getLatestLedger().then((info) => info.sequence + 20); + + return Promise.all( + [ + createAuthorizedFunc(contractAddress, 'upgrade', [nativeToScVal(newWasmHash)]), + createAuthorizedFunc(contractAddress, 'migrate', [nativeToScVal(migrationData)]), + ].map((auth) => + authorizeInvocation( + wallet, + validUntil, + new xdr.SorobanAuthorizedInvocation({ + function: auth, + subInvocations: [], + }), + wallet.publicKey(), + getNetworkPassphrase(chain.networkType), + ), + ), + ); +} + +// TODO: Remove this after v1.1.1 release +/* Note: Once R2 uploads for stellar use the cargo version number (does not include 'v' prefix), this will no longer be necessary. */ +function sanitizeUpgradeVersion(version) { + if (version.startsWith('v')) { + return version.slice(1); + } + + return version; +} + module.exports = { deploy, upgrade, diff --git a/stellar/its.js b/stellar/its.js index 5710c0ddb..a30588791 100644 --- a/stellar/its.js +++ b/stellar/its.js @@ -1,6 +1,6 @@ 'use strict'; -const { Contract, nativeToScVal, Address } = require('@stellar/stellar-sdk'); +const { Contract, nativeToScVal, Address, Operation, rpc, authorizeInvocation, xdr } = require('@stellar/stellar-sdk'); const { Command, Option } = require('commander'); const { saveConfig, @@ -22,6 +22,8 @@ const { hexToScVal, saltToBytes32, serializeValue, + createAuthorizedFunc, + getNetworkPassphrase, } = require('./utils'); const { prompt, parseTrustedChains, encodeITSDestination } = require('../common/utils'); @@ -183,6 +185,7 @@ async function execute(wallet, _, chain, contract, args, options) { await broadcast(operation, wallet, chain, 'Executed', options); } +// TODO: Remove this after v1.1.1 release async function migrateTokens(wallet, _, chain, contract, args, options) { let tokenIds = Array.isArray(args) ? args : [args]; @@ -190,16 +193,116 @@ async function migrateTokens(wallet, _, chain, contract, args, options) { for (const tokenId of tokenIds) { printInfo('Migrating token', tokenId); + printInfo('Upgrader address', chain.contracts.Upgrader.address); - const tokenIdScVal = nativeToScVal(Buffer.from(tokenId, 'hex')); + const tokenIdScVal = hexToScVal(tokenId); const upgraderAddressScVal = nativeToScVal(Address.fromString(chain.contracts.Upgrader.address), { type: 'address' }); const newVersionScVal = nativeToScVal(options.version, { type: 'string' }); - const operation = contract.call('migrate_token', tokenIdScVal, upgraderAddressScVal, newVersionScVal); + const tokenManagerAddressOperation = contract.call('token_manager_address', tokenIdScVal); + const tokenManagerAddressResult = await broadcast( + tokenManagerAddressOperation, + wallet, + chain, + 'Retrieved TokenManager address', + options, + ); + const tokenManagerAddress = serializeValue(tokenManagerAddressResult.value()); + + printInfo('TokenManager address', tokenManagerAddress); + + const interchainTokenAddressOperation = contract.call('interchain_token_address', tokenIdScVal); + const interchainTokenAddressResult = await broadcast( + interchainTokenAddressOperation, + wallet, + chain, + 'Retrieved InterchainToken address', + options, + ); + const interchainTokenAddress = serializeValue(interchainTokenAddressResult.value()); + + printInfo('InterchainToken address', interchainTokenAddress); + + const auths = await createMigrateTokenAuths( + contract, + tokenManagerAddress, + interchainTokenAddress, + tokenIdScVal, + upgraderAddressScVal, + newVersionScVal, + chain, + wallet, + ); + + const operation = Operation.invokeContractFunction({ + contract: chain.contracts.InterchainTokenService.address, + function: 'migrate_token', + args: [tokenIdScVal, upgraderAddressScVal, newVersionScVal], + auth: auths, + }); + await broadcast(operation, wallet, chain, 'Migrated token', options); } } +// TODO: Remove this after v1.1.1 release +async function createMigrateTokenAuths( + contract, + tokenManagerAddress, + interchainTokenAddress, + tokenIdScVal, + upgraderAddressScVal, + newVersionScVal, + chain, + wallet, +) { + // 20 seems a reasonable number of ledgers to allow for the upgrade to take effect + const validUntil = await new rpc.Server(chain.rpc).getLatestLedger().then((info) => info.sequence + 20); + + const walletAuth = await authorizeInvocation( + wallet, + validUntil, + new xdr.SorobanAuthorizedInvocation({ + function: createAuthorizedFunc(Address.fromString(chain.contracts.InterchainTokenService.address), 'migrate_token', [ + tokenIdScVal, + upgraderAddressScVal, + newVersionScVal, + ]), + subInvocations: [], + }), + wallet.publicKey(), + getNetworkPassphrase(chain.networkType), + ); + + const contractAuths = [ + createAuthorizedFunc(Address.fromString(tokenManagerAddress), 'upgrade', [ + nativeToScVal(chain.contracts.InterchainTokenService.initializeArgs.tokenManagerWasmHash), + ]), + createAuthorizedFunc(Address.fromString(tokenManagerAddress), 'migrate', [nativeToScVal(null)]), + createAuthorizedFunc(Address.fromString(interchainTokenAddress), 'upgrade', [ + nativeToScVal(chain.contracts.InterchainTokenService.initializeArgs.interchainTokenWasmHash), + ]), + createAuthorizedFunc(Address.fromString(interchainTokenAddress), 'migrate', [nativeToScVal(null)]), + ].map((auth, index) => { + const sorobanAddressCredentials = new xdr.SorobanAddressCredentials({ + address: Address.fromString(chain.contracts.InterchainTokenService.address).toScAddress(), + nonce: xdr.Int64.fromString(index.toString()), + signatureExpirationLedger: validUntil, + signature: xdr.ScVal.scvVec([]), + }); + + return new xdr.SorobanAuthorizationEntry({ + rootInvocation: new xdr.SorobanAuthorizedInvocation({ + function: auth, + subInvocations: [], + }), + credentials: xdr.SorobanCredentials.sorobanCredentialsAddress(sorobanAddressCredentials), + }); + }); + + return [walletAuth, ...contractAuths]; +} + async function mainProcessor(processor, args, options) { const { yes } = options; const config = loadConfig(options.env); diff --git a/stellar/type-utils.js b/stellar/type-utils.js index 81b3f945a..fd5b18288 100644 --- a/stellar/type-utils.js +++ b/stellar/type-utils.js @@ -96,7 +96,7 @@ function proofToScVal(proof) { ); } -function itsCustomMigrationDataToScValV110(migrationData) { +function itsCustomMigrationDataToScValV112(migrationData) { return nativeToScVal( { new_token_manager_wasm_hash: Buffer.from(migrationData.newTokenManagerWasmHash, 'hex'), @@ -116,5 +116,5 @@ module.exports = { messagesToScVal, weightedSignersToScVal, proofToScVal, - itsCustomMigrationDataToScValV110, + itsCustomMigrationDataToScValV112, }; diff --git a/stellar/utils.js b/stellar/utils.js index 616f4fd97..b1aa8eb82 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -16,7 +16,7 @@ const { downloadContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX } = require const { printInfo, sleep, addEnvOption, getCurrentVerifierSet } = require('../common'); const { Option } = require('commander'); const { ethers } = require('hardhat'); -const { itsCustomMigrationDataToScValV110 } = require('./type-utils'); +const { itsCustomMigrationDataToScValV112 } = require('./type-utils'); const { utils: { arrayify, hexZeroPad, id, isHexString, keccak256 }, BigNumber, @@ -39,12 +39,12 @@ const SUPPORTED_CONTRACTS = new Set([ 'Multicall', ]); -const CustomMigrationDataTypeToScValV111 = { - InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV110(migrationData), +const CustomMigrationDataTypeToScValV112 = { + InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV112(migrationData), }; const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { - '1.1.1': CustomMigrationDataTypeToScValV111, + '1.1.2': CustomMigrationDataTypeToScValV112, }; function getNetworkPassphrase(networkType) { From cced89385b07a1e42b9f9ead15aa387e7ce51027 Mon Sep 17 00:00:00 2001 From: ahramy Date: Mon, 14 Apr 2025 09:18:28 -0700 Subject: [PATCH 24/71] chore(stellar): upgrade stellar-2025-q1 testnet v1.1 (#661) --- axelar-chains-config/info/testnet.json | 37 +- releases/stellar/2025-03-GMP-v1.1.1.md | 4 +- releases/stellar/2025-03-ITS-v1.1.1.md | 4 +- .../2025-03-GMP-v1.1.1-devnet-amplifier.md | 59 +++ .../2025-q1/2025-03-GMP-v1.1.1-stagenet.md | 59 +++ .../2025-q1/2025-03-GMP-v1.1.1-testnet.md | 59 +++ ...=> 2025-03-ITS-v1.1.1-devnet-amplifier.md} | 60 --- ...enet.md => 2025-03-ITS-v1.1.1-stagenet.md} | 60 --- .../2025-q1/2025-03-ITS-v1.1.1-testnet.md | 382 ++++++++++++++++++ 9 files changed, 588 insertions(+), 136 deletions(-) create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md rename releases/stellar/logs/v1.1.1/2025-q1/{devnet-amplifier.md => 2025-03-ITS-v1.1.1-devnet-amplifier.md} (80%) rename releases/stellar/logs/v1.1.1/2025-q1/{stagenet.md => 2025-03-ITS-v1.1.1-stagenet.md} (50%) create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 8c5bd61ac..2214d02c3 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2815,7 +2815,7 @@ "AxelarGateway": { "address": "CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2835,29 +2835,33 @@ } ] }, - "connectionType": "amplifier" + "connectionType": "amplifier", + "version": "1.1.1" }, "AxelarOperators": { "address": "CCZEQG2QFL3WV2GPXO4BRCVIEZBMRJXAHJQWCUMNPQIXNMAD4NPZBF3M", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "82acfafba05ef400104d172664e8d30dbadca6e21e97fa9ae2e1c06c9148be1d", + "wasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3" - } + }, + "version": "1.1.1" }, "AxelarGasService": { "address": "CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "aec895c6a9e13f45cc0cc273e503cc818f5a30fd6fdc732e58a7fd9b4966ecef", + "wasmHash": "5f85b5ca8888347990b7d6384a3c73dac1fc652f93086224d78dbadfc934d729", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "CCZEQG2QFL3WV2GPXO4BRCVIEZBMRJXAHJQWCUMNPQIXNMAD4NPZBF3M" - } + }, + "version": "1.1.1" }, "AxelarExample": { - "address": "CCWKGEZEKOQ4UOJN3SSOWEL3GCFAJ4KRMDGCDVU4T5QSTWDEMZSD4TK6", + "address": "CBV5MHTQ2TWQLX6O3PFVTTHZOEDXXXG4UZHYXPYYIFG5LJ6VTV722BGQ", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "a4dbe77402308e9152dfd31777519b2ff19167db81c5a15f3032a15ee3ea3bc9", + "wasmHash": "cb96e568d52b5933111d3d97c7a3c23330df1db086aad6001f67e2daaa62d73b", + "version": "1.0.3", "initializeArgs": { "gatewayAddress": "CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I", "gasServiceAddress": "CAZUKAFB5XHZKFZR7B5HIKB6BBMYSZIV3V2VWFTQWKYEMONWK2ZLTZCT", @@ -2865,15 +2869,16 @@ } }, "Upgrader": { - "address": "CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG", + "address": "CCEHFQRT2DZC6C5KGTNUIGAHMIYMQLNGDXTWKVESVNNGRNQYIC3MCRJJ", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "a29f0384e948343a4bdc11c8c640c56345cbf91acf770828219766fc6c829382", + "wasmHash": "8393a1d52cc40fc3fd37d93da56a3322109159d794ab1d0fbee120dcb3d8cbcc", + "version": "1.1.1", "initializeArgs": {} }, "InterchainTokenService": { "address": "CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "7ebdf38b7df81ad0deaae0d09b3123b6f1617ffae9618382c5d11acb7b991191", + "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2884,7 +2889,15 @@ "nativeTokenAddress": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" - } + }, + "version": "1.1.2" + }, + "Multicall": { + "address": "CC6BXRCUQFAJ64NDLEZCS4FDL6GN65FL2KDOKCRHFWPMPKRWQNBA4YR2", + "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} } } } diff --git a/releases/stellar/2025-03-GMP-v1.1.1.md b/releases/stellar/2025-03-GMP-v1.1.1.md index 6d8e88844..72d6b280d 100644 --- a/releases/stellar/2025-03-GMP-v1.1.1.md +++ b/releases/stellar/2025-03-GMP-v1.1.1.md @@ -9,7 +9,7 @@ | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Completed | 2025-04-08 | | **Stagenet** | Completed | 2025-04-08 | -| **Testnet** | WIP | 2025-04-08 | +| **Testnet** | Completed | 2025-04-13 | | **Mainnet** | WIP | 2025-04-08 | - [v1.1.1 Crates](https://crates.io/crates/stellar-axelar-gateway/1.1.1) @@ -74,7 +74,7 @@ node stellar/faucet.js | -------------------- | ---------------------------------------------------------- | | **Devnet-amplifier** | `'[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]'` | | **Stagenet** | `'[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]'` | -| **Testnet** | `'[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"]]'` | +| **Testnet** | `'[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["axelar","0x0421b2eafda0b2476e3812a894d9c333af63cd92329d2bca1b50232cc63bbea6-2664345"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["axelar","0x044d4e3ae4925bff3cb36b0c624779cf278493d34eb77ebe154795e6dce767f7-4254191"],["axelar","0x1b9b0b01c3db74d34311a57d08d0cf4ae7b6c35bdf39654fb936ef2f7ef2afac-4065771"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0xed903b6087cf68867bfb7a43a8b6a8c4327eeb46501137d6c31628a0caf33780-1710363"],["axelar","0x0053b7aa500b691ff491ab6f06f35bcf7cf5d593a4e965d34dfd3aac989b6a00-1719427"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["axelar","0x131e23be2f09af47219c312c5f965eafafac8b1ed1b044dc82775ab3d978b3d8-4245291"],["axelar","0x64eab7a07a68276418c2de40908eaed4b4880b6ecedfc15bb1819472492ec8ef-4751251"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x61fbd550915e63a9874a13fc8c23cdb1ed970f1adc4143f00ec2ca60329e1880-1827888"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0xc08f58997fd6d8bc2f2d848c5ca54988aeae8463082c447f9aea57098a53d4bc-4747694"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xe309ec71355258e85f2da14531fc26482169e90204bbf87435c477c91e9ed2fd-4256960"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["axelar","0xd38a95574c5136d87ea51b85769adabf55d9931f373976ce6b51e11b6561605c-3758500"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"],["axelar","0x9de857075eb2afb02ad917ce02ac07af8f1a25f91767de4dc8506469e88e88a9-4051689"]]'` | | **Mainnet** | `'[["axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07a229a5f-250959"],["axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"],["axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"],["axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"],["stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"],["axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"],["axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"],["axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"],["axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"],["axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"],["stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"],["axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"],["axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084"]]'` | 5. Pause the `AxelarGateway` contract diff --git a/releases/stellar/2025-03-ITS-v1.1.1.md b/releases/stellar/2025-03-ITS-v1.1.1.md index 6cfc12ac6..38dd8cc9e 100644 --- a/releases/stellar/2025-03-ITS-v1.1.1.md +++ b/releases/stellar/2025-03-ITS-v1.1.1.md @@ -9,7 +9,7 @@ | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Completed | 2025-04-08 | | **Stagenet** | Completed | 2025-04-08 | -| **Testnet** | WIP | 2025-04-08 | +| **Testnet** | Completed | 2025-04-13 | | **Mainnet** | WIP | 2025-04-08 | - [Crates](https://crates.io/crates/stellar-interchain-token-service/1.1.1) @@ -84,7 +84,7 @@ node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 - | -------------------- | ---------------------------------------------------------- | | **Devnet-amplifier** | `"Ti+Y+1SPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0=" "J535ZSKoVNJdPK0QfK4QNZtrlGDrRoDaTmXV59EqXq0=" "bFaSJThTT7kJQzooI+f4g992m1LpEacDWN20EBHQ3ro=" "jC5tzI2Z+ljSXkwbNbkKMnWlWo59Pk+E2K5gdYOfna4=" "25L0WIB2ChfMc3cFtRM+oOzIJaEQfs+61S9DqJ+WqAw=" "sy1A5j5i5v43b84Zvz6ed57K3Dyb5pI+T+4oKVXbl2Q=" "DLFdu9+hYIW0XgkQTMSF5lSaI/cKdmSnoTn75jZbv8A=" "caBrwGL0ROiIbKS5sn7rSVTC6idQmOvsfx7E+cUpI10=" "MJlVSFxI9myqmYe0kPZAM0DZ82x+7qMHKqijO9Lq89o=" "w3yhg24JHcNlkpZ585AEdw7pc1s3BuDlcFXtQBCoibE=" "wTusnWDmOBMA0jtpoUzBTeSCOA6CDH4yzWZVakASQtk="` | | **Stagenet** | `"bk5TOcAqehReN14EFgsCy2nm+cXT4e+zjs+IsJ5zq6g="` | -| **Testnet** | `"hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q="` | +| **Testnet** | `"3OQqMLtE8vTBwWehxB3IAUAoFybxNbjV4pyXhgv1lwo=" "Ycf1QllLhjlb8FfTRi1I5ZpLN9u2SHeiaktMmkjXruk=" "hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "jzBSYAYAlSs3oIaHVFCd/Ou5dWIRBelJ+HmRUakcIPM=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "71UA0cka7t7WdzZscK9d7GA2R3mjBcY+i43FdRCUEyw=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "3x+VtlBv/H/sYTcXZ2a30i1itHqRWmpKEzuHa5mgXis=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "tGjmQdGE2Uk1+9r6Q14ZdLxhdmXw6uLT9G7BRaY+sr8=" "PrrXI+dMgrRlproa2biMpIW+B+l0F/eqIxZt79HRENA=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q="` | | **Mainnet** | `"A/cM/Lqj2/Fx22VBAjjgW1jDrnywIZy3Bo1Z1Wr5b7Q=" "dGQ0vIU2L8yyO8EEthUPrvCy0v+WpQ8tElUwREprmQ8=" "XqRV/aAChDa0fS7nCVsHUDo9emkk9vDjOrzuIaPtKv0=" "zlmGy2Rk0M/FhXFVKbDXxzQxjq33qxrvWtExvamdenI=" "pGiAIMevFALTHyQpjk+P1+e9nlgSqIEjHi9nOq0UxcE=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4="` | 8. Pause the `InterchainTokenService` contract diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md new file mode 100644 index 000000000..903231f92 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md @@ -0,0 +1,59 @@ +# GMP Deployments + +### Upgrade the AxelarGateway contract and migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]' + +Upgraded contract tx: dc7f63fc93a66ed5f3c9186940a92f437b3b7fc95f735b6c9384d086b45cff58 +``` + +### Upgrade AxelarOperators & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GBM47ULSN4OEQNPECDIMZSDMK6AH2RNICV2VGOYPBVJ4LBFCFFQP2BXM"]' + +Upgraded contract tx: 145d51bafa5c4a8e308b61fc4001f0e4697b35568314510103a166a48127a09f +``` + +### Upgrade the AxelarGasService contract + +``` +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: d807752dc174fc359caceb839de08eaaf13d0538f9d359bf4ca55ba293254985 +``` + +### Deploy the AxelarExample contract + +``` +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: 7efa3ad5d37bfb2a91a2f0048c14067f10ef1d70918ef5e0e2341fa3e3404a58 +``` + +### Deploy the Multicall contract + +``` +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Initialized contract tx: def777bb1acd1ac65304b2776423510a00ac571a007a7396b4a83507e76cfe68 +``` + +## Verify GMP call + +### Verify Stellar → EVM GMP Call + +``` +node stellar/gmp.js send avalanche-fuji 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://devnet-amplifier.axelarscan.io/gmp/ff297adfb3b6c28ebc744a4e4b6142a21f33a044a99dd0fe039eafbe08d122b4 +``` + +### Verify EVM → Stellar GMP Call + +``` +node evm/gateway.js -n avalanche-fuji --action callContract --destinationChain stellar-2025-q1 --destination CAYMUJY3W77TABSONTMIRWNOIMV7ZAXKA4PNDSRKEZWCBBVSG3JB2G3K --payload 0x1234 + +https://devnet-amplifier.axelarscan.io/gmp/0xfd7ec37a4536a768a97d1f3842c796af43020e21c75443f3ccba334c32ace12b +``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md new file mode 100644 index 000000000..441ea322d --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md @@ -0,0 +1,59 @@ +# GMP Deployments + +### Upgrade the AxelarGateway contract and migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]' + +Upgraded contract tx: a2731a2d09ae14aa0c99c6f140322871ce0cf79b1a4bb8a0ec27f6cace35f713 +``` + +### Upgrade AxelarOperators & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GAY6RYZLHDSYQ7Y3X2CRSOTB6PVXAQ3IRTQFIAATYSP2TX7N25HVSJEV","GBNSB3AHRLVVXBWZFCFSWBUG6RZHNSOIDIH7VGKL2GHVFXFVV3I6I5AM"]' + +Upgraded contract tx: 7937e2673b8bc447cb19478fbfc4d16d421120413601bc455bb0446aa63ff236 +``` + +### Upgrade the AxelarGasService contract + +``` +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: bf40a43f69cc88bcb6ac1be1a42be4072fb77bf398fa0c70a8149ae0080d15d1 +``` + +### Deploy the AxelarExample contract + +``` +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: ae1df3153084cc432050d22185db7e1f5bc9bc25468d69d41d98ddf4e75ea6b4 +``` + +### Deploy the Multicall contract + +``` +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Contract initialized at address: CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK +``` + +## Verify GMP call + +### Verify Stellar → EVM GMP Call + +``` +node stellar/gmp.js send avalanche 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://stagenet.axelarscan.io/gmp/064a45a48c072f578b69b9b0db21079065f31d00fc752775f8f4efdf4a42714c +``` + +### Verify EVM → Stellar GMP Call + +``` +node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H --payload 0x1234 + +https://stagenet.axelarscan.io/gmp/0x005d0a518b477215cad1ffdfc1b253144451359fbc0fd620ffe2a17c21d9bd92 +``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md new file mode 100644 index 000000000..2ef0c85bd --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md @@ -0,0 +1,59 @@ +# GMP Deployments + +### Upgrade the AxelarGateway contract and migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["axelar","0x0421b2eafda0b2476e3812a894d9c333af63cd92329d2bca1b50232cc63bbea6-2664345"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["axelar","0x044d4e3ae4925bff3cb36b0c624779cf278493d34eb77ebe154795e6dce767f7-4254191"],["axelar","0x1b9b0b01c3db74d34311a57d08d0cf4ae7b6c35bdf39654fb936ef2f7ef2afac-4065771"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0xed903b6087cf68867bfb7a43a8b6a8c4327eeb46501137d6c31628a0caf33780-1710363"],["axelar","0x0053b7aa500b691ff491ab6f06f35bcf7cf5d593a4e965d34dfd3aac989b6a00-1719427"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["axelar","0x131e23be2f09af47219c312c5f965eafafac8b1ed1b044dc82775ab3d978b3d8-4245291"],["axelar","0x64eab7a07a68276418c2de40908eaed4b4880b6ecedfc15bb1819472492ec8ef-4751251"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x61fbd550915e63a9874a13fc8c23cdb1ed970f1adc4143f00ec2ca60329e1880-1827888"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0xc08f58997fd6d8bc2f2d848c5ca54988aeae8463082c447f9aea57098a53d4bc-4747694"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xe309ec71355258e85f2da14531fc26482169e90204bbf87435c477c91e9ed2fd-4256960"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["axelar","0xd38a95574c5136d87ea51b85769adabf55d9931f373976ce6b51e11b6561605c-3758500"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"],["axelar","0x9de857075eb2afb02ad917ce02ac07af8f1a25f91767de4dc8506469e88e88a9-4051689"]]' + +Upgraded contract tx: 49bb713b4581427f034d98fb8e5c82eba10461e11b9932bf92522712d979aa7a +``` + +### Upgrade AxelarOperators & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GDIT77OPH2WST4IDQWG4AANU2ZELJGZ6FIEWTBH6GWXSKUMR2XSH24CX","GDKKJTHINMUVPTAS6DM6Z6JHKOEWWGFW3T3IIRHGGT2F2HXPIDONKRFG"]' + +Upgraded contract tx: bf92c6f572f5945c39b11c7ab1b1f645d446d84cdbea3accd2c1df1a58b594d5 +``` + +### Upgrade the AxelarGasService contract + +``` +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: f99abc30cc49226435bfbbeebe7d837e19df2800751cfdb74729a1638a6be70b +``` + +### Deploy the AxelarExample contract + +``` +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: 299a0f287c5cad032180af2b91830f4fbb0cff1fa72d93a9e89cc30ab6a01f83 +``` + +### Deploy the Multicall contract + +``` +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Initialized contract tx: 259c6852bd2f2c483aac772c13b4efd469ace070e198486e80bcfadbba3fef62 +``` + +## Verify GMP call + +### Verify Stellar → EVM GMP Call + +``` +node stellar/gmp.js send flow 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://testnet.axelarscan.io/gmp/adb1d382b277696106fa4ba2e504022e7c9ff1a7310ed70ef61033b5407bc225 +``` + +### Verify EVM → Stellar GMP Call + +``` +node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination + +https://testnet.axelarscan.io/gmp/0x77bee29470c76792919c471ddf37a6d6487306f737b80e61f922c05ab092d2c0 +``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md similarity index 80% rename from releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md rename to releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md index 61b822b54..61413933c 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/devnet-amplifier.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md @@ -1,63 +1,3 @@ -# GMP Deployments - -### Upgrade the AxelarGateway contract and migrate storage schema - -``` -node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]' - -Upgraded contract tx: dc7f63fc93a66ed5f3c9186940a92f437b3b7fc95f735b6c9384d086b45cff58 -``` - -### Upgrade AxelarOperators & migrate storage schema - -``` -node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GBM47ULSN4OEQNPECDIMZSDMK6AH2RNICV2VGOYPBVJ4LBFCFFQP2BXM"]' - -Upgraded contract tx: 145d51bafa5c4a8e308b61fc4001f0e4697b35568314510103a166a48127a09f -``` - -### Upgrade the AxelarGasService contract - -``` -node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 - -Upgraded contract tx: d807752dc174fc359caceb839de08eaaf13d0538f9d359bf4ca55ba293254985 -``` - -### Deploy the AxelarExample contract - -``` -node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 - -Initialized contract tx: 7efa3ad5d37bfb2a91a2f0048c14067f10ef1d70918ef5e0e2341fa3e3404a58 -``` - -### Deploy the Multicall contract - -``` -node stellar/deploy-contract.js deploy Multicall --version 1.0.1 - -Initialized contract tx: def777bb1acd1ac65304b2776423510a00ac571a007a7396b4a83507e76cfe68 -``` - -## Verify GMP call - -### Verify Stellar → EVM GMP Call - -``` -node stellar/gmp.js send avalanche-fuji 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 - -https://devnet-amplifier.axelarscan.io/gmp/ff297adfb3b6c28ebc744a4e4b6142a21f33a044a99dd0fe039eafbe08d122b4 -``` - -### Verify EVM → Stellar GMP Call - -``` -node evm/gateway.js -n avalanche-fuji --action callContract --destinationChain stellar-2025-q1 --destination CAYMUJY3W77TABSONTMIRWNOIMV7ZAXKA4PNDSRKEZWCBBVSG3JB2G3K --payload 0x1234 - -https://devnet-amplifier.axelarscan.io/gmp/0xfd7ec37a4536a768a97d1f3842c796af43020e21c75443f3ccba334c32ace12b -``` - # ITS Deployments ### Upload TokenManager & retrieve WASM hash diff --git a/releases/stellar/logs/v1.1.1/2025-q1/stagenet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md similarity index 50% rename from releases/stellar/logs/v1.1.1/2025-q1/stagenet.md rename to releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md index f1fb81914..41e44bf3a 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/stagenet.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md @@ -1,63 +1,3 @@ -# GMP Deployments - -### Upgrade the AxelarGateway contract and migrate storage schema - -``` -node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]' - -Upgraded contract tx: a2731a2d09ae14aa0c99c6f140322871ce0cf79b1a4bb8a0ec27f6cace35f713 -``` - -### Upgrade AxelarOperators & migrate storage schema - -``` -node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GAY6RYZLHDSYQ7Y3X2CRSOTB6PVXAQ3IRTQFIAATYSP2TX7N25HVSJEV","GBNSB3AHRLVVXBWZFCFSWBUG6RZHNSOIDIH7VGKL2GHVFXFVV3I6I5AM"]' - -Upgraded contract tx: 7937e2673b8bc447cb19478fbfc4d16d421120413601bc455bb0446aa63ff236 -``` - -### Upgrade the AxelarGasService contract - -``` -node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 - -Upgraded contract tx: bf40a43f69cc88bcb6ac1be1a42be4072fb77bf398fa0c70a8149ae0080d15d1 -``` - -### Deploy the AxelarExample contract - -``` -node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 - -Initialized contract tx: ae1df3153084cc432050d22185db7e1f5bc9bc25468d69d41d98ddf4e75ea6b4 -``` - -### Deploy the Multicall contract - -``` -node stellar/deploy-contract.js deploy Multicall --version 1.0.1 - -Contract initialized at address: CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK -``` - -## Verify GMP call - -### Verify Stellar → EVM GMP Call - -``` -node stellar/gmp.js send avalanche 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 - -https://stagenet.axelarscan.io/gmp/064a45a48c072f578b69b9b0db21079065f31d00fc752775f8f4efdf4a42714c -``` - -### Verify EVM → Stellar GMP Call - -``` -node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H --payload 0x1234 - -https://stagenet.axelarscan.io/gmp/0x005d0a518b477215cad1ffdfc1b253144451359fbc0fd620ffe2a17c21d9bd92 -``` - # ITS Deployments ### Upload TokenManager & retrieve WASM hash diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md new file mode 100644 index 000000000..dec3b7e46 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md @@ -0,0 +1,382 @@ +# ITS Deployments + +### Upload TokenManager & retrieve WASM hash + +``` +node stellar/deploy-contract.js upload TokenManager --version 1.1.1 + +Uploaded TokenManager wasm tx: 96387fdcbf32c5a30019fb14b692e5a0b75418c19391781da8ee59cb2cc48bf3 + +Contract uploaded successfully: { +"contractName": "TokenManager", +"wasmHash": "9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c" +} +``` + +### Upload InterchainToken & retrieve WASM hash + +``` +node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 + +Uploaded InterchainToken wasm tx: 251d6b04dc36f1c56aa99c09b1fd7704333e6813e94cc3aa713124d212b96e5b + +Contract uploaded successfully: { +"contractName": "InterchainToken", +"wasmHash": "71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe" +} +``` + +### Upgrade InterchainTokenService & migrate storage schema + +``` +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' + +Upgraded contract tx: be46ab9b6168a284d2ae0faa0c6f3498abc145e84abc0478571d3aa5073767ab +``` + +### Call ITS::migrate_token for ALL deployed tokenIds (base64) + +``` +node stellar/its.js migrate-tokens "3OQqMLtE8vTBwWehxB3IAUAoFybxNbjV4pyXhgv1lwo=" "Ycf1QllLhjlb8FfTRi1I5ZpLN9u2SHeiaktMmkjXruk=" "hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "jzBSYAYAlSs3oIaHVFCd/Ou5dWIRBelJ+HmRUakcIPM=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "71UA0cka7t7WdzZscK9d7GA2R3mjBcY+i43FdRCUEyw=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "3x+VtlBv/H/sYTcXZ2a30i1itHqRWmpKEzuHa5mgXis=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "tGjmQdGE2Uk1+9r6Q14ZdLxhdmXw6uLT9G7BRaY+sr8=" "PrrXI+dMgrRlproa2biMpIW+B+l0F/eqIxZt79HRENA=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q=" --version 1.1.1 + +Wallet address: GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3 + +Wallet balances: 9907.8177179 XLM + +Wallet sequence: 2418066587866 + +Proceed with action migrateTokens (y/n) y + +Migrating token: 0xdce42a30bb44f2f4c1c167a1c41dc80140281726f135b8d5e29c97860bf5970a + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 90d8de40814cb43debeda1c089c9ab22ff86820176432f4fcefdd942d344f115 + +TokenManager address: CAKO5ACNCJWAKTVWAS5X4ESLRGXBMARU72GXL5VU3O2MMKBA45CYME2G + +Retrieved InterchainToken address tx: 5859b9d47812cc42f75754a14dcb29d1fcaf40234327b845d4e36e96473ce62f + +InterchainToken address: CCEMY2CIQ5OF3XDF4GLWVNGOSONECSR5KZAKUEZ5GOY6FRWX4ADWKXB3 + +Migrated token tx: 4b9288fac652b7df5150e5ecdd82f860cf0c3e9eae6fccdcbd3f69e64eadcf35 + +Migrating token: 0x61c7f542594b86395bf057d3462d48e59a4b37dbb64877a26a4b4c9a48d7aee9 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 481ae8eb98f24ac41b1da3777f9235c6aa2b6948f0bd9dc98836159dee864e1a + +TokenManager address: CDNWGMW2RL7H4FCENSHLQWR6LI3FDNHWR2ZXNYVROFWOY3Z26G47EG73 + +Retrieved InterchainToken address tx: 3589bd36cffec0f23b96af5435836412114d8674e1fd4d2fc3fb82a290abc870 + +InterchainToken address: CATFNBWUSA4QEEGJFCS44UKCN2LKSLSW4P6LDEUVAOW4JHHXUTNWTAO5 + +Migrated token tx: 8fc086de74d1cc75b1a89d8b852029638c30f770492d5bf183aa2e8258af6ed1 + +Migrating token: 0x8600a4dcf88a51be2b20f81e83d0472f7564c2bb36d26a4912b0f1244786d842 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: ac1b4dd166213f1c60978fb4988831f01c2803bc924dc84a5d372f98d2fd0c44 + +TokenManager address: CALHLKDWVIGW4NGAXBJGJDPGHZGOJBXBEXWHKRYPAT5E44DXBNCBKUY7 + +Retrieved InterchainToken address tx: 78857f7758008125b4c9587cb2e3bcb8576a6dd7ab4cbfda8133314cc8cbd69a + +InterchainToken address: CBILAQQ25RLHM2CW3DZ4SQADEVKEUY5UGRDHDOX3EF4NTWOUQJSAJGXW + +Migrated token tx: d63f07660c0a1bf0d87aa6df02aecab931c621d4970517e6fc6492dd198de590 + +Migrating token: 0x68bf36365c4dd562f0b27dbb491819e6828f66623e9761900d63299425f6da14 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: b757fc9cd69ae1a01293bda2d1bfaf6306df1d575a168038e4d236281c5893c0 + +TokenManager address: CCN5XZSEYTOY3GLORPY7ZNAHSKIIECEPXFNV5TWXGNLCHDJVF7XJL247 + +Retrieved InterchainToken address tx: 6fd51521298add867daf76f3ffaa9b134a270fa9dc818e269e48166f0f40bd7c + +InterchainToken address: CBTH7JEEGN4UJY3PC4CU4EPXLSHWYCXRRFADIEVP5WG3KV66WB4YENMS + +Migrated token tx: 134c2b20ca5fd1196d55a524ed704374f1ea1642cdd4a66b1098e2ea5ee1c516 + +Migrating token: 0x8f3052600600952b37a0868754509dfcebb975621105e949f8799151a91c20f3 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 3be15018eef8e96380f43899872eeb15c86179ea1f5d2d442a4c1697f1ae4907 + +TokenManager address: CD7OLXQUCMUPVS34ZKFXWMZJVUR4IFID3E7B2SXBGVI4EXCV2HUPHHE2 + +Retrieved InterchainToken address tx: 578b1f14a947f773cf8cbc782d43ac627997a341c2f70b819f0b7679673bcc7b + +InterchainToken address: CBMDGUADWDXALJOK5PWANDSJ44EJYYFSSGYGMKUEWRK3M7SHBSI6XGTB + +Migrated token tx: 0e90bb68b0089aff91f5578fbfee838d5d5117a625623f2effece110e5b8de37 + +Migrating token: 0x24f5f6da0b9a1aeb3421dafe3bafffc97b96bd9666856442ba267b5708c8983d + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: aac5eb7ccd7441e74fb15dc69c311dcf7a31b4ae5c844ea0b2f68765b241a410 + +TokenManager address: CAPRKLV2MHSDKXFGEJR66RJ6FLNLXPTL7AZ4VXJBDEETDZJDGB5JMNFG + +Retrieved InterchainToken address tx: 83cb94bcbd3e11d5f63afc367c9a1e21ebcd80fe39c76e83db211dc0e9ad54d7 + +InterchainToken address: CBFXK7TAQV7HF6F7RTCIMTFIXSXCTPDQVOBTPESBXHQJP3CU5EFBGELY + +Migrated token tx: ab0d058437696d9d5fa803b6f084f1d4a28b326e9b9b0b9330ab7d65e5f0500f + +Migrating token: 0xef5500d1c91aeeded677366c70af5dec60364779a305c63e8b8dc5751094132c + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 813da70b74e78d149539b3ed53e8390ca654cd30bb08766c372674141ce01da2 + +TokenManager address: CBNXQACP3DX2Y5V35NWSQOQVQDRVNVPNVDTJW2CKJPJF274VTVHSPO23 + +Retrieved InterchainToken address tx: 7630b39b8f03eb46329822c21b9fbced467547d95411660db815aebe94307dfc + +InterchainToken address: CCS4WBIC4OGZIGA255SOJV52FEZBGZPXBFB34PWBWQRSYWKWGG7PGKIG + +Migrated token tx: a5833908970a315a45df2f0d97dfeabb409be61705e5d228aa384aae18c95c84 + +Migrating token: 0x76e302e75743a189b908c691e481cbc86f7635ae7d56667ebaf44555d8803e0b + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: bd28ea1815873676ac8ebba63a56293e4d1ed54675810bbf29e238145cc31cbf + +TokenManager address: CAFKSZAAUJ6KVPC43ZOKXSYSEE6FMTLIPWUUZDHBYFZPVRR6THVOBDBG + +Retrieved InterchainToken address tx: 5e0bae9bc182698401d40f532e91be56b7add91cd2f54717b6938640315b9dc3 + +InterchainToken address: CCNZ2XJUC3IHIJIB77NOWKHEHQHNYCNQHMZLNLQSAH5YQS7VWVBYBCKX + +Migrated token tx: a55c8614eb77444ca366fe31aaae71c4b4809d0f7bcf17225af3872792f5b37a + +Migrating token: 0xdb4bf76216a0ba9834f0c90cf575ae71154adb253c5a02a7a4be22616389c840 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: d8fd320c4e2a1c6e51bc96fe1f8986af9615f2ffce0da885ac69b4b5567cc57a + +TokenManager address: CCC444L2664VRK6ECUSEEKQBZKAQHA3KSKNTGDXW7TG6BQDDA7LXPBGL + +Retrieved InterchainToken address tx: d6093098caf2398bc896f28a6aa23e8999c6425fa7cad3d9581ac3e2a82f6d8f + +InterchainToken address: CAMDE5Q5IYVIJVSFZC4R4OX5SQBDA233WORHRQSUZ77DJLS6XHPOSHUJ + +Migrated token tx: 0b643707093fb2089cf052687a360d271f3398ed3f7f722c3a9d9259c9838eb0 + +Migrating token: 0xc599cceacaec4a57cccd2161eb162a6e50c00d329130a1fc8b96094a3f65bbe7 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: dbd7c640b0f8388ac359eea3a091870315a61a13109f0855af489c0bfeee22d7 + +TokenManager address: CB6PRTA3HAHCQM66YG5O756DULSNINO73PPC67P2VHXSLZOEWSPLPVAB + +Retrieved InterchainToken address tx: c96410acb5efb82383425a7a35365f6b64040dac46f370028671c17c79797e9f + +InterchainToken address: CCE3YXTUDUDYOFCHWNZRISSUOKQ5ESG5ZEJ5NKK7Q2R5LWKD6ZWQHRNT + +Migrated token tx: 47a86627ecba5b016a76112f7ffd14128f79b19f65f23640709250914e2676aa + +Migrating token: 0x819242619c73bf0bd2b305d36db6bad7baabdf9c8247a96705aada1c0335d9c9 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 68ada41714d70065f09d504981f1c76d2d4e6fa05ac312c2da3bdddf4a25682d + +TokenManager address: CDZYK55RA3HMN67OIAGBZJXR67OZII35AH7SJY7YJP4ESQVKSRUP7GSM + +Retrieved InterchainToken address tx: d8c8b4e2fc3269665065c745ed95f185317549ca9242f71b9393fb1fd8ddabf3 + +InterchainToken address: CADCLZYEUZPSY2YKRGY5R35CEJ57EKUYPP5G7BTCQX7FWPFF2LDUKM3S + +Migrated token tx: a418e9a0e09a3c41fc26540cd62fd1d43eea7528f9bb6e307a27dab135a1c97a + +Migrating token: 0x71cea78e6ff363ce54b817305790df9d91d64305356462c07d316ef87e49a971 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 11c69da375fb5718fd987676cc454ed3289003b781f1b6e537bb797d1508b634 + +TokenManager address: CAYP7TY3UYSIIMF5P6EVNBBZ2XGIKH4XWD42UZWAZAWIK4B6S3RVWNLO + +Retrieved InterchainToken address tx: c7e87caad3ecb4518d9d8fbe1e6688ce79dd625378b310ecb5df08e949e9be5e + +InterchainToken address: CC3SBVWPCZOWQF5XY4U4HWYVCH6K4C5LNGRV5ZEMI4ZU5U647257QKIH + +Migrated token tx: 5298670bb61ba580e10feb68d02c73f3a37de3e3c69653989d83044fcd1a7e9d + +Migrating token: 0xdf1f95b6506ffc7fec6137176766b7d22d62b47a915a6a4a133b876b99a05e2b + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 53707ac1754d562edada1a559692f2344673f09348fd4139905d8b63cb989c79 + +TokenManager address: CCZUN5BZ7JDXY6YTVDH4YHVENOEPRYOF54FZHGTUKSSPYSCR3UUJE3AS + +Retrieved InterchainToken address tx: 88c89cf76282a275afb9cadee39e9df05d42dc40b1220b6addf159cb526c3b40 + +InterchainToken address: CA7ZV3JU772Z7ESOZPF6IB2QLPD7T35KIIODXTI6RVY5ZMCT7ZZYDNQC + +Migrated token tx: 1eb0d7227f0ff991bf041b9f3f04c19c76ac19d19e6457ce358e694fdb3ee8d2 + +Migrating token: 0x9e1d865e0734e771a72085a55dece1173b5c455c433e23288acaff11bbf2fc96 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 949f4e5c2cd7472a53fb7245326e723db02d929920976f473548238d8039e8dd + +TokenManager address: CDMN5TELDLIABGGUVTZN7BCLNIKZ4NFD6JRXTSPGIE5WV4WIMGXXLTYN + +Retrieved InterchainToken address tx: bf708e79b51c5fa6b55567cc626de024c0d8b24786b966efc0a21cbac67b19c4 + +InterchainToken address: CCXD5HCCKTPEUSCV5TG7CAPFW4LKJ7XNXDPWT63GCSUACL732RUMVS5I + +Migrated token tx: 224895d3a65257685fbe7cf4aff1fdd1d64e319d5462876cd12a333eab69d728 + +Migrating token: 0x869d7a8953691e64b854e1f0c51a6d03969774bcd1fe4ae849ea90fea1872ec9 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 229e4b443206e0580d573af534c3af50896b4dc91d943fdfa1cf9dbd77cc0895 + +TokenManager address: CAGUUJVN44QQZF2IWUIMFUAG5UZYIZQAYP667XRN564J2MU4HWXP5VD5 + +Retrieved InterchainToken address tx: de1e5a51a09ff991c02be31d3eeb8c32e1479c21ce2bed0f6cd6c7a7b622264d + +InterchainToken address: CAPB5EPWGR3KYNFCXXXOQJ4XGYSYDNMRCDNFMVE5DLBMOFI3P6DC5M3Z + +Migrated token tx: 6e4840bc601de00900933f0cfb4b77b6db53b2bcde6e247b742fbea6fb04a929 + +Migrating token: 0xb468e641d184d94935fbdafa435e1974bc617665f0eae2d3f46ec145a63eb2bf + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 1efe4258b744427011f64b90a04605bdcd42e016ad639b04f1fa78fcad8af4e9 + +TokenManager address: CDSN7LTSCN7ZPLG7M4TWDFGFEYO42KYIM5KBHIW7HSTPD3DS5JSFPMM5 + +Retrieved InterchainToken address tx: dbbae7eb5bfb676aaa26122b121ea4039319b31ef86cc02c2959c17ce7f7f268 + +InterchainToken address: CC42TLFRSGDQJJJVMDA3A72PWIYJPQ4TAKTPNBZXQNVVP6Q65OFCGREH + +Migrated token tx: eca01ae369344f8b5235ea3d2325d5736bafd290c0c83e02b2acb5560c2939bd + +Migrating token: 0x3ebad723e74c82b465a6ba1ad9b88ca485be07e97417f7aa23166defd1d110d0 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: a0663d3d5be179a201fd1682585000229cc88db892f0fded0c4c5e1346d85cae + +TokenManager address: CBQNZLCG7ZJPMM7EHSEZPN2GC6UW7WW2MEX7DLGRI332UX2OHVHCIMWN + +Retrieved InterchainToken address tx: 77d71c1f9a31bbc6789c9d30f33d162917a707e6c960a8a36de5cbddc5e42c03 + +InterchainToken address: CAKUZRINCF3FIP6373TV3DP75Q5TYY5OZ3Q5MDFMVTKNBCE27PNKAQLD + +Migrated token tx: 2578ecae9a321215e492868ec8dbe7b03c9a0f807c37aaca25b79e2869aebc4f + +Migrating token: 0xa2871c92f366441840d481f170fe08aa7153b5de5540bc2da9f9a8be5d02f645 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 3f223d6f40227a38d89125c1ebd521a8bcc1544872bdd9698d45ab432547f9f3 + +TokenManager address: CBSK3KWJ4J63VF5W5CYPWXA6RZ3LZG7EA4IQPIJ6NEX5G7MGF5WHCC4T + +Retrieved InterchainToken address tx: 963dae3f28ac01dca71267f826ab210b383a1a499528b0a5bbffe527c1d81a4c + +InterchainToken address: CDCYRSNMQACAVHIHJGIJPNSQQBU5GJQDVH2FH6R7HFCMB7JPTWX4ZUWC + +Migrated token tx: 22d6c27fc3242efdedc554a6c2ab178c7563246e53ccdb57800de3ced1c2562b + +Migrating token: 0xbb49637e1d25d40601d228fc9795b60eaf1f0e0d196568c544d28db091bf91e9 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 3ae8d8e9c63c8a53fa12cd7ffe39089fd1674f09979e54167fb334f13a3db695 + +TokenManager address: CARD5JGINDB57B3DOBTM7EIK35XEMDEJWFXNGZ2J46ZLPBMWUQT43YI7 + +Retrieved InterchainToken address tx: 8831317c946cf9b95ec984a63c69a069d3020a300f43edd9a764340737b0a115 + +InterchainToken address: CAP55HPQEKGY7GOB6JJEPGJBVPDXRAWLN4QB6O4ZVGDQKBEXDZF3PGL2 + +Migrated token tx: dc043b5944223a1c265d11279bfa6fa9cc5b3e6fc47b89f2b508a87b894c74b5 + +Migrating token: 0x208677a2f9626c2f4220e0221d01ae0fb807fe154a01c6cbddb40d22e17abd66 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 33c5012d42be24aa703fdd1347734446d0b436a3962df23ed281bbad3cfac279 + +TokenManager address: CAJXGY6RTVEHSTVTZSQDTBGONFAKMHBXXYSJSWKTJGCX2UHCGDEE2Z6P + +Retrieved InterchainToken address tx: 24879d4c0340861e87c789363d4c67d209b9aa590c43a58bbc7d18b168adbdef + +InterchainToken address: CB5R5RPVT3K633VJXRXC4J2L2ANIIE5K4ZSTRSFNV6KRW7BGJSQF3CQH + +Migrated token tx: 670a6dfefc965a7b01b15f51d7b39995e30fbc531892217d0db9a5a9e121ee0d + +Migrating token: 0xc3506ca78a9d2ea20c94c557c297313be5d135822ba4acf61e985050e7a627e4 + +Upgrader address: CB2HN2WD2IVIKKZGMPSM7L6PVII6DEQIJDQ75S7EKBHLH7PPZH2C6MLG + +Retrieved TokenManager address tx: 9b63425f3685289ac279ae055e4a13fda7345c6d904ce8cd9f3a6973a9c60a1f + +TokenManager address: CAIDYMLGAILCXQMFESBK74WDO3GUEEQ6OK5EI7GLZUJHFVIAE5HSS5TP + +Retrieved InterchainToken address tx: eca9fcbfb96ff502778847f9b10a3e4ced79996b331a549861a6b78a8c6314c8 + +InterchainToken address: CBDIRN5XBMORJXZ7BTS6HY5NLVLN2RCBJWVMLHAFAVHFNM4CA75LXN4F + +Migrated token tx: 3ca94a1ac93dec824461fbcf1494b6ebb118b13670d3e7ccd714d78569bcf7a8 +``` + +### Deploy Upgrader + +``` +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 + +Initialized contract tx: f5363c9f3b691d6c64573f1de8635bf77cf7382e21c977dff42344c2f7eaabdf +``` + +# ITS Checklist + +## Stellar → EVM + +``` +node stellar/its.js deploy-interchain-token TEST132 test132 18 0x891012 100000000 + +Interchain Token Deployed tx: a0815faee69bc569299d0ba49123460937b2a187679d33152317d0fdc7218358 +``` + +``` +node stellar/its.js deploy-remote-interchain-token 0x891012 flow --gas-amount 50000000 + +https://testnet.axelarscan.io/gmp/607f195789220f937db8f9da0fab58288021281cffc84056f35597b0effa553d +``` + +## EVM to Stellar + +``` +node evm/interchainTokenFactory.js --action deployInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test55" --name "test55" --symbol "TEST55" --decimals 18 + +https://evm-testnet.flowscan.io/tx/0x6267996edee9beb553f9d2d980a398e75396904652edfe7ddfeb11412a79bdf7 +``` + +``` +node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test55" --gasValue 5000000000000000000 + +https://testnet.axelarscan.io/gmp/0x21d2fc1aa490ef77e733a2fab777d4bbb00c0c48e37ee97b0b9425fa1fc03e44 + +``` From c3b209673efac5ec85ee6763019fa6073f3b92e8 Mon Sep 17 00:00:00 2001 From: Milap Sheth Date: Mon, 14 Apr 2025 13:56:55 -0700 Subject: [PATCH 25/71] chore(stellar): upgrade stellar mainnet to v1.1 (#662) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Noah Bayindirli 🥂 --- axelar-chains-config/info/mainnet.json | 39 ++- releases/stellar/2025-03-GMP-v1.1.1.md | 14 +- releases/stellar/2025-03-ITS-v1.1.1.md | 6 +- .../2025-03-GMP-v1.1.1-devnet-amplifier.md | 24 +- .../2025-q1/2025-03-GMP-v1.1.1-mainnet.md | 150 ++++++++++ .../2025-q1/2025-03-GMP-v1.1.1-stagenet.md | 24 +- .../2025-q1/2025-03-GMP-v1.1.1-testnet.md | 26 +- .../2025-03-ITS-v1.1.1-devnet-amplifier.md | 30 +- .../2025-q1/2025-03-ITS-v1.1.1-mainnet.md | 256 ++++++++++++++++++ .../2025-q1/2025-03-ITS-v1.1.1-stagenet.md | 28 +- .../2025-q1/2025-03-ITS-v1.1.1-testnet.md | 29 +- 11 files changed, 528 insertions(+), 98 deletions(-) create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-mainnet.md create mode 100644 releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-mainnet.md diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 9d668d13c..43980b696 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -2751,7 +2751,7 @@ "AxelarGateway": { "address": "CD6VSKXB4HY2DWU7EP2PUIYTBJBJ36LDJXEZN4NSXFYF5YP37DDFX6NF", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", "initializeArgs": { "owner": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", "operator": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", @@ -2771,35 +2771,40 @@ } ] }, - "connectionType": "amplifier" + "connectionType": "amplifier", + "version": "1.1.1" }, "AxelarOperators": { "address": "CCO23C66LAPU5YO66VNXB75T7SDVZ5UZ2GHAU3M7T2YGRKHJI3B2LZPQ", "deployer": "GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S", - "wasmHash": "82acfafba05ef400104d172664e8d30dbadca6e21e97fa9ae2e1c06c9148be1d", + "wasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2", "initializeArgs": { "owner": "GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S" - } + }, + "version": "1.1.1" }, "AxelarGasService": { "address": "CDZNIEA5FLJY2L4BWFW3P6WPFYWQNZTNP6ED2K5UHD5PNYTIMNFZDD3W", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "aec895c6a9e13f45cc0cc273e503cc818f5a30fd6fdc732e58a7fd9b4966ecef", + "wasmHash": "5f85b5ca8888347990b7d6384a3c73dac1fc652f93086224d78dbadfc934d729", "initializeArgs": { "owner": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", "operator": "CCO23C66LAPU5YO66VNXB75T7SDVZ5UZ2GHAU3M7T2YGRKHJI3B2LZPQ" - } + }, + "version": "1.1.1" }, "Upgrader": { - "address": "CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F", + "address": "CDXI3F2R6Q3W5AZRP3VQIOXM3YEIBFPEUAGZDOOSZ7DNQXHOKXU4FPVB", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "a29f0384e948343a4bdc11c8c640c56345cbf91acf770828219766fc6c829382", + "wasmHash": "8393a1d52cc40fc3fd37d93da56a3322109159d794ab1d0fbee120dcb3d8cbcc", + "version": "1.1.1", "initializeArgs": {} }, "AxelarExample": { - "address": "CDEKXENLFI5A4XF5X2NQRDX5BK6MS2G47MU52N66Z6GAU4WUQ3RCH24M", - "deployer": "GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S", - "wasmHash": "a4dbe77402308e9152dfd31777519b2ff19167db81c5a15f3032a15ee3ea3bc9", + "address": "CCHEWZGXJSJL6Y4XONWGCWWQPWXEVPEE7GSF76PICHJSSQCJEHEL62F6", + "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", + "wasmHash": "cb96e568d52b5933111d3d97c7a3c23330df1db086aad6001f67e2daaa62d73b", + "version": "1.0.3", "initializeArgs": { "gatewayAddress": "CD6VSKXB4HY2DWU7EP2PUIYTBJBJ36LDJXEZN4NSXFYF5YP37DDFX6NF", "gasServiceAddress": "CDZNIEA5FLJY2L4BWFW3P6WPFYWQNZTNP6ED2K5UHD5PNYTIMNFZDD3W", @@ -2809,7 +2814,7 @@ "InterchainTokenService": { "address": "CBDBMIOFHGWUFRYH3D3STI2DHBOWGDDBCRKQEUB4RGQEBVG74SEED6C6", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "7ebdf38b7df81ad0deaae0d09b3123b6f1617ffae9618382c5d11acb7b991191", + "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", "initializeArgs": { "owner": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", "operator": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", @@ -2820,7 +2825,15 @@ "nativeTokenAddress": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" - } + }, + "version": "1.1.2" + }, + "Multicall": { + "address": "CC5LVKQA73ZVVUBAOCV5INV4TXPMELBFJ6XTQUBJTP4O2LSUKAA7VHLZ", + "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} } }, "approxFinalityWaitTime": 1, diff --git a/releases/stellar/2025-03-GMP-v1.1.1.md b/releases/stellar/2025-03-GMP-v1.1.1.md index 72d6b280d..b1e39046c 100644 --- a/releases/stellar/2025-03-GMP-v1.1.1.md +++ b/releases/stellar/2025-03-GMP-v1.1.1.md @@ -59,7 +59,7 @@ node stellar/faucet.js | **Devnet-amplifier** | `GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q` | | **Stagenet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | | **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | -| **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | +| **Mainnet** | `GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3` | 4. Retrieve full list of messages sent via the gateway @@ -74,8 +74,8 @@ node stellar/faucet.js | -------------------- | ---------------------------------------------------------- | | **Devnet-amplifier** | `'[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]'` | | **Stagenet** | `'[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]'` | -| **Testnet** | `'[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["axelar","0x0421b2eafda0b2476e3812a894d9c333af63cd92329d2bca1b50232cc63bbea6-2664345"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["axelar","0x044d4e3ae4925bff3cb36b0c624779cf278493d34eb77ebe154795e6dce767f7-4254191"],["axelar","0x1b9b0b01c3db74d34311a57d08d0cf4ae7b6c35bdf39654fb936ef2f7ef2afac-4065771"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0xed903b6087cf68867bfb7a43a8b6a8c4327eeb46501137d6c31628a0caf33780-1710363"],["axelar","0x0053b7aa500b691ff491ab6f06f35bcf7cf5d593a4e965d34dfd3aac989b6a00-1719427"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["axelar","0x131e23be2f09af47219c312c5f965eafafac8b1ed1b044dc82775ab3d978b3d8-4245291"],["axelar","0x64eab7a07a68276418c2de40908eaed4b4880b6ecedfc15bb1819472492ec8ef-4751251"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x61fbd550915e63a9874a13fc8c23cdb1ed970f1adc4143f00ec2ca60329e1880-1827888"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0xc08f58997fd6d8bc2f2d848c5ca54988aeae8463082c447f9aea57098a53d4bc-4747694"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xe309ec71355258e85f2da14531fc26482169e90204bbf87435c477c91e9ed2fd-4256960"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["axelar","0xd38a95574c5136d87ea51b85769adabf55d9931f373976ce6b51e11b6561605c-3758500"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"],["axelar","0x9de857075eb2afb02ad917ce02ac07af8f1a25f91767de4dc8506469e88e88a9-4051689"]]'` | -| **Mainnet** | `'[["axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07a229a5f-250959"],["axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"],["axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"],["axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"],["stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"],["axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"],["axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"],["axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"],["axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"],["axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"],["stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"],["axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"],["axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084"]]'` | +| **Testnet** | `'[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"]]'` | +| **Mainnet** | `'[["axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07a229a5f-250959"],["axelar","0x81d4274316380ec968c5cd249963b03588447104e369be005cbd60050c437715-272885"],["axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"],["axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"],["axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"],["stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"],["axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"],["axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"],["axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"],["axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"],["axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"],["stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"],["axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"],["axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084"]]'` | 5. Pause the `AxelarGateway` contract @@ -170,7 +170,7 @@ node stellar/operators.js is-operator operatorN Every call should return `true`. -### Verify Stellar → EVM GMP Call +### Stellar → EVM 1. Send a GMP call @@ -185,9 +185,9 @@ node stellar/gmp.js send [destination-chain] [destination-address] 0x1234 --gas- | **Devnet-amplifier** | [AxelarScan](https://devnet-amplifier.axelarscan.io/) | | **Stagenet** | [AxelarScan](https://stagenet.axelarscan.io/) | | **Testnet** | [AxelarScan](https://testnet.axelarscan.io/) | -| **Mainnet** | [AxelarScan](https://mainnet.axelarscan.io/) | +| **Mainnet** | [AxelarScan](https://axelarscan.io/) | -### Verify EVM → Stellar GMP Call +### EVM → Stellar 1. Send a GMP call @@ -202,4 +202,4 @@ node evm/gateway.js -n [source-chain] --action callContract --destinationChain $ | **Devnet-amplifier** | [AxelarScan](https://devnet-amplifier.axelarscan.io/) | | **Stagenet** | [AxelarScan](https://stagenet.axelarscan.io/) | | **Testnet** | [AxelarScan](https://testnet.axelarscan.io/) | -| **Mainnet** | [AxelarScan](https://mainnet.axelarscan.io/) | +| **Mainnet** | [AxelarScan](https://axelarscan.io/) | diff --git a/releases/stellar/2025-03-ITS-v1.1.1.md b/releases/stellar/2025-03-ITS-v1.1.1.md index 38dd8cc9e..0f61af3d0 100644 --- a/releases/stellar/2025-03-ITS-v1.1.1.md +++ b/releases/stellar/2025-03-ITS-v1.1.1.md @@ -43,7 +43,7 @@ CHAIN= | **Devnet-amplifier** | `GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q` | | **Stagenet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | | **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | -| **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | +| **Mainnet** | `GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3` | 2. Take note of the current bytes value for `TokenManagerWasmHash` via the explorer link below. @@ -84,8 +84,8 @@ node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 - | -------------------- | ---------------------------------------------------------- | | **Devnet-amplifier** | `"Ti+Y+1SPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0=" "J535ZSKoVNJdPK0QfK4QNZtrlGDrRoDaTmXV59EqXq0=" "bFaSJThTT7kJQzooI+f4g992m1LpEacDWN20EBHQ3ro=" "jC5tzI2Z+ljSXkwbNbkKMnWlWo59Pk+E2K5gdYOfna4=" "25L0WIB2ChfMc3cFtRM+oOzIJaEQfs+61S9DqJ+WqAw=" "sy1A5j5i5v43b84Zvz6ed57K3Dyb5pI+T+4oKVXbl2Q=" "DLFdu9+hYIW0XgkQTMSF5lSaI/cKdmSnoTn75jZbv8A=" "caBrwGL0ROiIbKS5sn7rSVTC6idQmOvsfx7E+cUpI10=" "MJlVSFxI9myqmYe0kPZAM0DZ82x+7qMHKqijO9Lq89o=" "w3yhg24JHcNlkpZ585AEdw7pc1s3BuDlcFXtQBCoibE=" "wTusnWDmOBMA0jtpoUzBTeSCOA6CDH4yzWZVakASQtk="` | | **Stagenet** | `"bk5TOcAqehReN14EFgsCy2nm+cXT4e+zjs+IsJ5zq6g="` | -| **Testnet** | `"3OQqMLtE8vTBwWehxB3IAUAoFybxNbjV4pyXhgv1lwo=" "Ycf1QllLhjlb8FfTRi1I5ZpLN9u2SHeiaktMmkjXruk=" "hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "jzBSYAYAlSs3oIaHVFCd/Ou5dWIRBelJ+HmRUakcIPM=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "71UA0cka7t7WdzZscK9d7GA2R3mjBcY+i43FdRCUEyw=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "3x+VtlBv/H/sYTcXZ2a30i1itHqRWmpKEzuHa5mgXis=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "tGjmQdGE2Uk1+9r6Q14ZdLxhdmXw6uLT9G7BRaY+sr8=" "PrrXI+dMgrRlproa2biMpIW+B+l0F/eqIxZt79HRENA=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q="` | -| **Mainnet** | `"A/cM/Lqj2/Fx22VBAjjgW1jDrnywIZy3Bo1Z1Wr5b7Q=" "dGQ0vIU2L8yyO8EEthUPrvCy0v+WpQ8tElUwREprmQ8=" "XqRV/aAChDa0fS7nCVsHUDo9emkk9vDjOrzuIaPtKv0=" "zlmGy2Rk0M/FhXFVKbDXxzQxjq33qxrvWtExvamdenI=" "pGiAIMevFALTHyQpjk+P1+e9nlgSqIEjHi9nOq0UxcE=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4="` | +| **Testnet** | `"hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q="` | +| **Mainnet** | `"A/cM/Lqj2/Fx22VBAjjgW1jDrnywIZy3Bo1Z1Wr5b7Q=" "dGQ0vIU2L8yyO8EEthUPrvCy0v+WpQ8tElUwREprmQ8=" "XqRV/aAChDa0fS7nCVsHUDo9emkk9vDjOrzuIaPtKv0=" "zlmGy2Rk0M/FhXFVKbDXxzQxjq33qxrvWtExvamdenI=" "pGiAIMevFALTHyQpjk+P1+e9nlgSqIEjHi9nOq0UxcE=" "sF8KrUqC9SrWClGQyl3oDK2QfbV4LI6jqVpBZhCYRPA=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4="` | 8. Pause the `InterchainTokenService` contract diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md index 903231f92..0cf99a5e4 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md @@ -1,8 +1,10 @@ -# GMP Deployments +# Stellar GMP v1.1.1 + +## Steps ### Upgrade the AxelarGateway contract and migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["axelar","0x28b56058d6009267808c6879e262a043ca8bf74c92954f22a178d488cd8e1672-128252"],["axelar","0xf1326ccf9e405273bae07843c5f7f34db34088a3f60f71cf42892014ebd58b1d-128247"],["axelar","0xbab4e1965d71e4102301ca375b80ed76b0f575280c3011a7d6a04dce475ae83e-126435"],["axelar","0xc882850ccf7695df6ca93ff22bfc9a18ebcf85e5b6e005c44c6153cbbce4f4cc-128657"],["axelar","0x816cf7d2f42c8093d1ab2ba684396c0386f9b5c0fd508239ccb461a1513f0fd2-126409"],["axelar","0x41da5017df7797bad6521af15678985211d6dc56db469e556f642a9fb7bb5663-114333"],["stellar-2025-q1","0x10fb1f5fbc62c2b347f16a5b15543aca5fa6156b51a4fd693b99177d0cdfe23a-2"],["axelar","0xe19b6a0805c67c73d1d69454a2f2dca196e59bbd14c9d1b5f7e9040c56334735-126378"]]' Upgraded contract tx: dc7f63fc93a66ed5f3c9186940a92f437b3b7fc95f735b6c9384d086b45cff58 @@ -10,7 +12,7 @@ Upgraded contract tx: dc7f63fc93a66ed5f3c9186940a92f437b3b7fc95f735b6c9384d086b4 ### Upgrade AxelarOperators & migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GBM47ULSN4OEQNPECDIMZSDMK6AH2RNICV2VGOYPBVJ4LBFCFFQP2BXM"]' Upgraded contract tx: 145d51bafa5c4a8e308b61fc4001f0e4697b35568314510103a166a48127a09f @@ -18,7 +20,7 @@ Upgraded contract tx: 145d51bafa5c4a8e308b61fc4001f0e4697b35568314510103a166a481 ### Upgrade the AxelarGasService contract -``` +```bash node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 Upgraded contract tx: d807752dc174fc359caceb839de08eaaf13d0538f9d359bf4ca55ba293254985 @@ -26,7 +28,7 @@ Upgraded contract tx: d807752dc174fc359caceb839de08eaaf13d0538f9d359bf4ca55ba293 ### Deploy the AxelarExample contract -``` +```bash node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 Initialized contract tx: 7efa3ad5d37bfb2a91a2f0048c14067f10ef1d70918ef5e0e2341fa3e3404a58 @@ -34,25 +36,25 @@ Initialized contract tx: 7efa3ad5d37bfb2a91a2f0048c14067f10ef1d70918ef5e0e2341fa ### Deploy the Multicall contract -``` +```bash node stellar/deploy-contract.js deploy Multicall --version 1.0.1 Initialized contract tx: def777bb1acd1ac65304b2776423510a00ac571a007a7396b4a83507e76cfe68 ``` -## Verify GMP call +## Checklist -### Verify Stellar → EVM GMP Call +### Stellar → EVM -``` +```bash node stellar/gmp.js send avalanche-fuji 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 https://devnet-amplifier.axelarscan.io/gmp/ff297adfb3b6c28ebc744a4e4b6142a21f33a044a99dd0fe039eafbe08d122b4 ``` -### Verify EVM → Stellar GMP Call +### EVM → Stellar -``` +```bash node evm/gateway.js -n avalanche-fuji --action callContract --destinationChain stellar-2025-q1 --destination CAYMUJY3W77TABSONTMIRWNOIMV7ZAXKA4PNDSRKEZWCBBVSG3JB2G3K --payload 0x1234 https://devnet-amplifier.axelarscan.io/gmp/0xfd7ec37a4536a768a97d1f3842c796af43020e21c75443f3ccba334c32ace12b diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-mainnet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-mainnet.md new file mode 100644 index 000000000..938e218b1 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-mainnet.md @@ -0,0 +1,150 @@ +# Stellar GMP v1.1.1 + +## Steps + +```bash +node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["axelar","0xe75bfad0ac5c972ac4053d11bade19d182c4799f22872c3cca8090e07 +a229a5f-250959"],["axelar","0x81d4274316380ec968c5cd249963b03588447104e369be005cbd60050c437715-272885"],["axelar","0x7ed28ebf275f430b64487ac74f944b151edf3b8392456d789f04f83bf75c079e-257089"],["axelar","0xfecb1bbe5e1eafa7fefb519884e3d58a05066c7ca07054372cab5a8105b31518-250301"],["axelar","0x6538b066d98bbd9d4e5338f19146d773747022fc4e698376671e4a1d228e69e3-252142"],["stellar","0x6a7348f84b5c0a42892656228834fcf3880a827cedeafcf6cfc171d825250395-2"],["axelar","0x93f6b146c47fe45c325b804e559fbb9036eba114ebb7a53ab12796aa5d5ba50a-256802"],["axelar","0x49ad7fd5f17a11694f1d0abdc1c498eed6f7128159685e3c066b6d1e4a3928fe-253098"],["axelar","0x85f5f5df8c774da7a50902f295fc9c9643187ab1bab4ae0d76dcfc11bd36bbc4-257244"],["axelar","0xd43f92c82e733db3d381addb7d8cff2f5d721e4e4f976f7811df1835104373b0-256938"],["axelar","0x621b48ce71ad7841772436ce1e5ed96238e4e537bbf37e55fdcc19e5ee3f6b4f-256521"],["stellar","0x965bd66495ad46390b97b6c03e4e52abe77b213cbaedfbabbd9e96b74648f847-2"],["axelar","0xb0f33127bb7049f967df74df92094ce8f9c32a21b33b048ba4bc34306ba08063-251212"],["axelar","0xe9a205b406e320b3124cb2e171567105fab78ac980d7f5dcc41a407dd955a308-251084"]]' +``` + +```text +Wallet address: GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3 + +Wallet balances: 409.0945038 XLM + +Wallet sequence: 240976600500273171 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded AxelarGateway wasm tx: 2ebcf4296ff931b38e085def744a379decf026c4e995de5b439be7ada2124aa5 + +New Wasm hash: d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24 + +Upgraded contract tx: 7bef9f6d863da0794df4d2979b48bd6d9d0a3adb2b841fb5bed28024f4644b31 + +Contract upgraded successfully: { + "contractName": "AxelarGateway", + "newWasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24" +} +``` + +```bash +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GBAGPWP4GXOB4PD62KLUGOWKWVBYSUQOO37XHB7PNYWKVHSDAVO4HWHD","GDK4ZR7W +NQMQ43WZTZDB3YRSWIOEQGPD4CZBKQOKYNIUHLQ6PZNPMOJK"]' +``` + +```text +Wallet address: GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3 + +Wallet balances: 383.0461123 XLM + +Wallet sequence: 240976600500273174 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded AxelarOperators wasm tx: d688e4e1e07836238d5b730b9735d7866ffb706cd5b53cffadd67118dd72daa6 + +New Wasm hash: 8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2 + +Upgraded contract tx: fdea67e9601a0b054f9f47a6ca827ec6629b6c124886762b101921b9d2434368 + +Contract upgraded successfully: { + "contractName": "AxelarOperators", + "newWasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2" +} +``` + +```bash +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 +``` + +```text +Wallet address: GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3 + +Wallet balances: 378.9354348 XLM + +Wallet sequence: 240976600500273176 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded AxelarGasService wasm tx: 939a075399181f79e08e224e4b732f47a3ae0210a67098abe807613bf3230d00 + +New Wasm hash: 5f85b5ca8888347990b7d6384a3c73dac1fc652f93086224d78dbadfc934d729 + +Upgraded contract tx: 6f03ad36b5b35a1d6f519a3fa9e3d3f74bfd9522e717ed1031a7738cf8b181fa + +Contract upgraded successfully: { + "contractName": "AxelarGasService", + "newWasmHash": "5f85b5ca8888347990b7d6384a3c73dac1fc652f93086224d78dbadfc934d729" +} +``` + +```bash +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 +``` + +```text +Uploaded AxelarExample wasm tx: 00f391de2a2d3a02be09422c8f5297fee2e75e81dcaf104b6d96a714d26a9756 + +Initializing contract with args: { + "gatewayAddress": "CD6VSKXB4HY2DWU7EP2PUIYTBJBJ36LDJXEZN4NSXFYF5YP37DDFX6NF", + "gasServiceAddress": "CDZNIEA5FLJY2L4BWFW3P6WPFYWQNZTNP6ED2K5UHD5PNYTIMNFZDD3W", + "itsAddress": "CBDBMIOFHGWUFRYH3D3STI2DHBOWGDDBCRKQEUB4RGQEBVG74SEED6C6" +} + +Initialized contract tx: bedfc3a6d5e50e14886811317047e012634ccb9f021584f32045731945658ef2 + +Contract initialized at address: CCHEWZGXJSJL6Y4XONWGCWWQPWXEVPEE7GSF76PICHJSSQCJEHEL62F6 + +Contract deployed successfully: { + "address": "CCHEWZGXJSJL6Y4XONWGCWWQPWXEVPEE7GSF76PICHJSSQCJEHEL62F6", + "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", + "wasmHash": "cb96e568d52b5933111d3d97c7a3c23330df1db086aad6001f67e2daaa62d73b", + "version": "1.0.3", + "initializeArgs": { + "gatewayAddress": "CD6VSKXB4HY2DWU7EP2PUIYTBJBJ36LDJXEZN4NSXFYF5YP37DDFX6NF", + "gasServiceAddress": "CDZNIEA5FLJY2L4BWFW3P6WPFYWQNZTNP6ED2K5UHD5PNYTIMNFZDD3W", + "itsAddress": "CBDBMIOFHGWUFRYH3D3STI2DHBOWGDDBCRKQEUB4RGQEBVG74SEED6C6" + } +} +``` + +```bash +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 +``` + +```text +Uploaded Multicall wasm tx: e8369bb9e8a8ac43d5466611772e629d7df37c7884eab6b656feff836373173b + +Initializing contract with args: {} + +Initialized contract tx: 28e149bc734f355ebd8e323542918f8d1de1cc3884fab02629718ebb956d7dd3 + +Contract initialized at address: CC5LVKQA73ZVVUBAOCV5INV4TXPMELBFJ6XTQUBJTP4O2LSUKAA7VHLZ + +Contract deployed successfully: { + "address": "CC5LVKQA73ZVVUBAOCV5INV4TXPMELBFJ6XTQUBJTP4O2LSUKAA7VHLZ", + "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} +} +``` + +## Checklist + +### Stellar → EVM + +```bash +node stellar/gmp.js send flow 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://axelarscan.io/gmp/85a830aa1b56dda7f8a99482b6278933fd05298820ee9bfd8d3b026d54bd870d +``` + +### EVM → Stellar + +```bash +node evm/gateway.js -n avalanche --action callContract --destinationChain stellar --destination CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H --payload 0x1234 + +https://axelarscan.io/gmp/0xa7e326173204ab88dce45c05783e1974031ff9f02e538288d579756d7baea4a6 +``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md index 441ea322d..8dd6352e3 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md @@ -1,8 +1,10 @@ -# GMP Deployments +# Stellar GMP v1.1.1 + +## Steps ### Upgrade the AxelarGateway contract and migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["stellar-2025-q1","0x92de6c8db2aabb7f7d42c7257b0b417a82118d6cdaac15ab7baede65a4879875-2"],["stellar-2025-q1","0x21f4d0219798fc132aad1329fe31f7c8ef838cbdb0e1c1a116c0e11f240d7dd0-2"],["stellar-2025-q1","0x183ae1e6933a4f800d2dbccde49e366bb72e2e01befd5bc0c7c2f9ca08a217ad-2"],["stellar-2025-q1","0x0ecaf9dfb0cdd75edad060f91cf9959cee1e13859b292e6a8c01a265be04ffb6-2"],["stellar-2025-q1","0xfa224e4184d1b98ce3d4852fad2eb7ebee8da64d3913b683cd9c16a89af9fe59-2"],["stellar-2025-q1","0x5cea873108514d2cf78365ae6d0e24e2a3afd639caf25b44483efe183cc22610-2"],["stellar-2025-q1","0x6bfc1d27e994da15ecf816b5b774033bd964ef0cb77ac8b965bd51bdc9167e4e-2"],["stellar-2025-q1","0x79a40ba475526130615a27f715f767890660a061f293bf5668758103c2af35f0-2"],["stellar-2025-q1","0x55e56efbf26f4663b3545db71b379c3e0e2f6976805fdce7714753947cc52832-2"],["stellar-2025-q1","0x63e1478a85ae18909f6a76162c625baf2c66623513404a0acaaa00f05a5b7b2e-2"],["stellar-2025-q1","0x88f46dbe5aff9ebb0861862fcaecc584f8025b9eab74a379e02f9c4cbbeb2d16-2"]]' Upgraded contract tx: a2731a2d09ae14aa0c99c6f140322871ce0cf79b1a4bb8a0ec27f6cace35f713 @@ -10,7 +12,7 @@ Upgraded contract tx: a2731a2d09ae14aa0c99c6f140322871ce0cf79b1a4bb8a0ec27f6cace ### Upgrade AxelarOperators & migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GAY6RYZLHDSYQ7Y3X2CRSOTB6PVXAQ3IRTQFIAATYSP2TX7N25HVSJEV","GBNSB3AHRLVVXBWZFCFSWBUG6RZHNSOIDIH7VGKL2GHVFXFVV3I6I5AM"]' Upgraded contract tx: 7937e2673b8bc447cb19478fbfc4d16d421120413601bc455bb0446aa63ff236 @@ -18,7 +20,7 @@ Upgraded contract tx: 7937e2673b8bc447cb19478fbfc4d16d421120413601bc455bb0446aa6 ### Upgrade the AxelarGasService contract -``` +```bash node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 Upgraded contract tx: bf40a43f69cc88bcb6ac1be1a42be4072fb77bf398fa0c70a8149ae0080d15d1 @@ -26,7 +28,7 @@ Upgraded contract tx: bf40a43f69cc88bcb6ac1be1a42be4072fb77bf398fa0c70a8149ae008 ### Deploy the AxelarExample contract -``` +```bash node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 Initialized contract tx: ae1df3153084cc432050d22185db7e1f5bc9bc25468d69d41d98ddf4e75ea6b4 @@ -34,25 +36,25 @@ Initialized contract tx: ae1df3153084cc432050d22185db7e1f5bc9bc25468d69d41d98ddf ### Deploy the Multicall contract -``` +```bash node stellar/deploy-contract.js deploy Multicall --version 1.0.1 Contract initialized at address: CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK ``` -## Verify GMP call +## Checklist -### Verify Stellar → EVM GMP Call +### Stellar → EVM -``` +```bash node stellar/gmp.js send avalanche 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 https://stagenet.axelarscan.io/gmp/064a45a48c072f578b69b9b0db21079065f31d00fc752775f8f4efdf4a42714c ``` -### Verify EVM → Stellar GMP Call +### EVM → Stellar -``` +```bash node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H --payload 0x1234 https://stagenet.axelarscan.io/gmp/0x005d0a518b477215cad1ffdfc1b253144451359fbc0fd620ffe2a17c21d9bd92 diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md index 2ef0c85bd..2b320708a 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md @@ -1,8 +1,10 @@ -# GMP Deployments +# Stellar GMP v1.1.1 + +## Steps ### Upgrade the AxelarGateway contract and migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade AxelarGateway --version 1.1.1 --migration-data '[["stellar-2025-q1","0x7aece3d2a23b6c1a23f1c760e7a1c87ff307d68c83807a29becf4d129139fb4d-2"],["sui","6HauA67bXzwJ93xnUCuvch1pCSEK3pPD6utg8kTZs4j3-1"],["stellar-2025-q1","0x3bb497abe4bd3ed5c6fceead0401a91d3baa6a3bda8b3170b9abc1172270e2d2-2"],["stellar-2025-q1","0x613c261e6d75647e52dbf5680af04bee4979a640338e470f5e5992b629f371aa-2"],["axelar","0x0179df5f68f56b3faf3048a984c62bfc3affb2ef888d792058d4a85a8421fa82-180705"],["axelar","0xe3e0a21efa1a8f60342a6a67d85fad418361c7351a2100973ab7e595b3be6276-617431"],["axelar","0x0421b2eafda0b2476e3812a894d9c333af63cd92329d2bca1b50232cc63bbea6-2664345"],["stellar-2025-q1","0x1c03d04a29177bdd8e1bc6648da506201884d0a644c2ad2b20900c1179cc564b-2"],["stellar-2025-q1","0x178e8cf97909ec3e7c48ccc539acca421aa967a62ea70c1176a26d3347431d07-2"],["axelar","0xe03a146e59e448bf2122c3d8d36883a193ec0d77e9fb9a4f7de707853617e486-862244"],["axelar","0x387d9dc4f444e1e0543995295d22f21d5d3eb5b406e4807dcf7bc31253c10ac5-618163"],["axelar","0x044d4e3ae4925bff3cb36b0c624779cf278493d34eb77ebe154795e6dce767f7-4254191"],["axelar","0x1b9b0b01c3db74d34311a57d08d0cf4ae7b6c35bdf39654fb936ef2f7ef2afac-4065771"],["stellar-2025-q1","0xd66d382b26665edb660cc7c7ab88ddd248e6e56ef67294467e15fafbf9b44fa8-2"],["axelar","0x0d2b02b0869bfb6cdde1062b85a4aab241ae49fe327693be6c1c53efe8305e88-863769"],["stellar-2025-q1","0xb71cf45d238bc7aa4acb4ae441d7f368922e3114a5159d439bf5d90eb26bfbfd-2"],["axelar","0x7fad45e064e3055da89ee7750a8755edf21521b729dce10c4fd98e0e060b968d-197733"],["axelar","0xed903b6087cf68867bfb7a43a8b6a8c4327eeb46501137d6c31628a0caf33780-1710363"],["axelar","0x0053b7aa500b691ff491ab6f06f35bcf7cf5d593a4e965d34dfd3aac989b6a00-1719427"],["axelar","0x1c569a496194cfde648f3206a7048bdc76bb770b8cc0d8a4c8c81a894384bc6d-714199"],["axelar","0x131e23be2f09af47219c312c5f965eafafac8b1ed1b044dc82775ab3d978b3d8-4245291"],["axelar","0x64eab7a07a68276418c2de40908eaed4b4880b6ecedfc15bb1819472492ec8ef-4751251"],["sui","CuBZFdh7R4Arf9RBp8v65rr4Tofjh8KP9AC6V8CXdYis-1"],["axelar","0xfee2ad0aa1f21ff55ff1d01689c08cf7e4596c4778812831afbbde04ce29cee9-197828"],["axelar","0x6d02a12f7e41285ee00804f2eb6f266fcb06710bc86316c780d7ba6c624bd14d-713874"],["axelar","0x61fbd550915e63a9874a13fc8c23cdb1ed970f1adc4143f00ec2ca60329e1880-1827888"],["axelar","0x5f726108ef0fe861010e54bedf76fb3ad84e8fcc2be730cec8158a9dc91e54a4-165293"],["axelar","0x56771aa4cf185a9e354458b227ab999d5296a6005f021e1cab01ce51e663ba86-713386"],["axelar","0xc561067549541ef3cb26ed53be88f210a6a0203f614a472a483b8fe7806cbde0-879813"],["axelar","0xc08f58997fd6d8bc2f2d848c5ca54988aeae8463082c447f9aea57098a53d4bc-4747694"],["axelar","0x0759eb2d0f791b41f9a04b3a9e1411afb05c61e3fe54cdb413ddd5193b1fffe3-713233"],["axelar","0xe309ec71355258e85f2da14531fc26482169e90204bbf87435c477c91e9ed2fd-4256960"],["axelar","0xebc50db6658721e1fc54556fc4ea893710c63774b1db597179ec70112b31e8bf-714318"],["axelar","0xde77e50549b773ed0814e21519819afa2b971d806fa878be855a9629027157f5-713033"],["axelar","0xc2b093c9da3c55561a25ab0aa53de25d6bba571785a80bde9b4f21fd25996f46-713573"],["axelar","0xd549e19277b795b8cb4cb5b99a72e09e42e28622c4021c8aed1950b2eedfb24c-620453"],["axelar","0x4b0610783250940844e32859ba810c9bf7a05c3001777e88f251ddd9674d8138-618785"],["axelar","0x81f6d3056f75de10c719ea371a36ed11ed5ba3d2b87d25cb6cc93a260dd5e61b-619668"],["axelar","0xd38a95574c5136d87ea51b85769adabf55d9931f373976ce6b51e11b6561605c-3758500"],["stellar-2025-q1","0x1981d439d734392a067cd017f3816d8d9e08613298479711b15eb6c4e73262ba-2"],["axelar","0x9de857075eb2afb02ad917ce02ac07af8f1a25f91767de4dc8506469e88e88a9-4051689"]]' Upgraded contract tx: 49bb713b4581427f034d98fb8e5c82eba10461e11b9932bf92522712d979aa7a @@ -10,7 +12,7 @@ Upgraded contract tx: 49bb713b4581427f034d98fb8e5c82eba10461e11b9932bf92522712d9 ### Upgrade AxelarOperators & migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GDIT77OPH2WST4IDQWG4AANU2ZELJGZ6FIEWTBH6GWXSKUMR2XSH24CX","GDKKJTHINMUVPTAS6DM6Z6JHKOEWWGFW3T3IIRHGGT2F2HXPIDONKRFG"]' Upgraded contract tx: bf92c6f572f5945c39b11c7ab1b1f645d446d84cdbea3accd2c1df1a58b594d5 @@ -18,7 +20,7 @@ Upgraded contract tx: bf92c6f572f5945c39b11c7ab1b1f645d446d84cdbea3accd2c1df1a58 ### Upgrade the AxelarGasService contract -``` +```bash node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 Upgraded contract tx: f99abc30cc49226435bfbbeebe7d837e19df2800751cfdb74729a1638a6be70b @@ -26,7 +28,7 @@ Upgraded contract tx: f99abc30cc49226435bfbbeebe7d837e19df2800751cfdb74729a1638a ### Deploy the AxelarExample contract -``` +```bash node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 Initialized contract tx: 299a0f287c5cad032180af2b91830f4fbb0cff1fa72d93a9e89cc30ab6a01f83 @@ -34,26 +36,26 @@ Initialized contract tx: 299a0f287c5cad032180af2b91830f4fbb0cff1fa72d93a9e89cc30 ### Deploy the Multicall contract -``` +```bash node stellar/deploy-contract.js deploy Multicall --version 1.0.1 Initialized contract tx: 259c6852bd2f2c483aac772c13b4efd469ace070e198486e80bcfadbba3fef62 ``` -## Verify GMP call +## Checklist -### Verify Stellar → EVM GMP Call +### Stellar → EVM -``` +```bash node stellar/gmp.js send flow 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 https://testnet.axelarscan.io/gmp/adb1d382b277696106fa4ba2e504022e7c9ff1a7310ed70ef61033b5407bc225 ``` -### Verify EVM → Stellar GMP Call +### EVM → Stellar -``` -node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination +```bash +node evm/gateway.js -n flow --action callContract --destinationChain stellar-2025-q1 --destination CDMT7AQM5WE7KGVS2257SGDZH6TA7KBFHQM2N4VWOWSWUV3GACR4YU3H --payload 0x1234 https://testnet.axelarscan.io/gmp/0x77bee29470c76792919c471ddf37a6d6487306f737b80e61f922c05ab092d2c0 ``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md index 61413933c..a602ef44f 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md @@ -1,8 +1,10 @@ -# ITS Deployments +# Stellar ITS v1.1.1 + +## Steps ### Upload TokenManager & retrieve WASM hash -``` +```bash node stellar/deploy-contract.js upload TokenManager --version 1.1.1 Uploaded TokenManager wasm tx: a940b26a580c6e22ee936e52970879442705b39c64e40c38663b60cf684df200 @@ -15,7 +17,7 @@ Contract uploaded successfully: { ### Upload InterchainToken & retrieve WASM hash -``` +```bash node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 Uploaded InterchainToken wasm tx: 4f0644d7a818571b41651c3ed82d582a5de68b401aaa7cdf2db1ad4f6c8a2e3f @@ -27,13 +29,13 @@ Contract uploaded successfully: { ### Upgrade InterchainTokenService & migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.1 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' Upgraded contract tx: 8ce3228982eff9f24a6d9c99e89c8af2a19506e54aca98e7c1caf0bf09bf31c2 ``` -``` +```bash node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' Upgraded contract tx: b29172c404b3b55a8ba98441c10e2af0c2455fd8b2901ce659356791936ea7c6 @@ -42,7 +44,7 @@ Upgraded contract tx: b29172c404b3b55a8ba98441c10e2af0c2455fd8b2901ce65935679193 ### Call ITS::migrate_token for ALL deployed tokenIds (base64) -``` +```bash node stellar/its.js migrate-tokens "Ti+Y+1SPlMl6ZvSfJSq1lTJna8pWcboxzVkujlT0/F0=" "J535ZSKoVNJdPK0QfK4QNZtrlGDrRoDaTmXV59EqXq0=" "bFaSJThTT7kJQzooI+f4g992m1LpEacDWN20EBHQ3ro=" "jC5tzI2Z+ljSXkwbNbkKMnWlWo59Pk+E2K5gdYOfna4=" "25L0WIB2ChfMc3cFtRM+oOzIJaEQfs+61S9DqJ+WqAw=" "sy1A5j5i5v43b84Zvz6ed57K3Dyb5pI+T+4oKVXbl2Q=" "DLFdu9+hYIW0XgkQTMSF5lSaI/cKdmSnoTn75jZbv8A=" "caBrwGL0ROiIbKS5sn7rSVTC6idQmOvsfx7E+cUpI10=" "MJlVSFxI9myqmYe0kPZAM0DZ82x+7qMHKqijO9Lq89o=" "w3yhg24JHcNlkpZ585AEdw7pc1s3BuDlcFXtQBCoibE=" "wTusnWDmOBMA0jtpoUzBTeSCOA6CDH4yzWZVakASQtk=" --version 1.1.1 Migrating token: 0x4e2f98fb548f94c97a66f49f252ab59532676bca5671ba31cd592e8e54f4fc5d @@ -202,37 +204,37 @@ Migrated token tx: e514e899c9a6505e5f780e961a82cdaeb1f5eb716d75c64defe0ca5793560 ### Deploy Upgrader -``` +```bash node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 Initialized contract tx: 1897e3904d6a9b51ce00ac38e3de2bc6b39042d358264970674b36c9d05f987b ``` -# ITS Checklist +## Checklist -## Stellar → EVM +### Stellar → EVM -``` +```bash node stellar/its.js deploy-interchain-token TEST2 test2 18 0x5678 100 Interchain Token Deployed tx: fe30dc0304fd49b77c96a27c683b1dc742afa7b0448c03552c05629d0d97844b ``` -``` +```bash node stellar/its.js deploy-remote-interchain-token 0x1234 avalanche-fuji --gas-amount 10000000 https://devnet-amplifier.axelarscan.io/gmp/9005da63ec6e6791f6d45ce41e46d3de8b2740c26578ca1b749c72166fbf9319 ``` -## EVM to Stellar +### EVM → Stellar -``` +```bash node evm/interchainTokenFactory.js --action deployInterchainToken -n avalanche-fuji --destinationChain stellar-2025-q1 --salt "testa1" --name "testa1" --symbol "TESTA1" --decimals 18 deployInterchainToken tx: 0x92eeff8fa20fb58dd85d99934307fa67317fb95dc88ca20a9ff01293d88ffd98 ``` -``` +```bash Token address: 0x68F1bC3C45a9e03C148F02C33baCEd48A0a7F737 node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n avalanche-fuji --destinationChain stellar-2025-q1 --salt "testa1" --gasValue 1000000000000000000 diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-mainnet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-mainnet.md new file mode 100644 index 000000000..408fe592e --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-mainnet.md @@ -0,0 +1,256 @@ +# Stellar ITS v1.1.1 + +## Steps + +```bash +node stellar/deploy-contract.js upload TokenManager --version 1.1.1 +``` + +```text +Uploaded TokenManager wasm tx: 81276211df5b55f95b082053bd787970e738e4929e9f6d17011a56899cdf14e4 + +Contract uploaded successfully: { + "contractName": "TokenManager", + "wasmHash": "9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c" +} +``` + +```bash +node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 +``` + +```text +Uploaded InterchainToken wasm tx: 2d50e74dd41b44d4f137ce2abe174d2d096f5a962cf42e4218272ebdf1758ad2 + +Contract uploaded successfully: { + "contractName": "InterchainToken", + "wasmHash": "71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe" +} +``` + +```bash +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269 +ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' +``` + +```bash +Uploaded InterchainTokenService wasm tx: f82cb4164a3098c376996d38b4f33d002be832169917e0ce2cd0830d9444b073 + +New Wasm hash: ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3 + +Upgraded contract tx: bda516a240c6633ad205d993d0eed56ebcc739deabc32881f3b5e70b9fb9c384 + +Contract upgraded successfully: { + "contractName": "InterchainTokenService", + "newWasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3" +} +``` + +```bash +node stellar/its.js migrate-tokens "A/cM/Lqj2/Fx22VBAjjgW1jDrnywIZy3Bo1Z1Wr5b7Q=" "dGQ0vIU2L8yyO8EEthUPrvCy0v+WpQ8tElUwREprmQ8=" "XqRV/aAChDa0fS7nCVsHUDo9e +mkk9vDjOrzuIaPtKv0=" "zlmGy2Rk0M/FhXFVKbDXxzQxjq33qxrvWtExvamdenI=" "pGiAIMevFALTHyQpjk+P1+e9nlgSqIEjHi9nOq0UxcE=" "sF8KrUqC9SrWClGQyl3oDK2QfbV4LI6jqVpBZhCYRPA=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4=" --version 1.1.1 +``` + +```bash +Migrating token: 0x03f70cfcbaa3dbf171db65410238e05b58c3ae7cb0219cb7068d59d56af96fb4 + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: afda741ce6684dc3eb75eb1aa54921fd25fbace272fecbd03d7ea203a272fbf6 + +TokenManager address: CBLLBQFUH2DQH2RVNFXTQGDTUJ4KFNIPK3R2IN5AYSSF2KEE2IODBTWB + +Retrieved InterchainToken address tx: 9f93cf2d776b5fdfd3e3e4eab330a0c7be22c8f7d6ead40c80c5cfdf77747ee0 + +InterchainToken address: CB7BTETLXJHEBMMR4A736GR5KKSA3SRWMP7DYRPTQAEHYJWAHBYMB2EV + +Migrated token tx: 8b6920bfc076563acaec972f4c45bf3e38c0c12776eae9c9b08005211a627e72 + +Migrating token: 0x746434bc85362fccb23bc104b6150faef0b2d2ff96a50f2d125530444a6b990f + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: dac225d0cb17cb573d2d2013992fd96133691b93d6780d640d7485050edd37cf + +TokenManager address: CDNPSZPQZJTCLN2CQPOS6HABME2KDT6WFVCIJXRIV6ZKOPJHO5LG3JTM + +Retrieved InterchainToken address tx: e0ccf284271166ea47887da9403ec2392319e497cf4ca7a58b809397975d6277 + +InterchainToken address: CB6Y3ILCSW2XZJIJHZ3XSZBZVYNHGA4VXNKMLHDAHLVMNR2DNL43ESIG + +Migrated token tx: cb8124258e9215b0518740d38b0cd76ae3f14830e27e20d148a8c033dffa6289 + +Migrating token: 0x5ea455fda0028436b47d2ee7095b07503a3d7a6924f6f0e33abcee21a3ed2afd + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: aaf61067455b1902b8b12b443be64c2f41ab0c76712a264aaf18aef380c352e2 + +TokenManager address: CCBRTUZTUIUZ2DXIC2MIDCNCL2PSFAXJPIIDK6XCGIU3ZVDQ4C63SB6X + +Retrieved InterchainToken address tx: 5a3034ab1544e9a02a8a65255259cd4c783817bc3e4d244552d44b89c4775773 + +InterchainToken address: CCHVF2CIBH6RP3FGXMFQ4ZGHYUGJDECRYCUZW6X7Q5A2ZBWUUZWTY4QT + +Migrated token tx: f34410c9682a840625b64c692a0f0acb8125a3994faba0475358961348ec1f48 + +Sending transaction failed + throw Error(`Transaction failed: ${getResponse.resultXdr}`); +``` + +```bash +node stellar/its.js migrate-tokens "zlmGy2Rk0M/FhXFVKbDXxzQxjq33qxrvWtExvamdenI=" "pGiAIMevFALTHyQpjk+P1+e9nlgSqIEjHi9nOq0UxcE=" "sF8KrUqC9SrWClGQyl3oDK2Qf +bV4LI6jqVpBZhCYRPA=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4=" --version 1.1.1 +``` + +```bash +Migrating token: 0xce5986cb6464d0cfc585715529b0d7c734318eadf7ab1aef5ad131bda99d7a72 + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: cd68dfee686d2286b889a1cb18b15fc069ea5a57b0b56c5a9019d3d43854a7d6 + +TokenManager address: CDK33BKPUIE2SKIUVG4ANKUJVGR5CQLL7WVORIAT4R24KVXJUMGZZZDQ + +Retrieved InterchainToken address tx: 68fec3bdf4747441df20874b5e76d2d1903a3fd4dae530de7cfb0fccd83d0654 + +InterchainToken address: CDMWNS76IQXK6J2JC2CK27DT6WQ2ZA4J5SMFLN6VPC3OIWFCK2Q473G6 + +Migrated token tx: 8410c5f873e27e867430d6421e7e1270015df57907c0c963bfd22d0002a280e6 + +Migrating token: 0xa4688020c7af1402d31f24298e4f8fd7e7bd9e5812a881231e2f673aad14c5c1 + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: 870ce7c8b4360ed4ed9093ae75e8a8aa487d386a6ee579af0c2cd806d5dd5f8d + +TokenManager address: CD2X2676D5ARZ7LRGDO7MJTTGHRVZX5UQNN4FXMNSTZD4KOYX6CYLCSJ + +Retrieved InterchainToken address tx: 45b34901b64413109cd7963a6a858953a9f05f9a0f4a806e9de89fc2051c37e2 + +InterchainToken address: CCN57TFTO3X7NZEAUIYQGDYC76LJBYPND57IYCVFTJFXKOS2IXHXQSDY + +Migrated token tx: 51cf258179b19fdc6772f6bb4c31b3e6dc4b1e0840639d2bf53a4eaefe01aa66 + +Migrating token: 0xb05f0aad4a82f52ad60a5190ca5de80cad907db5782c8ea3a95a4166109844f0 + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: cc4bcf9eb77c44384e8f88cc912d4fd265585efe8ab2eabf66b6b8bd8c5fb703 + +TokenManager address: CAYFH4LTVI3JBIDGP5UBM3HU724IJIDTTBKSYJ5TEBOG7RU2B5QJ72BU + +Retrieved InterchainToken address tx: b047bbc933139041ada347a3c858240ad13f0721a61fa2a9798f0b66bcabdf50 + +InterchainToken address: CB7PIYPBZLDZ5A2GL4OJQWQT22NCYSWEZAV2XOYHROUG2SJZCFE45VDJ + +Migrated token tx: 2b964a9999e26097d12f81fc7ed1f204cc7e656a0229bd85dee4f618ea142890 + +Migrating token: 0xfaa6beaa2748e4ff20d111baad11ec536ee4c608c3e4b73e6c3fd790659284aa + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: e73ab90ff0bc459e99664026a2a6ac5013eb9bd9e1d388f36ac007d176f36318 + +TokenManager address: CABC6SN2RGEES25ZVBVOPYTOOUKOKCNWLSRTKMCWLCRTJEXSJ6PRNBBN + +Retrieved InterchainToken address tx: e283b1a429209392c3708e84eb110924f94dd927b16c782f815c6f0b1d37dc23 + +InterchainToken address: CBC3S3RVAPTNQNK2OVVTFRQ6T6JYDSOFPPFO7W3SOR4WWHHSJHDRWAGN + +Migrated token tx: d40e4afdce5925044096681e25fa27cf0bbf393d524cf96466fe039a533a3a1a + +Migrating token: 0xc4796c45320e7cb67194b0225f8aee64cf9d882317c5610698d7c17deb292f0d + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: b48b34649644dd5632b72100459c2c36e9020cff5dc8d6767bff016b0b389630 + +TokenManager address: CABXIFFE5YMFV4TKZTUCHHUUKPMGPLG7D4PI5EYHNSDQ33NYGFLT2WKZ + +Retrieved InterchainToken address tx: 2a566ef0becc56b12ef6561cd489b64d342a1882dd26b629f15f2738e45f143b + +InterchainToken address: CCX3G6763NVWPRVKTCAE3XY3SPY32TCPPON72NTDONV23UQRRJE6M6T5 + +Migrated token tx: f59302710461d350811fc4a00874398dd206cf1ab34238998bded3975db043be + +Migrating token: 0xd192d366f702fe58e35d48f1d9264711c86b4188220298f6a99fd77cd9c00973 + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: aebd4d638f3ba8c220c454806e61893e9d7310fedc172059892b702586266d51 + +TokenManager address: CBONAZIKLQYHPMDNPJBVW6ELCGG4EY5WQSF5ZPO6UMXIDTPUPCFVRPXF + +Retrieved InterchainToken address tx: 7cb08acde59843ef5d367c684b7b092317dc1be6c83e2622c4dabc84944c2b53 + +InterchainToken address: CAQR2ADAMQ3MMRQ4WR2SNWVW3S2KGH4K762ZPUWSTGR5LVGLJRAHEKW6 + +Migrated token tx: 8990f84c5486d26d7e7df08bde6476116306e850545fbf908cabd06e3c4a9ed1 + +Migrating token: 0x26e3963cda5bafaba03a0293327cd6025fadc816d2b61f69cec3c3e37353d23e + +Upgrader address: CCIAE4D3SBAKHYGWN6FMY74ILYKNQXE7FQNYZESFUFAPS2JYZRNYED4F + +Retrieved TokenManager address tx: ed122a435d11387355f3da544e1bd5251845e3f7260ee23625b742ecbef64103 + +TokenManager address: CAS2JG4RTZOHQ67X46JAJ4W73JICNTGVFAGVCDPLUIVHC72CLN2LZI7T + +Retrieved InterchainToken address tx: afdfe074f4ac1f4e5483081b92f9ff604533ac2aa9cdd26423c2ba9e39989822 + +InterchainToken address: CCYZG2QLIHGFDQASP2GUXSVFNK6GFDA4MOU5A2IXHZASGT6A5O5ZAPP2 + +Migrated token tx: 026f52a7c564a2ec223bb5d23cdcd1ff85472fa33b4c763092216fce672dcce1 +``` + +```bash +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 +``` + +```bash +Uploaded Upgrader wasm tx: 5db67d88ccfb0d621dc6b33e64b9c7afb812f1cd3d2ccdd2ff159334b92efb69 + +Initializing contract with args: {} + +Initialized contract tx: ae413a06c625ca747ce5ece547a5146e40c3fdabaf3234c94abcdedaabfc13b1 + +Contract initialized at address: CDXI3F2R6Q3W5AZRP3VQIOXM3YEIBFPEUAGZDOOSZ7DNQXHOKXU4FPVB + +Contract deployed successfully: { + "address": "CDXI3F2R6Q3W5AZRP3VQIOXM3YEIBFPEUAGZDOOSZ7DNQXHOKXU4FPVB", + "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", + "wasmHash": "8393a1d52cc40fc3fd37d93da56a3322109159d794ab1d0fbee120dcb3d8cbcc", + "version": "1.1.1", + "initializeArgs": {} +} +``` + +## Checklist + +### Stellar → EVM + +```bash +node stellar/its.js deploy-interchain-token TEST132 test132 18 0x891012 100000000 + +https://stellar.expert/explorer/public/tx/243163516243623936 +``` + +```bash +node stellar/its.js deploy-remote-interchain-token 0x891012 flow --gas-amount 50000000 + +https://axelarscan.io/gmp/cc328e812738390f17d635cfd47dca2c3ef67d56005d789da111cb6ca1da5999 +``` + +### EVM → Stellar + +```bash +node evm/interchainTokenFactory.js --action deployInterchainToken -n avalanche --destinationChain stellar --salt "testC" --name "testC" --symbol "TESTC" --decimals 18 + +https://snowtrace.io/tx/0xde5796810bd40a35528c00f0ad67d5d36819470104e5f35c3d7af4e7fe4d6d19 +``` + +```bash +node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n flow --destinationChain stellar --salt "test55" --gasValue 500000000000000000 + +https://axelarscan.io/gmp/0x171f96c46de0b4c890d3ef54ae9476479109d8c048d7a8e585cb1bb775e40691 +``` diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md index 41e44bf3a..277360b75 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md @@ -1,8 +1,10 @@ -# ITS Deployments +# Stellar ITS v1.1.1 + +## Steps ### Upload TokenManager & retrieve WASM hash -``` +```bash node stellar/deploy-contract.js upload TokenManager --version 1.1.1 Uploaded TokenManager wasm tx: 820edbe4f401491a38c1ff001ed1443fbea61d96a5494b5be5e2b303568dc1ef @@ -10,7 +12,7 @@ Uploaded TokenManager wasm tx: 820edbe4f401491a38c1ff001ed1443fbea61d96a5494b5be ### Upload InterchainToken & retrieve WASM hash -``` +```bash node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 Uploaded InterchainToken wasm tx: b5e7eed7c5d2d8002d248275362b92fa3472fa9456a165e2602cb9ef3ccb4c64 @@ -18,7 +20,7 @@ Uploaded InterchainToken wasm tx: b5e7eed7c5d2d8002d248275362b92fa3472fa9456a165 ### Upgrade InterchainTokenService & migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' Uploaded InterchainTokenService wasm tx: 36e9adada74f4f927c37a3269951b664f99f6af38aa9f711f6ed81edbfdf3cc1 @@ -26,7 +28,7 @@ Uploaded InterchainTokenService wasm tx: 36e9adada74f4f927c37a3269951b664f99f6af ### Call ITS::migrate_token for ALL deployed tokenIds (base64) -``` +```bash node stellar/its.js migrate-tokens "bk5TOcAqehReN14EFgsCy2nm+cXT4e+zjs+IsJ5zq6g=" --version 1.1.1 Migrating token: 0x6e4e5339c02a7a145e375e04160b02cb69e6f9c5d3e1efb38ecf88b09e73aba8 @@ -46,37 +48,37 @@ Migrated token tx: b8b147071de0081ca91553bd3aa17a71d67be9400678cd682b9406a9fadef ### Deploy Upgrader -``` +```bash node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 Initialized contract tx: 174c4794d93e49ff246d99fb8563b1d6bfa7d4ef7ad9ed59c1609fcab7587518 ``` -# ITS Checklist +## Checklist -## Stellar → EVM +### Stellar → EVM -``` +```bash node stellar/its.js deploy-interchain-token TEST3 test3 18 0x8910 10000000 Interchain Token Deployed tx: b249f1096c8a775b3aa4b0940ec54c7043f92cdca04b1d9a2146c1b015e409e3 ``` -``` +```bash node stellar/its.js deploy-remote-interchain-token 0x8910 flow --gas-amount 50000000 https://stagenet.axelarscan.io/gmp/21f04be1f6cc5ee8773ea65e988b322df14c95a5e2d038f0af24879dd09668d5 ``` -## EVM to Stellar +### EVM → Stellar -``` +```bash node evm/interchainTokenFactory.js --action deployInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test3" --name "test3" --symbol "TEST3" --decimals 18 deployInterchainToken tx: 0x9356315fa63f62f069956b1dba9dd2e5019b0029224d510278697f6b82d8c0fc ``` -``` +```bash node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test3" --gasValue 1000000000000000000 https://stagenet.axelarscan.io/gmp/0x4c5ba293957c9c08b3872c735067ea0d6bb7c60e2f83eb0560d441a971fee9c2 diff --git a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md index dec3b7e46..91e4d7307 100644 --- a/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md @@ -1,8 +1,10 @@ -# ITS Deployments +# Stellar ITS v1.1.1 + +## Steps ### Upload TokenManager & retrieve WASM hash -``` +```bash node stellar/deploy-contract.js upload TokenManager --version 1.1.1 Uploaded TokenManager wasm tx: 96387fdcbf32c5a30019fb14b692e5a0b75418c19391781da8ee59cb2cc48bf3 @@ -15,7 +17,7 @@ Contract uploaded successfully: { ### Upload InterchainToken & retrieve WASM hash -``` +```bash node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 Uploaded InterchainToken wasm tx: 251d6b04dc36f1c56aa99c09b1fd7704333e6813e94cc3aa713124d212b96e5b @@ -28,7 +30,7 @@ Contract uploaded successfully: { ### Upgrade InterchainTokenService & migrate storage schema -``` +```bash node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.1.2 --migration-data '{"newTokenManagerWasmHash":"9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c","newInterchainTokenWasmHash":"71648e1b8ee1231ea03c096257ed3c6d55478effbfab77b8e587a5139ab84cbe"}' Upgraded contract tx: be46ab9b6168a284d2ae0faa0c6f3498abc145e84abc0478571d3aa5073767ab @@ -36,7 +38,7 @@ Upgraded contract tx: be46ab9b6168a284d2ae0faa0c6f3498abc145e84abc0478571d3aa507 ### Call ITS::migrate_token for ALL deployed tokenIds (base64) -``` +```bash node stellar/its.js migrate-tokens "3OQqMLtE8vTBwWehxB3IAUAoFybxNbjV4pyXhgv1lwo=" "Ycf1QllLhjlb8FfTRi1I5ZpLN9u2SHeiaktMmkjXruk=" "hgCk3PiKUb4rIPgeg9BHL3Vkwrs20mpJErDxJEeG2EI=" "aL82NlxN1WLwsn27SRgZ5oKPZmI+l2GQDWMplCX22hQ=" "jzBSYAYAlSs3oIaHVFCd/Ou5dWIRBelJ+HmRUakcIPM=" "JPX22guaGus0Idr+O6//yXuWvZZmhWRCuiZ7VwjImD0=" "71UA0cka7t7WdzZscK9d7GA2R3mjBcY+i43FdRCUEyw=" "duMC51dDoYm5CMaR5IHLyG92Na59VmZ+uvRFVdiAPgs=" "20v3Yhagupg08MkM9XWucRVK2yU8WgKnpL4iYWOJyEA=" "xZnM6srsSlfMzSFh6xYqblDADTKRMKH8i5YJSj9lu+c=" "gZJCYZxzvwvSswXTbba617qr35yCR6lnBaraHAM12ck=" "cc6njm/zY85UuBcwV5DfnZHWQwU1ZGLAfTFu+H5JqXE=" "3x+VtlBv/H/sYTcXZ2a30i1itHqRWmpKEzuHa5mgXis=" "nh2GXgc053GnIIWlXezhFztcRVxDPiMoisr/Ebvy/JY=" "hp16iVNpHmS4VOHwxRptA5aXdLzR/kroSeqQ/qGHLsk=" "tGjmQdGE2Uk1+9r6Q14ZdLxhdmXw6uLT9G7BRaY+sr8=" "PrrXI+dMgrRlproa2biMpIW+B+l0F/eqIxZt79HRENA=" "oocckvNmRBhA1IHxcP4IqnFTtd5VQLwtqfmovl0C9kU=" "u0ljfh0l1AYB0ij8l5W2Dq8fDg0ZZWjFRNKNsJG/kek=" "IIZ3ovlibC9CIOAiHQGuD7gH/hVKAcbL3bQNIuF6vWY=" "w1Bsp4qdLqIMlMVXwpcxO+XRNYIrpKz2HphQUOemJ+Q=" --version 1.1.1 Wallet address: GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3 @@ -344,39 +346,38 @@ Migrated token tx: 3ca94a1ac93dec824461fbcf1494b6ebb118b13670d3e7ccd714d78569bcf ### Deploy Upgrader -``` +```bash node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 Initialized contract tx: f5363c9f3b691d6c64573f1de8635bf77cf7382e21c977dff42344c2f7eaabdf ``` -# ITS Checklist +## Checklist -## Stellar → EVM +### Stellar → EVM -``` +```bash node stellar/its.js deploy-interchain-token TEST132 test132 18 0x891012 100000000 Interchain Token Deployed tx: a0815faee69bc569299d0ba49123460937b2a187679d33152317d0fdc7218358 ``` -``` +```bash node stellar/its.js deploy-remote-interchain-token 0x891012 flow --gas-amount 50000000 https://testnet.axelarscan.io/gmp/607f195789220f937db8f9da0fab58288021281cffc84056f35597b0effa553d ``` -## EVM to Stellar +### EVM → Stellar -``` +```bash node evm/interchainTokenFactory.js --action deployInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test55" --name "test55" --symbol "TEST55" --decimals 18 https://evm-testnet.flowscan.io/tx/0x6267996edee9beb553f9d2d980a398e75396904652edfe7ddfeb11412a79bdf7 ``` -``` +```bash node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n flow --destinationChain stellar-2025-q1 --salt "test55" --gasValue 5000000000000000000 https://testnet.axelarscan.io/gmp/0x21d2fc1aa490ef77e733a2fab777d4bbb00c0c48e37ee97b0b9425fa1fc03e44 - ``` From 0d7927171ea5e0acb3f8213e08c78134bee57810 Mon Sep 17 00:00:00 2001 From: ahramy Date: Mon, 14 Apr 2025 14:02:28 -0700 Subject: [PATCH 26/71] feat: add query for cosmwasm contracts (#617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Noah B. 🥂 <15343884+nbayindirli@users.noreply.github.com> --- cosmwasm/cli-utils.js | 7 ++ cosmwasm/query.js | 65 +++++++++++++++++++ cosmwasm/utils.js | 7 ++ .../cosmwasm/2025-01-Stellar-GMP-v1.0.0.md | 5 +- .../cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 3 +- releases/cosmwasm/2025-02-XRPL-v1.0.0.md | 4 +- releases/cosmwasm/2025-03-Sui-GMP-v1.1.0.md | 3 +- 7 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 cosmwasm/query.js diff --git a/cosmwasm/cli-utils.js b/cosmwasm/cli-utils.js index 0ff32c5e2..429e1eb12 100644 --- a/cosmwasm/cli-utils.js +++ b/cosmwasm/cli-utils.js @@ -87,6 +87,12 @@ const addAmplifierOptions = (program, options) => { } }; +const addAmplifierQueryOptions = (program) => { + addEnvOption(program); + + program.addOption(new Option('-n, --chainName ', 'chain name').env('CHAIN').argParser((value) => value.toLowerCase())); +}; + const addContractOptions = (program) => { program.addOption(new Option('-c, --contractName ', 'contract name').makeOptionMandatory(true)); program.addOption(new Option('-n, --chainName ', 'chain name').env('CHAIN').argParser((value) => value.toLowerCase())); @@ -172,4 +178,5 @@ const addProposalOptions = (program) => { module.exports = { addAmplifierOptions, + addAmplifierQueryOptions, }; diff --git a/cosmwasm/query.js b/cosmwasm/query.js new file mode 100644 index 000000000..f7ef04c20 --- /dev/null +++ b/cosmwasm/query.js @@ -0,0 +1,65 @@ +'use strict'; + +const { prepareDummyWallet, prepareClient, initContractConfig } = require('./utils'); +const { loadConfig, printInfo, printWarn } = require('../common'); +const { Command } = require('commander'); +const { addAmplifierQueryOptions } = require('./cli-utils'); + +async function rewards(client, config, options) { + const { chainName } = options; + + const rewardsContractAddresses = { + multisig: config.axelar.contracts.Multisig.address, + voting_verifier: config.axelar.contracts.VotingVerifier?.[chainName]?.address, + }; + + for (const [key, address] of Object.entries(rewardsContractAddresses)) { + try { + const result = await client.queryContractSmart(config.axelar.contracts.Rewards.address, { + rewards_pool: { + pool_id: { + chain_name: chainName, + contract: address, + }, + }, + }); + + printInfo(`Rewards pool for ${key} on ${chainName}`, JSON.stringify(result, null, 2)); + } catch (error) { + printWarn(`Failed to fetch rewards pool for ${key} on ${chainName}`, `${error.message}`); + } + } +} + +const mainProcessor = async (processor, options) => { + const { env } = options; + const config = loadConfig(env); + + initContractConfig(config, options); + + const wallet = await prepareDummyWallet(options); + const client = await prepareClient(config, wallet); + + await processor(client, config, options); +}; + +const programHandler = () => { + const program = new Command(); + + program.name('query').description('Query contract state'); + + const rewardCmd = program + .command('rewards') + .description('Query rewards pool state for multisig and voting_verifier contracts') + .action((options) => { + mainProcessor(rewards, options); + }); + + addAmplifierQueryOptions(rewardCmd); + + program.parse(); +}; + +if (require.main === module) { + programHandler(); +} diff --git a/cosmwasm/utils.js b/cosmwasm/utils.js index ab3816d83..c016a07c5 100644 --- a/cosmwasm/utils.js +++ b/cosmwasm/utils.js @@ -51,8 +51,14 @@ const governanceAddress = 'axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj'; const AXELAR_R2_BASE_URL = 'https://static.axelar.network'; +const DUMMY_MNEMONIC = 'test test test test test test test test test test test junk'; + const prepareWallet = async ({ mnemonic }) => await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: 'axelar' }); +const prepareDummyWallet = async () => { + return await DirectSecp256k1HdWallet.fromMnemonic(DUMMY_MNEMONIC, { prefix: 'axelar' }); +}; + const prepareClient = async ({ axelar: { rpc, gasPrice } }, wallet) => await SigningCosmWasmClient.connectWithSigner(rpc, wallet, { gasPrice }); @@ -1179,6 +1185,7 @@ module.exports = { CONTRACTS, governanceAddress, prepareWallet, + prepareDummyWallet, prepareClient, fromHex, getSalt, diff --git a/releases/cosmwasm/2025-01-Stellar-GMP-v1.0.0.md b/releases/cosmwasm/2025-01-Stellar-GMP-v1.0.0.md index af3e83488..f8eeb66e2 100644 --- a/releases/cosmwasm/2025-01-Stellar-GMP-v1.0.0.md +++ b/releases/cosmwasm/2025-01-Stellar-GMP-v1.0.0.md @@ -323,9 +323,8 @@ ampd register-chain-support "[service name]" $CHAIN axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET -# Query to check if the funding command worked -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\",\"contract\":\"$MULTISIG\"}}}" --output json | jq . -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\",\"contract\":\"$VOTING_VERIFIER\"}}}" --output json | jq . +# Check reward pool to confirm funding worked +node cosmwasm/query.js rewards -n $CHAIN ``` 13. Create genesis verifier set diff --git a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md index 5061cc5c4..c785884ff 100644 --- a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -340,8 +340,7 @@ axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_na Check reward pool to confirm funding worked: ```bash -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\",\"contract\":\"$MULTISIG\"}}}" --output json | jq . -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\",\"contract\":\"$VOTING_VERIFIER\"}}}" --output json | jq . +node cosmwasm/query.js rewards -n $CHAIN ``` 13. Create genesis verifier set diff --git a/releases/cosmwasm/2025-02-XRPL-v1.0.0.md b/releases/cosmwasm/2025-02-XRPL-v1.0.0.md index b0c75d678..e0341fe61 100644 --- a/releases/cosmwasm/2025-02-XRPL-v1.0.0.md +++ b/releases/cosmwasm/2025-02-XRPL-v1.0.0.md @@ -421,9 +421,7 @@ axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_na 13. Ensure the reward pools were created correctly. ```bash -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\", \"contract\":\"$MULTISIG\"}}}" --output json | jq . - -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\", \"contract\":\"$XRPL_VOTING_VERIFIER\"}}}" --output json | jq . +node cosmwasm/query.js rewards -n $CHAIN ``` ## Checklist diff --git a/releases/cosmwasm/2025-03-Sui-GMP-v1.1.0.md b/releases/cosmwasm/2025-03-Sui-GMP-v1.1.0.md index 4b4c677f1..1bb8647b5 100644 --- a/releases/cosmwasm/2025-03-Sui-GMP-v1.1.0.md +++ b/releases/cosmwasm/2025-03-Sui-GMP-v1.1.0.md @@ -305,8 +305,7 @@ axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_na Check reward pool to confirm funding worked: ```bash -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\",\"contract\":\"$MULTISIG\"}}}" --output json | jq . -axelard q wasm contract-state smart $REWARDS "{\"rewards_pool\":{\"pool_id\":{\"chain_name\":\"$CHAIN\",\"contract\":\"$VOTING_VERIFIER\"}}}" --output json | jq . +node cosmwasm/query.js rewards -n $CHAIN ``` 13. Create genesis verifier set From 42a7fb66588c3e7fef708e28707158b010a23144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Mon, 14 Apr 2025 17:22:02 -0600 Subject: [PATCH 27/71] chore(stellar): remove v1.1 migration TODOs (#664) --- stellar/deploy-contract/processors.js | 59 +----------- stellar/its.js | 130 +------------------------- 2 files changed, 6 insertions(+), 183 deletions(-) diff --git a/stellar/deploy-contract/processors.js b/stellar/deploy-contract/processors.js index 8e047013d..0614f8991 100644 --- a/stellar/deploy-contract/processors.js +++ b/stellar/deploy-contract/processors.js @@ -1,17 +1,8 @@ 'use strict'; -const { Address, nativeToScVal, scValToNative, Operation, authorizeInvocation, xdr, rpc } = require('@stellar/stellar-sdk'); +const { Address, nativeToScVal, scValToNative, Operation, Contract } = require('@stellar/stellar-sdk'); const { loadConfig, printInfo, saveConfig } = require('../../evm/utils'); -const { - getWallet, - broadcast, - serializeValue, - getContractCodePath, - BytesToScVal, - getUploadContractCodePath, - createAuthorizedFunc, - getNetworkPassphrase, -} = require('../utils'); +const { getWallet, broadcast, serializeValue, getContractCodePath, BytesToScVal, getUploadContractCodePath } = require('../utils'); const { getDomainSeparator, getChainConfig } = require('../../common'); const { prompt, validateParameters } = require('../../common/utils'); const { weightedSignersToScVal } = require('../type-utils'); @@ -88,16 +79,10 @@ const upgrade = async (options, _, chain, contractName) => { const newWasmHash = await uploadWasm(wallet, chain, options.contractCodePath, contractName); printInfo('New Wasm hash', serializeValue(newWasmHash)); - // TODO: Revert this after v1.1.1 release - const version = sanitizeUpgradeVersion(options.version); + const args = [contractAddress, options.version, newWasmHash, [options.migrationData]].map(nativeToScVal); - // TODO: Revert this after v1.1.1 release - const operation = Operation.invokeContractFunction({ - contract: chain.contracts.Upgrader.address, - function: 'upgrade', - args: [contractAddress, version, newWasmHash, [options.migrationData]].map(nativeToScVal), - auth: await createUpgradeAuths(contractAddress, newWasmHash, options.migrationData, chain, wallet), - }); + const upgrader = new Contract(upgraderAddress); + const operation = upgrader.call('upgrade', ...args); await broadcast(operation, wallet, chain, 'Upgraded contract', options); chain.contracts[contractName].wasmHash = serializeValue(newWasmHash); @@ -233,40 +218,6 @@ const mainProcessor = async (options, processor, contractName) => { saveConfig(config, options.env); }; -// TODO: Remove this after v1.1.1 release -async function createUpgradeAuths(contractAddress, newWasmHash, migrationData, chain, wallet) { - // 20 seems a reasonable number of ledgers to allow for the upgrade to take effect - const validUntil = await new rpc.Server(chain.rpc).getLatestLedger().then((info) => info.sequence + 20); - - return Promise.all( - [ - createAuthorizedFunc(contractAddress, 'upgrade', [nativeToScVal(newWasmHash)]), - createAuthorizedFunc(contractAddress, 'migrate', [nativeToScVal(migrationData)]), - ].map((auth) => - authorizeInvocation( - wallet, - validUntil, - new xdr.SorobanAuthorizedInvocation({ - function: auth, - subInvocations: [], - }), - wallet.publicKey(), - getNetworkPassphrase(chain.networkType), - ), - ), - ); -} - -// TODO: Remove this after v1.1.1 release -/* Note: Once R2 uploads for stellar use the cargo version number (does not include 'v' prefix), this will no longer be necessary. */ -function sanitizeUpgradeVersion(version) { - if (version.startsWith('v')) { - return version.slice(1); - } - - return version; -} - module.exports = { deploy, upgrade, diff --git a/stellar/its.js b/stellar/its.js index a30588791..537090eca 100644 --- a/stellar/its.js +++ b/stellar/its.js @@ -1,6 +1,6 @@ 'use strict'; -const { Contract, nativeToScVal, Address, Operation, rpc, authorizeInvocation, xdr } = require('@stellar/stellar-sdk'); +const { Contract, nativeToScVal } = require('@stellar/stellar-sdk'); const { Command, Option } = require('commander'); const { saveConfig, @@ -22,8 +22,6 @@ const { hexToScVal, saltToBytes32, serializeValue, - createAuthorizedFunc, - getNetworkPassphrase, } = require('./utils'); const { prompt, parseTrustedChains, encodeITSDestination } = require('../common/utils'); @@ -185,124 +183,6 @@ async function execute(wallet, _, chain, contract, args, options) { await broadcast(operation, wallet, chain, 'Executed', options); } -// TODO: Remove this after v1.1.1 release -async function migrateTokens(wallet, _, chain, contract, args, options) { - let tokenIds = Array.isArray(args) ? args : [args]; - - tokenIds = tokenIds.map((tokenId) => '0x'.concat(Buffer.from(tokenId, 'base64').toString('hex'))); - - for (const tokenId of tokenIds) { - printInfo('Migrating token', tokenId); - printInfo('Upgrader address', chain.contracts.Upgrader.address); - - const tokenIdScVal = hexToScVal(tokenId); - const upgraderAddressScVal = nativeToScVal(Address.fromString(chain.contracts.Upgrader.address), { type: 'address' }); - const newVersionScVal = nativeToScVal(options.version, { type: 'string' }); - - const tokenManagerAddressOperation = contract.call('token_manager_address', tokenIdScVal); - const tokenManagerAddressResult = await broadcast( - tokenManagerAddressOperation, - wallet, - chain, - 'Retrieved TokenManager address', - options, - ); - const tokenManagerAddress = serializeValue(tokenManagerAddressResult.value()); - - printInfo('TokenManager address', tokenManagerAddress); - - const interchainTokenAddressOperation = contract.call('interchain_token_address', tokenIdScVal); - const interchainTokenAddressResult = await broadcast( - interchainTokenAddressOperation, - wallet, - chain, - 'Retrieved InterchainToken address', - options, - ); - const interchainTokenAddress = serializeValue(interchainTokenAddressResult.value()); - - printInfo('InterchainToken address', interchainTokenAddress); - - const auths = await createMigrateTokenAuths( - contract, - tokenManagerAddress, - interchainTokenAddress, - tokenIdScVal, - upgraderAddressScVal, - newVersionScVal, - chain, - wallet, - ); - - const operation = Operation.invokeContractFunction({ - contract: chain.contracts.InterchainTokenService.address, - function: 'migrate_token', - args: [tokenIdScVal, upgraderAddressScVal, newVersionScVal], - auth: auths, - }); - - await broadcast(operation, wallet, chain, 'Migrated token', options); - } -} - -// TODO: Remove this after v1.1.1 release -async function createMigrateTokenAuths( - contract, - tokenManagerAddress, - interchainTokenAddress, - tokenIdScVal, - upgraderAddressScVal, - newVersionScVal, - chain, - wallet, -) { - // 20 seems a reasonable number of ledgers to allow for the upgrade to take effect - const validUntil = await new rpc.Server(chain.rpc).getLatestLedger().then((info) => info.sequence + 20); - - const walletAuth = await authorizeInvocation( - wallet, - validUntil, - new xdr.SorobanAuthorizedInvocation({ - function: createAuthorizedFunc(Address.fromString(chain.contracts.InterchainTokenService.address), 'migrate_token', [ - tokenIdScVal, - upgraderAddressScVal, - newVersionScVal, - ]), - subInvocations: [], - }), - wallet.publicKey(), - getNetworkPassphrase(chain.networkType), - ); - - const contractAuths = [ - createAuthorizedFunc(Address.fromString(tokenManagerAddress), 'upgrade', [ - nativeToScVal(chain.contracts.InterchainTokenService.initializeArgs.tokenManagerWasmHash), - ]), - createAuthorizedFunc(Address.fromString(tokenManagerAddress), 'migrate', [nativeToScVal(null)]), - createAuthorizedFunc(Address.fromString(interchainTokenAddress), 'upgrade', [ - nativeToScVal(chain.contracts.InterchainTokenService.initializeArgs.interchainTokenWasmHash), - ]), - createAuthorizedFunc(Address.fromString(interchainTokenAddress), 'migrate', [nativeToScVal(null)]), - ].map((auth, index) => { - const sorobanAddressCredentials = new xdr.SorobanAddressCredentials({ - address: Address.fromString(chain.contracts.InterchainTokenService.address).toScAddress(), - nonce: xdr.Int64.fromString(index.toString()), - signatureExpirationLedger: validUntil, - signature: xdr.ScVal.scvVec([]), - }); - - return new xdr.SorobanAuthorizationEntry({ - rootInvocation: new xdr.SorobanAuthorizedInvocation({ - function: auth, - subInvocations: [], - }), - credentials: xdr.SorobanCredentials.sorobanCredentialsAddress(sorobanAddressCredentials), - }); - }); - - return [walletAuth, ...contractAuths]; -} - async function mainProcessor(processor, args, options) { const { yes } = options; const config = loadConfig(options.env); @@ -398,14 +278,6 @@ if (require.main === module) { mainProcessor(execute, [sourceChain, messageId, sourceAddress, payload], options); }); - program - .command('migrate-tokens ') - .description('Migrates token TokenManagers and InterchainTokens to a new version') - .addOption(new Option('--version ', 'The version to migrate to')) - .action((tokenIds, options) => { - mainProcessor(migrateTokens, tokenIds, options); - }); - addOptionsToCommands(program, addBaseOptions); program.parse(); From fefc8d75047e46ddf143b395e6e48df4ccebe6d5 Mon Sep 17 00:00:00 2001 From: Laith Bahodi <70682032+hydrobeam@users.noreply.github.com> Date: Tue, 15 Apr 2025 00:44:11 -0400 Subject: [PATCH 28/71] feat(stellar): add deployment script for testing (#428) Co-authored-by: ahramy Co-authored-by: Milap Sheth --- .github/actions/setup-stellar/action.yml | 93 ++++++++++++++++++++++++ .github/workflows/test-stellar.yaml | 73 +++++++++++++++++++ stellar/generate-bindings.js | 8 +- stellar/utils.js | 18 ++++- 4 files changed, 185 insertions(+), 7 deletions(-) create mode 100644 .github/actions/setup-stellar/action.yml create mode 100644 .github/workflows/test-stellar.yaml diff --git a/.github/actions/setup-stellar/action.yml b/.github/actions/setup-stellar/action.yml new file mode 100644 index 000000000..cb04ee560 --- /dev/null +++ b/.github/actions/setup-stellar/action.yml @@ -0,0 +1,93 @@ +name: Setup Stellar CLI & Network +description: Install Stellar CLI and start a local Stellar network + +runs: + using: 'composite' + steps: + - name: Install stable Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Install Stellar CLI + shell: bash + run: cargo install --locked stellar-cli --version 22.2.0 --features opt + + - name: Set environment variables + id: env + shell: bash + run: | + RPC=http://localhost:8000 + echo "horizon_rpc=$RPC/" >> $GITHUB_OUTPUT + echo "soroban_rpc=$RPC/soroban/rpc" >> $GITHUB_OUTPUT + echo "friendbot=$RPC/friendbot" >> $GITHUB_OUTPUT + echo "network_passphrase='Standalone Network ; February 2017'" >> $GITHUB_OUTPUT + + - name: Start Stellar local network + shell: bash + run: | + stellar container start local --protocol-version 22 + + - name: Wait for Stellar network + shell: bash + run: | + MAX_WAIT=120 + ELAPSED=0 + + echo "Waiting for Stellar network to become ready..." + while true; do + echo "Checking Friendbot: ${{ steps.env.outputs.friendbot }} ..." + if curl -s "${{ steps.env.outputs.friendbot }}" | grep -q '"status"'; then + echo "✅ Stellar Network is ready" + exit 0 + fi + + sleep 2 + ELAPSED=$((ELAPSED + 2)) + + if [ "$ELAPSED" -ge "$MAX_WAIT" ]; then + echo "Timed out after $MAX_WAIT seconds waiting for Stellar network." + exit 1 + fi + + echo " - Stellar Network not ready yet" + + done + + - name: Add as configured network + shell: bash + run: | + stellar network add local \ + --rpc-url "${{ steps.env.outputs.soroban_rpc }}" \ + --network-passphrase "${{ steps.env.outputs.network_passphrase }}" + + - name: Prepare local.json + shell: bash + run: | + echo '{ + "chains": { + "stellar": { + "name": "Stellar", + "axelarId": "stellar", + "networkType": "local", + "chainType": "stellar", + "tokenSymbol": "XLM", + "tokenAddress": "CDMLFMKMMD7MWZP3FKUBZPVHTUEDLSX4BYGYKH4GCESXYHS3IHQ4EIG4", + "rpc": "${{ steps.env.outputs.soroban_rpc }}", + "horizonRpc": "${{ steps.env.outputs.horizon_rpc }}", + "contracts": {} + } + } + }' > ./axelar-chains-config/info/local.json + + - name: Display local.json + shell: bash + run: cat ./axelar-chains-config/info/local.json + + - name: Prepare .env + shell: bash + run: | + # Since the root account is derived from the network passphrase, it can be safely considered static. + echo "PRIVATE_KEY=SC5O7VZUXDJ6JBDSZ74DSERXL7W3Y5LTOAMRF7RQRL3TAGAPS7LUVG3L" >> .env + echo "ACCOUNT_ID=GBZXN7PIRZGNMHGA7MUUUF4GWPY5AYPV6LY4UV2GL6VJGIQRXFDNMADI" >> .env + echo "ENV=local" >> .env + echo "CHAIN=stellar" >> .env + echo "YES=true" >> .env diff --git a/.github/workflows/test-stellar.yaml b/.github/workflows/test-stellar.yaml new file mode 100644 index 000000000..31bd4f114 --- /dev/null +++ b/.github/workflows/test-stellar.yaml @@ -0,0 +1,73 @@ +name: Test Stellar + +on: pull_request + +jobs: + check-relevant-changes: + name: Check for Relevant Changes + runs-on: blacksmith-2vcpu-ubuntu-2204 + outputs: + run_tests: ${{ steps.filter.outputs.stellar == 'true' || steps.filter.outputs.common == 'true' || steps.filter.outputs.github == 'true' }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + stellar: + - 'stellar/**' + common: + - 'common/**' + github: + - '.github/workflows/test-stellar.yaml' + - name: Summarize Changes + run: | + echo "Changes in stellar: ${{ steps.filter.outputs.stellar }}" + echo "Changes in common: ${{ steps.filter.outputs.common }}" + echo "Changes in github: ${{ steps.filter.outputs.github }}" + + test-stellar: + name: Test Stellar + needs: check-relevant-changes + if: ${{ needs.check-relevant-changes.outputs.run_tests == 'true' }} + runs-on: blacksmith-8vcpu-ubuntu-2204 + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Checkout axelar-amplifier-stellar repo + uses: actions/checkout@v4 + with: + repository: axelarnetwork/axelar-amplifier-stellar + path: axelar-amplifier-stellar + + - name: Get latest short commit for axelar-amplifier-stellar + id: commit_hash + run: | + cd axelar-amplifier-stellar + git fetch --all + COMMIT_HASH=$(git rev-parse --short HEAD) + echo "hash=${COMMIT_HASH}" >> $GITHUB_OUTPUT + + - name: Install Node.js + uses: useblacksmith/setup-node@v5 + with: + node-version: 18.x + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Setup Stellar network + uses: ./.github/actions/setup-stellar + + ###### Command: Deploy Contract ###### + + - name: Deploy AxelarOperators + run: node stellar/deploy-contract deploy AxelarOperators --version ${{ steps.commit_hash.outputs.hash }} + + - name: Deploy AxelarGasService + run: node stellar/deploy-contract deploy AxelarGasService --version ${{ steps.commit_hash.outputs.hash }} + + - name: Deploy AxelarGateway + run: node stellar/deploy-contract deploy AxelarGateway --version ${{ steps.commit_hash.outputs.hash }} diff --git a/stellar/generate-bindings.js b/stellar/generate-bindings.js index 735c9e7d0..c46ec646f 100644 --- a/stellar/generate-bindings.js +++ b/stellar/generate-bindings.js @@ -5,13 +5,15 @@ const { execSync } = require('child_process'); const { loadConfig } = require('../evm/utils'); const path = require('path'); const { stellarCmd, getNetworkPassphrase } = require('./utils'); -const { addEnvOption } = require('../common'); +const { addEnvOption, getChainConfig } = require('../common'); const { validateParameters } = require('../common/utils'); require('./cli-utils'); -function processCommand(options, _, chain) { +function processCommand(options, config) { const { artifactPath, contractId, outputDir } = options; + const chain = getChainConfig(config, options.chainName); + validateParameters({ isValidStellarAddress: { contractId }, }); @@ -43,7 +45,7 @@ function main() { program.action((options) => { const config = loadConfig(options.env); - processCommand(options, config, config.stellar); + processCommand(options, config); }); program.parse(); diff --git a/stellar/utils.js b/stellar/utils.js index b1aa8eb82..52a170387 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -50,7 +50,7 @@ const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { function getNetworkPassphrase(networkType) { switch (networkType) { case 'local': - return Networks.SANDBOX; + return Networks.STANDALONE; case 'futurenet': return Networks.FUTURENET; case 'testnet': @@ -173,7 +173,7 @@ async function sendTransaction(tx, server, action, options = {}) { } async function broadcast(operation, wallet, chain, action, options = {}, simulateTransaction = false) { - const server = new rpc.Server(chain.rpc); + const server = new rpc.Server(chain.rpc, { allowHttp: chain.networkType === 'local' }); if (options.estimateCost) { const tx = await buildTransaction(operation, server, wallet, chain.networkType, options); @@ -202,11 +202,21 @@ function getAssetCode(balance, chain) { return balance.asset_type === 'native' ? chain.tokenSymbol : balance.asset_code; } +/* + * To enable connecting to the local network, allowHttp needs to be set to true. + * This is necessary because the local network does not accept HTTPS requests. + */ +function getRpcOptions(chain) { + return { + allowHttp: chain.networkType === 'local', + }; +} + async function getWallet(chain, options) { const keypair = Keypair.fromSecret(options.privateKey); const address = keypair.publicKey(); - const provider = new rpc.Server(chain.rpc); - const horizonServer = new Horizon.Server(chain.horizonRpc); + const provider = new rpc.Server(chain.rpc, getRpcOptions(chain)); + const horizonServer = new Horizon.Server(chain.horizonRpc, getRpcOptions(chain)); const balances = await getBalances(horizonServer, address); printInfo('Wallet address', address); From 2754ab3faec359b48cabc323bea8cfc6ea2636a2 Mon Sep 17 00:00:00 2001 From: ahramy Date: Tue, 22 Apr 2025 08:35:21 -0700 Subject: [PATCH 29/71] chore(stellar): update readme and remove generate bindings (#667) --- stellar/README.md | 48 ++++++++++++------------------- stellar/generate-bindings.js | 56 ------------------------------------ 2 files changed, 19 insertions(+), 85 deletions(-) delete mode 100644 stellar/generate-bindings.js diff --git a/stellar/README.md b/stellar/README.md index 0fafa15fb..525fdc636 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -28,13 +28,17 @@ stellar network add \ Create a new Stellar keypair ```bash +# Generate keypair stellar keys generate wallet --network testnet # Address stellar keys address wallet -# Get private key +# Private Key stellar keys show wallet + +# Remove the keypair +stellar keys rm wallet --global; ``` Set `PRIVATE_KEY` in `.env` to the above value. @@ -54,6 +58,7 @@ Setup ```bash cargo build +cargo test stellar contract build ``` @@ -68,7 +73,7 @@ stellar contract build Deploy the gateway contract ```bash -node stellar/deploy-contract.js deploy AxelarGateway --version v1.0.0 +node stellar/deploy-contract.js deploy AxelarGateway --version X.Y.Z ``` Provide `--estimate-cost` to show the gas costs for the initialize transaction instead of executing it. @@ -76,40 +81,33 @@ Provide `--estimate-cost` to show the gas costs for the initialize transaction i ### Operators ```bash -node stellar/deploy-contract.js deploy AxelarOperators --version v1.0.0 +node stellar/deploy-contract.js deploy AxelarOperators --version X.Y.Z ``` ### Gas Service ```bash -node stellar/deploy-contract.js deploy AxelarGasService --version v1.0.0 +node stellar/deploy-contract.js deploy AxelarGasService --version X.Y.Z ``` ### Interchain Token Service -Deploy Interchain Token and Token Manager wasm first. - ```bash -node stellar/deploy-contract.js deploy InterchainToken --version v1.0.0 -node stellar/deploy-contract.js deploy TokenManager --version v1.0.0 -node stellar/deploy-contract.js deploy InterchainTokenService --version v1.0.0 +node stellar/deploy-contract.js deploy InterchainTokenService --version X.Y.Z ``` -### Example - -Note that example contract should use `--artifact-path` or `--version` option to deploy contract. The contract wasm binary can be passed by specifiying the wasm file path or by specifying the contract version. The contract version has to a be a tagged release in semantic version format X.Y.Z or a commit hash. +### Axelar Example - -- `node stellar/deploy-contract.js deploy AxelarExample --artifact-path ../axelar-amplifier-stellar/target/wasm32-unknown-unknown/release/stellar_example.optimized.wasm` - -- `node stellar/deploy-contract.js deploy AxelarExample --version 1.0.0` +```bash +node stellar/deploy-contract.js deploy AxelarExample --version X.Y.Z +``` ## Upgrades To facilitate contract upgrades, the `Upgrader` contract needs to be deployed first. ```bash -node stellar/deploy-contract.js deploy Upgrader --version v1.0.0 +node stellar/deploy-contract.js deploy Upgrader --version X.Y.Z ``` After the `Upgrader` is deployed, any other instantiated contract can be upgraded by calling the `upgrade` function @@ -174,14 +172,6 @@ node stellar/deploy-contract.js upload --artifact-path ./axelar- --- -## Generate bindings - -Generate TypeScript bindings for the contract - -```bash -node stellar/generate-bindings.js --artifact-path /path/to/optimized.wasm --contract-id [contract-address] --output-dir ./stellar/bindings/[contract-name] -``` - ## Contract Interaction Soroban contracts can be interacted directly via the CLI as well. See the help text for individual contract cmds as follows. @@ -275,7 +265,7 @@ node stellar/its.js deploy-interchain-token [name] [symbol] [decimal] [salt] [in #### Deploy Remote Interchain Token ```bash -node stellar/its.js deploy-remote-interchain-token [salt] [destination-chain] --gas-token-address [address] --gas-amount [amount] +node stellar/its.js deploy-remote-interchain-token [salt] [destination-chain] --gas-amount [amount] ``` #### Register Canonical Token @@ -287,13 +277,13 @@ node stellar/its.js register-canonical-token [token-address] #### Deploy Remote Canonical Token ```bash -node stellar/its.js deploy-remote-canonical-token [token-address] [destination-chain] --gas-token-address [address] --gas-amount [amount] +node stellar/its.js deploy-remote-canonical-token [token-address] [destination-chain] --gas-amount [amount] ``` #### Interchain Transfer ```bash -node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --data [data] --gas-token-address [address] --gas-amount [amount] +node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --data [data] --gas-amount [amount] ``` #### Execute @@ -332,7 +322,7 @@ node stellar/contract.js restore-instance [contract-name] #### GMP - Send Command (Outgoing) ```bash -node stellar/gmp.js send [destination-chain] [destination-address] [payload] --gas-token-address [address] --gas-amount [amount] +node stellar/gmp.js send [destination-chain] [destination-address] [payload] --gas-amount [amount] # Example node stellar/gmp.js send avalanche 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 diff --git a/stellar/generate-bindings.js b/stellar/generate-bindings.js deleted file mode 100644 index c46ec646f..000000000 --- a/stellar/generate-bindings.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -const { Command, Option } = require('commander'); -const { execSync } = require('child_process'); -const { loadConfig } = require('../evm/utils'); -const path = require('path'); -const { stellarCmd, getNetworkPassphrase } = require('./utils'); -const { addEnvOption, getChainConfig } = require('../common'); -const { validateParameters } = require('../common/utils'); -require('./cli-utils'); - -function processCommand(options, config) { - const { artifactPath, contractId, outputDir } = options; - - const chain = getChainConfig(config, options.chainName); - - validateParameters({ - isValidStellarAddress: { contractId }, - }); - - const overwrite = true; - - const { rpc, networkType } = chain; - const networkPassphrase = getNetworkPassphrase(networkType); - - const cmd = `${stellarCmd} contract bindings typescript --wasm ${artifactPath} --rpc-url ${rpc} --network-passphrase "${networkPassphrase}" --contract-id ${contractId} --output-dir ${outputDir} ${ - overwrite ? '--overwrite' : '' - }`; - console.log(`Executing command: ${cmd}`); - - execSync(cmd, { stdio: 'inherit' }); - console.log('Bindings generated successfully!'); -} - -function main() { - const program = new Command(); - program.name('Generate TypeScript Bindings for Soroban contract').description('Generates TypeScript bindings for a Soroban contract.'); - - addEnvOption(program); - program.addOption(new Option('--artifact-path ', 'path to the WASM file').makeOptionMandatory(true)); - program.addOption(new Option('--contract-id ', 'contract ID').makeOptionMandatory(true)); - program.addOption( - new Option('--output-dir ', 'output directory for the generated bindings').default(path.join(__dirname, 'bindings')), - ); - - program.action((options) => { - const config = loadConfig(options.env); - processCommand(options, config); - }); - - program.parse(); -} - -if (require.main === module) { - main(); -} From 5d55a20d2916333c734c70a37923d498a72769d5 Mon Sep 17 00:00:00 2001 From: Nikolaos Kamarinakis Date: Wed, 23 Apr 2025 08:15:35 -0400 Subject: [PATCH 30/71] chore(xrpl): upgrade xrpl.js dependency (#672) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1eb5955d..fcf581d8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "csv-parser": "^3.0.0", "path": "^0.12.7", "toml": "^3.0.0", - "xrpl": "^4.2.0" + "xrpl": "^4.2.5" }, "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", @@ -11592,9 +11592,9 @@ } }, "node_modules/xrpl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.2.0.tgz", - "integrity": "sha512-RR6lJhRyQHPoI/rZGuKBzUc45KSC3thpYVzn3ATu78GXDZ6vsyn8SXmNveMhAJ2AVRvpRiyyztbU2TmGRUp2Xg==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.2.5.tgz", + "integrity": "sha512-QIpsqvhaRiVvlq7px7lC+lhrxESDMN1vd8mW0SfTgY5WgzP9RLiDoVywOOvSZqDDjPs0EGfhxzYjREW1gGu0Ng==", "license": "ISC", "dependencies": { "@scure/bip32": "^1.3.1", diff --git a/package.json b/package.json index 43c1f733e..6534c42e6 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "csv-parser": "^3.0.0", "path": "^0.12.7", "toml": "^3.0.0", - "xrpl": "^4.2.0" + "xrpl": "^4.2.5" }, "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", From cb1abaed30706ea8ad1dec44e7ab2e9560fceec2 Mon Sep 17 00:00:00 2001 From: Nikolaos Kamarinakis Date: Wed, 23 Apr 2025 09:58:28 -0400 Subject: [PATCH 31/71] docs(release): migrate to XRPL v1.1.1 (#654) --- releases/cosmwasm/2025-04-XRPL-v1.1.1.md | 178 +++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 releases/cosmwasm/2025-04-XRPL-v1.1.1.md diff --git a/releases/cosmwasm/2025-04-XRPL-v1.1.1.md b/releases/cosmwasm/2025-04-XRPL-v1.1.1.md new file mode 100644 index 000000000..426bebe01 --- /dev/null +++ b/releases/cosmwasm/2025-04-XRPL-v1.1.1.md @@ -0,0 +1,178 @@ +# XRPL Amplifier v1.1.1 + +| | **Owner** | +|----------------|--------------------------------------------------------------------------| +| **Created By** | @k4m4 | +| **Deployment** | @isi8787 , @k4m4 | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-04-08 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +Releases: +- [XRPLMultisigProver v1.1.1](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.1.1) +- [XRPLGateway v1.1.1](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.1.1) +- [XRPLVotingVerifier v1.1.1](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-voting-verifier-v1.1.1) + +## Background + +Changes in this release: + +1. Remove redundant `service-registry` XRPLMultisigProver dependency +1. Use ChainNameRaw instead of ChainName for destination chain +1. Represent XRPL addresses as UTF-8 +1. Use same `Voted` & `PollEnded` events in XRPLVotingVerifier as EVM VotingVerifier +1. Update to ampd-v1.7.0 (which modifies `XRPLCurrency` and makes `destination_chain` type be `ChainNameRaw`) +1. Fix next sequence number computation + +## Deployment + +- This rollout upgrades XRPLMultisigProver & XRPLVotingVerifier from `v1.0.0` to `v1.1.1` and XRPLGateway from `v1.0.1` to `v1.1.1` +- There is no migration involved, i.e., the migrate step will just update the code + +1. Create `.env`. + +| Network | `INIT_ADDRESSES` | `RUN_AS_ACCOUNT` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Devnet-amplifier** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +| Network | `DEPOSIT_VALUE` | +| -------------------- | --------------- | +| **Devnet-amplifier** | `100000000` | +| **Stagenet** | `100000000` | +| **Testnet** | `2000000000` | +| **Mainnet** | `2000000000` | + +```bash +MNEMONIC=xyz +ENV=abc +CHAIN=xrpl +RPC_URL= # Axelar RPC URL +RELEASES_BASE_URL=https://pub-7233af746dc8432f8d9547af0133309d.r2.dev +ARTIFACT_PATH=wasm +XRPL_MULTISIG_PROVER= +XRPL_GATEWAY= +XRPL_VOTING_VERIFIER= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.1.1/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.1.1/xrpl_gateway.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.1.1/xrpl_voting_verifier.wasm --directory-prefix=$ARTIFACT_PATH +``` + +3. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.1.1/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_multisig_prover.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_multisig_prover.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.1.1/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_gateway.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_gateway.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.1.1/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_voting_verifier.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_voting_verifier.wasm | grep $CHECKSUM +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +2c17d83304aa2c53fe302e77e48584663dff77dc1423d1be5e787991bad348ce wasm/xrpl_multisig_prover.wasm +7a1e3fc579fd112ef1d369daa9a070ca694345dce55c3a1240b882655be683cd wasm/xrpl_gateway.wasm +d7e696c139ba9a6b102586f4d6f06641f49d075f2af48d7a849e967fe6ec1684 wasm/xrpl_voting_verifier.wasm +``` + +4. Store contracts. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplMultisigProver \ + -t "Upload XRPLMultisigProver contract v1.1.1" \ + -d "Upload XRPLMultisigProver contract v1.1.1" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES + +node cosmwasm/submit-proposal.js store \ + -c XrplGateway \ + -t "Upload XRPLGateway contract v1.1.1" \ + -d "Upload XRPLGateway contract v1.1.1" \ + -a "$ARTIFACT_PATH/xrpl_gateway.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES + +node cosmwasm/submit-proposal.js store \ + -c XrplVotingVerifier \ + -t "Upload XRPLVotingVerifier contract v1.1.1" \ + -d "Upload XRPLVotingVerifier contract v1.1.1" \ + -a "$ARTIFACT_PATH/xrpl_voting_verifier.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +5. Migrate contracts. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplMultisigProver \ + -t "Migrate XRPLMultisigProver to v1.1.1" \ + -d "Migrate XRPLMultisigProver to v1.1.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE + +node cosmwasm/submit-proposal.js migrate \ + -c XrplGateway \ + -t "Migrate XRPLGateway to v1.1.1" \ + -d "Migrate XRPLGateway to v1.1.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE + +node cosmwasm/submit-proposal.js migrate \ + -c XrplVotingVerifier \ + -t "Migrate XRPLVotingVerifier to v1.1.1" \ + -d "Migrate XRPLVotingVerifier to v1.1.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify contract versions: + +```bash +axelard query wasm contract-state raw $XRPL_MULTISIG_PROVER 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +axelard query wasm contract-state raw $XRPL_GATEWAY 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +axelard query wasm contract-state raw $XRPL_VOTING_VERIFIER 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-multisig-prover","version":"1.1.1"} +{"contract":"xrpl-gateway","version":"1.1.1"} +{"contract":"xrpl-voting-verifier","version":"1.1.1"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. From cae40b21c810ea23dcfa1002d185c955edced5f6 Mon Sep 17 00:00:00 2001 From: Nikolaos Kamarinakis Date: Thu, 24 Apr 2025 05:47:05 -0400 Subject: [PATCH 32/71] docs(release): migrate to XRPL v1.1.2 (#670) --- releases/cosmwasm/2025-04-XRPL-v1.1.2.md | 179 +++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 releases/cosmwasm/2025-04-XRPL-v1.1.2.md diff --git a/releases/cosmwasm/2025-04-XRPL-v1.1.2.md b/releases/cosmwasm/2025-04-XRPL-v1.1.2.md new file mode 100644 index 000000000..e9b008563 --- /dev/null +++ b/releases/cosmwasm/2025-04-XRPL-v1.1.2.md @@ -0,0 +1,179 @@ +# XRPL Amplifier v1.1.2 + +| | **Owner** | +|----------------|------------------------------------------------------------------------------------------------------------| +| **Created By** | @k4m4 | +| **Deployment** | @@blockchainguyy , @isi8787 , @k4m4 | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-04-22 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +Releases: +- [XRPLMultisigProver v1.1.2](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.1.2) +- [XRPLGateway v1.1.2](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.1.2) +- [XRPLVotingVerifier v1.1.2](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-voting-verifier-v1.1.2) + +## Background + +Changes in this release: + +1. Allow `message_to_sign` for non-pending TXs in XRPLMultisigProver +1. Minor refactoring (removing hardcoded values & redundant comments) +1. Fix inaccurate `FailedToGetMessagesStatus` error message in XRPLMultisigProver +1. Refactor XRPLVotingVerifier to match its EVM counterpart (e.g., same QuorumReached with multiple messages structure) +1. Assign a new ticket if the last transaction failed on chain, to enable retries +1. Fix incorrect signing session expiration condition +1. Allow admin to `ChangeAdmin` + +## Deployment + +- This rollout upgrades the XRPLGateway, XRPLMultisigProver, & XRPLVotingVerifier from `v1.1.1` to `v1.1.2` +- There is no migration involved, i.e., the migrate step will just update the code + +1. Create `.env`. + +| Network | `INIT_ADDRESSES` | `RUN_AS_ACCOUNT` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Devnet-amplifier** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +| Network | `DEPOSIT_VALUE` | +| -------------------- | --------------- | +| **Devnet-amplifier** | `100000000` | +| **Stagenet** | `100000000` | +| **Testnet** | `2000000000` | +| **Mainnet** | `2000000000` | + +```bash +MNEMONIC=xyz +ENV=abc +CHAIN=xrpl +RPC_URL= # Axelar RPC URL +RELEASES_BASE_URL=https://pub-7233af746dc8432f8d9547af0133309d.r2.dev +ARTIFACT_PATH=wasm +XRPL_MULTISIG_PROVER= +XRPL_GATEWAY= +XRPL_VOTING_VERIFIER= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.1.2/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.1.2/xrpl_gateway.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.1.2/xrpl_voting_verifier.wasm --directory-prefix=$ARTIFACT_PATH +``` + +3. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.1.2/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_multisig_prover.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_multisig_prover.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.1.2/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_gateway.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_gateway.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.1.2/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_voting_verifier.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_voting_verifier.wasm | grep $CHECKSUM +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +0468518d4a3f0fe7033a0baad99ca0057685bd2c607c51ce9d341caacabb3462 wasm/xrpl_multisig_prover.wasm +806cdb054e7576f8d8591c9278d3909f0a937d9dfd8259d92a68a4b7b756212c wasm/xrpl_gateway.wasm +63af81c145dca0b5961ef9361a2f1a32019f97ed818a321035b614ea7dfbba9d wasm/xrpl_voting_verifier.wasm +``` + +4. Store contracts. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplMultisigProver \ + -t "Upload XRPLMultisigProver contract v1.1.2" \ + -d "Upload XRPLMultisigProver contract v1.1.2" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES + +node cosmwasm/submit-proposal.js store \ + -c XrplGateway \ + -t "Upload XRPLGateway contract v1.1.2" \ + -d "Upload XRPLGateway contract v1.1.2" \ + -a "$ARTIFACT_PATH/xrpl_gateway.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES + +node cosmwasm/submit-proposal.js store \ + -c XrplVotingVerifier \ + -t "Upload XRPLVotingVerifier contract v1.1.2" \ + -d "Upload XRPLVotingVerifier contract v1.1.2" \ + -a "$ARTIFACT_PATH/xrpl_voting_verifier.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +5. Migrate contracts. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplMultisigProver \ + -t "Migrate XRPLMultisigProver to v1.1.2" \ + -d "Migrate XRPLMultisigProver to v1.1.2" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE + +node cosmwasm/submit-proposal.js migrate \ + -c XrplGateway \ + -t "Migrate XRPLGateway to v1.1.2" \ + -d "Migrate XRPLGateway to v1.1.2" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE + +node cosmwasm/submit-proposal.js migrate \ + -c XrplVotingVerifier \ + -t "Migrate XRPLVotingVerifier to v1.1.2" \ + -d "Migrate XRPLVotingVerifier to v1.1.2" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify contract versions: + +```bash +axelard query wasm contract-state raw $XRPL_MULTISIG_PROVER 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +axelard query wasm contract-state raw $XRPL_GATEWAY 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +axelard query wasm contract-state raw $XRPL_VOTING_VERIFIER 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-multisig-prover","version":"1.1.2"} +{"contract":"xrpl-gateway","version":"1.1.2"} +{"contract":"xrpl-voting-verifier","version":"1.1.2"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. From 7f81db39aeeac34d72022eb48010299547214e75 Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Fri, 25 Apr 2025 20:28:19 +0530 Subject: [PATCH 33/71] fix: remove caret from xrpl dependency (#676) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcf581d8a..af89ea0b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "csv-parser": "^3.0.0", "path": "^0.12.7", "toml": "^3.0.0", - "xrpl": "^4.2.5" + "xrpl": "4.2.5" }, "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", diff --git a/package.json b/package.json index 6534c42e6..4010c6245 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "csv-parser": "^3.0.0", "path": "^0.12.7", "toml": "^3.0.0", - "xrpl": "^4.2.5" + "xrpl": "4.2.5" }, "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", From 6b56e628bdcca435f4f7e86b19ec003f753e8904 Mon Sep 17 00:00:00 2001 From: Tanvir Deol Date: Fri, 25 Apr 2025 17:45:31 -0400 Subject: [PATCH 34/71] feat(stellar): add flow limit support (#669) Co-authored-by: ahramy --- stellar/README.md | 26 ++++++++++++++++++ stellar/its.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/stellar/README.md b/stellar/README.md index 525fdc636..f14386803 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -292,6 +292,32 @@ node stellar/its.js interchain-transfer [token-id] [destination-chain] [destinat node stellar/its.js execute [source-chain] [message-id] [source-address] [payload] ``` +#### Get Flow Limit + +```bash +node stellar/its.js flow-limit [token-id] + +# Example +node stellar/its.js flow-limit 0x3e818f44d754748c2e7f59cfff8c34125884121fada921a31dcf383994eec1c5 +``` + +#### Set Flow Limit + +```bash +node stellar/its.js set-flow-limit [token-id] [flow-limit] + +# Example +node stellar/its.js set-flow-limit 0x3e818f44d754748c2e7f59cfff8c34125884121fada921a31dcf383994eec1c5 1000000 +``` + +#### Remove Flow Limit +```bash +node stellar/its.js remove-flow-limit [token-id] + +# Example +node stellar/its.js remove-flow-limit 0x3e818f44d754748c2e7f59cfff8c34125884121fada921a31dcf383994eec1c5 +``` + ## TTL extension and state archival recovery All Soroban storage entries, including contract instances, have a 'time to live' (`ttl`) after which entries will be archived and no longer accessible until restored. The following commands can be used to extend `ttl` or restore archived contract instances. diff --git a/stellar/its.js b/stellar/its.js index 537090eca..d37e593d7 100644 --- a/stellar/its.js +++ b/stellar/its.js @@ -183,6 +183,52 @@ async function execute(wallet, _, chain, contract, args, options) { await broadcast(operation, wallet, chain, 'Executed', options); } +async function flowLimit(wallet, _, chain, contract, args, options) { + const [tokenId] = args; + + validateParameters({ + isNonEmptyString: { tokenId }, + }); + + const operation = contract.call('flow_limit', hexToScVal(tokenId)); + + const returnValue = await broadcast(operation, wallet, chain, 'Get Flow Limit', options); + const flowLimit = returnValue.value(); + + printInfo('Flow Limit', flowLimit || 'No limit set'); +} + +async function setFlowLimit(wallet, _, chain, contract, args, options) { + const [tokenId, flowLimit] = args; + + validateParameters({ + isNonEmptyString: { tokenId }, + isValidNumber: { flowLimit }, + }); + + const flowLimitScVal = nativeToScVal(flowLimit, { type: 'i128' }); + + const operation = contract.call('set_flow_limit', hexToScVal(tokenId), flowLimitScVal); + + await broadcast(operation, wallet, chain, 'Set Flow Limit', options); + printInfo('Successfully set flow limit', flowLimit); +} + +async function removeFlowLimit(wallet, _, chain, contract, args, options) { + const [tokenId] = args; + + validateParameters({ + isNonEmptyString: { tokenId }, + }); + + const flowLimitScVal = nativeToScVal(null, { type: 'void' }); + + const operation = contract.call('set_flow_limit', hexToScVal(tokenId), flowLimitScVal); + + await broadcast(operation, wallet, chain, 'Remove Flow Limit', options); + printInfo('Successfully removed flow limit'); +} + async function mainProcessor(processor, args, options) { const { yes } = options; const config = loadConfig(options.env); @@ -278,6 +324,27 @@ if (require.main === module) { mainProcessor(execute, [sourceChain, messageId, sourceAddress, payload], options); }); + program + .command('flow-limit ') + .description('Get the flow limit for a token') + .action((tokenId, options) => { + mainProcessor(flowLimit, [tokenId], options); + }); + + program + .command('set-flow-limit ') + .description('Set the flow limit for a token') + .action((tokenId, flowLimit, options) => { + mainProcessor(setFlowLimit, [tokenId, flowLimit], options); + }); + + program + .command('remove-flow-limit ') + .description('Remove the flow limit for a token') + .action((tokenId, options) => { + mainProcessor(removeFlowLimit, [tokenId], options); + }); + addOptionsToCommands(program, addBaseOptions); program.parse(); From 5c4bb6a5139b156b3a812e7f0ebeccc66533fd44 Mon Sep 17 00:00:00 2001 From: ahramy Date: Mon, 28 Apr 2025 09:59:16 -0700 Subject: [PATCH 35/71] chore(stellar): create generate key pair and send tokens (#665) --- common/utils.js | 18 +++++++--- stellar/README.md | 17 ++++------ stellar/generate-keypair.js | 46 ++++++++++++++++++++++++++ stellar/send-tokens.js | 66 +++++++++++++++++++++++++++++++++++++ stellar/utils.js | 43 ++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 15 deletions(-) create mode 100644 stellar/generate-keypair.js create mode 100644 stellar/send-tokens.js diff --git a/common/utils.js b/common/utils.js index cf8fbaede..b10dca4cd 100644 --- a/common/utils.js +++ b/common/utils.js @@ -258,17 +258,25 @@ function isValidTimeFormat(timeString) { } /** - * Validate if the given address is a Stellar address. + * Validate if the given address or array of addresses are valid Stellar addresses. * * A valid Stellar address is either: * - a valid Stellar account address (starts with 'G') * - a valid Stellar contract address (starts with 'C') * - * @param {string} address - The input Stellar address. - * @returns {boolean} - True if the address is valid, otherwise false. + * @param {string|string[]} addresses - A single Stellar address or an array of Stellar addresses. + * @returns {boolean} - True if the address or all addresses are valid, otherwise false. */ -function isValidStellarAddress(address) { - return isValidStellarAccount(address) || isValidStellarContract(address); +function isValidStellarAddress(addresses) { + if (typeof addresses === 'string') { + return isValidStellarAccount(addresses) || isValidStellarContract(addresses); + } + + if (Array.isArray(addresses)) { + return addresses.every((address) => isValidStellarAccount(address) || isValidStellarContract(address)); + } + + return false; } /** diff --git a/stellar/README.md b/stellar/README.md index f14386803..4c343393d 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -29,16 +29,7 @@ Create a new Stellar keypair ```bash # Generate keypair -stellar keys generate wallet --network testnet - -# Address -stellar keys address wallet - -# Private Key -stellar keys show wallet - -# Remove the keypair -stellar keys rm wallet --global; +node stellar/generate-keypair.js ``` Set `PRIVATE_KEY` in `.env` to the above value. @@ -49,6 +40,12 @@ Testnet funds can be obtained via [this link](https://ftl.ai/) or using the `fau node stellar/faucet.js --recipient
``` +Send tokens (if needed) + +```bash +node stellar/send-tokens.js --amount --recipients +``` + ## Deployments Setup diff --git a/stellar/generate-keypair.js b/stellar/generate-keypair.js new file mode 100644 index 000000000..0225aa331 --- /dev/null +++ b/stellar/generate-keypair.js @@ -0,0 +1,46 @@ +'use strict'; + +const { Command, Option } = require('commander'); +const { addBaseOptions, generateKeypair, isFriendbotSupported } = require('./utils'); +const { loadConfig, printInfo, getChainConfig } = require('../common/utils'); +const { Horizon } = require('@stellar/stellar-sdk'); + +async function processCommand(chain, options) { + const keypair = await generateKeypair(options); + const horizonServer = new Horizon.Server(chain.horizonRpc); + + // Fund and activate the account using Friendbot if supported by the network. + // Friendbot is available only on local, futurenet, and testnet. + // On unsupported networks (e.g., mainnet), manual funding is required. + if (isFriendbotSupported(chain.networkType)) { + await horizonServer.friendbot(keypair.publicKey()).call(); + printInfo('Keypair generated and funded via Friendbot'); + } else { + printInfo('Keypair generated (manual funding required)'); + } + + printInfo('Private key', keypair.secret()); + printInfo('Address', keypair.publicKey()); +} + +async function mainProcessor(options, processor) { + const config = loadConfig(options.env); + const chain = getChainConfig(config, options.chainName); + await processor(chain, options); +} + +if (require.main === module) { + const program = new Command(); + + program.name('generate-keypair').description('Generate keypair.'); + + addBaseOptions(program, { ignorePrivateKey: true }); + + program.addOption(new Option('--signatureScheme ', 'sig scheme').choices(['ed25519']).default('ed25519')); + + program.action((options) => { + mainProcessor(options, processCommand); + }); + + program.parse(); +} diff --git a/stellar/send-tokens.js b/stellar/send-tokens.js new file mode 100644 index 000000000..a5ad322e5 --- /dev/null +++ b/stellar/send-tokens.js @@ -0,0 +1,66 @@ +'use strict'; + +const { Asset, Operation } = require('@stellar/stellar-sdk'); +const { Command, Option } = require('commander'); +const { addBaseOptions, broadcast, getWallet, getNativeBalance } = require('./utils'); +const { loadConfig, printInfo, printError, getChainConfig, prompt, validateParameters } = require('../common/utils'); + +async function processCommand(chain, options) { + const wallet = await getWallet(chain, options); + let { amount, recipients, yes } = options; + recipients = options.recipients.split(',').map((str) => str.trim()); + + validateParameters({ + isValidDecimal: amount, + isValidStellarAddress: { recipients }, + }); + + const nativeAssetBalance = await getNativeBalance(chain, wallet.publicKey()); + const totalAmount = amount * recipients.length; + + if (nativeAssetBalance < totalAmount) { + printError(`Wallet balance ${nativeAssetBalance} has insufficient funds for ${totalAmount}.`); + return; + } + + if (prompt(`Send ${amount} XLM to ${recipients}?`, yes)) { + return; + } + + options.nativePayment = true; + + for (const recipient of recipients) { + printInfo(`Sending ${amount} XLM to ${recipient}`); + + const operation = Operation.payment({ + destination: recipient, + asset: Asset.native(), + amount, + }); + + await broadcast(operation, wallet, chain, 'Send token', options); + } +} + +async function mainProcessor(options, processor) { + const config = loadConfig(options.env); + const chain = getChainConfig(config, options.chainName); + await processor(chain, options); +} + +if (require.main === module) { + const program = new Command(); + + program.name('send-tokens').description('Send native tokens to recipients.'); + + addBaseOptions(program); + + program.addOption(new Option('-r, --recipients ', 'comma-separated recipients of tokens').makeOptionMandatory(true)); + program.addOption(new Option('-a, --amount ', 'amount to transfer (in terms of XLM)').makeOptionMandatory(true)); + + program.action((options) => { + mainProcessor(options, processCommand); + }); + + program.parse(); +} diff --git a/stellar/utils.js b/stellar/utils.js index 52a170387..c465f126a 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -152,6 +152,9 @@ async function sendTransaction(tx, server, action, options = {}) { throw Error(`Transaction failed: ${getResponse.resultXdr}`); } + // Native payment — sorobanMeta is not present, so skip parsing. + if (options.nativePayment) return; + // Make sure the transaction's resultMetaXDR is not empty // TODO: might be empty if the operation doesn't have a return value if (!getResponse.resultMetaXdr) { @@ -175,6 +178,12 @@ async function sendTransaction(tx, server, action, options = {}) { async function broadcast(operation, wallet, chain, action, options = {}, simulateTransaction = false) { const server = new rpc.Server(chain.rpc, { allowHttp: chain.networkType === 'local' }); + if (options.nativePayment) { + const tx = await buildTransaction(operation, server, wallet, chain.networkType, options); + tx.sign(wallet); + return sendTransaction(tx, server, action, options); + } + if (options.estimateCost) { const tx = await buildTransaction(operation, server, wallet, chain.networkType, options); const resourceCost = await estimateCost(tx, server); @@ -241,6 +250,13 @@ async function getBalances(horizonServer, address) { return response.balances; } +async function getNativeBalance(chain, address) { + const horizonServer = new Horizon.Server(chain.horizonRpc, getRpcOptions(chain)); + const balances = await getBalances(horizonServer, address); + const native = balances.find((balance) => balance.asset_type === ASSET_TYPE_NATIVE); + return native ? parseFloat(native.balance) : 0; +} + async function estimateCost(tx, server) { await server.simulateTransaction(tx); @@ -545,6 +561,30 @@ function customMigrationData(migrationDataObj, version, contractName) { } } +async function generateKeypair(options) { + switch (options.signatureScheme) { + case 'ed25519': + return Keypair.random(); + + default: { + throw new Error(`Unsupported scheme: ${options.signatureScheme}`); + } + } +} + +function isFriendbotSupported(networkType) { + switch (networkType) { + case 'local': + case 'futurenet': + case 'testnet': + return true; + case 'mainnet': + return false; + default: + throw new Error(`Unknown network type: ${networkType}`); + } +} + module.exports = { stellarCmd, ASSET_TYPE_NATIVE, @@ -559,6 +599,7 @@ module.exports = { getNewSigners, serializeValue, getBalances, + getNativeBalance, createAuthorizedFunc, addressToScVal, hexToScVal, @@ -572,4 +613,6 @@ module.exports = { BytesToScVal, pascalToKebab, sanitizeMigrationData, + generateKeypair, + isFriendbotSupported, }; From dfc2eae00a806212e53c0cb2e5406618edcca139 Mon Sep 17 00:00:00 2001 From: haiyizxx Date: Mon, 28 Apr 2025 16:24:38 -0400 Subject: [PATCH 36/71] docs(releases): axelard v1.2.1 (#543) Co-authored-by: Milap Sheth --- releases/axelard/2025-02-v1.2.0.md | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 releases/axelard/2025-02-v1.2.0.md diff --git a/releases/axelard/2025-02-v1.2.0.md b/releases/axelard/2025-02-v1.2.0.md new file mode 100644 index 000000000..d5c9277f8 --- /dev/null +++ b/releases/axelard/2025-02-v1.2.0.md @@ -0,0 +1,45 @@ +# axelard v1.2.1 + +| | **Owner** | +|-----------|------------| +| **Created By** | @haiyizxx | +| **Deployment** | @RiceAndMeet | + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 2025-02-07 | +| **Stagenet** | Deployed | 2025-02-07 | +| **Testnet** | Deployed | 2025-02-13 | +| **Mainnet** | Deployed | 2025-02-20 | + +[Release](https://github.com/axelarnetwork/axelar-core/releases/tag/v1.2.1) + +## Background + +Changes in the release: + +1. Burn transaction fees from circulation. +2. Security patches to wasmd and CometBFT. + +## Deployment + +- wasmvm lib has been updated from `v1.3.1` to `v1.5.8`, make sure to update the dependency if you are using the `axelard` binary. + +- Stop the node once the upgrade height is reached. [Show upgrade height log] + +- Restart the node with the `axelard v1.2.1` and `wasmvm v1.5.8`. + +## Checklist + +The following checks should be performed after the rollout + +- [ ] Verify that nodes are producing new blocks after the upgrade. +- [ ] Check the denomination of burned fees in `burned-uaxl` on-chain using: +```bash +axelard q bank total --denom burned-uaxl + +# OR + +axelard q bank balances axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqecnww6 --denom burned-uaxl +``` + From d23656ed94365bbe54fa7e44fe8a0a8098e59641 Mon Sep 17 00:00:00 2001 From: npty <78221556+npty@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:01:21 +0800 Subject: [PATCH 37/71] fix: remove port 443 from sui rpc urls (#673) Co-authored-by: Blockchain Guy --- axelar-chains-config/info/devnet-amplifier.json | 2 +- axelar-chains-config/info/mainnet.json | 2 +- axelar-chains-config/info/stagenet.json | 2 +- axelar-chains-config/info/testnet.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 0fe86bd06..130c8b514 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -740,7 +740,7 @@ "name": "Sui", "axelarId": "sui-2", "networkType": "testnet", - "rpc": "https://sui-testnet-rpc.publicnode.com:443", + "rpc": "https://sui-testnet-rpc.publicnode.com", "tokenSymbol": "SUI", "decimals": 9, "chainType": "sui", diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 43980b696..47a3fb12e 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -2516,7 +2516,7 @@ "name": "Sui", "axelarId": "sui", "networkType": "mainnet", - "rpc": "https://sui-rpc.publicnode.com:443", + "rpc": "https://sui-rpc.publicnode.com", "tokenSymbol": "SUI", "decimals": 9, "chainType": "sui", diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index e9fcf6480..7d80646c0 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -1691,7 +1691,7 @@ "name": "Sui", "axelarId": "sui", "networkType": "testnet", - "rpc": "https://sui-testnet-rpc.publicnode.com:443", + "rpc": "https://sui-testnet-rpc.publicnode.com", "tokenSymbol": "SUI", "decimals": 9, "chainType": "sui", diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 2214d02c3..be5f86f3a 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2353,7 +2353,7 @@ "name": "Sui", "axelarId": "sui", "networkType": "testnet", - "rpc": "https://sui-testnet-rpc.publicnode.com:443", + "rpc": "https://sui-testnet-rpc.publicnode.com", "tokenSymbol": "SUI", "decimals": 9, "chainType": "sui", From ebcd7c9b5e50cc5ed6948465f3a924852d3b2c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:33:04 -0400 Subject: [PATCH 38/71] refactor: support Typescript (#671) --- .eslintignore | 2 + .eslintrc | 23 +- .github/workflows/lint.yaml | 3 + .github/workflows/test-chains-config.yaml | 4 + .github/workflows/test-evm.yaml | 3 + .github/workflows/test-stellar.yaml | 3 + .github/workflows/test-sui.yaml | 4 + .github/workflows/update-gas-info.yaml | 1 + .mocharc.yaml | 4 +- .prettierignore | 2 + .prettierrc | 34 - .prettierrc.ts | 48 + README.md | 21 + axelar-chains-config/package-lock.json | 141 ++ axelar-chains-config/package.json | 2 +- common/cli-utils.js | 1 + cosmwasm/README.md | 2 +- cosmwasm/cli-utils.js | 2 +- cosmwasm/deploy-contract.js | 2 +- cosmwasm/rotate-signers.js | 2 +- cosmwasm/submit-proposal.js | 2 +- cosmwasm/update-code-id.js | 2 +- evm/README.md | 2 +- evm/check-ownership-request.js | 2 +- evm/decode.js | 3 +- evm/sign-message-defender.js | 3 +- global.d.ts | 1 + hardhat.config.js | 74 +- index.js | 12 - index.ts | 12 + package-lock.json | 2068 +++++-------------- package.json | 26 +- package.sh | 2 + releases/evm/2025-01-ITS-v2.1.0.md | 2 +- releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 2 +- releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md | 2 +- releases/sui/2025-03-ITS-v1.1.3.md | 2 +- stellar/README.md | 2 +- stellar/cli-utils.js | 2 +- stellar/utils.js | 1 + sui/utils/cli-utils.js | 3 +- tsconfig.json | 18 + xrpl/README.md | 2 +- xrpl/cli-utils.js | 3 +- 44 files changed, 937 insertions(+), 1615 deletions(-) create mode 100644 .eslintignore create mode 100644 .prettierignore delete mode 100644 .prettierrc create mode 100644 .prettierrc.ts create mode 100644 global.d.ts delete mode 100644 index.js create mode 100644 index.ts create mode 100644 tsconfig.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..1eae0cf67 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/.eslintrc b/.eslintrc index 23f3ab81e..41fb5ac91 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,11 +1,18 @@ { - "extends": "richardpringle", - "env": { - "es2020": true, - "mocha": true + "extends": [ + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint/eslint-plugin"], + "rules": { + "@typescript-eslint/no-unused-vars": "off" }, - "rules": { - "no-unused-expressions": "off" - }, - "ignorePatterns": ["temp-arguments.js"] + "overrides": [ + { + "files": ["*.js"], + "rules": { + "@typescript-eslint/no-require-imports": "off" + } + } + ] } diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index adee4bbb8..fee06cb56 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -19,6 +19,9 @@ jobs: - name: Install Dependencies run: npm ci + - name: Build + run: npm run build + - name: Lint run: npm run lint diff --git a/.github/workflows/test-chains-config.yaml b/.github/workflows/test-chains-config.yaml index c002abc33..70c717e89 100644 --- a/.github/workflows/test-chains-config.yaml +++ b/.github/workflows/test-chains-config.yaml @@ -20,6 +20,10 @@ jobs: run: npm ci working-directory: axelar-chains-config + - name: Build + run: npm run build + working-directory: axelar-chains-config + - name: Test run: npm run test working-directory: axelar-chains-config diff --git a/.github/workflows/test-evm.yaml b/.github/workflows/test-evm.yaml index b08c3c43b..96cf1585a 100644 --- a/.github/workflows/test-evm.yaml +++ b/.github/workflows/test-evm.yaml @@ -19,6 +19,9 @@ jobs: - name: Install run: npm ci + - name: Build + run: npm run build + - name: Spin up Hardhat Network run: npx hardhat node & diff --git a/.github/workflows/test-stellar.yaml b/.github/workflows/test-stellar.yaml index 31bd4f114..200982bdb 100644 --- a/.github/workflows/test-stellar.yaml +++ b/.github/workflows/test-stellar.yaml @@ -58,6 +58,9 @@ jobs: - name: Install dependencies run: npm ci + - name: Build + run: npm run build + - name: Setup Stellar network uses: ./.github/actions/setup-stellar diff --git a/.github/workflows/test-sui.yaml b/.github/workflows/test-sui.yaml index 07370fdb0..761c73274 100644 --- a/.github/workflows/test-sui.yaml +++ b/.github/workflows/test-sui.yaml @@ -46,6 +46,10 @@ jobs: shell: bash run: npm ci + - name: Build + shell: bash + run: npm run build + - name: Get Sui Version shell: bash run: | diff --git a/.github/workflows/update-gas-info.yaml b/.github/workflows/update-gas-info.yaml index 14317cbc3..5100070ea 100644 --- a/.github/workflows/update-gas-info.yaml +++ b/.github/workflows/update-gas-info.yaml @@ -24,6 +24,7 @@ jobs: node-version: '18.x' registry-url: 'https://registry.npmjs.org' - run: npm ci + - run: npm run build - run: | if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then ENV="${{ github.event.inputs.environment }}" diff --git a/.mocharc.yaml b/.mocharc.yaml index 18c0e4d65..8e21a5d1f 100644 --- a/.mocharc.yaml +++ b/.mocharc.yaml @@ -1,3 +1,5 @@ exit: true -spec: test/**/*.js +spec: + - test/**/*.js + - test/**/*.ts timeout: 10000 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..9cd06fba5 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +// TODO: Delete this file +**/* diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 74eabe89d..000000000 --- a/.prettierrc +++ /dev/null @@ -1,34 +0,0 @@ -{ - "printWidth": 140, - "singleQuote": true, - "tabWidth": 4, - "useTabs": false, - "bracketSpacing": true, - "overrides": [ - { - "files": "*.sol", - "options": { - "explicitTypes": "always" - } - }, - { - "files": "*.js", - "options": { - "trailingComma": "all" - } - }, - { - "files": "*.json", - "options": { - "tabWidth": 2, - "parser": "json-stringify" - } - }, - { - "files": "*.yaml", - "options": { - "tabWidth": 2 - } - } - ] -} diff --git a/.prettierrc.ts b/.prettierrc.ts new file mode 100644 index 000000000..0e93450e3 --- /dev/null +++ b/.prettierrc.ts @@ -0,0 +1,48 @@ +import { Config } from "prettier"; + +const config: Config = { + printWidth: 140, + singleQuote: true, + tabWidth: 4, + useTabs: false, + bracketSpacing: true, + importOrder: ["^[./]"], + importOrderSeparation: true, + importOrderSortSpecifiers: true, + plugins: ["@trivago/prettier-plugin-sort-imports"], + overrides: [ + { + files: "*.sol", + options: { + explicitTypes: "always", + }, + }, + { + files: "*.js", + options: { + trailingComma: "all", + }, + }, + { + files: "*.ts", + options: { + trailingComma: "all", + }, + }, + { + files: "*.json", + options: { + tabWidth: 2, + parser: "json-stringify", + }, + }, + { + files: "*.yaml", + options: { + tabWidth: 2, + }, + }, + ], +}; + +export default config; diff --git a/README.md b/README.md index 15a2dd16e..d928ed5cb 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ Install dependencies via `npm ci` +Build the project via +`npm run build` + ## Deployment Instructions - [EVM](./evm/README.md) @@ -11,3 +14,21 @@ Install dependencies via - [Stellar](./stellar/README.md) - [XRPL](./xrpl/README.md) +## Javascript -> Typescript Migration + +Please note that this project currently supports both Javascript and Typescript. + +### To migrate to Typescript, you may use the following steps + +1. When touching a file or creating a new file, ensure the file's extension is `.ts` +2. Complete your implementation, and ensure any relevant testing is also in TS +3. Use types appropriately throughout your implementation. You may type code unrelated to your changes only as necessary +4. Run `npm run build` to compile the project and ensure your new TS is valid + +### Once migration is complete + +1. Remove this information from this README +2. Remove JS related artifacts from the package.json, .eslintrc, .prettierrc.ts, .mocharc.yaml +3. In tsconfig.json, set `allowJs` to `false` and `strict` to `true` +4. Remove the `global.d.ts` file +5. Search globally for '.js' to ensure all references have been removed diff --git a/axelar-chains-config/package-lock.json b/axelar-chains-config/package-lock.json index 54fe5eca7..df71cd4d2 100644 --- a/axelar-chains-config/package-lock.json +++ b/axelar-chains-config/package-lock.json @@ -16,6 +16,7 @@ "eslint": "^8.49.0", "jsonschema": "^1.4.1", "prettier": "^3.3.2", + "ts-node": "^10.9.2", "typescript": "^5.2.2", "vitest": "^0.34.4" } @@ -29,6 +30,18 @@ "node": ">=0.10.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -534,12 +547,31 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -581,6 +613,30 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", @@ -767,6 +823,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -883,6 +945,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -932,6 +1000,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -1550,6 +1627,12 @@ "node": ">=12" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2043,6 +2126,49 @@ "node": ">=14.0.0" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2112,6 +2238,12 @@ "punycode": "^2.1.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/vite": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", @@ -2304,6 +2436,15 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/axelar-chains-config/package.json b/axelar-chains-config/package.json index 18faa1f8f..9cf953445 100644 --- a/axelar-chains-config/package.json +++ b/axelar-chains-config/package.json @@ -20,6 +20,7 @@ "eslint": "^8.49.0", "jsonschema": "^1.4.1", "prettier": "^3.3.2", + "ts-node": "^10.9.2", "typescript": "^5.2.2", "vitest": "^0.34.4" }, @@ -28,4 +29,3 @@ "fs-extra": "^11.1.1" } } - diff --git a/common/cli-utils.js b/common/cli-utils.js index ce522abc3..5df7659fd 100644 --- a/common/cli-utils.js +++ b/common/cli-utils.js @@ -1,5 +1,6 @@ 'use strict'; +require('ts-node/register'); /* enable node during migration */ require('dotenv').config(); const fs = require('fs'); diff --git a/cosmwasm/README.md b/cosmwasm/README.md index 62fdb8359..540c0a20f 100644 --- a/cosmwasm/README.md +++ b/cosmwasm/README.md @@ -4,7 +4,7 @@ This folder contains deployment scripts for cosmwasm contracts needed for amplif ### Setup -`npm ci` +`npm ci && npm run build` 1. Compile the contracts in the amplifier [repo](https://github.com/axelarnetwork/axelar-amplifier) using the [rust optimizer](https://github.com/CosmWasm/rust-optimizer) for cosmwasm. diff --git a/cosmwasm/cli-utils.js b/cosmwasm/cli-utils.js index 429e1eb12..2524357f0 100644 --- a/cosmwasm/cli-utils.js +++ b/cosmwasm/cli-utils.js @@ -1,6 +1,6 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils') const { isNumber, addEnvOption } = require('../common'); const { addStoreOptions } = require('../common/cli-utils'); diff --git a/cosmwasm/deploy-contract.js b/cosmwasm/deploy-contract.js index 5721a4a72..58541600b 100644 --- a/cosmwasm/deploy-contract.js +++ b/cosmwasm/deploy-contract.js @@ -1,6 +1,6 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); const { instantiate2Address } = require('@cosmjs/cosmwasm-stargate'); diff --git a/cosmwasm/rotate-signers.js b/cosmwasm/rotate-signers.js index 44654d03d..7ac1cd984 100644 --- a/cosmwasm/rotate-signers.js +++ b/cosmwasm/rotate-signers.js @@ -1,6 +1,6 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); const { Command } = require('commander'); const { addAmplifierOptions } = require('./cli-utils'); diff --git a/cosmwasm/submit-proposal.js b/cosmwasm/submit-proposal.js index 8db0ef64a..2ad4c81a1 100644 --- a/cosmwasm/submit-proposal.js +++ b/cosmwasm/submit-proposal.js @@ -1,6 +1,6 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); const { createHash } = require('crypto'); diff --git a/cosmwasm/update-code-id.js b/cosmwasm/update-code-id.js index ee832ab35..40342d898 100644 --- a/cosmwasm/update-code-id.js +++ b/cosmwasm/update-code-id.js @@ -1,6 +1,6 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); const { printInfo, loadConfig, saveConfig } = require('../common'); const { prepareWallet, prepareClient, initContractConfig, getAmplifierContractConfig, fetchCodeIdFromContract } = require('./utils'); diff --git a/evm/README.md b/evm/README.md index 9d439a5f4..34297279c 100644 --- a/evm/README.md +++ b/evm/README.md @@ -5,7 +5,7 @@ By default the version of contracts specified in `package.json` will be used for ## Setup -`npm ci` +`npm ci && npm run build` Add the deployer private key in `.env` folder (see `.example.env` for reference). diff --git a/evm/check-ownership-request.js b/evm/check-ownership-request.js index 4a484a61b..bcadafa83 100644 --- a/evm/check-ownership-request.js +++ b/evm/check-ownership-request.js @@ -1,4 +1,4 @@ -require('dotenv').config(); +require('../common/cli-utils'); const axios = require('axios'); const { Command, Option } = require('commander'); diff --git a/evm/decode.js b/evm/decode.js index 006923d91..005f0b51f 100644 --- a/evm/decode.js +++ b/evm/decode.js @@ -1,6 +1,7 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); + const { ethers } = require('hardhat'); const { utils: { Interface }, diff --git a/evm/sign-message-defender.js b/evm/sign-message-defender.js index 42e89391b..e93cbb71e 100644 --- a/evm/sign-message-defender.js +++ b/evm/sign-message-defender.js @@ -1,6 +1,7 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); + const { Relayer } = require('@openzeppelin/defender-relay-client'); const { ethers } = require('hardhat'); const { diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 000000000..229aee5f0 --- /dev/null +++ b/global.d.ts @@ -0,0 +1 @@ +declare module "*.js"; diff --git a/hardhat.config.js b/hardhat.config.js index d55b7a99b..0dce015bc 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -1,47 +1,49 @@ require('@nomicfoundation/hardhat-toolbox'); +require('@nomiclabs/hardhat-ethers'); +require('@typechain/hardhat'); -const env = process.env.NETWORK || 'testnet'; const { importNetworks, readJSON } = require(`${__dirname}/axelar-chains-config`); -const chains = require(`${__dirname}/axelar-chains-config/info/${env}.json`); + +const env = process.env.NETWORK || 'testnet'; +const chains = readJSON(`${__dirname}/axelar-chains-config/info/${env}.json`); const keys = readJSON(`${__dirname}/keys.json`); const { networks, etherscan } = importNetworks(chains, keys); networks.hardhat.hardfork = process.env.EVM_VERSION || 'merge'; -/** - * @type import('hardhat/config').HardhatUserConfig - */ -module.exports = { - solidity: { - version: '0.8.21', - settings: { - evmVersion: process.env.EVM_VERSION || 'london', - optimizer: { - enabled: true, - runs: 1000000, - details: { - peephole: process.env.COVERAGE === undefined, - inliner: process.env.COVERAGE === undefined, - jumpdestRemover: true, - orderLiterals: true, - deduplicate: true, - cse: process.env.COVERAGE === undefined, - constantOptimizer: true, - yul: true, - yulDetails: { - stackAllocation: true, - }, - }, - }, +const config = { + solidity: { + version: '0.8.21', + settings: { + evmVersion: process.env.EVM_VERSION || 'london', + optimizer: { + enabled: true, + runs: 1000000, + details: { + peephole: process.env.COVERAGE === undefined, + inliner: process.env.COVERAGE === undefined, + jumpdestRemover: true, + orderLiterals: true, + deduplicate: true, + cse: process.env.COVERAGE === undefined, + constantOptimizer: true, + yul: true, + yulDetails: { + stackAllocation: true, + }, }, + }, }, - defaultNetwork: 'hardhat', - networks, - etherscan, - mocha: { - timeout: 1000000, - }, - gasReporter: { - enabled: process.env.REPORT_GAS !== '', - }, + }, + defaultNetwork: 'hardhat', + networks, + etherscan, + mocha: { + timeout: 1000000, + }, + gasReporter: { + enabled: process.env.REPORT_GAS !== '', + }, }; + +module.exports = config; diff --git a/index.js b/index.js deleted file mode 100644 index 2fc5374ad..000000000 --- a/index.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -const { printObj, readJSON, writeJSON, importNetworks, verifyContract, getBytecodeHash } = require('./evm'); - -module.exports = { - printObj, - readJSON, - writeJSON, - importNetworks, - verifyContract, - getBytecodeHash, -}; diff --git a/index.ts b/index.ts new file mode 100644 index 000000000..321f008fd --- /dev/null +++ b/index.ts @@ -0,0 +1,12 @@ +'use strict'; + +import { printObj, readJSON, writeJSON, importNetworks, verifyContract, getBytecodeHash } from './evm'; + +export { + printObj, + readJSON, + writeJSON, + importNetworks, + verifyContract, + getBytecodeHash, +}; diff --git a/package-lock.json b/package-lock.json index af89ea0b5..c2981d9ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,18 +27,30 @@ "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@openzeppelin/defender-relay-client": "^1.54.1", + "@trivago/prettier-plugin-sort-imports": "^5.2.2", + "@typechain/ethers-v5": "^10.2.1", + "@typechain/hardhat": "^6.1.6", + "@types/chai": "^4.3.20", + "@types/mocha": "^10.0.10", + "@types/node": "^22.14.1", + "@types/prettier": "^3.0.0", + "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/parser": "^8.30.1", "chai": "^4.3.7", "chalk": "^4.1.2", "commander": "^11.0.0", "dotenv": "^16.0.1", "eslint": "^8.57.0", - "eslint-config-richardpringle": "^2.0.0", "fs-extra": "^11.1.1", "hardhat": "~2.19.5", "mocha": "^10.2.0", "prettier": "^3.3.2", - "readline-sync": "^1.4.10" + "readline-sync": "^1.4.10", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.8.3" }, "engines": { "node": ">=18" @@ -182,6 +194,133 @@ "node": ">=18" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", @@ -363,7 +502,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1335,12 +1473,44 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -1349,15 +1519,13 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1988,7 +2156,6 @@ "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", "dev": true, - "peer": true, "peerDependencies": { "ethers": "^5.0.0", "hardhat": "^2.0.0" @@ -2231,12 +2398,6 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, "node_modules/@scure/base": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz", @@ -2447,40 +2608,69 @@ "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz", "integrity": "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==" }, + "node_modules/@trivago/prettier-plugin-sort-imports": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.2.tgz", + "integrity": "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "javascript-natural-sort": "^0.7.1", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">18.12" + }, + "peerDependencies": { + "@vue/compiler-sfc": "3.x", + "prettier": "2.x - 3.x", + "prettier-plugin-svelte": "3.x", + "svelte": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@typechain/ethers-v5": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", "dev": true, - "peer": true, "dependencies": { "lodash": "^4.17.15", "ts-essentials": "^7.0.1" @@ -2498,7 +2688,6 @@ "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz", "integrity": "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==", "dev": true, - "peer": true, "dependencies": { "fs-extra": "^9.1.0" }, @@ -2516,7 +2705,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "peer": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2540,8 +2728,7 @@ "version": "4.3.20", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/chai-as-promised": { "version": "7.1.8", @@ -2584,12 +2771,6 @@ "@types/node": "*" } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -2612,15 +2793,14 @@ "version": "10.0.10", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/pbkdf2": { @@ -2633,11 +2813,14 @@ } }, "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==", + "deprecated": "This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.", "dev": true, - "peer": true + "dependencies": { + "prettier": "*" + } }, "node_modules/@types/qs": { "version": "6.9.18", @@ -2677,6 +2860,214 @@ "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", @@ -2792,7 +3183,6 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "peer": true, "dependencies": { "acorn": "^8.11.0" }, @@ -2989,8 +3379,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/argparse": { "version": "2.0.1", @@ -3003,53 +3392,16 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "peer": true, + "peer": true, "engines": { "node": ">=8" } @@ -3064,83 +3416,6 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -3193,7 +3468,6 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -3203,6 +3477,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3531,6 +3806,7 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -3549,6 +3825,7 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dev": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -3562,6 +3839,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dev": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" @@ -3925,7 +4203,6 @@ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, - "peer": true, "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -3941,7 +4218,6 @@ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, - "peer": true, "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -3957,7 +4233,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -3970,7 +4245,6 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -3980,7 +4254,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3995,7 +4268,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -4004,15 +4276,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/command-line-usage/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "peer": true, "engines": { "node": ">=0.8.0" } @@ -4022,7 +4292,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -4032,7 +4301,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -4045,7 +4313,6 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -4185,8 +4452,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/cross-fetch": { "version": "4.1.0", @@ -4252,57 +4518,6 @@ "node": ">=0.12" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", @@ -4508,6 +4723,7 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -4573,71 +4789,6 @@ "node": ">=6" } }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4659,6 +4810,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -4666,47 +4818,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -4922,334 +5033,62 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "get-stdin": "^6.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": ">=3.14.1" - } - }, - "node_modules/eslint-config-richardpringle": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-richardpringle/-/eslint-config-richardpringle-2.0.0.tgz", - "integrity": "sha512-c2eaJF76KmvOz1KvQCu5nrHBM1H6qB9Z5aW+RYaw9yQsoELiZ09ms9F7NZdPV4Q15sYV8NEJje9rTwnrbUSX6w==", - "dev": true, - "dependencies": { - "eslint-config-prettier": "^6.10.1", - "eslint-config-standard": "^14.1.1", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-mocha": "^6.3.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1" - } - }, - "node_modules/eslint-config-standard": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", - "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", - "dev": true, - "peerDependencies": { - "eslint": ">=6.2.2", - "eslint-plugin-import": ">=2.18.0", - "eslint-plugin-node": ">=9.1.0", - "eslint-plugin-promise": ">=4.2.1", - "eslint-plugin-standard": ">=4.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", "dev": true, + "peer": true, "dependencies": { - "ms": "^2.1.1" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-mocha": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", - "integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "ramda": "^0.27.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "eslint": ">= 4.0.0" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", - "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-standard": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", - "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dev": true, - "peer": true, - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5687,7 +5526,6 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5704,7 +5542,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5798,7 +5635,6 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, - "peer": true, "dependencies": { "array-back": "^3.0.1" }, @@ -5875,6 +5711,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -5950,26 +5787,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5980,15 +5798,6 @@ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -6012,6 +5821,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", @@ -6046,6 +5856,7 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -6054,32 +5865,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/ghost-testrpc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", @@ -6718,18 +6503,6 @@ "node": ">= 4.0.0" } }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6750,26 +6523,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -6782,6 +6541,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -6820,6 +6580,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7024,20 +6785,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -7082,84 +6829,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", - "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -7188,6 +6869,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -7200,6 +6882,7 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -7210,39 +6893,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7252,21 +6902,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -7281,6 +6916,7 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -7316,18 +6952,6 @@ "npm": ">=3" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7337,22 +6961,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -7376,6 +6984,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -7400,71 +7009,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "peer": true, "dependencies": { "which-typed-array": "^1.1.16" }, @@ -7494,55 +7044,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7567,6 +7068,12 @@ "ws": "*" } }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "dev": true + }, "node_modules/jose": { "version": "5.9.6", "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", @@ -7613,6 +7120,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -7631,18 +7150,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -7799,8 +7306,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -7875,8 +7381,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/markdown-table": { "version": "1.1.3", @@ -7890,6 +7395,7 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -7942,7 +7448,6 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "peer": true, "engines": { "node": ">= 8" } @@ -7959,7 +7464,6 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "peer": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -8347,6 +7851,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -8362,76 +7867,6 @@ "node": ">= 0.4" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obliterator": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", @@ -8490,23 +7925,6 @@ "node": ">=0.10.0" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8662,6 +8080,12 @@ "node": ">=0.12" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -8694,6 +8118,7 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -8858,12 +8283,6 @@ } ] }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -8977,68 +8396,13 @@ "node": ">=6.0.0" } }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=6" } }, "node_modules/req-cwd": { @@ -9100,6 +8464,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "peer": true, "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -9287,25 +8652,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9325,27 +8671,12 @@ } ] }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9538,6 +8869,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -9550,35 +8882,6 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -9661,6 +8964,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -9680,6 +8984,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -9696,6 +9001,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9714,6 +9020,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10131,8 +9438,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/string-width": { "version": "4.2.3", @@ -10148,62 +9454,6 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -10216,15 +9466,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -10267,6 +9508,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -10329,7 +9571,6 @@ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, - "peer": true, "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -10345,7 +9586,6 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -10355,7 +9595,6 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -10508,12 +9747,23 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-command-line-args": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, - "peer": true, "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", @@ -10529,7 +9779,6 @@ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, - "peer": true, "peerDependencies": { "typescript": ">=3.7.0" } @@ -10539,7 +9788,6 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -10583,23 +9831,10 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "peer": true, "engines": { "node": ">=0.3.1" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -10680,7 +9915,6 @@ "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, - "peer": true, "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", @@ -10700,12 +9934,17 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -10721,7 +9960,6 @@ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10742,7 +9980,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -10752,7 +9989,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -10765,7 +10001,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, - "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -10781,85 +10016,10 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "peer": true, "engines": { "node": ">= 4.0.0" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -10878,9 +10038,9 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10894,7 +10054,6 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -10913,24 +10072,6 @@ "node": ">=0.8.0" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undici": { "version": "5.28.5", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", @@ -10944,9 +10085,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" }, "node_modules/unfetch": { "version": "4.2.0", @@ -11060,8 +10201,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/valibot": { "version": "0.36.0", @@ -11406,75 +10546,12 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -11523,7 +10600,6 @@ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, - "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -11537,7 +10613,6 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -11698,7 +10773,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "peer": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index 4010c6245..97eca0544 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,13 @@ "type": "commonjs", "version": "1.4.0", "description": "Axelar contract deployment scripts", - "main": "index.js", + "main": "dist/index.js", + "types": "dist/index.d.ts", "scripts": { - "lint": "eslint --fix '**/*.js'", - "prettier": "prettier --write '**/*.js' 'axelar-chains-config/info/*.json' 'package.json' 'evm/**/*.json' '.github/**/*.yaml'", - "test:sui": "mocha sui" + "build": "tsc", + "lint": "eslint --fix '**/*.{js,ts}'", + "prettier": "prettier --write '**/*.{js,ts}' 'axelar-chains-config/info/*.json' 'package.json' 'evm/**/*.json' '.github/**/*.yaml'", + "test": "mocha -r ts-node/register 'test/**/*.ts'" }, "repository": { "type": "git", @@ -42,18 +44,30 @@ "devDependencies": { "@ledgerhq/hw-transport-node-hid": "^6.27.21", "@nomicfoundation/hardhat-toolbox": "^2.0.2", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@openzeppelin/defender-relay-client": "^1.54.1", + "@trivago/prettier-plugin-sort-imports": "^5.2.2", + "@typechain/ethers-v5": "^10.2.1", + "@typechain/hardhat": "^6.1.6", + "@types/chai": "^4.3.20", + "@types/mocha": "^10.0.10", + "@types/node": "^22.14.1", + "@types/prettier": "^3.0.0", + "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/parser": "^8.30.1", "chai": "^4.3.7", "chalk": "^4.1.2", "commander": "^11.0.0", "dotenv": "^16.0.1", "eslint": "^8.57.0", - "eslint-config-richardpringle": "^2.0.0", "fs-extra": "^11.1.1", "hardhat": "~2.19.5", "mocha": "^10.2.0", "prettier": "^3.3.2", - "readline-sync": "^1.4.10" + "readline-sync": "^1.4.10", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.8.3" }, "engines": { "node": ">=18" diff --git a/package.sh b/package.sh index 2a12099fe..f0bf7f45c 100755 --- a/package.sh +++ b/package.sh @@ -8,6 +8,8 @@ fi if [ ! -f deps.zip ]; then npm ci + npm run build + zip -rq deps.zip node_modules fi diff --git a/releases/evm/2025-01-ITS-v2.1.0.md b/releases/evm/2025-01-ITS-v2.1.0.md index 75417bd59..cc032366f 100644 --- a/releases/evm/2025-01-ITS-v2.1.0.md +++ b/releases/evm/2025-01-ITS-v2.1.0.md @@ -30,7 +30,7 @@ Changes in the release: ```bash # Clone latest main and update deps -npm ci +npm ci && npm run build ``` Create an `.env` config. Use `all` for `CHAINS` to run the cmd for every EVM chain, or set a specific chain. diff --git a/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md index 96410a734..4f188e031 100644 --- a/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -36,7 +36,7 @@ An initial chain config needs to be added to `${ENV}.json` file under `CHAINS` k Update npm dependencies (including contracts) ```bash -npm ci +npm ci && npm run build ``` #### Devnet-Amplifier / Stagenet / Testnet diff --git a/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md b/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md index 284d171e9..b28dd260b 100644 --- a/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md +++ b/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md @@ -25,7 +25,7 @@ Ensure that [XRPL EVM GMP](../evm/2025-02-XRPL-EVM-GMP-v6.0.4.md) is deployed fi ```bash # Clone latest main and update deps -npm ci +npm ci && npm run build ``` Create an `.env` config. Use `all` for `CHAINS` to run the cmd for every EVM chain, or set a specific chain. `CHAIN` should be set to `xrpl-evm`. diff --git a/releases/sui/2025-03-ITS-v1.1.3.md b/releases/sui/2025-03-ITS-v1.1.3.md index 5386ac93b..17bfbd761 100644 --- a/releases/sui/2025-03-ITS-v1.1.3.md +++ b/releases/sui/2025-03-ITS-v1.1.3.md @@ -23,7 +23,7 @@ ```bash # Clone latest main and update deps -npm ci +npm ci && npm run build ``` Create an `.env` config. Use `all` for `CHAINS` to run the cmd for every EVM chain, or set a specific chain. On `devnet-amplifier` chain name will be set to `sui-2`. diff --git a/stellar/README.md b/stellar/README.md index 4c343393d..cda412690 100644 --- a/stellar/README.md +++ b/stellar/README.md @@ -7,7 +7,7 @@ Install `libsodium` for faster signing operations optionally. Install npm depend ```sh brew install libsodium -npm ci +npm ci && npm run build ``` Install Stellar CLI diff --git a/stellar/cli-utils.js b/stellar/cli-utils.js index a38e4e676..eedc53e04 100644 --- a/stellar/cli-utils.js +++ b/stellar/cli-utils.js @@ -1,3 +1,3 @@ 'use strict'; -require('dotenv').config(); +require('../common/cli-utils'); diff --git a/stellar/utils.js b/stellar/utils.js index c465f126a..dff2ac948 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -586,6 +586,7 @@ function isFriendbotSupported(networkType) { } module.exports = { + ...require('ts-node/register'), /* enable node during migration */ stellarCmd, ASSET_TYPE_NATIVE, buildTransaction, diff --git a/sui/utils/cli-utils.js b/sui/utils/cli-utils.js index f7a67e24b..e7fb24ecd 100644 --- a/sui/utils/cli-utils.js +++ b/sui/utils/cli-utils.js @@ -1,7 +1,5 @@ 'use strict'; -require('dotenv').config(); - const { Option, InvalidArgumentError } = require('commander'); const { getUnitAmount } = require('./amount-utils'); const { addEnvOption, addOptionsToCommands } = require('../../common'); @@ -71,6 +69,7 @@ const parseSuiUnitAmount = (value, previous) => { }; module.exports = { + ...require('../../common/cli-utils'), addBaseOptions, addExtendedOptions, addOptionsToCommands, diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..e3ddd1d1b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": false, // false for easier migration + "skipLibCheck": true, + "rootDir": "./", + "outDir": "dist", + "declaration": true, + "resolveJsonModule": true, + "sourceMap": true, + "allowJs": true // remove once all JS is removed + }, + "include": ["**/*.ts"], + "exclude": ["node_modules", "dist"], +} diff --git a/xrpl/README.md b/xrpl/README.md index 4dc081f0d..5a37e8e0f 100644 --- a/xrpl/README.md +++ b/xrpl/README.md @@ -12,7 +12,7 @@ 1. Install npm dependencies. ```sh -npm ci +npm ci && npm run build ``` 2. Create a new XRPL keypair via the [`generate-wallet.js` script](#generate-wallet). diff --git a/xrpl/cli-utils.js b/xrpl/cli-utils.js index 4191c3b6f..2dd765f11 100644 --- a/xrpl/cli-utils.js +++ b/xrpl/cli-utils.js @@ -1,5 +1,7 @@ 'use strict'; +require('../common/cli-utils') + const xrpl = require('xrpl'); const { Option } = require('commander'); const { addEnvOption } = require('../common/cli-utils'); @@ -41,7 +43,6 @@ const addBaseOptions = (program, _options = {}) => { }; module.exports = { - ...require('../common/cli-utils'), addBaseOptions, addWalletOptions, addSkipPromptOption, From f54f51a995598b623f54624cf5f7a27ef3857401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20B=2E=20=F0=9F=A5=82?= <15343884+nbayindirli@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:46:35 -0400 Subject: [PATCH 39/71] chore: run TS prettier (#685) --- .prettierrc.cjs | 2 + .prettierrc.ts | 88 ++++++++++--------- README.md | 3 + .../tests/getChainArray.test.js | 5 +- axelar-chains-config/tests/info.test.js | 3 +- cosmwasm/cli-utils.js | 2 +- global.d.ts | 2 +- index.ts | 11 +-- stellar/utils.js | 2 +- xrpl/cli-utils.js | 2 +- 10 files changed, 61 insertions(+), 59 deletions(-) create mode 100644 .prettierrc.cjs diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 000000000..f69a7a2e5 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,2 @@ +require('ts-node/register'); +module.exports = require('./.prettierrc.ts').default; diff --git a/.prettierrc.ts b/.prettierrc.ts index 0e93450e3..3e34f683d 100644 --- a/.prettierrc.ts +++ b/.prettierrc.ts @@ -1,48 +1,50 @@ -import { Config } from "prettier"; +import { Config } from 'prettier'; const config: Config = { - printWidth: 140, - singleQuote: true, - tabWidth: 4, - useTabs: false, - bracketSpacing: true, - importOrder: ["^[./]"], - importOrderSeparation: true, - importOrderSortSpecifiers: true, - plugins: ["@trivago/prettier-plugin-sort-imports"], - overrides: [ - { - files: "*.sol", - options: { - explicitTypes: "always", - }, - }, - { - files: "*.js", - options: { - trailingComma: "all", - }, - }, - { - files: "*.ts", - options: { - trailingComma: "all", - }, - }, - { - files: "*.json", - options: { - tabWidth: 2, - parser: "json-stringify", - }, - }, - { - files: "*.yaml", - options: { - tabWidth: 2, - }, - }, - ], + printWidth: 140, + singleQuote: true, + tabWidth: 4, + useTabs: false, + bracketSpacing: true, + importOrder: ['^[./]'], + importOrderSeparation: true, + importOrderSortSpecifiers: true, + plugins: ['@trivago/prettier-plugin-sort-imports'], + endOfLine: 'auto', // maintains existing line endings + proseWrap: 'preserve', // don't change line wrapping + overrides: [ + { + files: '*.sol', + options: { + explicitTypes: 'always', + }, + }, + { + files: '*.js', + options: { + trailingComma: 'all', + }, + }, + { + files: '*.ts', + options: { + trailingComma: 'all', + }, + }, + { + files: '*.json', + options: { + tabWidth: 2, + parser: 'json-stringify', + }, + }, + { + files: '*.yaml', + options: { + tabWidth: 2, + }, + }, + ], }; export default config; diff --git a/README.md b/README.md index d928ed5cb..2b1c58727 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ Build the project via Please note that this project currently supports both Javascript and Typescript. +All new commands should continue to use `node` for continuity. +The migration from `node` to `ts-node` will be done all at once. + ### To migrate to Typescript, you may use the following steps 1. When touching a file or creating a new file, ensure the file's extension is `.ts` diff --git a/axelar-chains-config/tests/getChainArray.test.js b/axelar-chains-config/tests/getChainArray.test.js index 221ce1fff..707870531 100644 --- a/axelar-chains-config/tests/getChainArray.test.js +++ b/axelar-chains-config/tests/getChainArray.test.js @@ -1,8 +1,9 @@ import fs from 'fs'; -import { describe, expect, it, beforeAll } from 'vitest'; import { Validator } from 'jsonschema'; -import { chainValueSchema, addAllSchema } from './schema'; +import { beforeAll, describe, expect, it } from 'vitest'; + import { getChainArray } from '..'; +import { addAllSchema, chainValueSchema } from './schema'; describe('getChainArray', () => { let validator; diff --git a/axelar-chains-config/tests/info.test.js b/axelar-chains-config/tests/info.test.js index 30857f1a0..936509972 100644 --- a/axelar-chains-config/tests/info.test.js +++ b/axelar-chains-config/tests/info.test.js @@ -1,6 +1,7 @@ -import { describe, expect, it, beforeAll } from 'vitest'; import fs from 'fs'; import { Validator } from 'jsonschema'; +import { beforeAll, describe, expect, it } from 'vitest'; + import { addAllSchema, schema } from './schema'; describe('Verify `info/*.json` files', () => { diff --git a/cosmwasm/cli-utils.js b/cosmwasm/cli-utils.js index 2524357f0..a90c750a1 100644 --- a/cosmwasm/cli-utils.js +++ b/cosmwasm/cli-utils.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common/cli-utils') +require('../common/cli-utils'); const { isNumber, addEnvOption } = require('../common'); const { addStoreOptions } = require('../common/cli-utils'); diff --git a/global.d.ts b/global.d.ts index 229aee5f0..68b464de4 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1 +1 @@ -declare module "*.js"; +declare module '*.js'; diff --git a/index.ts b/index.ts index 321f008fd..d714d8e86 100644 --- a/index.ts +++ b/index.ts @@ -1,12 +1,5 @@ 'use strict'; -import { printObj, readJSON, writeJSON, importNetworks, verifyContract, getBytecodeHash } from './evm'; +import { getBytecodeHash, importNetworks, printObj, readJSON, verifyContract, writeJSON } from './evm'; -export { - printObj, - readJSON, - writeJSON, - importNetworks, - verifyContract, - getBytecodeHash, -}; +export { printObj, readJSON, writeJSON, importNetworks, verifyContract, getBytecodeHash }; diff --git a/stellar/utils.js b/stellar/utils.js index dff2ac948..2f1c5dbe6 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -586,7 +586,7 @@ function isFriendbotSupported(networkType) { } module.exports = { - ...require('ts-node/register'), /* enable node during migration */ + ...require('ts-node/register') /* enable node during migration */, stellarCmd, ASSET_TYPE_NATIVE, buildTransaction, diff --git a/xrpl/cli-utils.js b/xrpl/cli-utils.js index 2dd765f11..9bb16a9ab 100644 --- a/xrpl/cli-utils.js +++ b/xrpl/cli-utils.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common/cli-utils') +require('../common/cli-utils'); const xrpl = require('xrpl'); const { Option } = require('commander'); From 66135186c308bd343e92b03f29ff65cb2ccc8c0e Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Mon, 5 May 2025 13:29:46 +0530 Subject: [PATCH 40/71] docs: update xrpl-evm cosmwasm release doc according to mainnet release (#687) --- .../cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 108 +++++++----------- 1 file changed, 43 insertions(+), 65 deletions(-) diff --git a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md index c785884ff..9a950746a 100644 --- a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -183,53 +183,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -```bash -axelard q wasm contract-state smart $ROUTER "{\"chain_info\": \"$CHAIN\"}" --output json | jq . -# You should see something like this: -{ - "data": { - "name": \"$CHAIN\", - "gateway": { - "address": "axelar1jah3ac59xke2r266yjhh45tugzsvnlzsefyvx6jgp0msk6tp7vqqaktuz2" - }, - "frozen_status": 0, - "msg_id_format": "hex_tx_hash_and_event_index" - } -} -``` - -6. Update ampd with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. - -| Network | `http_url` | -| -------------------- | ------------------------------- | -| **Devnet-amplifier** | https://rpc.testnet.xrplevm.org | -| **Stagenet** | https://rpc.testnet.xrplevm.org | -| **Testnet** | https://rpc.testnet.xrplevm.org | -| **Mainnet** | `` | - -```bash -[[handlers]] -chain_finalization="RPCFinalizedBlock" -chain_name="$CHAIN" -chain_rpc_url=[http url] -cosmwasm_contract="$VOTING_VERIFIER" -type="EvmMsgVerifier" - -[[handlers]] -chain_finalization="RPCFinalizedBlock" -chain_name="$CHAIN" -chain_rpc_url=[http url] -cosmwasm_contract="$VOTING_VERIFIER" -type="EvmVerifierSetVerifier" -``` - -7. Update ampd with the `$CHAIN` chain configuration. - -```bash -ampd register-chain-support "[service name]" $CHAIN -``` - -8. Register prover contract on coordinator +6. Register prover contract on coordinator ```bash node cosmwasm/submit-proposal.js execute \ @@ -246,7 +200,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -9. Authorize `$CHAIN` Multisig prover on Multisig +7. Authorize `$CHAIN` Multisig prover on Multisig ```bash node cosmwasm/submit-proposal.js execute \ @@ -264,15 +218,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -```bash -axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"contract_address\": \"$MULTISIG_PROVER\", \"chain_name\": \"$CHAIN\"}}" --output json | jq . -# Result should look like: -{ - "data": true -} -``` - -10. Create reward pool for voting verifier +8. Create reward pool for voting verifier #### Rewards @@ -305,7 +251,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -11. Create reward pool for multisig +9. Create reward pool for multisig ```bash node cosmwasm/submit-proposal.js execute \ @@ -329,21 +275,39 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -12. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` - Add Rewards: + +10. Update ampd with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. + +| Network | `http_url` | +| -------------------- | ------------------------------- | +| **Devnet-amplifier** | https://rpc.testnet.xrplevm.org | +| **Stagenet** | https://rpc.testnet.xrplevm.org | +| **Testnet** | https://rpc.testnet.xrplevm.org | +| **Mainnet** | `` | ```bash -axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET -axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmMsgVerifier" + +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmVerifierSetVerifier" ``` -Check reward pool to confirm funding worked: +11. Update ampd with the `$CHAIN` chain configuration. ```bash -node cosmwasm/query.js rewards -n $CHAIN +ampd register-chain-support "[service name]" $CHAIN ``` -13. Create genesis verifier set +12. Create genesis verifier set Note that this step can only be run once a sufficient number of verifiers have registered. @@ -364,6 +328,20 @@ Query the multisig prover for active verifier set axelard q wasm contract-state smart $MULTISIG_PROVER '"current_verifier_set"' ``` +13. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` + Add Rewards: + +```bash +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET +``` + +Check reward pool to confirm funding worked: + +```bash +node cosmwasm/query.js rewards -n $CHAIN +``` + ## Checklist The [xrplevm GMP checklist](../evm/2025-02-XRPL-EVM-GMP-v6.0.4.md) will test GMP call. From 59c1736573a3671509186fbdfb79816305f6c9ed Mon Sep 17 00:00:00 2001 From: isi8787 <38940784+isi8787@users.noreply.github.com> Date: Mon, 5 May 2025 16:30:15 -0400 Subject: [PATCH 41/71] chore: add xrpl evm mainnet (#689) Co-authored-by: Milap Sheth --- axelar-chains-config/info/mainnet.json | 381 ++++++++++++------ .../cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 6 +- releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 21 +- releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md | 6 +- .../evm/logs/2025-02-XRPL-EVM-GMP-v6.0.4.md | 336 +++++++++++++++ .../evm/logs/2025-02-XRPL-EVM-ITS-v2.1.0.md | 135 +++++++ 6 files changed, 745 insertions(+), 140 deletions(-) create mode 100644 releases/evm/logs/2025-02-XRPL-EVM-GMP-v6.0.4.md create mode 100644 releases/evm/logs/2025-02-XRPL-EVM-ITS-v2.1.0.md diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 47a3fb12e..777d9a09d 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -1,5 +1,132 @@ { "chains": { + "celo": { + "name": "Celo", + "axelarId": "celo", + "chainId": 42220, + "rpc": "https://forno.celo.org", + "tokenSymbol": "CELO", + "decimals": 18, + "chainType": "evm", + "contracts": { + "AxelarGateway": { + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "startingKeyIDs": [ + "evm-celo-9170074" + ], + "implementation": "0x99B5FA03a5ea4315725c43346e55a6A6fbd94098", + "implementationCodehash": "0x815c3711b7191c2598de8b4b7d977ac2d1903d20883bd25c26cf2c4a8ca37827", + "authModule": "0x96eEE595f0ACD7d232a9B1dE4FCc2a4b2F6b0f3a", + "tokenDeployer": "0xb28478319B64f8D47e19A120209A211D902F8b8f", + "deploymentMethod": "create3", + "salt": "AxelarGateway v6.2", + "governance": "0xBbEE71e2fE7741Cdd7787DC46D73Af6715D47Dc0", + "mintLimiter": "0xCC940AE49C78F20E3F13F3cF37e996b98Ac3EC68", + "connectionType": "consensus" + }, + "AxelarGasService": { + "salt": "AxelarGasService", + "collector": "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC", + "address": "0x2d5d7d31F671F86C782533cc367F14109a082712", + "implementation": "0xcb5C784DCf8FF342625DbC53B356ed0Cbb0EBB9b", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" + }, + "AxelarDepositService": { + "salt": "AxelarDepositService", + "wrappedSymbol": "", + "refundIssuer": "0x4f671f34d2d23fec3eE3087E3A0221f8D314D9dF", + "address": "0xc1DCb196BA862B337Aa23eDA1Cb9503C0801b955", + "implementation": "0xb6241272C569767072e0587098415DF6BA0aaEe9", + "deployer": "0xd55cd98cdE61c3CcE1286F9aF50cDbF16f5dba5b" + }, + "ConstAddressDeployer": { + "address": "0x98B2920D53612483F91F12Ed7754E51b4A77919e" + }, + "Create3Deployer": { + "address": "0x6513Aedb4D1593BA12e50644401D976aebDc90d8", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create2", + "salt": "Create3Deployer", + "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", + "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92" + }, + "InterchainProposalSender": { + "address": "0x1f8A4d195B647647c7dD45650CBd553FD33cCAA6", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create3", + "salt": "InterchainProposalSender v1.2" + }, + "InterchainGovernance": { + "governanceChain": "Axelarnet", + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "minimumTimeDelay": 604800, + "address": "0xfDF36A30070ea0241d69052ea85ff44Ad0476a66", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create3", + "codehash": "0x70cb562f5d856fab1b0eee1e91dfcbb568be85f28e184c6a096b4c63b145a6c2", + "predeployCodehash": "0xe2de43b29f2387b6f3575a1b50d566908fc00e03a8d88ad6be74b674a70874d2", + "salt": "InterchainGovernance v5.5" + }, + "Multisig": { + "threshold": 3, + "signers": [ + "0x3f5876a2b06E54949aB106651Ab6694d0289b2b4", + "0x9256Fd872118ed3a97754B0fB42c15015d17E0CC", + "0x1486157d505C7F7E546aD00E3E2Eee25BF665C9b", + "0x2eC991B5c0B742AbD9d2ea31fe6c14a85e91C821", + "0xf505462A29E36E26f25Ef0175Ca1eCBa09CC118f", + "0x027c1882B975E2cd771AE068b0389FA38B9dda73" + ], + "address": "0xCC940AE49C78F20E3F13F3cF37e996b98Ac3EC68", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create3", + "codehash": "0x912095d5076ee40a9dd49c0f9d61d61334c47a78c7512852791652baef26c296", + "predeployCodehash": "0x912095d5076ee40a9dd49c0f9d61d61334c47a78c7512852791652baef26c296", + "salt": "Multisig v5.5" + }, + "Operators": { + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "address": "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "InterchainTokenService": { + "salt": "ITS v2.1.0", + "proxySalt": "ITS v1.0.0", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "tokenManagerDeployer": "0xe50A35500805b555A8318Bdb98E542FB50DD6E08", + "interchainToken": "0x7F9F70Da4af54671a6abAc58e705b5634cac8819", + "interchainTokenDeployer": "0x4c555f2E0c69aC02747986ce5F6A14e2BCE44F13", + "tokenManager": "0x9D3583cBeB5542287B635Bf09D693C8106284C27", + "tokenHandler": "0xcC360c322f72a89E5247F3875a02c214F31DA035", + "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", + "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", + "gatewayCaller": "0x994014b7f3E5Ac898aAD533b10534B69D65DD6dE" + }, + "InterchainTokenFactory": { + "salt": "ITS Factory v1.0.0", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "implementation": "0x9c551097d890E16f407a1e675490a2359B3933FD", + "address": "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66" + } + }, + "explorer": { + "name": "Celoscan", + "url": "https://celoscan.io", + "api": "https://api.celoscan.io/api" + }, + "staticGasOptions": { + "gasLimit": 3000000, + "gasPrice": 100000000000 + }, + "finality": "1", + "approxFinalityWaitTime": 1 + }, "ethereum": { "name": "Ethereum", "axelarId": "Ethereum", @@ -271,7 +398,7 @@ "name": "Fantom", "axelarId": "Fantom", "chainId": 250, - "rpc": "https://rpc.ftm.tools", + "rpc": "https://fantom-mainnet.public.blastapi.io", "tokenSymbol": "FTM", "decimals": 18, "chainType": "evm", @@ -653,7 +780,7 @@ "name": "Binance", "axelarId": "binance", "chainId": 56, - "rpc": "https://bscrpc.com", + "rpc": "https://bsc-mainnet.public.blastapi.io", "tokenSymbol": "BNB", "decimals": 18, "wrappedSymbol": "WBNB", @@ -919,133 +1046,6 @@ "finality": "finalized", "approxFinalityWaitTime": 25 }, - "celo": { - "name": "Celo", - "axelarId": "celo", - "chainId": 42220, - "rpc": "https://forno.celo.org", - "tokenSymbol": "CELO", - "decimals": 18, - "chainType": "evm", - "contracts": { - "AxelarGateway": { - "address": "0xe432150cce91c13a887f7D836923d5597adD8E31", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "startingKeyIDs": [ - "evm-celo-9170074" - ], - "implementation": "0x99B5FA03a5ea4315725c43346e55a6A6fbd94098", - "implementationCodehash": "0x815c3711b7191c2598de8b4b7d977ac2d1903d20883bd25c26cf2c4a8ca37827", - "authModule": "0x96eEE595f0ACD7d232a9B1dE4FCc2a4b2F6b0f3a", - "tokenDeployer": "0xb28478319B64f8D47e19A120209A211D902F8b8f", - "deploymentMethod": "create3", - "salt": "AxelarGateway v6.2", - "governance": "0xBbEE71e2fE7741Cdd7787DC46D73Af6715D47Dc0", - "mintLimiter": "0xCC940AE49C78F20E3F13F3cF37e996b98Ac3EC68", - "connectionType": "consensus" - }, - "AxelarGasService": { - "salt": "AxelarGasService", - "collector": "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC", - "address": "0x2d5d7d31F671F86C782533cc367F14109a082712", - "implementation": "0xcb5C784DCf8FF342625DbC53B356ed0Cbb0EBB9b", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" - }, - "AxelarDepositService": { - "salt": "AxelarDepositService", - "wrappedSymbol": "", - "refundIssuer": "0x4f671f34d2d23fec3eE3087E3A0221f8D314D9dF", - "address": "0xc1DCb196BA862B337Aa23eDA1Cb9503C0801b955", - "implementation": "0xb6241272C569767072e0587098415DF6BA0aaEe9", - "deployer": "0xd55cd98cdE61c3CcE1286F9aF50cDbF16f5dba5b" - }, - "ConstAddressDeployer": { - "address": "0x98B2920D53612483F91F12Ed7754E51b4A77919e" - }, - "Create3Deployer": { - "address": "0x6513Aedb4D1593BA12e50644401D976aebDc90d8", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "deploymentMethod": "create2", - "salt": "Create3Deployer", - "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", - "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92" - }, - "InterchainProposalSender": { - "address": "0x1f8A4d195B647647c7dD45650CBd553FD33cCAA6", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "deploymentMethod": "create3", - "salt": "InterchainProposalSender v1.2" - }, - "InterchainGovernance": { - "governanceChain": "Axelarnet", - "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", - "minimumTimeDelay": 604800, - "address": "0xfDF36A30070ea0241d69052ea85ff44Ad0476a66", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "deploymentMethod": "create3", - "codehash": "0x70cb562f5d856fab1b0eee1e91dfcbb568be85f28e184c6a096b4c63b145a6c2", - "predeployCodehash": "0xe2de43b29f2387b6f3575a1b50d566908fc00e03a8d88ad6be74b674a70874d2", - "salt": "InterchainGovernance v5.5" - }, - "Multisig": { - "threshold": 3, - "signers": [ - "0x3f5876a2b06E54949aB106651Ab6694d0289b2b4", - "0x9256Fd872118ed3a97754B0fB42c15015d17E0CC", - "0x1486157d505C7F7E546aD00E3E2Eee25BF665C9b", - "0x2eC991B5c0B742AbD9d2ea31fe6c14a85e91C821", - "0xf505462A29E36E26f25Ef0175Ca1eCBa09CC118f", - "0x027c1882B975E2cd771AE068b0389FA38B9dda73" - ], - "address": "0xCC940AE49C78F20E3F13F3cF37e996b98Ac3EC68", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "deploymentMethod": "create3", - "codehash": "0x912095d5076ee40a9dd49c0f9d61d61334c47a78c7512852791652baef26c296", - "predeployCodehash": "0x912095d5076ee40a9dd49c0f9d61d61334c47a78c7512852791652baef26c296", - "salt": "Multisig v5.5" - }, - "Operators": { - "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "address": "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "deploymentMethod": "create2", - "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", - "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", - "salt": "Operators" - }, - "InterchainTokenService": { - "salt": "ITS v2.1.0", - "proxySalt": "ITS v1.0.0", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "tokenManagerDeployer": "0xe50A35500805b555A8318Bdb98E542FB50DD6E08", - "interchainToken": "0x7F9F70Da4af54671a6abAc58e705b5634cac8819", - "interchainTokenDeployer": "0x4c555f2E0c69aC02747986ce5F6A14e2BCE44F13", - "tokenManager": "0x9D3583cBeB5542287B635Bf09D693C8106284C27", - "tokenHandler": "0xcC360c322f72a89E5247F3875a02c214F31DA035", - "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", - "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", - "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x994014b7f3E5Ac898aAD533b10534B69D65DD6dE" - }, - "InterchainTokenFactory": { - "salt": "ITS Factory v1.0.0", - "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", - "implementation": "0x9c551097d890E16f407a1e675490a2359B3933FD", - "address": "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66" - } - }, - "explorer": { - "name": "Celoscan", - "url": "https://celoscan.io", - "api": "https://api.celoscan.io/api" - }, - "staticGasOptions": { - "gasLimit": 3000000, - "gasPrice": 100000000000 - }, - "finality": "1", - "approxFinalityWaitTime": 1 - }, "kava": { "name": "Kava", "axelarId": "kava", @@ -2841,6 +2841,95 @@ "name": "Stellar Expert", "url": "https://stellar.expert/explorer/public" } + }, + "xrpl-evm": { + "name": "XRPL EVM", + "axelarId": "xrpl-evm", + "chainId": 1440000, + "rpc": "http://mainnet-json-rpc-1868519179.us-east-1.elb.amazonaws.com", + "tokenSymbol": "XRP", + "decimals": 18, + "confirmations": 1, + "finality": "finalized", + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Xrplscan", + "url": "[placeholder]", + "api": "[placeholder]" + }, + "contracts": { + "ConstAddressDeployer": { + "address": "0x98B2920D53612483F91F12Ed7754E51b4A77919e", + "deployer": "0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F", + "deploymentMethod": "create", + "codehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe", + "predeployCodehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe" + }, + "Create3Deployer": { + "address": "0x6513Aedb4D1593BA12e50644401D976aebDc90d8", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create2", + "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", + "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92", + "salt": "Create3Deployer" + }, + "AxelarGateway": { + "deployer": "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "operator": "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "proxyDeploymentArgs": [ + "0x05823c334150a48ACD5D325fBA16147c21bA3653", + "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "0x000000000000000000000000b8cd93c83a974649d76b1c19f311f639e62272bc00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000111950c000000000000000000000000000000000000000000000000000000000000001900000000000000000000000013476c82ab76de288a1d2765cc113e83845fa9e4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000020c4ad615e3c5f0ee136c56adfc5296da94828c40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000215fa9602f4991c665a3f8cfae301a15d597fda900000000000000000000000000000000000000000000000000000000000000010000000000000000000000002743a8844f399bb7a0d6d8535be417fde72a867e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000002d9a783ae26a498e7bb77a8813480e62f523ad7d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000003a5360b6231b2a44904a683915aaf8e33b760106000000000000000000000000000000000000000000000000000000000000000100000000000000000000000040a08e1ddb42cdb8869342958a829b80cf150c61000000000000000000000000000000000000000000000000000000000000000100000000000000000000000040d56668eb8e2c7e02a15795804f37cc7e9f55cd000000000000000000000000000000000000000000000000000000000000000100000000000000000000000047e22383c384a92ece0e16908da432472efb7b4c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000004d5955cba942a448052469a7b2c5c768bbf7b84100000000000000000000000000000000000000000000000000000000000000010000000000000000000000005aa28a502d8a9f9df24d6f45f6af5177a7faa6d000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005d0cb24000b17585b118686d44d7792e4fdb329700000000000000000000000000000000000000000000000000000000000000010000000000000000000000007191523b52690a777820601d60d5523ca1481af90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000743e91394fed80577cd893cbfc23fb78bb59ef2200000000000000000000000000000000000000000000000000000000000000010000000000000000000000008b99555ad6d2c3c114037746f3582e2105ac8561000000000000000000000000000000000000000000000000000000000000000100000000000000000000000099f6753fa1330af12e262a94cbc297f1c7beb8900000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a360fae63e806238de4dde49bfa92f79eff73fc60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000adda4a8627185c1d5558552868e45f514fd641720000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b18d3a3c404abda400b8f818ffaddf987ba088750000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cdb49d6d7167d71ddea024e0ce3da5fcceab37e30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d601001d8ce6b1ed0f6e688005600b346f01fb6b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d88a2598600814e985a1fe19a5b350aaaf3245100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ef3350da91a1ca637fcc2c6d664551a7dd3171c40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f04636c843a8d38efb549b310c041f5052b6e0ca0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f24bbd6f2e0e0b14f897b2c7980d1a4d99125f190000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "04281267616f3e94729df7c494552599a6cffdf11fbd67e692a9da10e65d4117", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "implementation": "0x05823c334150a48ACD5D325fBA16147c21bA3653", + "implementationCodehash": "0x6bf95c2a410e1f72b47cdabc8d8fcf794f3ccd5171f16ddd4a8db8a1f69a82b2", + "deploymentMethod": "create", + "previousSignersRetention": 15, + "domainSeparator": "0x0474cdd6880766991d1bab2fdfae4385e7b54b1032d68f9b1c0bab887b2f5ca4", + "minimumRotationDelay": 86400, + "connectionType": "amplifier", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" + }, + "Operators": { + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "address": "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "AxelarGasService": { + "collector": "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC", + "salt": "AxelarGasService", + "address": "0x2d5d7d31F671F86C782533cc367F14109a082712", + "implementation": "0xdC46f07661B673Fc262f61FC5b05B10A58a3b7fE", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" + }, + "InterchainTokenService": { + "salt": "ITS v2.1.0", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "proxySalt": "ITS v1.0.0", + "tokenManagerDeployer": "0xe50A35500805b555A8318Bdb98E542FB50DD6E08", + "interchainToken": "0xFe3C351E8D85aBc4eb7B669C450583ff40ed0B22", + "interchainTokenDeployer": "0x6Cf80d1dcEdD398A6af7e9b0026a750a5c6e2a4c", + "tokenManager": "0x9D3583cBeB5542287B635Bf09D693C8106284C27", + "tokenHandler": "0xcC360c322f72a89E5247F3875a02c214F31DA035", + "gatewayCaller": "0x994014b7f3E5Ac898aAD533b10534B69D65DD6dE", + "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", + "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C" + }, + "InterchainTokenFactory": { + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "salt": "ITS Factory v1.0.0", + "implementation": "0x9c551097d890E16f407a1e675490a2359B3933FD", + "address": "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66" + } + } } }, "axelar": { @@ -2959,6 +3048,21 @@ "domainSeparator": "0xd2937eba76cea053386484dae0e3d497548237ecb777dfdd5401e12cfc97ec78", "address": "axelar1wdgp5xyqjyv5zsq86n6pah2lsmd46mn0gt4055mvvk6mezn9skqs6p93dg" }, + "xrpl-evm": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj", + "signingThreshold": [ + "2", + "3" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa", + "codeId": 16, + "domainSeparator": "0x0474cdd6880766991d1bab2fdfae4385e7b54b1032d68f9b1c0bab887b2f5ca4", + "address": "axelar198xehj5htckk75s8wcamxerxtdc45669zdqjmr69guveqntj9f6s5rqq55" + }, "storeCodeProposalId": "263", "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a", "codeId": 16, @@ -2979,6 +3083,10 @@ "stellar": { "codeId": 17, "address": "axelar1t46envzujl4kmhst6myg364v00f8jcyjespw6tr00r3ycd0pehxqetqrpm" + }, + "xrpl-evm": { + "codeId": 17, + "address": "axelar1vvdukrmxdylvnn8e59s3gnn49lutv3n9tg4vnsttn33a8zulgfssl62q69" } }, "VotingVerifier": { @@ -3026,6 +3134,21 @@ "codeId": 20, "address": "axelar1dalnx2yvmu3g3aau8m7fj426fk9u8dnzlr5azvqmr4x82rtclats8lhjmu" }, + "xrpl-evm": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "serviceName": "amplifier", + "sourceGatewayAddress": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "votingThreshold": [ + "2", + "3" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55", + "codeId": 20, + "address": "axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" + }, "storeCodeProposalId": "267", "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708", "codeId": 20, diff --git a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md index 9a950746a..8d406fc73 100644 --- a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -3,7 +3,7 @@ | | **Owner** | | -------------- | -------------------------------------- | | **Created By** | @blockchainguyy | -| **Deployment** | @blockchainguyy | +| **Deployment** | @blockchainguyy , @isi8787 | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | @@ -11,7 +11,7 @@ | **Stagenet** | - | TBD | | **Testnet**(staging) | Completed | 2025-02-19 | | **Testnet** | Completed | 2025-03-13 | -| **Mainnet** | - | TBD | +| **Mainnet** | Completed | 2025-04-29 | - [Amplifier Releases](https://github.com/axelarnetwork/axelar-amplifier/releases) - [VotingVerifier v1.1.0](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/voting-verifier-v1.1.0) @@ -227,7 +227,7 @@ node cosmwasm/submit-proposal.js execute \ | **Devnet-amplifier** | `100` | `[\"7\", \"10\"]` | `100` | | **Stagenet** | `600` | `[\"7\", \"10\"]` | `100` | | **Testnet** | `600` | `[\"7\", \"10\"]` | `100` | -| **Mainnet** | `14845` | `[\"8\", \"10\"]` | `TBD` | +| **Mainnet** | `14845` | `[\"8\", \"10\"]` | `1260000000` | ```bash node cosmwasm/submit-proposal.js execute \ diff --git a/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md index 4f188e031..613837f36 100644 --- a/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -10,8 +10,8 @@ | **Devnet Amplifier** | - | TBD | | **Stagenet** | - | TBD | | **Testnet**(staging) | Completed | 2025-02-19 | -| **Testnet** | In Progress | TBD | -| **Mainnet** | - | TBD | +| **Testnet** | Completed | 2025-03-13 | +| **Mainnet** | Completed | 2025-05-05 | - [Releases](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/releases/tag/v6.0.4) @@ -170,7 +170,7 @@ node evm/deploy-contract.js -c Operators -m create2 node evm/operators.js --action addOperator --args $OPERATOR_ADDRESS ``` -8. Deploy GasService (set the `AxelarGasService.collector` to `Operators` address in config, which you will receive at step 6) +8. Deploy GasService (set the `collector` to `Operators` address from step 6) | Network | `deployer address` | `deployMethod` | | -------------------- | -------------------------------------------- | -------------- | @@ -183,11 +183,22 @@ node evm/operators.js --action addOperator --args $OPERATOR_ADDRESS node evm/deploy-upgradable.js -c AxelarGasService -m [deployMethod] --args '{"collector": "$OPERATOR_ADDRESS"}' ``` -8. Transfer ownerships for gateway, operators and gas service contracts on `mainnet` and `testnet` +8. Transfer ownership for contracts on mainnet and testnet. + +For Mainnet + +```bash +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + +For Testnet ```bash -# Only for mainnet and official testnet connection node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +node evm/ownership.js -c AxelarGasService --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +node evm/ownership.js -c Operators --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 ``` ## Checklist diff --git a/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md b/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md index b28dd260b..4e224f753 100644 --- a/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md +++ b/releases/evm/2025-02-XRPL-EVM-ITS-v2.1.0.md @@ -9,9 +9,9 @@ | --------------------- | --------------------- | ---------- | | **Devnet Amplifier** | - | TBD | | **Stagenet** | - | TBD | -| **Testnet** (staging) | Completed | 2025-02-19 | +| **Testnet** (staging) | Completed | 2025-02-19 | | **Testnet** | Completed | 2025-03-13 | -| **Mainnet** | - | TBD | +| **Mainnet** | Completed | 2025-05-05 | [Release](https://github.com/axelarnetwork/interchain-token-service/releases/tag/v) @@ -121,5 +121,5 @@ node evm/interchainTokenFactory.js --action deployInterchainToken --minter [mint node evm/its.js interchain-transfer [destination-chain] [tokenId] [recipient] 1 --gasValue 1000000000000000000 -n $CHAIN # Transfer token back from remote chain -node evm/its.js interchain-transfer $CHAIN [tokenId] [destination-address] 1 --gasValue 1000000000000000000 -n [destination-chain] +node evm/its.js interchain-transfer $CHAIN [tokenId] [destination-address] 1 --gasValue 1000000000000000000 -n [destination-chain] ``` diff --git a/releases/evm/logs/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/evm/logs/2025-02-XRPL-EVM-GMP-v6.0.4.md new file mode 100644 index 000000000..bd5865650 --- /dev/null +++ b/releases/evm/logs/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -0,0 +1,336 @@ +# Deployment logs + +```bash +node evm/deploy-contract.js -c ConstAddressDeployer -m create --artifactPath ../evm/legacy/ConstAddressDeployer.json +``` + +```text + +Environment: mainnet + + +Chain: XRPL EVM + +Wallet address: 0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F + +Wallet balance: 2.0001 + +Wallet nonce: 0 + +Contract name: ConstAddressDeployer + +Pre-deploy Contract bytecode hash: 0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe + +Gas options: {} + +Constructor args for chain XRPL EVM: [] + +Deployment method: create + +Deployer contract + +ConstAddressDeployer will be deployed to: 0x98B2920D53612483F91F12Ed7754E51b4A77919e + +Proceed with deployment on XRPL EVM? (y/n) y + +Deployed Contract bytecode hash: 0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe + +XRPL EVM | ConstAddressDeployer: 0x98B2920D53612483F91F12Ed7754E51b4A77919e +``` + +```bash +node evm/deploy-contract.js -c Create3Deployer -m create2 +``` + +```text +Chain: XRPL EVM + +Wallet address: 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +Wallet balance: 2.0001 + +Wallet nonce: 0 + +Contract name: Create3Deployer + +Pre-deploy Contract bytecode hash: 0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92 + +Gas options: {} + +Constructor args for chain XRPL EVM: [] + +Create3Deployer deployment salt: Create3Deployer + +Deployment method: create2 + +Deployer contract: 0x98B2920D53612483F91F12Ed7754E51b4A77919e + +Create3Deployer will be deployed to: 0x6513Aedb4D1593BA12e50644401D976aebDc90d8 + +Proceed with deployment on XRPL EVM? (y/n) y + +Deployed Contract bytecode hash: 0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7 + +XRPL EVM | Create3Deployer: 0x6513Aedb4D1593BA12e50644401D976aebDc90d8 +``` + +```bash +node evm/deploy-amplifier-gateway.js -m create --minimumRotationDelay 86400 +``` + +```text +Chain: XRPL EVM + +Wallet address: 0xB8Cd93C83A974649D76B1c19f311f639e62272BC + +Wallet balance: 11.991437 + +Wallet nonce: 2 + +Owner address: 0xB8Cd93C83A974649D76B1c19f311f639e62272BC + +Gas options: {} + +Predicted gateway proxy address: 0xe432150cce91c13a887f7D836923d5597adD8E31 + +Does derived address match existing gateway deployments? Proceed with deployment on XRPL EVM? (y/n) y + +Retrieving domain separator for XRPL EVM from Axelar network + +Deploying gateway implementation contract + +Gateway Implementation args: 15, 0x0474cdd6880766991d1bab2fdfae4385e7b54b1032d68f9b1c0bab887b2f5ca4, 86400 + +Deploy method: create + +Deploy salt (if not create based deployment) + +Gateway Implementation: 0x05823c334150a48ACD5D325fBA16147c21bA3653 + +Gateway Implementation codehash: 0x6bf95c2a410e1f72b47cdabc8d8fcf794f3ccd5171f16ddd4a8db8a1f69a82b2 + +Setup params: [ + "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + [ + { + "signers": [ + { + "signer": "0x13476c82AB76dE288A1D2765cc113e83845Fa9E4", + "weight": 1 + }, + { + "signer": "0x20C4AD615e3C5F0eE136C56aDfC5296dA94828C4", + "weight": 1 + }, + { + "signer": "0x215Fa9602f4991C665A3F8CFae301a15D597FDa9", + "weight": 1 + }, + { + "signer": "0x2743A8844F399Bb7a0D6d8535bE417FDe72a867e", + "weight": 1 + }, + { + "signer": "0x2d9A783Ae26a498E7bb77a8813480e62f523AD7d", + "weight": 1 + }, + { + "signer": "0x3A5360b6231B2a44904a683915AAF8E33B760106", + "weight": 1 + }, + { + "signer": "0x40a08E1Ddb42cDb8869342958a829b80cf150c61", + "weight": 1 + }, + { + "signer": "0x40D56668Eb8E2C7E02a15795804f37cC7E9F55cd", + "weight": 1 + }, + { + "signer": "0x47E22383c384a92ece0E16908da432472Efb7B4C", + "weight": 1 + }, + { + "signer": "0x4d5955cBa942A448052469a7B2c5C768bbf7B841", + "weight": 1 + }, + { + "signer": "0x5aa28a502d8A9f9DF24d6F45f6aF5177A7FaA6d0", + "weight": 1 + }, + { + "signer": "0x5d0cB24000B17585B118686d44D7792E4fdB3297", + "weight": 1 + }, + { + "signer": "0x7191523b52690a777820601D60D5523ca1481af9", + "weight": 1 + }, + { + "signer": "0x743E91394FEd80577cD893cBfC23fb78bB59ef22", + "weight": 1 + }, + { + "signer": "0x8b99555aD6d2c3C114037746f3582E2105aC8561", + "weight": 1 + }, + { + "signer": "0x99f6753fA1330AF12E262a94CBc297f1C7BEB890", + "weight": 1 + }, + { + "signer": "0xa360Fae63e806238De4dDe49Bfa92f79Eff73fC6", + "weight": 1 + }, + { + "signer": "0xadDa4A8627185C1d5558552868e45F514Fd64172", + "weight": 1 + }, + { + "signer": "0xB18d3A3C404abDA400b8f818ffaddF987Ba08875", + "weight": 1 + }, + { + "signer": "0xCdB49D6d7167d71dDea024E0ce3Da5FcCeAB37e3", + "weight": 1 + }, + { + "signer": "0xd601001d8CE6B1ED0F6e688005600b346F01fB6b", + "weight": 1 + }, + { + "signer": "0xD88a2598600814E985A1fE19a5B350aAAF324510", + "weight": 1 + }, + { + "signer": "0xEf3350da91a1ca637Fcc2c6d664551A7dD3171c4", + "weight": 1 + }, + { + "signer": "0xf04636C843A8D38Efb549B310C041f5052b6E0cA", + "weight": 1 + }, + { + "signer": "0xF24bbD6f2E0E0b14F897B2c7980D1a4d99125F19", + "weight": 1 + } + ], + "threshold": 17, + "nonce": "0x000000000000000000000000000000000000000000000000000000000111950c" + } + ] +] + +Deploying gateway proxy contract + +Proxy deployment args: 0x05823c334150a48ACD5D325fBA16147c21bA3653, 0x000000000000000000000000b8cd93c83a974649d76b1c19f311f639e62272bc00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000111950c000000000000000000000000000000000000000000000000000000000000001900000000000000000000000013476c82ab76de288a1d2765cc113e83845fa9e4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000020c4ad615e3c5f0ee136c56adfc5296da94828c40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000215fa9602f4991c665a3f8cfae301a15d597fda900000000000000000000000000000000000000000000000000000000000000010000000000000000000000002743a8844f399bb7a0d6d8535be417fde72a867e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000002d9a783ae26a498e7bb77a8813480e62f523ad7d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000003a5360b6231b2a44904a683915aaf8e33b760106000000000000000000000000000000000000000000000000000000000000000100000000000000000000000040a08e1ddb42cdb8869342958a829b80cf150c61000000000000000000000000000000000000000000000000000000000000000100000000000000000000000040d56668eb8e2c7e02a15795804f37cc7e9f55cd000000000000000000000000000000000000000000000000000000000000000100000000000000000000000047e22383c384a92ece0e16908da432472efb7b4c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000004d5955cba942a448052469a7b2c5c768bbf7b84100000000000000000000000000000000000000000000000000000000000000010000000000000000000000005aa28a502d8a9f9df24d6f45f6af5177a7faa6d000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005d0cb24000b17585b118686d44d7792e4fdb329700000000000000000000000000000000000000000000000000000000000000010000000000000000000000007191523b52690a777820601d60d5523ca1481af90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000743e91394fed80577cd893cbfc23fb78bb59ef2200000000000000000000000000000000000000000000000000000000000000010000000000000000000000008b99555ad6d2c3c114037746f3582e2105ac8561000000000000000000000000000000000000000000000000000000000000000100000000000000000000000099f6753fa1330af12e262a94cbc297f1c7beb8900000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a360fae63e806238de4dde49bfa92f79eff73fc60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000adda4a8627185c1d5558552868e45f514fd641720000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b18d3a3c404abda400b8f818ffaddf987ba088750000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cdb49d6d7167d71ddea024e0ce3da5fcceab37e30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d601001d8ce6b1ed0f6e688005600b346f01fb6b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d88a2598600814e985a1fe19a5b350aaaf3245100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ef3350da91a1ca637fcc2c6d664551a7dd3171c40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f04636c843a8d38efb549b310c041f5052b6e0ca0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f24bbd6f2e0e0b14f897b2c7980d1a4d99125f190000000000000000000000000000000000000000000000000000000000000001 + +Gateway Proxy: 0xe432150cce91c13a887f7D836923d5597adD8E31 + +Existing owner: 0xB8Cd93C83A974649D76B1c19f311f639e62272BC + +Deployment status: SUCCESS +``` + +```bash +node evm/deploy-contract.js -c Operators -m create2 +``` + +```text +Chain: XRPL EVM + +Wallet address: 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +Wallet balance: 11.8502172475 + +Wallet nonce: 1 + +Contract name: Operators + +Pre-deploy Contract bytecode hash: 0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb + +Gas options: {} + +Constructor args for chain XRPL EVM: [ + "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" +] + +Operators deployment salt: Operators + +Deployment method: create2 + +Deployer contract: 0x98B2920D53612483F91F12Ed7754E51b4A77919e + +Operators will be deployed to: 0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC + +Proceed with deployment on XRPL EVM? (y/n) y + +Deployed Contract bytecode hash: 0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb + +XRPL EVM | Operators: 0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC +``` + +```bash +node evm/deploy-upgradable.js -c AxelarGasService -m create2 --args '{"collector": "0x7D +dB2d76b80B0AA19bDEa48EB1301182F4CeefbC"}' +``` + +```text +Chain: XRPL EVM + +Wallet address: 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +Wallet balance: 11.688325498 + +Wallet nonce: 4 + +Gas options: {} + +Implementation args for chain XRPL EVM: [ + "0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC" +] + +Proxy setup args: 0x + +AxelarGasService deployment salt: AxelarGasService + +Deployment method: create2 + +Deployer contract: 0x98B2920D53612483F91F12Ed7754E51b4A77919e + +AxelarGasService will be deployed to: 0x2d5d7d31F671F86C782533cc367F14109a082712 + +Does derived address match existing deployments? Proceed with deployment on XRPL EVM? (y/n) y + +XRPL EVM | ConstAddressDeployer: 0x98B2920D53612483F91F12Ed7754E51b4A77919e + +XRPL EVM | Implementation for AxelarGasService: 0xdC46f07661B673Fc262f61FC5b05B10A58a3b7fE + +XRPL EVM | Proxy for AxelarGasService: 0x2d5d7d31F671F86C782533cc367F14109a082712 +``` + +```bash +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47F +c8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + +```text +Chain: XRPL EVM + +Contract name: AxelarGateway + +Wallet address: 0xB8Cd93C83A974649D76B1c19f311f639e62272BC + +Wallet balance: 11.360003704 + +Wallet nonce: 4 + +Gas options: {} + +Ownership Action: transferOwnership + +Proceed with transferOwnership on XRPL EVM? (y/n) y + +New contract owner: 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + diff --git a/releases/evm/logs/2025-02-XRPL-EVM-ITS-v2.1.0.md b/releases/evm/logs/2025-02-XRPL-EVM-ITS-v2.1.0.md new file mode 100644 index 000000000..4b07a1bf2 --- /dev/null +++ b/releases/evm/logs/2025-02-XRPL-EVM-ITS-v2.1.0.md @@ -0,0 +1,135 @@ +```bash +node evm/deploy-its.js -s "v2.1.0" -m create2 --proxySalt 'v1.0.0' +``` + +```text +Chain: XRPL EVM + +Wallet address: 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +Wallet balance: 11.0674103005 + +Wallet nonce: 6 + +Gas options: {} + +Interchain Token Service will be deployed to: 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C + +Interchain Token Factory will be deployed to: 0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66 + +Trusted chains: [ + "celo", + "Ethereum", + "Avalanche", + "Fantom", + "Polygon", + "Moonbeam", + "binance", + "arbitrum", + "kava", + "filecoin", + "optimism", + "linea", + "base", + "mantle", + "scroll", + "immutable", + "fraxtal", + "blast", + "flow", + "axelar" +] + +Trusted addresses: [ + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "hub", + "axelar1aqcj54lzz0rk22gvqgcn8fr5tx4rzwdv5wv5j9dmnacgefvd7wzsy2j2mr" +] + +Proceed with deployment on XRPL EVM? (y/n) y + +Deploying Token Manager Deployer + +Deployed Token Manager Deployer at 0xe50A35500805b555A8318Bdb98E542FB50DD6E08 + +Deploying Interchain Token + +Deployed Interchain Token at 0xFe3C351E8D85aBc4eb7B669C450583ff40ed0B22 + +Deploying Interchain Token Deployer + +Deployed Interchain Token Deployer at 0x6Cf80d1dcEdD398A6af7e9b0026a750a5c6e2a4c + +Deploying Token Manager + +Deployed Token Manager at 0x9D3583cBeB5542287B635Bf09D693C8106284C27 + +Deploying Token Handler + +Deployed Token Handler at 0xcC360c322f72a89E5247F3875a02c214F31DA035 + +Deploying Gateway Caller + +Deployed Gateway Caller at 0x994014b7f3E5Ac898aAD533b10534B69D65DD6dE + +Deploying Interchain Token Service Implementation + +ITS Implementation args: [ + "0xe50A35500805b555A8318Bdb98E542FB50DD6E08", + "0x6Cf80d1dcEdD398A6af7e9b0026a750a5c6e2a4c", + "0xe432150cce91c13a887f7D836923d5597adD8E31", + "0x2d5d7d31F671F86C782533cc367F14109a082712", + "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66", + "xrpl-evm", + "0x9D3583cBeB5542287B635Bf09D693C8106284C27", + "0xcC360c322f72a89E5247F3875a02c214F31DA035", + "0x994014b7f3E5Ac898aAD533b10534B69D65DD6dE" +] + +Deployed Interchain Token Service Implementation at 0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921 + +Deploying Interchain Token Service Proxy + +ITS Proxy args: [ + "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", + "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "0x0000000000000000000000006f24a47fc8ae5441eb47effc3665e70e69ac3f05000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000000087872706c2d65766d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000000463656c6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008457468657265756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094176616c616e6368650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646616e746f6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007506f6c79676f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d6f6f6e6265616d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000762696e616e6365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008617262697472756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046b61766100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000866696c65636f696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f7074696d69736d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056c696e65610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004626173650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066d616e746c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067363726f6c6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009696d6d757461626c65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076672617874616c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005626c6173740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004666c6f770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066178656c617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036875620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000368756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036875620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000368756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036875620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000368756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036875620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000368756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036875620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000368756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036875620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000368756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003687562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416178656c6172316171636a35346c7a7a30726b323267767167636e38667235747834727a776476357776356a39646d6e6163676566766437777a7379326a326d7200000000000000000000000000000000000000000000000000000000000000" +] + +Deployed Interchain Token Service Proxy at 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C + +Deploying Interchain Token Factory Implementation + +Deployed Interchain Token Factory Implementation at 0x9c551097d890E16f407a1e675490a2359B3933FD + +Deploying Interchain Token Factory Proxy + +ITS Factory Proxy args: [ + "0x9c551097d890E16f407a1e675490a2359B3933FD", + "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "0x" +] + +Deployed Interchain Token Factory Proxy at 0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66 +``` + +```bash +node evm/its.js set-trusted-chains xrpl-evm hub -n all --skipChains xrpl-evm +``` From 4870979b2952d3b030def844c8413cfd24e535cb Mon Sep 17 00:00:00 2001 From: Nikolaos Kamarinakis Date: Tue, 6 May 2025 06:10:46 -0400 Subject: [PATCH 42/71] docs(release): migrate to XRPLGateway v1.0.1 (#633) --- .../cosmwasm/2025-03-XRPLGateway-v1.0.1.md | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 releases/cosmwasm/2025-03-XRPLGateway-v1.0.1.md diff --git a/releases/cosmwasm/2025-03-XRPLGateway-v1.0.1.md b/releases/cosmwasm/2025-03-XRPLGateway-v1.0.1.md new file mode 100644 index 000000000..76c4b9ee6 --- /dev/null +++ b/releases/cosmwasm/2025-03-XRPLGateway-v1.0.1.md @@ -0,0 +1,119 @@ +# XRPLGateway v1.0.1 + +| | **Owner** | +|----------------|--------------------------------------------------------------------------| +| **Created By** | @k4m4 | +| **Deployment** | @blockchainguyy , @k4m4 | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-03-26 | +| **Stagenet** | Deployed | 2025-03-28 | +| **Testnet** | Deployed | 2025-03-28 | +| **Mainnet** | - | TBD | + +[Release](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.0.1) + +## Background + +Changes in this release: + +1. Fix bug in XRPLTokenAmount arithmetic operations + +## Deployment + +- This rollout upgrades XRPLGateway from `v1.0.0` to `v1.1.0` +- There is no migration involved, i.e., the migrate step will just update the code + +1. Create `.env`. + +| Network | `INIT_ADDRESSES` | `RUN_AS_ACCOUNT` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Devnet-amplifier** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +| Network | `DEPOSIT_VALUE` | +| -------------------- | --------------- | +| **Devnet-amplifier** | `100000000` | +| **Stagenet** | `100000000` | +| **Testnet** | `2000000000` | +| **Mainnet** | `2000000000` | + +```bash +MNEMONIC=xyz +ENV=abc +CHAIN=xrpl +RELEASES_BASE_URL=https://pub-7233af746dc8432f8d9547af0133309d.r2.dev +ARTIFACT_PATH=wasm +XRPL_GATEWAY= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download `XRPLGateway` wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.0.1/xrpl_gateway.wasm --directory-prefix=$ARTIFACT_PATH +``` + +3. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.0.1/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_gateway.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_gateway.wasm | grep $CHECKSUM +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +695eac10df3b5e5c571047ddab1bc64b92e80938d424907d7e2039c86883fd51 wasm/xrpl_gateway.wasm +``` + +4. Store `XRPLGateway` contract. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplGateway \ + -t "Upload XRPLGateway contract v1.0.1" \ + -d "Upload XRPLGateway contract v1.0.1" \ + -a "$ARTIFACT_PATH/xrpl_gateway.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +6. Migrate `XRPLGateway` contract. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplGateway \ + -t "Migrate XrplGateway to v1.0.1" \ + -d "Migrate XrplGateway to v1.0.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify XRPLGateway contract version: + +```bash +axelard query wasm contract-state raw $XRPL_GATEWAY 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-gateway","version":"1.0.1"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. From ad4336e2a4576e1c4959a8409b8dc3e8c8b3439c Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Tue, 6 May 2025 11:37:41 -0400 Subject: [PATCH 43/71] docs: add ITS hub 1.2.1 release doc (#680) --- releases/cosmwasm/2025-01-ITS-v1.2.1.md | 133 ++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 releases/cosmwasm/2025-01-ITS-v1.2.1.md diff --git a/releases/cosmwasm/2025-01-ITS-v1.2.1.md b/releases/cosmwasm/2025-01-ITS-v1.2.1.md new file mode 100644 index 000000000..1bdb5d0b9 --- /dev/null +++ b/releases/cosmwasm/2025-01-ITS-v1.2.1.md @@ -0,0 +1,133 @@ +# Cosmwasm ITS v1.2.1 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 | +| **Deployment** | TBD | + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 2025-04-24 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) + +## Background + +Changes in this release: + +1. Support registering p2p tokens with the Hub +2. Support modifying supply of existing tokens +3. Change max uint to max uint bits +4. Add several queries + +## Deployment + +- This rollout upgrades ITS Hub from `v1.0.0` to `v1.2.1` +- There is a migration involved + +1. Download interchain token service wasm bytecode + +```bash +mkdir wasm +wget https://static.axelar.network/releases/cosmwasm/interchain-token-service/1.2.1/interchain_token_service.wasm --directory-prefix=wasm/ +``` + +2. Download and verify Checksum +```bash +wget https://static.axelar.network/releases/cosmwasm/interchain-token-service/1.2.1/checksums.txt +CHECKSUM=$(cat checksums.txt | grep interchain_token_service.wasm | awk '{print $1}') +shasum -a 256 wasm/interchain_token_service.wasm | grep $CHECKSUM +``` + +3. Expected output, make sure this matches before proceeding +``` +36c758c8e36951369ff2b5f9590485edab6c302e7c1b385415ecc6e08185d738 wasm/interchain_token_service.wasm +``` + +4. Upload new ITS Hub contract + +| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | +| :-----: | :---: | :---: | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +```bash +node cosmwasm/submit-proposal.js store -c InterchainTokenService -t "Upload InterchainTokenService contract v1.2.1" -d "Upload InterchainTokenService contract v1.2.1" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES -a ./wasm/interchain_token_service.wasm +``` + +5. Migrate ITS Hub contract + +Input the correct operator address in the migration msg. This is just the address of the multisig prover admin on each network. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c InterchainTokenService \ + -t "Migrate InterchainTokenService to v1.2.1" \ + -d "Migrate InterchainTokenService to v1.2.1" \ + --msg '{"operator_address":[operator address]}' \ + --fetchCodeId \ + --deposit 2000000000 +``` + +## Checklist + +Verify ITS hub contract version + +```bash +axelard query wasm contract-state raw $ITS_HUB_ADDRESS 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` +Expected output + +```bash +{"contract":"interchain-token-service","version":"1.2.1"} +``` + +Verify max uints for each chain +```bash +axelard q wasm contract-state smart $ITS_HUB_ADDRESS '{"its_chains":{}}' +``` +For each chain max_uint_bits should be 64 or higher. + +Test deployments and transfers. Choose a source and destination chain from the environment config file. + +Create a .env file: + +```yaml +PRIVATE_KEY=xyz +ENV=xyz +CHAINS=[source chain] +``` +Be sure you have funds on the specified chain + +Deploy token: + +```bash +node evm/interchainTokenFactory.js --action deployInterchainToken --minter [wallet] --name "test" --symbol "TST" --decimals 18 --initialSupply 10000 --salt [some salt] +``` +Note the token id. + +Deploy remote token: +```bash +node evm/interchainTokenFactory.js --action deployRemoteInterchainToken --salt [same salt as above] --destinationChain [destination chain] +``` + +Verify the deployment succeeds on axelarscan (paste the deploy tx hash into the search bar) + +Do a transfer: +```bash +node evm/its.js interchain-transfer [destination chain] [token id] [destination address] 1 +``` + +Switch the `CHAIN` field in the .env file to the destination chain, and do a transfer in the other direction: + +```bash + +node evm/its.js interchain-transfer [destination chain] [token_id] [destination address] 1 +``` + + From 44527ab46be2a799034206b106e06a2a13fd1824 Mon Sep 17 00:00:00 2001 From: Attiss Ngo <92927591+AttissNgo@users.noreply.github.com> Date: Tue, 6 May 2025 13:10:15 -0500 Subject: [PATCH 44/71] feat: add plume devnet config (#688) --- .../info/devnet-amplifier.json | 124 ++++++ releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md | 368 ++++++++++++++++++ releases/evm/2025-05-Plume-GMP-v6.0.4.md | 242 ++++++++++++ releases/evm/2025-05-Plume-ITS-v2.1.0.md | 106 +++++ 4 files changed, 840 insertions(+) create mode 100644 releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md create mode 100644 releases/evm/2025-05-Plume-GMP-v6.0.4.md create mode 100644 releases/evm/2025-05-Plume-ITS-v2.1.0.md diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 130c8b514..3cf3f8b0f 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -1009,6 +1009,96 @@ ] } } + }, + "plume-2": { + "name": "Plume", + "axelarId": "plume-2", + "networkType": "testnet", + "chainId": 98867, + "rpc": "https://testnet-rpc.plumenetwork.xyz", + "tokenSymbol": "PLUME", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Plume-testnet Explorer", + "url": "https://testnet-explorer.plumenetwork.xyz/" + }, + "contracts": { + "ConstAddressDeployer": { + "address": "0x858Bd33dF5BeAabF16Dc0249Acd194564c16BB2d", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "deploymentMethod": "create", + "codehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe", + "predeployCodehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe" + }, + "Create3Deployer": { + "address": "0x27A6E2Cf2d37B320EDaF5688ae89f21ef19099A8", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "deploymentMethod": "create2", + "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", + "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92", + "salt": "Create3Deployer" + }, + "AxelarGateway": { + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "operator": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "proxyDeploymentArgs": [ + "0x75c216B93337e23c8b1DD4F4fB818CA48511Aa2B", + "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "0x000000000000000000000000ba76c6980428a0b10cfc5d8ccb61949677a61233000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000661dd9000000000000000000000000000000000000000000000000000000000000000500000000000000000000000040e0122633f2f81ab18854eff39d954a26793060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000051380cbf0777990e197a3e498ffafd26143e35f8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000061373485594010371dfbf3a8f8bd1736bfda7c0900000000000000000000000000000000000000000000000000000000000000010000000000000000000000009b027e69b79099feb3dd1478c574dc986671bea10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c70aa87b38e6ab3c0df6e56338f96a5c00e653080000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "36daafe02cd36d4540355cd904501b9f71664605598bc4502fb00ab30b615e91", + "address": "0xA7938970ebF2E35E2789dc8C3019754c2ed762A8", + "implementation": "0x75c216B93337e23c8b1DD4F4fB818CA48511Aa2B", + "implementationCodehash": "0xa029d8325304c28c639f8f0a28c1495a386ee6cf615b9765e093328b5fbacda3", + "deploymentMethod": "create3", + "previousSignersRetention": 15, + "domainSeparator": "0x974a372dccb2a81196b546432ad388af9cb49d0a5e4567d444c51ea63edb62f9", + "minimumRotationDelay": 0, + "connectionType": "amplifier", + "owner": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "salt": "AxelarAmplifierGateway" + }, + "Operators": { + "owner": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "address": "0x2e1C331cE54863555Ee1638c99eA9154b02bA831", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "AxelarGasService": { + "collector": "0x2e1C331cE54863555Ee1638c99eA9154b02bA831", + "salt": "AxelarGasService", + "address": "0x2CcdaDdc282D5F22F740398f1992003b525aE0F5", + "implementation": "0xC578504932E11C45e18C272C4Ea98F7e7FCA2Cbe", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233" + }, + "InterchainTokenService": { + "salt": "ITS v2.1.0 devnet-amplifier", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "proxySalt": "ITS v1.0.0 devnet-amplifier", + "tokenManagerDeployer": "0x94168edd3C4DF7CE78cBC94EB9d8d71E1457BE9F", + "interchainToken": "0x412b3F9F72ceE68c77D1bFB604921084d1f79cbb", + "interchainTokenDeployer": "0x995bc77092d0C5F82c90d9e54A93F562613E5635", + "tokenManager": "0x83621ef18479b784672999630ACC472Ed175140C", + "tokenHandler": "0x2B68a9771A135E5ea1B0E05B5F2Dd8F4f6fe027c", + "gatewayCaller": "0xD9248a848FF4aC0B74e86f4A17D6e232BFbD585B", + "implementation": "0xCEbc4E6b7a7ee6A352dE18392941A932E664EE78", + "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", + "address": "0xcCe2c86467d382931653dD3b3E7b3eB4ebD23349" + }, + "InterchainTokenFactory": { + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "salt": "ITS Factory v1.0.0 devnet-amplifier", + "implementation": "0x0EBAB1dB776aca68112c53a4F5E4Fc2725aF439d", + "address": "0x9186233C327329408a9034F22407244421cADbEF" + } + } } }, "axelar": { @@ -1196,6 +1286,21 @@ "codeId": 854, "address": "axelar1w78434ta3l83fstf743xh9v5vkh4k203x2rh7l6w093n4s4vzv0suz09g3" }, + "plume-2": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "serviceName": "validators", + "sourceGatewayAddress": "0xA7938970ebF2E35E2789dc8C3019754c2ed762A8", + "votingThreshold": [ + "6", + "10" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55", + "codeId": 854, + "address": "axelar1a4e4aful6hchmxd3cffurz24pca52wmt3pf78rsmzglzujnueqgq7eypgl" + }, "storeCodeProposalId": "78", "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708" }, @@ -1226,6 +1331,10 @@ "stellar-2025-q1": { "codeId": 848, "address": "axelar1tatg2n9gsq6vkkafm6pv8hsunr236wgdk4gdc7lw0hs2e3cnspmsw75rld" + }, + "plume-2": { + "codeId": 848, + "address": "axelar1unafus3vpt7nawfzdjf7u26g2rl855lpkqussxmtl5r2njaz39mqrmyv7g" } }, "XrplMultisigProver": { @@ -1339,6 +1448,21 @@ "domainSeparator": "0x9b90841c0ee97f5016eab9cba092490f454c896916d5f0470bea8f7fb650762d", "address": "axelar1lgtcv0lfxwaz2prmea2y73lespr3mnwkfjv9kr0q6j7qhvhvwx6s54cesj" }, + "plume-2": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "adminAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "signingThreshold": [ + "6", + "10" + ], + "serviceName": "validators", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa", + "codeId": 855, + "domainSeparator": "0x974a372dccb2a81196b546432ad388af9cb49d0a5e4567d444c51ea63edb62f9", + "address": "axelar1mfn6hevkpj54qkkdy2rznp2azgvqff0rt2cegmflxgqfm0nqx20q6aqnp5" + }, "storeCodeProposalId": "82", "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a" }, diff --git a/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md b/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md new file mode 100644 index 000000000..2da12d05f --- /dev/null +++ b/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md @@ -0,0 +1,368 @@ +# Plume GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @AttissNgo | +| **Deployment** | | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-30 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Amplifier Releases](https://github.com/axelarnetwork/axelar-amplifier/releases) +- [VotingVerifier v1.1.0](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/voting-verifier-v1.1.0) +- [Gateway v1.1.1](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/gateway-v1.1.1) +- [MultisigProver v1.1.1](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/multisig-prover-v1.1.1) + +## Background + +These are the instructions for deploying Amplifier contracts for the Plume connection. + +### Pre-requisites + +Predict the [External Gateway](../evm/2025-05-Plume-GMP-v6.0.4.md) address, as `VotingVerifier` needs the `sourceGatewayAddress` which is the External Gateway address. + +| Network | `minimumRotationDelay` | `deploymentType` | `deployer` | +| -------------------- | ---------------------- | ---------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | + +```bash +node evm/deploy-amplifier-gateway.js -m [deploymentType] --minimumRotationDelay [minimumRotationDelay] --predictOnly +``` + +## Deployment + +- Create an `.env` config. `CHAIN` should be set to `plume`. + +```yaml +MNEMONIC=xyz +ENV=xyz +CHAIN=xyz +``` + +| Network | `deployer address` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2` | + +- Confirm `VotingVerifier`, `Gateway` and `MultisigProver` contracts are already stored in `$ENV.json` + +```bash +VotingVerifier (v1.1.0) -> "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708" +Gateway (v1.1.1) -> "storeCodeProposalCodeHash": "2ba600ee0d162184c9387eaf6fad655f1d75db548f93e379f0565cb2042d856f" +MultisigProver (v1.1.1) -> "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a" +``` + +- Add config in `$ENV.json` to deploy Amplifier contracts. + +| Network | `governanceAddress` | `adminAddress` | +| -------------------- | ----------------------------------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | +| **Mainnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + +| Network | `serviceName` | `votingThreshold` | `signingThreshold` | `confirmationHeight` | +| -------------------- | ------------- | ----------------- | ------------------ | -------------------- | +| **Devnet-amplifier** | `validators` | `["6", "10"]` | `["6", "10"]` | `1` | +| **Stagenet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | +| **Testnet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | +| **Mainnet** | `amplifier` | `["2", "3"]` | `["2", "3"]` | `1` | + +```bash +# Add under `config.axelar.contracts.VotingVerifier` based on Network +"$CHAIN" : { + "governanceAddress": "[governance address]", + "serviceName": "[service name]", + "sourceGatewayAddress": "[external gateway address]", + "votingThreshold": "[voting threshold]", + "blockExpiry": 10, + "confirmationHeight": 1000000, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55" +} + +# Add under `config.axelar.contracts.MultisigProver` based on Network +"$CHAIN" : { + "governanceAddress": "[governance address]", + "adminAddress": "[admin address]", + "signingThreshold": "[signing threshold]", + "serviceName": "[service name]", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa" +} +``` + +### Instantiate Amplifier contracts + +| Network | `CONTRACT_ADMIN` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | +| **Testnet** | `axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | +| **Mainnet** | `axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | + +`CONTRACT_ADMIN` is the wasm contract admin address for contract upgrades + +1. Instantiate `VotingVerifier` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c VotingVerifier --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +2. Instantiate `Gateway` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c Gateway --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +3. Instantiate `MultisigProver` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c MultisigProver --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +4. Set environment variables + +- Network-specific environment variables: These variables need to be updated by the network. + +```bash +VOTING_VERIFIER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.VotingVerifier[\"$CHAIN\"].address" | tr -d '"') +GATEWAY=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.Gateway[\"$CHAIN\"].address" | tr -d '"') +MULTISIG_PROVER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.MultisigProver[\"$CHAIN\"].address" | tr -d '"') +MULTISIG=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Multisig.address | tr -d '"') +REWARDS=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Rewards.address | tr -d '"') +ROUTER=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Router.address | tr -d '"') +``` + +- Gov proposal environment variables. Update these for each network + +| Network | `PROVER_ADMIN` | `DEPOSIT_VALUE` | `REWARD_AMOUNT` | +| -------------------- | ----------------------------------------------- | --------------- | ------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `100000000` | `1000000uamplifier` | +| **Stagenet** | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | `100000000` | `1000000uaxl` | +| **Testnet** | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | `2000000000` | `1000000uaxl` | +| **Mainnet** | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | `2000000000` | `1000000uaxl` | + +```bash +PROVER_ADMIN=[prover admin who is responsible for the contract's operations] +DEPOSIT_VALUE=[deposit value] +REWARD_AMOUNT=[reward amount] +RUN_AS_ACCOUNT=[wasm deployer/governance address] +EPOCH_DURATION=[epoch duration according to the environment] +``` + +- `--runAs $RUN_AS_ACCOUNT` is only required for devnet-amplifier. Do not use `--runAs` for stagenet, testnet, or mainnet. +- Add a community post for the mainnet proposal. i.e: https://community.axelar.network/t/proposal-add-its-hub-to-mainnet/3227 + +5. Register Gateway at the Router + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Router \ + -t "Register Gateway for $CHAIN" \ + -d "Register Gateway address for $CHAIN at Router contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"register_chain\": { + \"chain\": \"$CHAIN\", + \"gateway_address\": \"$GATEWAY\", + \"msg_id_format\": \"hex_tx_hash_and_event_index\" + } + }" +``` + +```bash +axelard q wasm contract-state smart $ROUTER "{\"chain_info\": \"$CHAIN\"}" --output json | jq . +# You should see something like this: +{ + "data": { + "name": \"$CHAIN\", + "gateway": { + "address": "axelar1jah3ac59xke2r266yjhh45tugzsvnlzsefyvx6jgp0msk6tp7vqqaktuz2" + }, + "frozen_status": 0, + "msg_id_format": "hex_tx_hash_and_event_index" + } +} +``` + +6. Update ampd with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. + +| Network | `http_url` | +| -------------------- | ----------------------------- | +| **Devnet-amplifier** | https://testnet-rpc.plume.org | +| **Stagenet** | https://testnet-rpc.plume.org | +| **Testnet** | https://testnet-rpc.plume.org | +| **Mainnet** | TBD | + +```bash +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmMsgVerifier" + +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmVerifierSetVerifier" +``` + +7. Update ampd with the `$CHAIN` chain configuration. + +```bash +ampd register-chain-support "[service name]" $CHAIN +``` + +8. Register prover contract on coordinator + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Coordinator \ + -t "Register Multisig Prover for $CHAIN" \ + -d "Register Multisig Prover address for $CHAIN at Coordinator contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"register_prover_contract\": { + \"chain_name\": \"$CHAIN\", + \"new_prover_addr\": \"$MULTISIG_PROVER\" + } + }" +``` + +9. Authorize `$CHAIN` Multisig prover on Multisig + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Multisig \ + -t "Authorize Multisig Prover for $CHAIN" \ + -d "Authorize Multisig Prover address for $CHAIN at Multisig contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"authorize_callers\": { + \"contracts\": { + \"$MULTISIG_PROVER\": \"$CHAIN\" + } + } + }" +``` + +```bash +axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"contract_address\": \"$MULTISIG_PROVER\", \"chain_name\": \"$CHAIN\"}}" --output json | jq . +# Result should look like: +{ + "data": true +} +``` + +10. Create reward pool for voting verifier + +#### Rewards + +| Network | `epoch_duration` | `participation_threshold` | `rewards_per_epoch` | +| -------------------- | ---------------- | ------------------------- | ------------------- | +| **Devnet-amplifier** | `100` | `[\"7\", \"10\"]` | `100` | +| **Stagenet** | `600` | `[\"7\", \"10\"]` | `100` | +| **Testnet** | `600` | `[\"7\", \"10\"]` | `100` | +| **Mainnet** | `14845` | `[\"8\", \"10\"]` | `TBD` | + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in $CHAIN voting verifier" \ + -d "Create pool for $CHAIN in $CHAIN voting verifier" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"$EPOCH_DURATION\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$VOTING_VERIFIER\" + } + } + }" +``` + +11. Create reward pool for multisig + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in axelar multisig" \ + -d "Create pool for $CHAIN in axelar multisig" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"$EPOCH_DURATION\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$MULTISIG\" + } + } + }" +``` + +12. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` + Add Rewards: + +```bash +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET +``` + +Check reward pool to confirm funding worked: + +```bash +node cosmwasm/query.js rewards -n $CHAIN +``` + +13. Create genesis verifier set + +Note that this step can only be run once a sufficient number of verifiers have registered. + +| Network | `min_num_verifiers` | +| -------------------- | ------------------- | +| **Devnet-amplifier** | 3 | +| **Stagenet** | 3 | +| **Testnet** | 21 | +| **Mainnet** | 25 | + +```bash +axelard tx wasm execute $MULTISIG_PROVER '"update_verifier_set"' --from $PROVER_ADMIN --gas auto --gas-adjustment 1.2 +``` + +Query the multisig prover for active verifier set + +```bash +axelard q wasm contract-state smart $MULTISIG_PROVER '"current_verifier_set"' +``` + +## Checklist + +The [Plume GMP checklist](../evm/2025-05-Plume-GMP-v6.0.4.md) will test GMP. diff --git a/releases/evm/2025-05-Plume-GMP-v6.0.4.md b/releases/evm/2025-05-Plume-GMP-v6.0.4.md new file mode 100644 index 000000000..eda52a83b --- /dev/null +++ b/releases/evm/2025-05-Plume-GMP-v6.0.4.md @@ -0,0 +1,242 @@ +# Plume GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @AttissNgo | +| **Deployment** | | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-30 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Releases](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/releases/tag/v6.0.4) + +## Background + +Changes in the release: + +This is the v6.0.4 deployment of EVM compatible Amplifier Gateway contracts for Plume. + +## Deployment + +Create an `.env` config. Local environment variable `CHAIN` should be set to `plume`. + +```yaml +PRIVATE_KEY=xyz +ENV=xyz +CHAINS=xyz +``` + +An initial chain config needs to be added to `${ENV}.json`. + +Update npm dependencies (including contracts) + +```bash +npm ci +``` + +#### Devnet-Amplifier / Stagenet / Testnet + +```json +"$CHAIN": { + "name": "Plume", + "axelarId": "plume", + "networkType": "testnet", + "chainId": 98867, + "rpc": "https://testnet-rpc.plumenetwork.xyz", + "tokenSymbol": "PLUME", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 53, + "chainType": "evm", + "explorer": { + "name": "Plume-testnet Explorer", + "url": "https://testnet-explorer.plumenetwork.xyz/" + }, + "contracts": {} +} +``` + +#### Mainnet + +```json +"$CHAIN": { + "name": "Plume", + "axelarId": "plume", + "chainId": "TBD", + "rpc": "TBD", + "tokenSymbol": "PLUME", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 30, + "chainType": "evm", + "explorer": { + "name": "TBD", + "url": "TBD", + "api": "TBD" + }, + "contracts": {} +} +``` + +1. Fund the following addresses with native tokens on chain: + +| Network | Addresses | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Mainnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | + +2. Deploy `ConstAddrDeployer`: + +- `stagenet` and `testnet` use the same contract address, so we only deploy on `testnet`. + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Testnet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Mainnet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | + +```bash +node evm/deploy-contract.js -c ConstAddressDeployer -m create --artifactPath ../evm/legacy/ConstAddressDeployer.json +``` + +3. Deploy `Create3Deployer`: + +- `stagenet` and `testnet` use the same contract address, so we only deploy on `testnet`. + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Testnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +```bash +node evm/deploy-contract.js -c Create3Deployer -m create2 +``` + +4. Waste nonce, this step should only be performed on `stagenet`, `testnet` and `mainnet`. To generate the same `AmplifierGateway` address as older EVM chains we need to waste 2 nonce on the deployer key. + +```bash +node evm/send-tokens.js -r 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --amount 0.0001 # burn nonce 0 +node evm/send-tokens.js -r 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --amount 0.0001 # burn nonce 1 +``` + +5. Deploy Gateway contract + +| Network | `minimumRotationDelay` | `deploymentType` | `deployer` | +| -------------------- | ---------------------- | ---------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | + +```bash +node evm/deploy-amplifier-gateway.js -m [deploymentType] --minimumRotationDelay [minimumRotationDelay] +``` + +6. Deploy `Operators` + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +```bash +node evm/deploy-contract.js -c Operators -m create2 +``` + +7. After deploying the Operators contract, register the following operators according to their environment + +| Network | `operators` | +| -------------------- | ------------------------------------------------------------------------------------------ | +| **Devnet-amplifier** | ? | +| **Stagenet** | `0x7054acf1b2d01e33b86235458edf0046cc354293`, `0xf669ed1ebc608c48f58b6e290df566ede7fb1103` | +| **Testnet** | `0x8f23e84c49624a22e8c252684129910509ade4e2`, `0x3b401fa00191acb03c24ebb7754fe35d34dd1abd` | +| **Mainnet** | `0x0CDeE446bD3c2E0D11568eeDB859Aa7112BE657a`, `0x1a07a2Ee043Dd3922448CD53D20Aae88a67e486E` | + +```bash +node evm/operators.js --action addOperator --args $OPERATOR_ADDRESS +``` + +8. Deploy GasService (set the `AxelarGasService.collector` to `Operators` address in config, which you will receive at step 6) + +| Network | `deployer address` | `deployMethod` | +| -------------------- | -------------------------------------------- | -------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | `create2` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | `create2` | +| **Testnet** | `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85` | `create` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | `create2` | + +```bash +node evm/deploy-upgradable.js -c AxelarGasService -m [deployMethod] --args '{"collector": "$OPERATOR_ADDRESS"}' +``` + +8. Transfer ownerships for gateway, operators and gas service contracts on `mainnet` and `testnet` + +```bash +# Only for mainnet and official testnet connection +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + +## Checklist + +The following checks should be performed after the rollout + +### Plume -> EVM GMP call + +1. Send a GMP call + +```bash +node evm/gateway.js -n $CHAIN --action callContract --destinationChain [destination-chain] --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payloadHash [payload-hash] +``` + +### EVM -> Plume GMP Call + +1. Send a GMP call + +```bash +node evm/gateway.js -n [destination-chain] --action callContract --destinationChain $CHAIN --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +node evm/gateway.js -n $CHAIN --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n $CHAIN --action isContractCallApproved --commandID [command-id] --sourceChain [destination-chain] --sourceAddress [source-address] --destination [destination-address] --payloadHash [payload-hash] +``` diff --git a/releases/evm/2025-05-Plume-ITS-v2.1.0.md b/releases/evm/2025-05-Plume-ITS-v2.1.0.md new file mode 100644 index 000000000..b499663c0 --- /dev/null +++ b/releases/evm/2025-05-Plume-ITS-v2.1.0.md @@ -0,0 +1,106 @@ +## Plume ITS v2.1.0 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @AttissNgo | +| **Deployment** | | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-30 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/interchain-token-service/releases/tag/v2.1.0) + +## Background + +- This is the Plume ITS release. + +## Deployment + +Ensure that [Plume GMP](../evm/2025-05-Plume-GMP-v6.0.4.md) is deployed first. + +```bash +# Clone latest main and update deps +npm ci +``` + +Create an `.env` config. Local environment variable `CHAIN` should be set to `plume`. + +```yaml +PRIVATE_KEY=xyz +ENV=xyz +CHAINS=xyz +``` + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +### Devnet Amplifier + +```bash +node evm/deploy-its.js -s "v2.1.0 devnet-amplifier" -m create2 --proxySalt 'v1.0.0 devnet-amplifier' +``` + +### Stagenet / Testnet / Mainnet + +```bash +node evm/deploy-its.js -s "v2.1.0" -m create2 --proxySalt 'v1.0.0' +``` + +### Verify Upgraded ITS Contracts + +Please follow this [instruction](https://github.com/axelarnetwork/axelar-contract-deployments/tree/main/evm#contract-verification) to verify ITS contracts on EVM chains. + +## Register Plume ITS on ITS Hub + +Please refer to `$DEPOSIT_VALUE` and `$RUN_AS_ACCOUNT` from [Plume GMP Amplifier](../cosmwasm/2025-05-Plume-GMP-v6.0.4.md). + +```bash +node cosmwasm/submit-proposal.js \ + its-hub-register-chains $CHAIN \ + -t "Register $CHAIN on ITS Hub" \ + -d "Register $CHAIN on ITS Hub" \ + --deposit $DEPOSIT_VALUE \ + --runAs $RUN_AS_ACCOUNT +``` + +## Set Plume as trusted chain on remote ITS contracts + +Set Plume as trusted chain on remote ITS contracts for EVM and non-EVM chains. + +```bash +node evm/its.js set-trusted-chains $CHAIN hub -n all +``` + +## Checklist + +The following checks should be performed after the rollout. + +- Run post-deployment checks. + +```bash +node evm/its.js checks -n $CHAIN -y +``` + +- Run the following for two EVM chains (one Amplifier, one consensus, with different decimals for each token) + +```bash +# Create a token on chain. Substitute the `wallet` below with the deployer key +node evm/interchainTokenFactory.js --action deployInterchainToken --minter [minter-address] --name "test" --symbol "TST" --decimals 6 --initialSupply 10000 --salt "salt1234" -n $CHAIN + +# Deploy token to a remote chain + node evm/interchainTokenFactory.js --action deployRemoteInterchainToken --destinationChain [destination-chain] --salt "salt1234" --gasValue 1000000000000000000 -y -n $CHAIN + +# Transfer token to remote chain +node evm/its.js interchain-transfer [destination-chain] [tokenId] [recipient] 1 --gasValue 1000000000000000000 -n $CHAIN + +# Transfer token back from remote chain +node evm/its.js interchain-transfer $CHAIN [tokenId] [destination-address] 1 --gasValue 1000000000000000000 -n [destination-chain] +``` From c98179e2a60812fdf866116b6536a599a6feabed Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Tue, 6 May 2025 15:31:50 -0400 Subject: [PATCH 45/71] docs(releases): add multisig v1.2.0 release doc (#692) --- .../info/devnet-amplifier.json | 8 +-- releases/cosmwasm/2025-05-Multisig-v1.2.0.md | 68 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 releases/cosmwasm/2025-05-Multisig-v1.2.0.md diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 3cf3f8b0f..34c2a1d24 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -1128,12 +1128,12 @@ "Multisig": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", "blockExpiry": 10, - "codeId": 851, - "lastUploadedCodeId": 851, + "codeId": 1268, + "lastUploadedCodeId": 1268, "address": "axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r", "executeProposalId": "55", - "storeCodeProposalId": "72", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e" + "storeCodeProposalId": "561", + "storeCodeProposalCodeHash": "6898517f95da74cbc8c59223cc0f0f6b89e95911c321cf3be87e999935366687" }, "Coordinator": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md new file mode 100644 index 000000000..12aed7cbd --- /dev/null +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md @@ -0,0 +1,68 @@ +# Cosmwasm Multisig v1.2.0 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 | +| **Deployment** | TBD | + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 2025-05-06 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) + +## Background + +Changes in this release: + +1. Use error-stack for better error reporting + +## Deployment + +- This rollout upgrades the amplifier multisig contract from `v1.1.1` to `v1.2.0` +- There is a no state migration involved + +1. Upload new ITS Hub contract + +| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | +| :-----: | :---: | :---: | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +```bash +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v1.2.0" -d "Upload Multisig contract v1.2.0" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES --version 1.2.0 +``` + +2. Upgrade Multisig contract + +There is no state migration needed during upgrade. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c Multisig \ + -t "Migrate Multisig to v1.2.0" \ + -d "Multisig to v1.2.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit 2000000000 +``` + +## Checklist + +Verify multisig contract version + +```bash +axelard query wasm contract-state raw $MULTISIG_ADDRESS 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` +Expected output + +```bash +{"contract":"multisig","version":"1.2.0"} +``` + + From a619ff82dbcca3ebc24a2b0e1eb991d4986f5019 Mon Sep 17 00:00:00 2001 From: ahramy Date: Wed, 7 May 2025 07:14:50 -0700 Subject: [PATCH 46/71] docs(common): create readme for encoding ITS recipient (#686) --- common/README.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 common/README.md diff --git a/common/README.md b/common/README.md new file mode 100644 index 000000000..85f6f3317 --- /dev/null +++ b/common/README.md @@ -0,0 +1,37 @@ +# Commmon scripts + +## Interchain Token Service + +### ITS Destination Address Encoding + +When sending interchain tokens across different chains using the **Interchain Token Service (ITS)**, the recipient address must be encoded into a chain-specific format. This encoding ensures that the ITS protocol can correctly route the token to the intended recipient on the destination chain. Without it, the destination address may not be recognized by the ITS contract, potentially leading to failed or misrouted transactions. + +#### Notes +- For **EVM** and **Sui**, addresses do not require special encoding and are used as-is. +- For **Stellar**, addresses must be converted to ASCII byte arrays to be properly recognized by the ITS contract. + +### Usage + +```bash +node common/its.js encode-recipient [destination-chain] [destination-address] +``` + +#### Example (EVM) +```bash +node common/its.js encode-recipient flow 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C + +# Output +Human-readable destination address: 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C + +Encoded ITS destination address: 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C +``` + +#### Example (Stellar) +```bash +node common/its.js encode-recipient stellar CC6FYRUBDJVTATQ55KGPMD2JQFY775BTSJQMRNJEWPEJFUXPOBFSMEOX + +# Output +Human-readable destination address: CC6FYRUBDJVTATQ55KGPMD2JQFY775BTSJQMRNJEWPEJFUXPOBFSMEOX + +Encoded ITS destination address: 0x4343364659525542444a565441545135354b47504d44324a5146593737354254534a514d524e4a455750454a465558504f4246534d454f58 +``` From d32c00dd5ea297a7de7c4f48b78a409d7961c9bd Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Wed, 7 May 2025 22:41:11 +0530 Subject: [PATCH 47/71] feat: migrate ITS hub to v1.2.1 on stagenet (#695) Co-authored-by: Milap Sheth --- axelar-chains-config/info/stagenet.json | 8 ++-- releases/cosmwasm/2025-01-ITS-v1.2.1.md | 49 ++++++++++++++----------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 7d80646c0..4fc97d627 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2377,11 +2377,11 @@ "lastUploadedCodeId": 24 }, "InterchainTokenService": { - "storeCodeProposalId": "102", - "storeCodeProposalCodeHash": "174688fff71f479dca62066a9db5bb417e8b38db2d066650bf20e7e2b623f854", + "storeCodeProposalId": "150", + "storeCodeProposalCodeHash": "36c758c8e36951369ff2b5f9590485edab6c302e7c1b385415ecc6e08185d738", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky", - "codeId": 29, + "codeId": 37, "address": "axelar1ph8qufmsh556e40uk0ceaufc06nwhnw0ksgdqqk6ldszxchh8llq8x52dk", "sui": { "maxUintBits": 64, @@ -2391,7 +2391,7 @@ "maxUintBits": 127, "maxDecimalsWhenTruncating": 255 }, - "lastUploadedCodeId": 29 + "lastUploadedCodeId": 37 }, "AxelarnetGateway": { "storeCodeProposalId": "68", diff --git a/releases/cosmwasm/2025-01-ITS-v1.2.1.md b/releases/cosmwasm/2025-01-ITS-v1.2.1.md index 1bdb5d0b9..41f87e050 100644 --- a/releases/cosmwasm/2025-01-ITS-v1.2.1.md +++ b/releases/cosmwasm/2025-01-ITS-v1.2.1.md @@ -1,16 +1,16 @@ # Cosmwasm ITS v1.2.1 -| | **Owner** | -|-----------|------------| -| **Created By** | @cjcobb23 | -| **Deployment** | TBD | - -| **Network** | **Deployment Status** | **Date** | -|-------------|----------------------|----------| -| **Devnet Amplifier** | Deployed | 2025-04-24 | -| **Stagenet** | - | TBD | -| **Testnet** | - | TBD | -| **Mainnet** | - | TBD | +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @cjcobb23 | +| **Deployment** | @blockchainguyy | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-04-24 | +| **Stagenet** | Deployed | 2025-05-07 | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | [Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) @@ -49,18 +49,25 @@ shasum -a 256 wasm/interchain_token_service.wasm | grep $CHECKSUM 4. Upload new ITS Hub contract -| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | -| :-----: | :---: | :---: | -| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | -| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | -| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | -| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| Network | `INIT_ADDRESSES` | `RUN_AS_ACCOUNT` | `DEPOSIT_VALUE` | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | --------------- | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `100000000` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `100000000` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `2000000000` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `2000000000` | ```bash -node cosmwasm/submit-proposal.js store -c InterchainTokenService -t "Upload InterchainTokenService contract v1.2.1" -d "Upload InterchainTokenService contract v1.2.1" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES -a ./wasm/interchain_token_service.wasm +node cosmwasm/submit-proposal.js store -c InterchainTokenService -t "Upload InterchainTokenService contract v1.2.1" -d "Upload InterchainTokenService contract v1.2.1" -r $RUN_AS_ACCOUNT --deposit $DEPOSIT_VALUE --instantiateAddresses $INIT_ADDRESSES --version 1.2.1 ``` -5. Migrate ITS Hub contract +| Network | `PROVER_ADMIN` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | +| **Mainnet** | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + +1. Migrate ITS Hub contract Input the correct operator address in the migration msg. This is just the address of the multisig prover admin on each network. @@ -69,9 +76,9 @@ node cosmwasm/submit-proposal.js migrate \ -c InterchainTokenService \ -t "Migrate InterchainTokenService to v1.2.1" \ -d "Migrate InterchainTokenService to v1.2.1" \ - --msg '{"operator_address":[operator address]}' \ + --msg '{"operator_address":"$PROVER_ADMIN"}' \ --fetchCodeId \ - --deposit 2000000000 + --deposit $DEPOSIT_VALUE ``` ## Checklist From c1906d97f262550956e27950e3fab1e7cad3b988 Mon Sep 17 00:00:00 2001 From: isi8787 <38940784+isi8787@users.noreply.github.com> Date: Wed, 7 May 2025 15:26:39 -0400 Subject: [PATCH 48/71] chore: migrate multisig v1.2.0 for testnet (#694) --- axelar-chains-config/info/testnet.json | 8 ++++---- releases/cosmwasm/2025-05-Multisig-v1.2.0.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index be5f86f3a..7be97eddc 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2961,10 +2961,10 @@ "adminAddress": "axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "173", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e", - "codeId": 16, - "lastUploadedCodeId": 16, + "storeCodeProposalId": "273", + "storeCodeProposalCodeHash": "6898517f95da74cbc8c59223cc0f0f6b89e95911c321cf3be87e999935366687", + "codeId": 42, + "lastUploadedCodeId": 42, "address": "axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5", "executeProposalId": "115", "flow": { diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md index 12aed7cbd..a48d0973b 100644 --- a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md @@ -3,13 +3,13 @@ | | **Owner** | |-----------|------------| | **Created By** | @cjcobb23 | -| **Deployment** | TBD | +| **Deployment** | @isi8787 | | **Network** | **Deployment Status** | **Date** | |-------------|----------------------|----------| | **Devnet Amplifier** | Deployed | 2025-05-06 | | **Stagenet** | - | TBD | -| **Testnet** | - | TBD | +| **Testnet** | Complete | 2025-05-06 | | **Mainnet** | - | TBD | [Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) From 8cc5aa757402575450ff2278149cb37bfe8d7d70 Mon Sep 17 00:00:00 2001 From: Foivos Date: Thu, 8 May 2025 17:01:19 +0300 Subject: [PATCH 49/71] docs(releases): add release doc for multisig 1.2.1 (#720) Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth Co-authored-by: CJ Cobb --- releases/cosmwasm/2025-05-Multisig-v1.2.1.md | 68 ++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 releases/cosmwasm/2025-05-Multisig-v1.2.1.md diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.1.md b/releases/cosmwasm/2025-05-Multisig-v1.2.1.md new file mode 100644 index 000000000..dd47d7525 --- /dev/null +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.1.md @@ -0,0 +1,68 @@ +# Cosmwasm Multisig v1.2.1 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 | +| **Deployment** | TBD | + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | - | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/multisig-v1.2.1) + +## Background + +Changes in this release: + +1. Use error-stack for better error reporting + +## Deployment + +- This rollout upgrades the amplifier multisig contract from `v1.2.0` to `v1.2.1` +- There is a no state migration involved + +1. Upload new ITS Hub contract + +| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | +| :-----: | :---: | :---: | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +```bash +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v1.2.1" -d "Upload Multisig contract v1.2.1" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES --version 1.2.1 +``` + +2. Upgrade Multisig contract + +There is no state migration needed during upgrade. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c Multisig \ + -t "Migrate Multisig to v1.2.1" \ + -d "Multisig to v1.2.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit 2000000000 +``` + +## Checklist + +Verify multisig contract version + +```bash +axelard query wasm contract-state raw $MULTISIG_ADDRESS 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` +Expected output + +```bash +{"contract":"multisig","version":"1.2.1"} +``` + + From 870728f3f1736ba7820a834227f4a5f128490b6d Mon Sep 17 00:00:00 2001 From: Foivos Date: Thu, 8 May 2025 22:10:33 +0300 Subject: [PATCH 50/71] feat: add hyperliquid release docs (#727) Co-authored-by: isaac markus --- .../2025-05-Hyperliquid-GMP-v6.0.4.md | 373 ++++++++++++++++++ .../evm/2025-05-Hyperliquid-GMP-v6.0.4.md | 302 ++++++++++++++ .../evm/2025-05-Hyperliquid-ITS-v2.1.0.md | 106 +++++ 3 files changed, 781 insertions(+) create mode 100644 releases/cosmwasm/2025-05-Hyperliquid-GMP-v6.0.4.md create mode 100644 releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md create mode 100644 releases/evm/2025-05-Hyperliquid-ITS-v2.1.0.md diff --git a/releases/cosmwasm/2025-05-Hyperliquid-GMP-v6.0.4.md b/releases/cosmwasm/2025-05-Hyperliquid-GMP-v6.0.4.md new file mode 100644 index 000000000..7eaedac4b --- /dev/null +++ b/releases/cosmwasm/2025-05-Hyperliquid-GMP-v6.0.4.md @@ -0,0 +1,373 @@ +# Hyperliquid GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @isi8787 | +| **Deployment** | @isi8787 | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | TBD | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Amplifier Releases](https://github.com/axelarnetwork/axelar-amplifier/releases) +- [VotingVerifier v1.1.0](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/voting-verifier-v1.1.0) +- [Gateway v1.1.1](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/gateway-v1.1.1) +- [MultisigProver v1.1.1](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/multisig-prover-v1.1.1) + +## Background + +These are the instructions for deploying Amplifier contracts for the Hyperliquid connection. + +### Pre-requisites + +Predict the [External Gateway](../evm/2025-05-Hyperliquid-GMP-v6.0.4.md) address, as `VotingVerifier` needs the `sourceGatewayAddress` which is the External Gateway address. + +| Network | `minimumRotationDelay` | `deploymentType` | `deployer` | +| -------------------- | ---------------------- | ---------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | + +```bash +node evm/deploy-amplifier-gateway.js -m [deploymentType] --minimumRotationDelay [minimumRotationDelay] --predictOnly +``` + +## Deployment + +- Create an `.env` config. `CHAIN` should be set to `hyperliquid`. + +```yaml +MNEMONIC=xyz +ENV=xyz +CHAIN=xyz +``` + +| Network | `deployer address` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2` | + +- Confirm `VotingVerifier`, `Gateway` and `MultisigProver` contracts are already stored in `$ENV.json` + +```bash +VotingVerifier (v1.1.0) -> "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708" +Gateway (v1.1.1) -> "storeCodeProposalCodeHash": "2ba600ee0d162184c9387eaf6fad655f1d75db548f93e379f0565cb2042d856f" +MultisigProver (v1.1.1) -> "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a" +``` + +- Add config in `$ENV.json` to deploy Amplifier contracts. + +| Network | `governanceAddress` | `adminAddress` | +| -------------------- | ----------------------------------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | +| **Mainnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + +| Network | `serviceName` | `votingThreshold` | `signingThreshold` | `confirmationHeight` | +| -------------------- | ------------- | ----------------- | ------------------ | -------------------- | +| **Devnet-amplifier** | `validators` | `["6", "10"]` | `["6", "10"]` | `1` | +| **Stagenet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | +| **Testnet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | +| **Mainnet** | `amplifier` | `["2", "3"]` | `["2", "3"]` | `1` | + +```bash +# Add under `config.axelar.contracts.VotingVerifier` based on Network +"$CHAIN" : { + "governanceAddress": "[governance address]", + "serviceName": "[service name]", + "sourceGatewayAddress": "[external gateway address]", + "votingThreshold": "[voting threshold]", + "blockExpiry": 10, + "confirmationHeight": 1000000, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55" +} + +# Add under `config.axelar.contracts.MultisigProver` based on Network +"$CHAIN" : { + "governanceAddress": "[governance address]", + "adminAddress": "[admin address]", + "signingThreshold": "[signing threshold]", + "serviceName": "[service name]", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa" +} +``` + +### Instantiate Amplifier contracts + +| Network | `CONTRACT_ADMIN` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | +| **Testnet** | `axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | +| **Mainnet** | `axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | + +`CONTRACT_ADMIN` is the wasm contract admin address for contract upgrades + +1. Instantiate `VotingVerifier` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c VotingVerifier --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +2. Instantiate `Gateway` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c Gateway --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +3. Instantiate `MultisigProver` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c MultisigProver --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +4. Set environment variables + +- Network-specific environment variables: These variables need to be updated by the network. + +```bash +VOTING_VERIFIER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.VotingVerifier[\"$CHAIN\"].address" | tr -d '"') +GATEWAY=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.Gateway[\"$CHAIN\"].address" | tr -d '"') +MULTISIG_PROVER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.MultisigProver[\"$CHAIN\"].address" | tr -d '"') +MULTISIG=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Multisig.address | tr -d '"') +REWARDS=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Rewards.address | tr -d '"') +ROUTER=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Router.address | tr -d '"') +``` + +- Gov proposal environment variables. Update these for each network + +| Network | `PROVER_ADMIN` | `DEPOSIT_VALUE` | `REWARD_AMOUNT` | +| -------------------- | ----------------------------------------------- | --------------- | ------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `100000000` | `1000000uamplifier` | +| **Stagenet** | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | `100000000` | `1000000uaxl` | +| **Testnet** | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | `2000000000` | `1000000uaxl` | +| **Mainnet** | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | `2000000000` | `1000000uaxl` | + +```bash +PROVER_ADMIN=[prover admin who is responsible for the contract's operations] +DEPOSIT_VALUE=[deposit value] +REWARD_AMOUNT=[reward amount] +RUN_AS_ACCOUNT=[wasm deployer/governance address] +EPOCH_DURATION=[epoch duration according to the environment] +``` + +- `--runAs $RUN_AS_ACCOUNT` is only required for devnet-amplifier. Do not use `--runAs` for stagenet, testnet, or mainnet. +- Add a community post for the mainnet proposal. i.e: https://community.axelar.network/t/proposal-add-its-hub-to-mainnet/3227 + +### Create proposals +Create all proposals so that integration is not blocked by voting. Include [ITS Hub Registration](../evm/2025-05-Plume-ITS-v2.1.0.md) if possible. + + +5. Register Gateway at the Router + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Router \ + -t "Register Gateway for $CHAIN" \ + -d "Register Gateway address for $CHAIN at Router contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"register_chain\": { + \"chain\": \"$CHAIN\", + \"gateway_address\": \"$GATEWAY\", + \"msg_id_format\": \"hex_tx_hash_and_event_index\" + } + }" +``` + +```bash +axelard q wasm contract-state smart $ROUTER "{\"chain_info\": \"$CHAIN\"}" --output json | jq . +# You should see something like this: +{ + "data": { + "name": \"$CHAIN\", + "gateway": { + "address": "axelar1jah3ac59xke2r266yjhh45tugzsvnlzsefyvx6jgp0msk6tp7vqqaktuz2" + }, + "frozen_status": 0, + "msg_id_format": "hex_tx_hash_and_event_index" + } +} +``` + +6. Register prover contract on coordinator + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Coordinator \ + -t "Register Multisig Prover for $CHAIN" \ + -d "Register Multisig Prover address for $CHAIN at Coordinator contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"register_prover_contract\": { + \"chain_name\": \"$CHAIN\", + \"new_prover_addr\": \"$MULTISIG_PROVER\" + } + }" +``` + +7. Authorize `$CHAIN` Multisig prover on Multisig + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Multisig \ + -t "Authorize Multisig Prover for $CHAIN" \ + -d "Authorize Multisig Prover address for $CHAIN at Multisig contract" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"authorize_callers\": { + \"contracts\": { + \"$MULTISIG_PROVER\": \"$CHAIN\" + } + } + }" +``` + +```bash +axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"contract_address\": \"$MULTISIG_PROVER\", \"chain_name\": \"$CHAIN\"}}" --output json | jq . +# Result should look like: +{ + "data": true +} +``` + +8. Create reward pool for voting verifier + +#### Rewards + +| Network | `epoch_duration` | `participation_threshold` | `rewards_per_epoch` | +| -------------------- | ---------------- | ------------------------- | ------------------- | +| **Devnet-amplifier** | `100` | `[\"7\", \"10\"]` | `100` | +| **Stagenet** | `600` | `[\"7\", \"10\"]` | `100` | +| **Testnet** | `600` | `[\"7\", \"10\"]` | `100` | +| **Mainnet** | `14845` | `[\"8\", \"10\"]` | `TBD` | + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in $CHAIN voting verifier" \ + -d "Create pool for $CHAIN in $CHAIN voting verifier" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"$EPOCH_DURATION\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$VOTING_VERIFIER\" + } + } + }" +``` + +9. Create reward pool for multisig + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in axelar multisig" \ + -d "Create pool for $CHAIN in axelar multisig" \ + --runAs $RUN_AS_ACCOUNT \ + --deposit $DEPOSIT_VALUE \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"$EPOCH_DURATION\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$MULTISIG\" + } + } + }" +``` + +10. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` + Add Rewards: + +```bash +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET +``` + +Check reward pool to confirm funding worked: + +```bash +node cosmwasm/query.js rewards -n $CHAIN +``` + +11. Update ampd with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. + +| Network | `http_url` | +| -------------------- | ----------------------------- | +| **Devnet-amplifier** | https://rpc.hyperliquid-testnet.xyz/evm | +| **Stagenet** | https://rpc.hyperliquid-testnet.xyz/evm | +| **Testnet** | https://rpc.hyperliquid-testnet.xyz/evm | +| **Mainnet** | https://rpc.hyperliquid.xyz/evm | + +```bash +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmMsgVerifier" + +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmVerifierSetVerifier" +``` + +12. Update ampd with the `$CHAIN` chain configuration. + +```bash +ampd register-chain-support "[service name]" $CHAIN +``` + + +13. Create genesis verifier set + +Note that this step can only be run once a sufficient number of verifiers have registered. + +| Network | `min_num_verifiers` | +| -------------------- | ------------------- | +| **Devnet-amplifier** | 3 | +| **Stagenet** | 3 | +| **Testnet** | 21 | +| **Mainnet** | 25 | + +```bash +axelard tx wasm execute $MULTISIG_PROVER '"update_verifier_set"' --from $PROVER_ADMIN --gas auto --gas-adjustment 1.2 +``` + +Query the multisig prover for active verifier set + +```bash +axelard q wasm contract-state smart $MULTISIG_PROVER '"current_verifier_set"' +``` + +## Checklist + +The [Hyperliquid GMP checklist](../evm/2025-05-Hyperliquid-GMP-v6.0.4.md) will test GMP. \ No newline at end of file diff --git a/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md b/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md new file mode 100644 index 000000000..ae5342fc6 --- /dev/null +++ b/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md @@ -0,0 +1,302 @@ +# Hyperliquid GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @isi8787 | +| **Deployment** | @isi8787 | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Pending | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Releases](https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/releases/tag/v6.0.4) + +## Background + +Changes in the release: + +This is the v6.0.4 deployment of EVM compatible Amplifier Gateway contracts for Hyperliquid. + +## Deployment + +Create an `.env` config. Local environment variable `CHAIN` should be set to `hyperliquid`. + +```yaml +PRIVATE_KEY=xyz +ENV=xyz +CHAINS=xyz +``` + +An initial chain config needs to be added to `${ENV}.json`. + +Update npm dependencies (including contracts) + +```bash +npm ci +``` + +#### Devnet-Amplifier / Stagenet / Testnet + +```json +"$CHAIN": { + "name": "Hyperliquid", + "axelarId": "hyperliquid", + "networkType": "testnet", + "chainId": 998, + "rpc": "https://rpc.hyperliquid-testnet.xyz/evm", + "tokenSymbol": "HYPE", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Hyperliquid-testnet Explorer", + "url": "https://app.hyperliquid-testnet.xyz/explorer" + }, + "contracts": {} +} +``` + +#### Mainnet + +```json +"$CHAIN": { + "name": "Hyperliquid", + "axelarId": "hyperliquid", + "chainId": "999", + "rpc": "https://rpc.hyperliquid.xyz/evm", + "tokenSymbol": "HYPE", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Hyperliquid Explorer", + "url": "https://app.hyperliquid.xyz/explorer" + }, + "contracts": {} +} +``` + +Ensure python3 is installed on your system, recomended version is 3.10, but was tested succesfully with 3.13. + +1. Fund the following addresses with native tokens on chain: + +| Network | Addresses | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Mainnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | + +2. Set Deployer Keys to Use Slow/Big Blocks + +Hyperliquid EVM uses a dual architecture block model: +- **Fast blocks**: 2 seconds duration with a 2M gas limit +- **Slow blocks**: 1 minute duration with a 30M gas limit + +Contract deployments exceed the fast block gas limit and will require that each deployer key be permissioned to use the slow block model. Additional instructtions are provided if accounts needs to be converted back to fast block to utilize the faster finalization rate. + +a. Clone the Hyperliquid Python SDK. This document was prepared using release v0.13 (commit hash: 583a96dc0af53c6d0b4eed06afb5a5c08481821d): + ```bash + git clone https://github.com/hyperliquid-dex/hyperliquid-python-sdk.git + cd hyperliquid-python-sdk + ``` + +b. Edit the `./hyperliquid-python-sdk/examples/basic_evm_use_big_blocks.py` file: + #### For devnet-amplifier, testnet and stagenet + ```bash + address, info, exchange = example_utils.setup(constants.TESTNET_API_URL, skip_ws=True) + ``` + + #### For mainnet + ```bash + address, info, exchange = example_utils.setup(constants.MAINNET_API_URL, skip_ws=True) + ``` + - Comment out or delete: + ```bash + print(exchange.use_big_blocks(False)) + ``` + +c. Fund one account with HYPE on both HyperCore and Hyperliquid EVM. Steps to procure and swap funds are: + #### For devnet-amplifier, testnet and stagenet + - Provision USDC funds: from their faucet at: https://app.hyperliquid-testnet.xyz/drip. Faucet requires account exist on mainnet. + - Use their trading app https://app.hyperliquid-testnet.xyz/trade and connect wallet. + - Buy HYPE with USDC balance + - Under `balances` section connect wallet again to perform an EVM transfer. + + #### For mainnet + - Provision USDC on Arbitrum + - Use their trading app https://app.hyperliquid.xyz/trade and connect wallet. + - Buy HYPE with USDC balance + - Under `balances` section connect wallet again to perform an EVM transfer. + +d. Update the `./hyperliquid-python-sdk/examples/config.json`: + +- Set the main funded account as the secret_key +- Set the deployer address as the account_address + +e. Run the script: +```bash +python3 examples/basic_evm_use_big_blocks.py +``` + +Steps `c`, `d` and `e` needs to be repeated for each deployer key. + +f. Delete private key information from `./hyperliquid-python-sdk/examples/config.json` + +After release is complete the deployer keys can set to utilize fast blocks again to enable faster operations that dont require larger gas limits of slow blocks. To disable slow/big blocks Edit the `./hyperliquid-python-sdk/examples/basic_evm_use_big_blocks.py` file to add back `print(exchange.use_big_blocks(True))` and rerun step `d` and `e` + + +3. Deploy `ConstAddrDeployer`: + +- `stagenet` and `testnet` use the same contract address, so we only deploy on `testnet`. + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Testnet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Mainnet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | + +```bash +node evm/deploy-contract.js -c ConstAddressDeployer -m create --artifactPath ../evm/legacy/ConstAddressDeployer.json +``` + +4. Deploy `Create3Deployer`: + +- `stagenet` and `testnet` use the same contract address, so we only deploy on `testnet`. + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Testnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +```bash +node evm/deploy-contract.js -c Create3Deployer -m create2 +``` + +5. Waste nonce, this step should only be performed on `stagenet`, `testnet` and `mainnet`. To generate the same `AmplifierGateway` address as older EVM chains we need to waste 2 nonce on the deployer key. + +```bash +node evm/send-tokens.js -r 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --amount 0.0001 # burn nonce 0 +node evm/send-tokens.js -r 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --amount 0.0001 # burn nonce 1 +``` + +6. Deploy Gateway contract + +| Network | `minimumRotationDelay` | `deploymentType` | `deployer` | +| -------------------- | ---------------------- | ---------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | + +```bash +node evm/deploy-amplifier-gateway.js -m [deploymentType] --minimumRotationDelay [minimumRotationDelay] +``` + +7. Deploy `Operators` + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +```bash +node evm/deploy-contract.js -c Operators -m create2 +``` + +8. After deploying the Operators contract, register the following operators according to their environment + +| Network | `operators` | +| -------------------- | ------------------------------------------------------------------------------------------ | +| **Devnet-amplifier** | ? | +| **Stagenet** | `0x7054acf1b2d01e33b86235458edf0046cc354293`, `0xf669ed1ebc608c48f58b6e290df566ede7fb1103` | +| **Testnet** | `0x8f23e84c49624a22e8c252684129910509ade4e2`, `0x3b401fa00191acb03c24ebb7754fe35d34dd1abd` | +| **Mainnet** | `0x0CDeE446bD3c2E0D11568eeDB859Aa7112BE657a`, `0x1a07a2Ee043Dd3922448CD53D20Aae88a67e486E` | + +```bash +node evm/operators.js --action addOperator --args $OPERATOR_ADDRESS +``` + +9. Deploy GasService (set the `AxelarGasService.collector` to `Operators` address in config, which you will receive at step 6) + +| Network | `deployer address` | `deployMethod` | +| -------------------- | -------------------------------------------- | -------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | `create2` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | `create2` | +| **Testnet** | `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85` | `create` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | `create2` | + +```bash +node evm/deploy-upgradable.js -c AxelarGasService -m [deployMethod] --args '{"collector": "$OPERATOR_ADDRESS"}' +``` + +10. Transfer ownerships for gateway, operators and gas service contracts on `mainnet` and `testnet` + +```bash +# Only for mainnet and official testnet connection +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + +## Checklist + +The following checks should be performed after the rollout + +### Hyperliquid -> EVM GMP call + +1. Send a GMP call + +```bash +node evm/gateway.js -n $CHAIN --action callContract --destinationChain [destination-chain] --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payloadHash [payload-hash] +``` + +### EVM -> Hyperliquid GMP Call + +1. Send a GMP call + +```bash +node evm/gateway.js -n [destination-chain] --action callContract --destinationChain $CHAIN --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +node evm/gateway.js -n $CHAIN --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n $CHAIN --action isContractCallApproved --commandID [command-id] --sourceChain [destination-chain] --sourceAddress [source-address] --destination [destination-address] --payloadHash [payload-hash] +``` \ No newline at end of file diff --git a/releases/evm/2025-05-Hyperliquid-ITS-v2.1.0.md b/releases/evm/2025-05-Hyperliquid-ITS-v2.1.0.md new file mode 100644 index 000000000..659c657eb --- /dev/null +++ b/releases/evm/2025-05-Hyperliquid-ITS-v2.1.0.md @@ -0,0 +1,106 @@ +## Hyperliquid ITS v2.1.0 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @isi8787 | +| **Deployment** | @isi8787 | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | TBD | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/interchain-token-service/releases/tag/v2.1.0) + +## Background + +- This is the Hyperliquid ITS release. + +## Deployment + +Ensure that [Hyperliquid GMP](../evm/2025-03-Hyperliquid-GMP-v6.0.4.md) is deployed first. + +```bash +# Clone latest main and update deps +npm ci +``` + +Create an `.env` config. Local environment variable `CHAIN` should be set to `hyperliquid`. + +```yaml +PRIVATE_KEY=xyz +ENV=xyz +CHAINS=xyz +``` + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +### Devnet Amplifier + +```bash +node evm/deploy-its.js -s "v2.1.0 devnet-amplifier" -m create2 --proxySalt 'v1.0.0 devnet-amplifier' +``` + +### Stagenet / Testnet / Mainnet + +```bash +node evm/deploy-its.js -s "v2.1.0" -m create2 --proxySalt 'v1.0.0' +``` + +### Verify Upgraded ITS Contracts + +Please follow this [instruction](https://github.com/axelarnetwork/axelar-contract-deployments/tree/main/evm#contract-verification) to verify ITS contracts on EVM chains. + +## Register Hyperliquid ITS on ITS Hub + +Please refer to `$DEPOSIT_VALUE` and `$RUN_AS_ACCOUNT` from [Hyperliquid GMP Amplifier](../cosmwasm/2025-04-Hyperliquid-GMP-v6.0.4.md). + +```bash +node cosmwasm/submit-proposal.js \ + its-hub-register-chains $CHAIN \ + -t "Register $CHAIN on ITS Hub" \ + -d "Register $CHAIN on ITS Hub" \ + --deposit $DEPOSIT_VALUE \ + --runAs $RUN_AS_ACCOUNT +``` + +## Set Hyperliquid as trusted chain on remote ITS contracts + +Set Hyperliquid as trusted chain on remote ITS contracts for EVM and non-EVM chains. + +```bash +node evm/its.js set-trusted-chains $CHAIN hub -n all +``` + +## Checklist + +The following checks should be performed after the rollout. + +- Run post-deployment checks. + +```bash +node evm/its.js checks -n $CHAIN -y +``` + +- Run the following for two EVM chains (one Amplifier, one consensus, with different decimals for each token) + +```bash +# Create a token on chain. Substitute the `wallet` below with the deployer key +node evm/interchainTokenFactory.js --action deployInterchainToken --minter [minter-address] --name "test" --symbol "TST" --decimals 6 --initialSupply 10000 --salt "salt1234" -n $CHAIN + +# Deploy token to a remote chain + node evm/interchainTokenFactory.js --action deployRemoteInterchainToken --destinationChain [destination-chain] --salt "salt1234" --gasValue 1000000000000000000 -y -n $CHAIN + +# Transfer token to remote chain +node evm/its.js interchain-transfer [destination-chain] [tokenId] [recipient] 1 --gasValue 1000000000000000000 -n $CHAIN + +# Transfer token back from remote chain +node evm/its.js interchain-transfer $CHAIN [tokenId] [destination-address] 1 --gasValue 1000000000000000000 -n [destination-chain] +``` \ No newline at end of file From d39c3489ddb6db1a075572d5da48f0a9bc92c7f3 Mon Sep 17 00:00:00 2001 From: Foivos Date: Thu, 8 May 2025 22:37:27 +0300 Subject: [PATCH 51/71] feat: plume stagenet (#715) Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth Co-authored-by: Attiss Ngo <92927591+AttissNgo@users.noreply.github.com> --- axelar-chains-config/info/stagenet.json | 123 ++++++++++++++++++ releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md | 82 ++++++------ releases/evm/2025-05-Plume-GMP-v6.0.4.md | 6 +- releases/evm/2025-05-Plume-ITS-v2.1.0.md | 6 +- 4 files changed, 172 insertions(+), 45 deletions(-) diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 4fc97d627..b06acaac7 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2105,6 +2105,95 @@ "initializeArgs": {} } } + }, + "plume": { + "name": "Plume", + "axelarId": "plume", + "networkType": "testnet", + "chainId": 98867, + "rpc": "https://testnet-rpc.plumenetwork.xyz", + "tokenSymbol": "PLUME", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 53, + "chainType": "evm", + "explorer": { + "name": "Plume-testnet Explorer", + "url": "https://testnet-explorer.plumenetwork.xyz/" + }, + "contracts": { + "ConstAddressDeployer": { + "address": "0x98B2920D53612483F91F12Ed7754E51b4A77919e", + "deployer": "0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F", + "deploymentMethod": "create", + "codehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe", + "predeployCodehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe" + }, + "Create3Deployer": { + "address": "0x6513Aedb4D1593BA12e50644401D976aebDc90d8", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create2", + "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", + "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92", + "salt": "Create3Deployer" + }, + "AxelarGateway": { + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "operator": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "proxyDeploymentArgs": [ + "0xC5578b1c63CE803B9f7f185652CC1E14Af887b8f", + "0xBeF25f4733b9d451072416360609e5A4c115293E", + "0x000000000000000000000000bef25f4733b9d451072416360609e5a4c115293e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000004842be00000000000000000000000000000000000000000000000000000000000000050000000000000000000000004ed1fd87673ed52b810710e1e81c10df10906f40000000000000000000000000000000000000000000000000000000000000000100000000000000000000000054059b18cf1b10d648d922e00c149e68b3d77e90000000000000000000000000000000000000000000000000000000000000000100000000000000000000000057c026c5a2dcb35fd220f3436ff4096978066bb50000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d368332a3cb3ea8a38144508c1ddea649c4d23fd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f48dfdc4f1666701ba74efa1d8491f4811c064a40000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "8575509a2caf5054141bd371edaa726b62f6f96f35bd48ef936f8dd4764833d5", + "address": "0x5A4fA5187BddD93097dE4F6062a2E96C82Ea2d61", + "implementation": "0xC5578b1c63CE803B9f7f185652CC1E14Af887b8f", + "implementationCodehash": "0x49114edf1041c1aae87698f69a658dfd0712e30142a2d3d6cd268323b393b038", + "deploymentMethod": "create", + "previousSignersRetention": 15, + "domainSeparator": "0x2dbc42136ba0394d31cf1f35344a182ecf00210b42b9b8bf3234c3da201a9ca6", + "minimumRotationDelay": 300, + "connectionType": "amplifier", + "owner": "0xBeF25f4733b9d451072416360609e5A4c115293E" + }, + "Operators": { + "owner": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "address": "0xc5C525B7Bb2a7Ce95C13Ee5aBdB7F8fd3cb77392", + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "AxelarGasService": { + "collector": "0xc5C525B7Bb2a7Ce95C13Ee5aBdB7F8fd3cb77392", + "salt": "AxelarGasService", + "address": "0xeE1d04E4F9F9AdEB7be7d6996f4A726773460A87", + "implementation": "0x39dA9388Ec10347BB08aA3d464631ab14553afe4", + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E" + }, + "InterchainTokenService": { + "salt": "ITS v2.1.0", + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "proxySalt": "ITS v1.0.0", + "tokenManagerDeployer": "0x8d73f4350f1d0384e097aaC88d3e04Af94A95984", + "interchainToken": "0xE6575486955D887BcFcFaDfaacF891C462cfab6B", + "interchainTokenDeployer": "0x48a6464Adad6Ef96286BC738dfE1a89249f67D24", + "tokenManager": "0x790bD31aCF3a0548b4e71f2fB6785f6844aA286e", + "tokenHandler": "0x95C7e8e04440bD85c336147e2964b2F8331F23aD", + "gatewayCaller": "0xb8Dcc3f2971072d556d8E33284725B3A6f83adFd", + "implementation": "0x7566C3f4A589Cd84F995d12eFB72D8c54dEc272B", + "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", + "address": "0x0FCb262571be50815627C16Eca1f5F3D342FF5a5" + }, + "InterchainTokenFactory": { + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "salt": "ITS Factory v1.0.0", + "implementation": "0x27Dae89620Ed5f3111d85D44ceFc6EdB7fe74551", + "address": "0x35eAd6089aBF6233C3E0086CD3C0eF849bdE95c3" + } + } } }, "axelar": { @@ -2267,6 +2356,21 @@ "domainSeparator": "0xa4c6eacdfaf3d80b7b9a2c5fb1802eb1d83539590448774e22eda83659a726c5", "address": "axelar1emmjd57gha5vchnysth3g6fsyzyrjm4xhj4dzlg2ulj4dz8p9kxs2l6zvy" }, + "plume": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv", + "signingThreshold": [ + "51", + "100" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa", + "codeId": 21, + "domainSeparator": "0x2dbc42136ba0394d31cf1f35344a182ecf00210b42b9b8bf3234c3da201a9ca6", + "address": "axelar1vs8rvpuyhq40tn4suq4jamx3fe9gqlszds0z8s39ta4txz95ryws8xnpk0" + }, "storeCodeProposalId": "69", "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a", "lastUploadedCodeId": 21 @@ -2288,6 +2392,10 @@ "codeId": 22, "address": "axelar1u6t0zgqc3y8qdymrr7t95vp6gkgdg5lekcgt8r46w5w36kqcp8csy4k93j" }, + "plume": { + "codeId": 22, + "address": "axelar1mnu5s858ptnwqt9dkr2u7v3u4pa5z27arwzxlp9smf64n3xp4u3qyhvgj5" + }, "storeCodeProposalId": "70", "storeCodeProposalCodeHash": "2ba600ee0d162184c9387eaf6fad655f1d75db548f93e379f0565cb2042d856f", "lastUploadedCodeId": 22, @@ -2372,6 +2480,21 @@ "codeId": 24, "address": "axelar1f7unnl3uu8mgjecmaasv5p3e6khx2u99th9lhkhl2l9e05ldrzwq3vu33h" }, + "plume": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "serviceName": "amplifier", + "sourceGatewayAddress": "0x5A4fA5187BddD93097dE4F6062a2E96C82Ea2d61", + "votingThreshold": [ + "51", + "100" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55", + "codeId": 24, + "address": "axelar1t49krzwl0sc6z8qwdst5d7kmgn3xutjtp4ku8u2c06quy7w8hp4q5zsqn2" + }, "storeCodeProposalId": "72", "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708", "lastUploadedCodeId": 24 diff --git a/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md b/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md index 2da12d05f..cfbf2e512 100644 --- a/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md +++ b/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md @@ -3,12 +3,12 @@ | | **Owner** | | -------------- | ---------------------------------- | | **Created By** | @AttissNgo | -| **Deployment** | | +| **Deployment** | @AttissNgo | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Completed | 2025-04-30 | -| **Stagenet** | - | TBD | +| **Stagenet** | Completed | 2025-05-06 | | **Testnet** | - | TBD | | **Mainnet** | - | TBD | @@ -28,7 +28,7 @@ Predict the [External Gateway](../evm/2025-05-Plume-GMP-v6.0.4.md) address, as ` | Network | `minimumRotationDelay` | `deploymentType` | `deployer` | | -------------------- | ---------------------- | ---------------- | -------------------------------------------- | | **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | -| **Stagenet** | `300` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | | **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | | **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | @@ -164,6 +164,10 @@ EPOCH_DURATION=[epoch duration according to the environment] - `--runAs $RUN_AS_ACCOUNT` is only required for devnet-amplifier. Do not use `--runAs` for stagenet, testnet, or mainnet. - Add a community post for the mainnet proposal. i.e: https://community.axelar.network/t/proposal-add-its-hub-to-mainnet/3227 +### Create proposals + +Create all proposals so that integration is not blocked by voting. Include [ITS Hub Registration](../evm/2025-05-Plume-ITS-v2.1.0.md) if possible. + 5. Register Gateway at the Router ```bash @@ -197,38 +201,7 @@ axelard q wasm contract-state smart $ROUTER "{\"chain_info\": \"$CHAIN\"}" --out } ``` -6. Update ampd with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. - -| Network | `http_url` | -| -------------------- | ----------------------------- | -| **Devnet-amplifier** | https://testnet-rpc.plume.org | -| **Stagenet** | https://testnet-rpc.plume.org | -| **Testnet** | https://testnet-rpc.plume.org | -| **Mainnet** | TBD | - -```bash -[[handlers]] -chain_finalization="RPCFinalizedBlock" -chain_name="$CHAIN" -chain_rpc_url=[http url] -cosmwasm_contract="$VOTING_VERIFIER" -type="EvmMsgVerifier" - -[[handlers]] -chain_finalization="RPCFinalizedBlock" -chain_name="$CHAIN" -chain_rpc_url=[http url] -cosmwasm_contract="$VOTING_VERIFIER" -type="EvmVerifierSetVerifier" -``` - -7. Update ampd with the `$CHAIN` chain configuration. - -```bash -ampd register-chain-support "[service name]" $CHAIN -``` - -8. Register prover contract on coordinator +6. Register prover contract on coordinator ```bash node cosmwasm/submit-proposal.js execute \ @@ -245,7 +218,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -9. Authorize `$CHAIN` Multisig prover on Multisig +7. Authorize `$CHAIN` Multisig prover on Multisig ```bash node cosmwasm/submit-proposal.js execute \ @@ -271,7 +244,7 @@ axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"con } ``` -10. Create reward pool for voting verifier +8. Create reward pool for voting verifier #### Rewards @@ -304,7 +277,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -11. Create reward pool for multisig +9. Create reward pool for multisig ```bash node cosmwasm/submit-proposal.js execute \ @@ -328,7 +301,7 @@ node cosmwasm/submit-proposal.js execute \ }" ``` -12. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` +10. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` Add Rewards: ```bash @@ -342,6 +315,37 @@ Check reward pool to confirm funding worked: node cosmwasm/query.js rewards -n $CHAIN ``` +11. Update ampd with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. + +| Network | `http_url` | +| -------------------- | ----------------------------- | +| **Devnet-amplifier** | https://testnet-rpc.plume.org | +| **Stagenet** | https://testnet-rpc.plume.org | +| **Testnet** | https://testnet-rpc.plume.org | +| **Mainnet** | TBD | + +```bash +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmMsgVerifier" + +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmVerifierSetVerifier" +``` + +12. Update ampd with the `$CHAIN` chain configuration. + +```bash +ampd register-chain-support "[service name]" $CHAIN +``` + 13. Create genesis verifier set Note that this step can only be run once a sufficient number of verifiers have registered. diff --git a/releases/evm/2025-05-Plume-GMP-v6.0.4.md b/releases/evm/2025-05-Plume-GMP-v6.0.4.md index eda52a83b..33f2f2d05 100644 --- a/releases/evm/2025-05-Plume-GMP-v6.0.4.md +++ b/releases/evm/2025-05-Plume-GMP-v6.0.4.md @@ -3,12 +3,12 @@ | | **Owner** | | -------------- | ---------------------------------- | | **Created By** | @AttissNgo | -| **Deployment** | | +| **Deployment** | @AttissNgo , @milapsheth | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Completed | 2025-04-30 | -| **Stagenet** | - | TBD | +| **Stagenet** | Completed | 2025-05-07 | | **Testnet** | - | TBD | | **Mainnet** | - | TBD | @@ -89,7 +89,7 @@ npm ci | Network | Addresses | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | -| **Stagenet** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | | **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | | **Mainnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | diff --git a/releases/evm/2025-05-Plume-ITS-v2.1.0.md b/releases/evm/2025-05-Plume-ITS-v2.1.0.md index b499663c0..fcc8a7252 100644 --- a/releases/evm/2025-05-Plume-ITS-v2.1.0.md +++ b/releases/evm/2025-05-Plume-ITS-v2.1.0.md @@ -3,12 +3,12 @@ | | **Owner** | | -------------- | ---------------------------------- | | **Created By** | @AttissNgo | -| **Deployment** | | +| **Deployment** | @AttissNgo | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Completed | 2025-04-30 | -| **Stagenet** | - | TBD | +| **Stagenet** | Completed | 2025-05-07 | | **Testnet** | - | TBD | | **Mainnet** | - | TBD | @@ -92,7 +92,7 @@ node evm/its.js checks -n $CHAIN -y - Run the following for two EVM chains (one Amplifier, one consensus, with different decimals for each token) ```bash -# Create a token on chain. Substitute the `wallet` below with the deployer key +# Create a token on chain. Substitute the `minter-address` below with the deployer key node evm/interchainTokenFactory.js --action deployInterchainToken --minter [minter-address] --name "test" --symbol "TST" --decimals 6 --initialSupply 10000 --salt "salt1234" -n $CHAIN # Deploy token to a remote chain From 42e6bcc1b00e44c524aa4e66236851dc4ee59c74 Mon Sep 17 00:00:00 2001 From: Foivos Date: Thu, 8 May 2025 23:50:52 +0300 Subject: [PATCH 52/71] chore: xrpl evm release docs correction (#732) Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth Co-authored-by: Attiss Ngo <92927591+AttissNgo@users.noreply.github.com> --- releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 2 +- releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md index 8d406fc73..d6f97bd6b 100644 --- a/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/cosmwasm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -29,7 +29,7 @@ Predict the [External Gateway](../evm/2025-02-XRPL-EVM-GMP-v6.0.4.md) address, a | Network | `minimumRotationDelay` | `deploymentType` | `deployer` | | -------------------- | ---------------------- | ---------------- | -------------------------------------------- | | **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | -| **Stagenet** | `300` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | | **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | | **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | diff --git a/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md b/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md index 613837f36..5a1f472b1 100644 --- a/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md +++ b/releases/evm/2025-02-XRPL-EVM-GMP-v6.0.4.md @@ -90,7 +90,7 @@ npm ci && npm run build | Network | Addresses | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | -| **Stagenet** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | | **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | | **Mainnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | From 8ffe042b1185c2f49a3d13ec9a4059d866c5753c Mon Sep 17 00:00:00 2001 From: Foivos Date: Fri, 9 May 2025 00:22:49 +0300 Subject: [PATCH 53/71] ci(git): add Husky commit hook support (#726) --- .husky/post-merge | 4 ++++ .husky/pre-commit | 4 ++++ package-lock.json | 16 ++++++++++++++++ package.json | 4 +++- 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100755 .husky/post-merge create mode 100755 .husky/pre-commit diff --git a/.husky/post-merge b/.husky/post-merge new file mode 100755 index 000000000..cda3d2159 --- /dev/null +++ b/.husky/post-merge @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +echo "Running 'npm ci' post-merge..." +npm ci diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..5c21d7f51 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +echo "Running 'npm run build' pre-commit..." +npm run build diff --git a/package-lock.json b/package-lock.json index c2981d9ba..691f13f51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "eslint": "^8.57.0", "fs-extra": "^11.1.1", "hardhat": "~2.19.5", + "husky": "^9.1.7", "mocha": "^10.2.0", "prettier": "^3.3.2", "readline-sync": "^1.4.10", @@ -6683,6 +6684,21 @@ "node": ">= 6" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", diff --git a/package.json b/package.json index 97eca0544..2eea2e9ee 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "build": "tsc", "lint": "eslint --fix '**/*.{js,ts}'", "prettier": "prettier --write '**/*.{js,ts}' 'axelar-chains-config/info/*.json' 'package.json' 'evm/**/*.json' '.github/**/*.yaml'", - "test": "mocha -r ts-node/register 'test/**/*.ts'" + "test": "mocha -r ts-node/register 'test/**/*.ts'", + "prepare": "husky" }, "repository": { "type": "git", @@ -62,6 +63,7 @@ "eslint": "^8.57.0", "fs-extra": "^11.1.1", "hardhat": "~2.19.5", + "husky": "^9.1.7", "mocha": "^10.2.0", "prettier": "^3.3.2", "readline-sync": "^1.4.10", From 7a96fefa8c4fb27b1da19b7f6f7f4e32efe370e1 Mon Sep 17 00:00:00 2001 From: Foivos Date: Fri, 9 May 2025 19:23:13 +0300 Subject: [PATCH 54/71] chore(stellar): add additional deployment and test scripts for stellar (#728) Co-authored-by: ahramy Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth --- .../setup-stellar/{action.yml => action.yaml} | 0 .github/workflows/test-stellar.yaml | 160 +++++++++++++++++- 2 files changed, 159 insertions(+), 1 deletion(-) rename .github/actions/setup-stellar/{action.yml => action.yaml} (100%) diff --git a/.github/actions/setup-stellar/action.yml b/.github/actions/setup-stellar/action.yaml similarity index 100% rename from .github/actions/setup-stellar/action.yml rename to .github/actions/setup-stellar/action.yaml diff --git a/.github/workflows/test-stellar.yaml b/.github/workflows/test-stellar.yaml index 200982bdb..1d6384810 100644 --- a/.github/workflows/test-stellar.yaml +++ b/.github/workflows/test-stellar.yaml @@ -64,7 +64,51 @@ jobs: - name: Setup Stellar network uses: ./.github/actions/setup-stellar - ###### Command: Deploy Contract ###### + ###### Environment Variables ###### + + - name: Prepare Environment Variables + id: env_vars + run: | + echo "sourceChain=ethereum" >> $GITHUB_OUTPUT + echo "sourceAddress=0x4F4495243837681061C4743b74B3eEdf548D56A5" >> $GITHUB_OUTPUT + echo "messageId=0x32034b47cb29d162d9d803cc405356f4ac0ec07fe847ace431385fe8acf3e6e5-0" >> $GITHUB_OUTPUT + echo "payload=0x56570de287d73cd1cb6092bb8fdee6173974955fdef345ae579ee9f475ea7432" >> $GITHUB_OUTPUT + echo "destinationChain=remote" >> $GITHUB_OUTPUT + echo "destinationAddress=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" >> $GITHUB_OUTPUT + echo "data=0x1234" >> $GITHUB_OUTPUT + echo "accountAddress=$(awk -F '=' '/^ACCOUNT_ID=/{print $2}' .env)" >> $GITHUB_OUTPUT + + stellar keys generate newAccount --fund --network local + echo "newAccountAddress=$(stellar keys address newAccount)" >> $GITHUB_OUTPUT + + # ITS Example Parameters + echo "name=TEST" >> $GITHUB_OUTPUT + echo "symbol=TEST" >> $GITHUB_OUTPUT + echo "decimal=18" >> $GITHUB_OUTPUT + echo "salt=0x1234" >> $GITHUB_OUTPUT + echo "amount=1" >> $GITHUB_OUTPUT + echo "tokenId=0x1829aae91cedf3603a9441688a099b4fcbdb6733b464027c69814b80ef420ada" >> $GITHUB_OUTPUT + + # ITS Hub Address + ITS_HUB_ADDRESS='its_hub_address' + echo "itsHubAddress=$ITS_HUB_ADDRESS" >> $GITHUB_OUTPUT + + ###### ITS Hub Config ###### + + - name: Set ITS Hub Address + run: | + jq '. + { + "axelar": { + "contracts": { + "InterchainTokenService": { + "address": "'"${{ steps.env_vars.outputs.itsHubAddress }}"'" + } + } + } + }' axelar-chains-config/info/local.json > temp.json + mv temp.json axelar-chains-config/info/local.json + + ###### Command: Deploy Latest Contract ###### - name: Deploy AxelarOperators run: node stellar/deploy-contract deploy AxelarOperators --version ${{ steps.commit_hash.outputs.hash }} @@ -74,3 +118,117 @@ jobs: - name: Deploy AxelarGateway run: node stellar/deploy-contract deploy AxelarGateway --version ${{ steps.commit_hash.outputs.hash }} + + - name: Deploy InterchainTokenService + run: node stellar/deploy-contract deploy InterchainTokenService --version ${{ steps.commit_hash.outputs.hash }} + + - name: Deploy AxelarExample + run: node stellar/deploy-contract deploy AxelarExample --version ${{ steps.commit_hash.outputs.hash }} + + - name: Deploy Upgrader + run: node stellar/deploy-contract deploy Upgrader --version ${{ steps.commit_hash.outputs.hash }} + + - name: Deploy Multicall + run: node stellar/deploy-contract deploy Multicall --version ${{ steps.commit_hash.outputs.hash }} + + ###### Command: AxelarGateway ###### + + - name: Gateway Paused + run: node stellar/contract.js paused AxelarGateway + + - name: Gateway Pause + run: node stellar/contract.js pause AxelarGateway + + - name: Gateway Unpause + run: node stellar/contract.js unpause AxelarGateway + + - name: Gateway Approve + run: node stellar/gateway.js approve ${{ steps.env_vars.outputs.sourceChain }} ${{ steps.env_vars.outputs.messageId }} ${{ steps.env_vars.outputs.sourceAddress }} ${{ steps.env_vars.outputs.accountAddress }} ${{ steps.env_vars.outputs.payload }} + + - name: Gateway Call Contract + run: node stellar/gateway.js call-contract ${{ steps.env_vars.outputs.destinationChain }} ${{ steps.env_vars.outputs.destinationAddress }} ${{ steps.env_vars.outputs.data }} + + - name: Gateway Rotate Signers + run: node stellar/gateway.js rotate --new-nonce test --signers wallet + + ###### Command: InterchainTokenService ###### + + - name: ITS Paused + run: node stellar/contract.js paused InterchainTokenService + + - name: ITS Pause + run: node stellar/contract.js pause InterchainTokenService + + - name: ITS Unpause + run: node stellar/contract.js unpause InterchainTokenService + + - name: Add Trusted Chain + run: node stellar/its.js add-trusted-chains ${{ steps.env_vars.outputs.destinationChain }} + + - name: Remove Trusted Chain + run: node stellar/its.js remove-trusted-chains ${{ steps.env_vars.outputs.destinationChain }} + + - name: Add All Trusted Chains + run: node stellar/its.js add-trusted-chains all + + - name: Remove All Trusted Chains + run: node stellar/its.js remove-trusted-chains all + + ###### Command: ITS Example ###### + + - name: Add Trusted Chains + run: node stellar/its.js add-trusted-chains ${{ steps.env_vars.outputs.destinationChain }} + + - name: Deploy Test Tokens + run: | + node stellar/its.js deploy-interchain-token ${{ steps.env_vars.outputs.name }} ${{ steps.env_vars.outputs.symbol }} ${{ steps.env_vars.outputs.decimal }} ${{ steps.env_vars.outputs.salt }} ${{ steps.env_vars.outputs.amount }} + node stellar/its.js deploy-remote-interchain-token ${{ steps.env_vars.outputs.salt }} ${{ steps.env_vars.outputs.destinationChain }} + + - name: Send Token to another chain + run: node stellar/its.js interchain-transfer ${{ steps.env_vars.outputs.tokenId }} ${{ steps.env_vars.outputs.destinationChain }} ${{ steps.env_vars.outputs.destinationAddress }} ${{ steps.env_vars.outputs.amount }} --data '' + + ###### Command: ITS Flow Limit ###### + + - name: ITS Flow Limit + run: node stellar/its.js flow-limit ${{ steps.env_vars.outputs.tokenId }} + + - name: ITS Flow Limit Set + run: node stellar/its.js set-flow-limit ${{ steps.env_vars.outputs.tokenId }} 1 + + - name: ITS Flow Limit Remove + run: node stellar/its.js remove-flow-limit ${{ steps.env_vars.outputs.tokenId }} + + ###### Command: Operators ###### + + - name: Operator + run: node stellar/operators is-operator ${{ steps.env_vars.outputs.accountAddress }} + + - name: Add Operator + run: node stellar/operators add-operator ${{ steps.env_vars.outputs.accountAddress }} + + - name: Remove Operator + run: node stellar/operators remove-operator ${{ steps.env_vars.outputs.accountAddress }} + + ###### Command: Operator ###### + + - name: Operator + run: node stellar/contract operator InterchainTokenService + + - name: Transfer Operatorship + run: node stellar/contract transfer-operatorship InterchainTokenService ${{ steps.env_vars.outputs.newAccountAddress }} + + ###### Command: Owner ###### + + - name: Owner + run: node stellar/contract owner InterchainTokenService + + - name: Transfer Ownership + run: node stellar/contract transfer-ownership InterchainTokenService ${{ steps.env_vars.outputs.newAccountAddress }} + + ###### Command: Upgrade Contract ###### + + - name: Upgrade Contract + run: | + node stellar/deploy-contract deploy AxelarOperators --version 1.1.0 + node stellar/deploy-contract upgrade AxelarOperators --version 1.1.1 --migration-data '[]' + From a1d0e74b19846f4ba4b650504c395080e9ce8186 Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Mon, 12 May 2025 18:25:47 +0530 Subject: [PATCH 55/71] feat: migrate multisig to v1.2.1 on Testnet (#736) --- axelar-chains-config/info/testnet.json | 8 ++--- releases/cosmwasm/2025-05-Multisig-v1.2.1.md | 38 ++++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 7be97eddc..d812c096b 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2961,10 +2961,10 @@ "adminAddress": "axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "273", - "storeCodeProposalCodeHash": "6898517f95da74cbc8c59223cc0f0f6b89e95911c321cf3be87e999935366687", - "codeId": 42, - "lastUploadedCodeId": 42, + "storeCodeProposalId": "276", + "storeCodeProposalCodeHash": "a031928989cca91d7b3f673969b397856edfea67a52d8ee4a9f4fedd6f0b5121", + "codeId": 44, + "lastUploadedCodeId": 44, "address": "axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5", "executeProposalId": "115", "flow": { diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.1.md b/releases/cosmwasm/2025-05-Multisig-v1.2.1.md index dd47d7525..0a365359a 100644 --- a/releases/cosmwasm/2025-05-Multisig-v1.2.1.md +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.1.md @@ -1,16 +1,16 @@ # Cosmwasm Multisig v1.2.1 -| | **Owner** | -|-----------|------------| -| **Created By** | @cjcobb23 | -| **Deployment** | TBD | - -| **Network** | **Deployment Status** | **Date** | -|-------------|----------------------|----------| -| **Devnet Amplifier** | - | TBD | -| **Stagenet** | - | TBD | -| **Testnet** | - | TBD | -| **Mainnet** | - | TBD | +| | **Owner** | +| -------------- | ------------------------------------- | +| **Created By** | @cjcobb23 | +| **Deployment** | @blockchainguyy Date: Mon, 12 May 2025 16:46:26 +0300 Subject: [PATCH 56/71] feat: migrate ITS hub to v1.2.1 on testnet (#706) --- axelar-chains-config/info/testnet.json | 8 ++++---- releases/cosmwasm/2025-01-ITS-v1.2.1.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index d812c096b..2c7f0c60f 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -3191,12 +3191,12 @@ "lastUploadedCodeId": 26 }, "InterchainTokenService": { - "storeCodeProposalId": "202", - "storeCodeProposalCodeHash": "174688fff71f479dca62066a9db5bb417e8b38db2d066650bf20e7e2b623f854", + "storeCodeProposalId": "275", + "storeCodeProposalCodeHash": "36c758c8e36951369ff2b5f9590485edab6c302e7c1b385415ecc6e08185d738", "adminAddress": "axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", - "lastUploadedCodeId": 27, - "codeId": 27, + "lastUploadedCodeId": 43, + "codeId": 43, "address": "axelar1aqcj54lzz0rk22gvqgcn8fr5tx4rzwdv5wv5j9dmnacgefvd7wzsy2j2mr", "sui": { "maxUintBits": 64, diff --git a/releases/cosmwasm/2025-01-ITS-v1.2.1.md b/releases/cosmwasm/2025-01-ITS-v1.2.1.md index 41f87e050..cb124f587 100644 --- a/releases/cosmwasm/2025-01-ITS-v1.2.1.md +++ b/releases/cosmwasm/2025-01-ITS-v1.2.1.md @@ -9,7 +9,7 @@ | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Deployed | 2025-04-24 | | **Stagenet** | Deployed | 2025-05-07 | -| **Testnet** | - | TBD | +| **Testnet** | Deployed | 2025-05-08 | | **Mainnet** | - | TBD | [Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) From 08454803258155e02bab94e2a80b69c791ac8e9f Mon Sep 17 00:00:00 2001 From: Blockchain Guy Date: Mon, 12 May 2025 19:20:57 +0530 Subject: [PATCH 57/71] feat: migrate multisig to v1.2.0 & v1.2.1 on Stagenet (#737) --- axelar-chains-config/info/stagenet.json | 8 ++--- releases/cosmwasm/2025-05-Multisig-v1.2.0.md | 38 ++++++++++---------- releases/cosmwasm/2025-05-Multisig-v1.2.1.md | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index b06acaac7..a18e0ba7b 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2267,10 +2267,10 @@ "adminAddress": "axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "73", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e", - "codeId": 25, - "lastUploadedCodeId": 6, + "storeCodeProposalId": "156", + "storeCodeProposalCodeHash": "a031928989cca91d7b3f673969b397856edfea67a52d8ee4a9f4fedd6f0b5121", + "codeId": 40, + "lastUploadedCodeId": 40, "address": "axelar143vjln56ke4pjmj5ut7u3358ywyfl7h5rg58js8gprr39664wcqs72vs3u", "executeProposalId": "18", "flow": { diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md index a48d0973b..665ca01fd 100644 --- a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md @@ -1,16 +1,16 @@ # Cosmwasm Multisig v1.2.0 -| | **Owner** | -|-----------|------------| -| **Created By** | @cjcobb23 | -| **Deployment** | @isi8787 | - -| **Network** | **Deployment Status** | **Date** | -|-------------|----------------------|----------| -| **Devnet Amplifier** | Deployed | 2025-05-06 | -| **Stagenet** | - | TBD | -| **Testnet** | Complete | 2025-05-06 | -| **Mainnet** | - | TBD | +| | **Owner** | +| -------------- | ----------------------------------------------------------------------- | +| **Created By** | @cjcobb23 | +| **Deployment** | @isi8787 , @blockchainguyy | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-06 | +| **Stagenet** | Deployed | 2025-05-08 | +| **Testnet** | Deployed | 2025-05-06 | +| **Mainnet** | - | TBD | [Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) @@ -27,15 +27,15 @@ Changes in this release: 1. Upload new ITS Hub contract -| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | -| :-----: | :---: | :---: | -| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | -| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | -| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | -| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | `DEPOSIT_VALUE` | +| :--------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------: | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `100000000` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `100000000` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `2000000000` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `2000000000` | ```bash -node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v1.2.0" -d "Upload Multisig contract v1.2.0" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES --version 1.2.0 +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v1.2.0" -d "Upload Multisig contract v1.2.0" -r $RUN_AS_ACCOUNT --deposit $DEPOSIT_AMOUNT --instantiateAddresses $INIT_ADDRESSES --version 1.2.0 ``` 2. Upgrade Multisig contract @@ -49,7 +49,7 @@ node cosmwasm/submit-proposal.js migrate \ -d "Multisig to v1.2.0" \ --msg '{}' \ --fetchCodeId \ - --deposit 2000000000 + --deposit $DEPOSIT_AMOUNT ``` ## Checklist diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.1.md b/releases/cosmwasm/2025-05-Multisig-v1.2.1.md index 0a365359a..116db2ab1 100644 --- a/releases/cosmwasm/2025-05-Multisig-v1.2.1.md +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.1.md @@ -8,7 +8,7 @@ | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | - | TBD | -| **Stagenet** | - | TBD | +| **Stagenet** | Deployed | 2025-05-08 | | **Testnet** | Deployed | 2025-05-08 | | **Mainnet** | - | TBD | From c865969e25461afbc6f5a73d87b16287305bd8d2 Mon Sep 17 00:00:00 2001 From: Nikolaos Kamarinakis Date: Mon, 12 May 2025 12:01:50 -0400 Subject: [PATCH 58/71] docs(release): migrate to XRPL v1.2.0 (#739) --- releases/cosmwasm/2025-05-XRPL-v1.2.0.md | 177 +++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 releases/cosmwasm/2025-05-XRPL-v1.2.0.md diff --git a/releases/cosmwasm/2025-05-XRPL-v1.2.0.md b/releases/cosmwasm/2025-05-XRPL-v1.2.0.md new file mode 100644 index 000000000..e54570633 --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPL-v1.2.0.md @@ -0,0 +1,177 @@ +# XRPL Amplifier v1.2.0 + +| | **Owner** | +|----------------|------------------------------------------------------------------------------------------------------------| +| **Created By** | @k4m4 | +| **Deployment** | @blockchainguyy , @isi8787 , @k4m4 | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-05-12 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +Releases: +- [XRPLMultisigProver v1.2.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.2.0) +- [XRPLGateway v1.2.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.2.0) +- [XRPLVotingVerifier v1.2.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-voting-verifier-v1.2.0) + +## Background + +Changes in this release: + +1. Add `ExecuteMsg::VerifySignature` to XRPLMultisigProver +1. Add execution killswitch to XRPLGateway, XRPLMultisigProver, & XRPLVotingVerifier +1. Add `QueryMsg::{AvailableTickets,NextSequenceNumber,FeeReserve}` to XRPLMultisigProver + +## Deployment + +- This rollout upgrades the XRPLGateway, XRPLMultisigProver, & XRPLVotingVerifier from `v1.1.2` to `v1.2.0` +- There is no state migration involved beyond: + * initializing the killswitch state to `Disengaged` on the XRPLGateway, XRPLMultisigProver, & XRPLVotingVerifier, and + * setting an admin address on the XRPLVotingVerifier + +1. Create `.env`. + +| Network | `INIT_ADDRESSES` | `RUN_AS_ACCOUNT` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +| Network | `DEPOSIT_VALUE` | +| -------------------- | --------------- | +| **Devnet-amplifier** | `100000000` | +| **Stagenet** | `100000000` | +| **Testnet** | `2000000000` | +| **Mainnet** | `2000000000` | + +```bash +MNEMONIC=xyz +ENV=abc +CHAIN=xrpl +RPC_URL= # Axelar RPC URL +RELEASES_BASE_URL=https://pub-7233af746dc8432f8d9547af0133309d.r2.dev +ARTIFACT_PATH=wasm +XRPL_MULTISIG_PROVER= +XRPL_GATEWAY= +XRPL_VOTING_VERIFIER= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.2.0/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.2.0/xrpl_gateway.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.2.0/xrpl_voting_verifier.wasm --directory-prefix=$ARTIFACT_PATH +``` + +3. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.2.0/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_multisig_prover.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_multisig_prover.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.2.0/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_gateway.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_gateway.wasm | grep $CHECKSUM + +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.2.0/checksums.txt +CHECKSUM=$(cat checksums.txt | grep xrpl_voting_verifier.wasm | awk '{print $1}') +shasum -a 256 $ARTIFACT_PATH/xrpl_voting_verifier.wasm | grep $CHECKSUM +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +9745311bfa3fbd164a51fead4387329b5b4216714fd7960fe4413ea11109ddf3 wasm/xrpl_multisig_prover.wasm +5d94ddb7d9581be6a1a40fed1d3f90e4818a70b5fb4fe09ff6f5f1e378dc54e8 wasm/xrpl_gateway.wasm +c43ad844c84f1dba51f6f1ebf2c806d403b0d3e5789c76a288090abfd0120096 wasm/xrpl_voting_verifier.wasm +``` + +4. Store contracts. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplMultisigProver \ + -t "Upload XRPLMultisigProver contract v1.2.0" \ + -d "Upload XRPLMultisigProver contract v1.2.0" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES + +node cosmwasm/submit-proposal.js store \ + -c XrplGateway \ + -t "Upload XRPLGateway contract v1.2.0" \ + -d "Upload XRPLGateway contract v1.2.0" \ + -a "$ARTIFACT_PATH/xrpl_gateway.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES + +node cosmwasm/submit-proposal.js store \ + -c XrplVotingVerifier \ + -t "Upload XRPLVotingVerifier contract v1.2.0" \ + -d "Upload XRPLVotingVerifier contract v1.2.0" \ + -a "$ARTIFACT_PATH/xrpl_voting_verifier.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +5. Migrate contracts. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplMultisigProver \ + -t "Migrate XRPLMultisigProver to v1.2.0" \ + -d "Migrate XRPLMultisigProver to v1.2.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE + +node cosmwasm/submit-proposal.js migrate \ + -c XrplGateway \ + -t "Migrate XRPLGateway to v1.2.0" \ + -d "Migrate XRPLGateway to v1.2.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE + +node cosmwasm/submit-proposal.js migrate \ + -c XrplVotingVerifier \ + -t "Migrate XRPLVotingVerifier to v1.2.0" \ + -d "Migrate XRPLVotingVerifier to v1.2.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify contract versions: + +```bash +axelard query wasm contract-state raw $XRPL_MULTISIG_PROVER 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +axelard query wasm contract-state raw $XRPL_GATEWAY 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +axelard query wasm contract-state raw $XRPL_VOTING_VERIFIER 636F6E74726163745F696E666F --node $RPC_URL -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-multisig-prover","version":"1.2.0"} +{"contract":"xrpl-gateway","version":"1.2.0"} +{"contract":"xrpl-voting-verifier","version":"1.2.0"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. From e434c91334a79d0cc501c99cc23e01c382dbc76f Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Mon, 12 May 2025 14:49:12 -0400 Subject: [PATCH 59/71] docs(releases): add release doc for multisig v2.0.0 (#734) Co-authored-by: isi8787 <38940784+isi8787@users.noreply.github.com> Co-authored-by: Milap Sheth --- .../info/devnet-amplifier.json | 8 +-- releases/cosmwasm/2025-05-Multisig-v2.0.0.md | 68 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 releases/cosmwasm/2025-05-Multisig-v2.0.0.md diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 34c2a1d24..4f9576f1d 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -1128,12 +1128,12 @@ "Multisig": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", "blockExpiry": 10, - "codeId": 1268, - "lastUploadedCodeId": 1268, + "codeId": 1273, + "lastUploadedCodeId": 1273, "address": "axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r", "executeProposalId": "55", - "storeCodeProposalId": "561", - "storeCodeProposalCodeHash": "6898517f95da74cbc8c59223cc0f0f6b89e95911c321cf3be87e999935366687" + "storeCodeProposalId": "571", + "storeCodeProposalCodeHash": "9b0d47bb3c780594e5ef1e649d8ec12842aa3592f5dce4223150967e14ac380e" }, "Coordinator": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", diff --git a/releases/cosmwasm/2025-05-Multisig-v2.0.0.md b/releases/cosmwasm/2025-05-Multisig-v2.0.0.md new file mode 100644 index 000000000..da4f29ea0 --- /dev/null +++ b/releases/cosmwasm/2025-05-Multisig-v2.0.0.md @@ -0,0 +1,68 @@ +# Cosmwasm Multisig v2.0.0 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 | +| **Deployment** | TBD | + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 05-10-2025 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/multisig-v1.2.1) + +## Background + +Changes in this release: + +1. Change custom signature verification to use an execute msg instead of a query. + +## Deployment + +- This rollout upgrades the amplifier multisig contract from `v1.2.1` to `v2.0.0` +- There is a no state migration involved + +1. Upload new Multisig contract + +| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | +| :-----: | :---: | :---: | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +```bash +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v2.0.0" -d "Upload Multisig contract v2.0.0" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES --version 2.0.0 +``` + +2. Upgrade Multisig contract + +There is no state migration needed during upgrade. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c Multisig \ + -t "Migrate Multisig to v2.0.0" \ + -d "Multisig to v2.0.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit 2000000000 +``` + +## Checklist + +Verify multisig contract version + +```bash +axelard query wasm contract-state raw $MULTISIG_ADDRESS 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` +Expected output + +```bash +{"contract":"multisig","version":"2.0.0"} +``` + + From 4402c27e4a812c4f1f0526bb59661aaf7dbf731e Mon Sep 17 00:00:00 2001 From: ahramy Date: Tue, 13 May 2025 09:29:20 -0700 Subject: [PATCH 60/71] docs(releases): add Stellar ITS v1.2.0 release doc (#741) Co-authored-by: Milap Sheth --- releases/stellar/2025-03-GMP-v1.1.1.md | 2 +- releases/stellar/2025-03-ITS-v1.1.1.md | 2 +- releases/stellar/2025-05-ITS-v1.2.0.md | 73 ++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 releases/stellar/2025-05-ITS-v1.2.0.md diff --git a/releases/stellar/2025-03-GMP-v1.1.1.md b/releases/stellar/2025-03-GMP-v1.1.1.md index b1e39046c..8503973c2 100644 --- a/releases/stellar/2025-03-GMP-v1.1.1.md +++ b/releases/stellar/2025-03-GMP-v1.1.1.md @@ -10,7 +10,7 @@ | **Devnet Amplifier** | Completed | 2025-04-08 | | **Stagenet** | Completed | 2025-04-08 | | **Testnet** | Completed | 2025-04-13 | -| **Mainnet** | WIP | 2025-04-08 | +| **Mainnet** | Completed | 2025-04-14 | - [v1.1.1 Crates](https://crates.io/crates/stellar-axelar-gateway/1.1.1) - [v1.1.1 Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-axelar-gateway-v1.1.1) diff --git a/releases/stellar/2025-03-ITS-v1.1.1.md b/releases/stellar/2025-03-ITS-v1.1.1.md index 0f61af3d0..c02e24524 100644 --- a/releases/stellar/2025-03-ITS-v1.1.1.md +++ b/releases/stellar/2025-03-ITS-v1.1.1.md @@ -10,7 +10,7 @@ | **Devnet Amplifier** | Completed | 2025-04-08 | | **Stagenet** | Completed | 2025-04-08 | | **Testnet** | Completed | 2025-04-13 | -| **Mainnet** | WIP | 2025-04-08 | +| **Mainnet** | Completed | 2025-04-14 | - [Crates](https://crates.io/crates/stellar-interchain-token-service/1.1.1) - [Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-interchain-token-service-v1.1.1) diff --git a/releases/stellar/2025-05-ITS-v1.2.0.md b/releases/stellar/2025-05-ITS-v1.2.0.md new file mode 100644 index 000000000..758d8c939 --- /dev/null +++ b/releases/stellar/2025-05-ITS-v1.2.0.md @@ -0,0 +1,73 @@ +# Stellar ITS v1.2.0 + +| | **Owner** | +| -------------- | ------------------------------------ | +| **Created By** | @ahram () | +| **Deployment** | @ahram () | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | TBD | 2025-05-13 | +| **Stagenet** | TBD | 2025-05-13 | +| **Testnet** | TBD | 2025-05-13 | +| **Mainnet** | TBD | TBD | + +- [Crates](https://crates.io/crates/stellar-interchain-token-service/1.2.0) +- [Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-interchain-token-service-v1.2.0) + +## Background + +- This is the v1.2.0 Stellar ITS release. + +Contract changes in the release: + +- ([#342](https://github.com/axelarnetwork/axelar-amplifier-stellar/pull/342)): Breaking change to the `InterchainTransferSentEvent` event in ITS. `data_hash` is emitted now instead of `data`. + +## Deployment + +Create an `.env` config. `CHAIN` should be set to `stellar` for mainnet, and `stellar-2025-q1` for all other networks. + +```yaml +# Change `PRIVATE_KEY in `.env` to Stellar +PRIVATE_KEY= +ENV= +CHAIN= +``` + +1. Verify deployer address + +| Network | `deployer address` | +| -------------------- | ---------------------------------------------------------- | +| **Devnet-amplifier** | `GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q` | +| **Stagenet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Mainnet** | `GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3` | + +2. Upgrade `InterchainTokenService` + +```bash +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.2.0 +``` + +## Checklist + +The following checks should be performed after the rollout + +### Stellar → EVM + +1. Deploy Native Interchain Token + +```bash +node stellar/its.js deploy-interchain-token TEST2 test2 18 0x5678 100 + +node stellar/its.js deploy-remote-interchain-token 0x1234 [destination-chain] --gas-amount 10000000 +``` + +2. Interchain Token Transfer for Native Interchain Token + +```bash +node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --data 0x1234 --gas-amount 10000000 +``` + +3. Ensure that the interchain transfer sent event emits `data_hash` from the transaction. +- Open `stellar.expert` with the transaction, search for the `interchain_transfer_sent` event, and check the `data_hash`. From 4fe8455c07b4966cee09d46f15f0a9b87f947ee2 Mon Sep 17 00:00:00 2001 From: Milap Sheth Date: Thu, 15 May 2025 03:10:02 +0530 Subject: [PATCH 61/71] chore: remove xrpl-evm-test-1 (#749) --- axelar-chains-config/info/testnet.json | 187 ++++++------------------- evm/deploy-its.js | 1 - evm/utils.js | 6 +- 3 files changed, 44 insertions(+), 150 deletions(-) diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 2c7f0c60f..96059e5c3 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -90,7 +90,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -182,7 +183,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0xf7b6736d66E545a1A460Bf14CAa46B9460Aa9caf" + "gatewayCaller": "0xf7b6736d66E545a1A460Bf14CAa46B9460Aa9caf", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -301,7 +303,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0x64cf33D513F045DcecD7Fe32f5E0056D5607CeBd" + "gatewayCaller": "0x64cf33D513F045DcecD7Fe32f5E0056D5607CeBd", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -457,7 +460,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0xa2d3c0eC6B03EAc02A0A686b4A82b430A076E0eC" + "gatewayCaller": "0xa2d3c0eC6B03EAc02A0A686b4A82b430A076E0eC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -576,7 +580,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0xb4799F0CA9dFb8FAB3eb473526C33ab68687A07B" + "gatewayCaller": "0xb4799F0CA9dFb8FAB3eb473526C33ab68687A07B", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -661,7 +666,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -815,7 +821,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0x8150f03DceB9D9464Cb472c4b926B6e958cE4daa" + "gatewayCaller": "0x8150f03DceB9D9464Cb472c4b926B6e958cE4daa", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -926,7 +933,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0xf7057A0202B1F5ac85bCF18f9fd078F8437183E4" + "gatewayCaller": "0xf7057A0202B1F5ac85bCF18f9fd078F8437183E4", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -1040,7 +1048,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", "proxySalt": "ITS v1.0.0", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "salt": "ITS Factory v1.0.0", @@ -1157,7 +1166,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1270,7 +1280,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x3AB8A7be32b7a1A12686258aDda1C005E2fcb4EC" + "gatewayCaller": "0x3AB8A7be32b7a1A12686258aDda1C005E2fcb4EC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1479,7 +1490,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1600,7 +1612,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1716,7 +1729,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1732,7 +1746,7 @@ "name": "Blast-Sepolia", "axelarId": "blast-sepolia", "chainId": 168587773, - "rpc": "https://sepolia.blast.io/", + "rpc": "https://blastl2-sepolia.public.blastapi.io", "tokenSymbol": "ETH", "decimals": 18, "chainType": "evm", @@ -1832,7 +1846,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1945,7 +1960,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x8150f03DceB9D9464Cb472c4b926B6e958cE4daa" + "gatewayCaller": "0x8150f03DceB9D9464Cb472c4b926B6e958cE4daa", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2048,7 +2064,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2159,7 +2176,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2253,7 +2271,8 @@ "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", - "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C" + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2617,95 +2636,6 @@ } } }, - "xrpl-evm-test-1": { - "name": "XRPL EVM", - "axelarId": "xrpl-evm-test-1", - "chainId": 1449000, - "rpc": "https://rpc.testnet.xrplevm.org", - "tokenSymbol": "XRP", - "decimals": 18, - "confirmations": 1, - "finality": "finalized", - "approxFinalityWaitTime": 1, - "chainType": "evm", - "explorer": { - "name": "Blockscout", - "url": "https://explorer.testnet.xrplevm.org/", - "api": "https://explorer.testnet.xrplevm.org/api/" - }, - "contracts": { - "AxelarGateway": { - "implementation": "0x27a3daf3b243104E9b0afAe6b56026a416B852C9", - "implementationCodehash": "0xe56da1cf07bfb2f24fb6fc782c510e2e7cff95c40d3ef4eec0c374565104c173", - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "operator": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "proxyDeploymentArgs": [ - "0x27a3daf3b243104E9b0afAe6b56026a416B852C9", - "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "0x000000000000000000000000ba76c6980428a0b10cfc5d8ccb61949677a612330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000010e64a700000000000000000000000000000000000000000000000000000000000000160000000000000000000000000e3c1ac746bd5d47fa44f77a6e3a700eadd9e1bc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000001f2eb0420e6aac6e25154639a37587bbc4b256d6000000000000000000000000000000000000000000000000000000000000000100000000000000000000000020aecd082d8788639f2a4afb8563f62aee2183f2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000024449d80a8c616cff227b37a1461ebd059529d140000000000000000000000000000000000000000000000000000000000000001000000000000000000000000380dda1ce71d1922b37db6079ca6e26b2b65da4b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000414b06d536092988aa828a3209a0331be53a126f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000004acc331501a4cde2bea4a3703ccf328f2833182500000000000000000000000000000000000000000000000000000000000000010000000000000000000000005cdf30e201017cb3aaab487949af41e7225e2d1600000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ff6e6fb7f3804fee29aa2ff75dd889c8e09eb7e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070a97c7328a22e012d6e7c7f0615a19f6761b617000000000000000000000000000000000000000000000000000000000000000100000000000000000000000083313ac5d1e023cbca79a18b9ec5ab7875746335000000000000000000000000000000000000000000000000000000000000000100000000000000000000000092ec015a988cf083c6ad0627f37df05937687e7900000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ce4f02aab880308bc8db8cc6e4ec9a2a8cded5b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a8f56991b33b07ccac084be1d2a246d1c82fa73e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b00e4c94faa6698ad2c3b64af7c94071d5eeb2d00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b9f5ea2331ef8224b56576db506afc88f8b070480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c4db1d3fcf418d4baf61f173eef18c6fb40132fb0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c89566ef25f70cbf3507d5b3c6605129ef9d508c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cbfa786fbdbb8779063fd7580a22da8f306eb8240000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cee3d5699cbfd940b7ee9ac71518120d5f8f67570000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e19404210888776d57780666d0a435298da6d7cf0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e6a16d54e432883da61ce9130b1cd0240025ce620000000000000000000000000000000000000000000000000000000000000001" - ], - "initialVerifierSetId": "2834280fb102254adf6bd68a066a6d11cc08614331574f479291cd0ccdac6a5b", - "address": "0xA1eBb6A4b856dF8bf6c3aCa88a9115a9ab3b2E02", - "deploymentMethod": "create", - "previousSignersRetention": 15, - "domainSeparator": "0x2214f7ca91c3424e236cedad6111c856315c14847a06255275a9df3de28aa015", - "minimumRotationDelay": 3600, - "connectionType": "amplifier", - "owner": "0xba76c6980428A0b10CFC5d8ccb61949677A61233" - }, - "ConstAddressDeployer": { - "address": "0x858Bd33dF5BeAabF16Dc0249Acd194564c16BB2d", - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "deploymentMethod": "create", - "codehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe", - "predeployCodehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe" - }, - "Create3Deployer": { - "address": "0x27A6E2Cf2d37B320EDaF5688ae89f21ef19099A8", - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "deploymentMethod": "create2", - "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", - "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92", - "salt": "Create3Deployer" - }, - "Operators": { - "owner": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "address": "0x2e1C331cE54863555Ee1638c99eA9154b02bA831", - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "deploymentMethod": "create2", - "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", - "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", - "salt": "Operators" - }, - "AxelarGasService": { - "collector": "0x2e1C331cE54863555Ee1638c99eA9154b02bA831", - "salt": "AxelarGasService", - "address": "0x2CcdaDdc282D5F22F740398f1992003b525aE0F5", - "implementation": "0x3c5c8cCdc4178af5a54f343988b8a068dba4b387", - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233" - }, - "InterchainTokenService": { - "salt": "ITS v2.1.0", - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "proxySalt": "ITS v1.0.0", - "tokenManagerDeployer": "0xBC97Fc0D633312Fe7E991BCFcAA2F98A3958122F", - "interchainToken": "0x0db26a0EBE8EBe69c83D0A3b6Dd11d26bCeD7D64", - "interchainTokenDeployer": "0xBdcc0bD2B7fB45952a0D29500D9225cE4a5d4f16", - "tokenManager": "0x20b13F343227037f2911598e30dE2f24c27f5B7c", - "tokenHandler": "0xE36Dd3A5D2e4aeDCA024F051c739c6135027D671", - "gatewayCaller": "0x281DA551fB8E9fe16b595107f6bC9d5e049eBdaC", - "implementation": "0x2A4c19146Fc83e01C92C09AbE8A9383B34efe52F", - "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", - "address": "0x3b1ca8B18698409fF95e29c506ad7014980F0193" - }, - "InterchainTokenFactory": { - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "salt": "ITS Factory v1.0.0", - "implementation": "0x56858a5bD9928858cd0307f22C3FE8791a784253", - "address": "0x0E7620b73a53980f2138B43314fa944AE990d387" - } - } - }, "xrpl-evm": { "name": "XRPL EVM", "axelarId": "xrpl-evm", @@ -2785,7 +2715,8 @@ "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", - "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C" + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2985,7 +2916,7 @@ "keyType": "ecdsa", "domainSeparator": "0x79191ee0824b0f995492dc4ac6e737040f4d9fd4501f6078e56671da70968259", "codeId": 18, - "address": "axelar1rsuejfntt4rs2y8dn4dd3acszs00zyg9wpnsc6fmhevcp6plu5qspzn7e0" + "address": "axelar1rsuejfntt4rs2y8dn4dd3acszs00zyg9wpnsc6fmhevcp6x5qspzn7e0" }, "hedera": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", @@ -3017,21 +2948,6 @@ "domainSeparator": "0xf221c54a1a478f48c840a24cf2b96f77c9bc369a40570744b8fedd91df001624", "address": "axelar1v8jrupu2rqpskwgtr69max0ajul92q8z5mdxd505m2hu3xc5jzcqm8zyc6" }, - "xrpl-evm-test-1": { - "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", - "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", - "signingThreshold": [ - "51", - "100" - ], - "serviceName": "amplifier", - "verifierSetDiffThreshold": 0, - "encoder": "abi", - "keyType": "ecdsa", - "codeId": 18, - "domainSeparator": "0x2214f7ca91c3424e236cedad6111c856315c14847a06255275a9df3de28aa015", - "address": "axelar1fxjzgyhuvst30frp773jnyvy4sj9839t23fkfsfnr3gun0w740uqfhwe4g" - }, "xrpl-evm": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", @@ -3079,10 +2995,6 @@ "codeId": 24, "address": "axelar1svl69e32m240xgjluezrvpudjn92usrn3dqzfm2tzn3zqkn76d6qfse593" }, - "xrpl-evm-test-1": { - "codeId": 24, - "address": "axelar1jah3ac59xke2r266yjhh45tugzsvnlzsefyvx6jgp0msk6tp7vqqaktuz2" - }, "xrpl-evm": { "codeId": 24, "address": "axelar1vvdukrmxdylvnn8e59s3gnn49lutv3n9tg4vnsttn33a8zulgfssl62q69" @@ -3141,21 +3053,6 @@ "codeId": 26, "address": "axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh" }, - "xrpl-evm-test-1": { - "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", - "serviceName": "amplifier", - "sourceGatewayAddress": "0xA1eBb6A4b856dF8bf6c3aCa88a9115a9ab3b2E02", - "votingThreshold": [ - "51", - "100" - ], - "blockExpiry": 10, - "confirmationHeight": 1, - "msgIdFormat": "hex_tx_hash_and_event_index", - "addressFormat": "eip55", - "codeId": 26, - "address": "axelar1wn27x0th9amw5z59tssn5f9hwraevla8xx7ksur570npfpkckr9s257vet" - }, "xrpl-evm": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "serviceName": "amplifier", diff --git a/evm/deploy-its.js b/evm/deploy-its.js index 1674601f3..a9030bc44 100644 --- a/evm/deploy-its.js +++ b/evm/deploy-its.js @@ -131,7 +131,6 @@ async function deployAll(config, wallet, chain, options) { const isCurrentChainConsensus = isConsensusChain(chain); // Register all EVM chains that ITS is or will be deployed on. - // Add a "skip": true under ITS key in the config if the chain will not have ITS. const itsChains = Object.values(config.chains).filter( (chain) => chain.chainType === 'evm' && chain.contracts?.InterchainTokenService?.address, ); diff --git a/evm/utils.js b/evm/utils.js index 859938d15..f16100376 100644 --- a/evm/utils.js +++ b/evm/utils.js @@ -710,8 +710,7 @@ const mainProcessor = async (options, processCommand, save = true, catchErr = fa if ( chainsToSkip.includes(chain.name.toLowerCase()) || - chain.status === 'deactive' || - (chain.contracts && chain.contracts[options.contractName]?.skip) + chain.status === 'deactive' ) { printWarn('Skipping chain', chain.name); return Promise.resolve(); @@ -754,8 +753,7 @@ const mainProcessor = async (options, processCommand, save = true, catchErr = fa if ( chainsToSkip.includes(chain.name.toLowerCase()) || - chain.status === 'deactive' || - (chain.contracts && chain.contracts[options.contractName]?.skip) + chain.status === 'deactive' ) { printWarn('Skipping chain', chain.name); continue; From 733fb00c74e28cc5e85c9fac6d6a4feed7b6936e Mon Sep 17 00:00:00 2001 From: ahramy Date: Wed, 14 May 2025 15:14:05 -0700 Subject: [PATCH 62/71] chore(stellar): stellar ITS v1.2.0 deployment (#747) Co-authored-by: Milap Sheth --- .../info/devnet-amplifier.json | 4 +- axelar-chains-config/info/stagenet.json | 4 +- axelar-chains-config/info/testnet.json | 4 +- releases/stellar/2025-05-ITS-v1.2.0.md | 6 +- .../2025-05-ITS-v1.2.0-devnet-amplifier.md | 58 +++++++++++++++++++ .../2025-q1/2025-05-ITS-v1.2.0-stagenet.md | 58 +++++++++++++++++++ .../2025-q1/2025-05-ITS-v1.2.0-testnet.md | 58 +++++++++++++++++++ 7 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-devnet-amplifier.md create mode 100644 releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-stagenet.md create mode 100644 releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-testnet.md diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 4f9576f1d..efc8356da 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -713,8 +713,8 @@ "InterchainTokenService": { "address": "CATNQHWMG4VOWPSWF4HXVW7ASDJNX7M7F6JLFC544T7ZMMXXAE2HUDTY", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", - "version": "1.1.2", + "wasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", + "version": "1.2.0", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", "operator": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index a18e0ba7b..d8348cac8 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2083,8 +2083,8 @@ "InterchainTokenService": { "address": "CBD5WIIZ3BR62DQWUON2SV556UYSHL3KLBTPRX54TWDYJGPMVLZUBXXP", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", - "version": "1.1.2", + "wasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", + "version": "1.2.0", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 96059e5c3..9e9a86fba 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -2809,7 +2809,7 @@ "InterchainTokenService": { "address": "CCXT3EAQ7GPQTJWENU62SIFBQ3D4JMNQSB77KRPTGBJ7ZWBYESZQBZRK", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", + "wasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2821,7 +2821,7 @@ "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" }, - "version": "1.1.2" + "version": "1.2.0" }, "Multicall": { "address": "CC6BXRCUQFAJ64NDLEZCS4FDL6GN65FL2KDOKCRHFWPMPKRWQNBA4YR2", diff --git a/releases/stellar/2025-05-ITS-v1.2.0.md b/releases/stellar/2025-05-ITS-v1.2.0.md index 758d8c939..1e1e2c9e8 100644 --- a/releases/stellar/2025-05-ITS-v1.2.0.md +++ b/releases/stellar/2025-05-ITS-v1.2.0.md @@ -7,9 +7,9 @@ | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | -| **Devnet Amplifier** | TBD | 2025-05-13 | -| **Stagenet** | TBD | 2025-05-13 | -| **Testnet** | TBD | 2025-05-13 | +| **Devnet Amplifier** | Completed | 2025-05-13 | +| **Stagenet** | Completed | 2025-05-13 | +| **Testnet** | Completed | 2025-05-13 | | **Mainnet** | TBD | TBD | - [Crates](https://crates.io/crates/stellar-interchain-token-service/1.2.0) diff --git a/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-devnet-amplifier.md b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-devnet-amplifier.md new file mode 100644 index 000000000..5b551a232 --- /dev/null +++ b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-devnet-amplifier.md @@ -0,0 +1,58 @@ +# Stellar ITS v1.2.0 + +## Steps + +### 1. Verify deployer address +```bash +Devnet-amplifier: GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q +``` + +### 2. Upgrade `InterchainTokenService` +```bash +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.2.0 + +Wallet address: GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q + +Wallet balances: 9510.9120975 XLM + +Wallet sequence: 2667174691262 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded InterchainTokenService wasm tx: 2ae6076d5f709dd652e361cd6639c8fab659d6a3a38d5d549d7b2a21a4732573 + +New Wasm hash: cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942 + +Upgraded contract tx: 30e7d0cc5a70dff175f6edf297e7b4de1dc35f57005ec1f86b9bf029f9893735 + +Contract upgraded successfully: { + "contractName": "InterchainTokenService", + "newWasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942" +} +``` + +### 3. Verification + +#### 1. Deploy Native Interchain Token + +```bash +node stellar/its.js deploy-interchain-token TEST342 test342 18 0x112233 10000 + +https://stellar.expert/explorer/testnet/tx/4074137257512960 +``` + +#### 2. Interchain Token Transfer for Native Interchain Token + +```bash +node stellar/its.js deploy-remote-interchain-token 0x112233 avalanche-fuji --gas-amount 10000000 + +https://stellar.expert/explorer/testnet/tx/4074175912218624 +``` + +#### 3. Ensure that the interchain transfer sent event emits `data_hash` from the transaction. + +```bash +node stellar/its.js interchain-transfer 0x38fcfcc27521e87b31d351624408365b6d3b209ef4e5fb037247d8eda029668c avalanche-fuji 0x2269B93c8D8D4AfcE9786d2940F5Fcd4386Db7ff 1 --data 0x1234 --gas-amount 10000000 + +https://devnet-amplifier.axelarscan.io/gmp/80e6265e55f921d4492a963ebc3b95c55092f6c1db168a0fa56e31f83e4cdfae +``` diff --git a/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-stagenet.md b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-stagenet.md new file mode 100644 index 000000000..4736abc55 --- /dev/null +++ b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-stagenet.md @@ -0,0 +1,58 @@ +# Stellar ITS v1.2.0 + +## Steps + +### 1. Verify deployer address +```bash +Stagenet: GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3 +``` + +### 2. Upgrade `InterchainTokenService` +```bash +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.2.0 + +Wallet address: GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3 + +Wallet balances: 9904.3765457 XLM + +Wallet sequence: 2418066587934 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded InterchainTokenService wasm tx: f8f4d150b763f05333328ed31343b30108677fba9d9aabcde9d29b8bdc30b1ae + +New Wasm hash: cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942 + +Upgraded contract tx: 7ae9ddfaaecf25228d61c01151b2eef700e78140000eeff4d0f463791387dc01 + +Contract upgraded successfully: { + "contractName": "InterchainTokenService", + "newWasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942" +} +``` + +### 3. Verification + +#### 1. Deploy Native Interchain Token + +```bash +node stellar/its.js deploy-interchain-token TEST342 test342 18 0x112233 10000 + +https://stellar.expert/explorer/testnet/tx/4075163754700800 +``` + +#### 2. Interchain Token Transfer for Native Interchain Token + +```bash +node stellar/its.js deploy-remote-interchain-token 0x112233 avalanche --gas-amount 10000000 + +https://stellar.expert/explorer/testnet/tx/4075215294308352 +``` + +#### 3. Ensure that the interchain transfer sent event emits `data_hash` from the transaction. + +```bash +node stellar/its.js interchain-transfer 0x96efc3f5494b452964196fa62dd5a3a3b6b895d317f8f0172ce55c8286ef9fe7 avalanche 0x0FCb262571be50815627C16Eca1f5F3D342FF5a5 1 --data 0x1234 --gas-amount 10000000 + +https://stagenet.axelarscan.io/gmp/48ed1aabc44f033c859864f4bf990d03db6fe123e6faf322da5d845d50b4650f +``` diff --git a/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-testnet.md b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-testnet.md new file mode 100644 index 000000000..8b1c8f300 --- /dev/null +++ b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-testnet.md @@ -0,0 +1,58 @@ +# Stellar ITS v1.2.0 + +## Steps + +### 1. Verify deployer address +```bash +Testnet: GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3 +``` + +### 2. Upgrade `InterchainTokenService` +```bash +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.2.0 + +Wallet address: GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3 + +Wallet balances: 9901.4435774 XLM + +Wallet sequence: 2418066587939 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded InterchainTokenService wasm tx: b3af4c58f1c1d29b99e9dbe98d4d5a3755fcf7626158bcc86e4179956d973adb + +New Wasm hash: cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942 + +Upgraded contract tx: 578b4f2cb84b6eb259a710e2868c295dd47af3d364aa36cb8c7f796acdf71650 + +Contract upgraded successfully: { + "contractName": "InterchainTokenService", + "newWasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942" +} +``` + +### 3. Verification + +#### 1. Deploy Native Interchain Token + +```bash +node stellar/its.js deploy-interchain-token TEST342 test342 18 0x112233 10000 + +https://stellar.expert/explorer/testnet/tx/4075558891696128 +``` + +#### 2. Interchain Token Transfer for Native Interchain Token + +```bash +node stellar/its.js deploy-remote-interchain-token 0x112233 flow --gas-amount 10000000 + +https://stellar.expert/explorer/testnet/tx/4075606136336384 +``` + +#### 3. Ensure that the interchain transfer sent event emits `data_hash` from the transaction. + +```bash +node stellar/its.js interchain-transfer 0x96efc3f5494b452964196fa62dd5a3a3b6b895d317f8f0172ce55c8286ef9fe7 flow 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C 1 --data 0x1234 --gas-amount 10000000 + +https://testnet.axelarscan.io/gmp/a4a38d7ae5d4fb8bdac2a7cd00f1cfcdab559dc3f97a1184426d9923aebda201 +``` From 4206e87f11ee9d9580fe4adcb4d04209df920ef2 Mon Sep 17 00:00:00 2001 From: Milap Sheth Date: Thu, 15 May 2025 10:35:40 +0530 Subject: [PATCH 63/71] chore: upgrade stellar ITS v1.2.0 on mainnet (#753) --- axelar-chains-config/info/mainnet.json | 4 +- releases/stellar/2025-05-ITS-v1.2.0.md | 12 ++--- .../2025-q1/2025-05-ITS-v1.2.0-mainnet.md | 53 +++++++++++++++++++ stellar/utils.js | 2 +- 4 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-mainnet.md diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 777d9a09d..08fc0f9e5 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -2814,7 +2814,7 @@ "InterchainTokenService": { "address": "CBDBMIOFHGWUFRYH3D3STI2DHBOWGDDBCRKQEUB4RGQEBVG74SEED6C6", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "ed1762aa118cc09a2c035213f92b8cc0fa32d74302ec9636d4f925a3eba49dc3", + "wasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", "initializeArgs": { "owner": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", "operator": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", @@ -2826,7 +2826,7 @@ "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" }, - "version": "1.1.2" + "version": "1.2.0" }, "Multicall": { "address": "CC5LVKQA73ZVVUBAOCV5INV4TXPMELBFJ6XTQUBJTP4O2LSUKAA7VHLZ", diff --git a/releases/stellar/2025-05-ITS-v1.2.0.md b/releases/stellar/2025-05-ITS-v1.2.0.md index 1e1e2c9e8..d5625a686 100644 --- a/releases/stellar/2025-05-ITS-v1.2.0.md +++ b/releases/stellar/2025-05-ITS-v1.2.0.md @@ -1,16 +1,16 @@ # Stellar ITS v1.2.0 -| | **Owner** | -| -------------- | ------------------------------------ | -| **Created By** | @ahram () | -| **Deployment** | @ahram () | +| | **Owner** | +| -------------- | ------------------------------- | +| **Created By** | @ahram () | +| **Deployment** | @ahram () | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | | **Devnet Amplifier** | Completed | 2025-05-13 | | **Stagenet** | Completed | 2025-05-13 | | **Testnet** | Completed | 2025-05-13 | -| **Mainnet** | TBD | TBD | +| **Mainnet** | Completed | 2025-05-14 | - [Crates](https://crates.io/crates/stellar-interchain-token-service/1.2.0) - [Releases](https://github.com/axelarnetwork/axelar-amplifier-stellar/releases/tag/stellar-interchain-token-service-v1.2.0) @@ -58,7 +58,7 @@ The following checks should be performed after the rollout 1. Deploy Native Interchain Token ```bash -node stellar/its.js deploy-interchain-token TEST2 test2 18 0x5678 100 +node stellar/its.js deploy-interchain-token TEST2 test2 18 0x1234 100 node stellar/its.js deploy-remote-interchain-token 0x1234 [destination-chain] --gas-amount 10000000 ``` diff --git a/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-mainnet.md b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-mainnet.md new file mode 100644 index 000000000..dcf4e85e8 --- /dev/null +++ b/releases/stellar/logs/v1.2.0/2025-q1/2025-05-ITS-v1.2.0-mainnet.md @@ -0,0 +1,53 @@ +# Stellar ITS v1.2.0 + +## Steps + +### 2. Upgrade `InterchainTokenService` + +```bash +node stellar/deploy-contract.js upgrade InterchainTokenService --version 1.2.0 + +Wallet address: GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3 + +Wallet balances: 271.4389576 XLM + +Wallet sequence: 240976600500273233 + +Proceed with upgrade on Stellar? (y/n) y + +Uploaded InterchainTokenService wasm tx: ea7161645bf89cc50d1941d19b1c9208e235cc27a44f536d3944a0a389536e60 + +New Wasm hash: cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942 + +Upgraded contract tx: 49c1093062b9b9499a7bdfd964f7e03032672296f08a1d9dde28a1ec4f6fac98 +Contract upgraded successfully: { + "contractName": "InterchainTokenService", + "newWasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942" +} +``` + +### 3. Verification + +#### 1. Deploy Native Interchain Token + +```bash +node stellar/its.js deploy-interchain-token TEST342 test342 18 0x5678 10000 + +https://stellar.expert/explorer/public/tx/4f618f5dc06e505e561943365412c10ce5b639573c1dbe1a4522bad7b71711a4 +``` + +#### 2. Interchain Token Transfer for Native Interchain Token + +```bash +node stellar/its.js deploy-remote-interchain-token 0x5678 flow --gas-amount 10000000 + +https://stellar.expert/explorer/public/tx/7e7937ae0cc093b69854fb7f401d74ef352d75e3313ffd6fb1f117a3c7f4e0bf +``` + +#### 3. Ensure that the interchain transfer sent event emits `data_hash` from the transaction. + +```bash +node stellar/its.js interchain-transfer 0x9a214f2599a28604d6dff115804b19271d24930039eab69a48a984732195295c flow 0xba76c6980428A0b10CFC5d8ccb61949677A61233 1 --data 0x1234 --gas-amount 10000000 + +https://stellar.expert/explorer/public/tx/3c178f4ad8d756de4461a9c38202fd2f8d5232c5ead346f2d19f004b8517c40b +``` diff --git a/stellar/utils.js b/stellar/utils.js index 2f1c5dbe6..334022c9d 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -149,7 +149,7 @@ async function sendTransaction(tx, server, action, options = {}) { } if (getResponse.status !== 'SUCCESS') { - throw Error(`Transaction failed: ${getResponse.resultXdr}`); + throw Error(`Transaction failed: ${getResponse.txHash}`); } // Native payment — sorobanMeta is not present, so skip parsing. From c572991f28224e81f44ee64e50034778ee352f87 Mon Sep 17 00:00:00 2001 From: Foivos Date: Thu, 15 May 2025 16:50:55 +0300 Subject: [PATCH 64/71] feat: migrate ITS hub to v1.2.1 on mainnet (#711) Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth Co-authored-by: blockchainguyy --- axelar-chains-config/info/mainnet.json | 8 ++++---- releases/cosmwasm/2025-01-ITS-v1.2.1.md | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 08fc0f9e5..65351ae04 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -3155,12 +3155,12 @@ "lastUploadedCodeId": 20 }, "InterchainTokenService": { - "storeCodeProposalId": "285", - "storeCodeProposalCodeHash": "174688fff71f479dca62066a9db5bb417e8b38db2d066650bf20e7e2b623f854", + "storeCodeProposalId": "315", + "storeCodeProposalCodeHash": "36c758c8e36951369ff2b5f9590485edab6c302e7c1b385415ecc6e08185d738", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am", - "lastUploadedCodeId": 15, - "codeId": 25, + "lastUploadedCodeId": 29, + "codeId": 29, "address": "axelar1aqcj54lzz0rk22gvqgcn8fr5tx4rzwdv5wv5j9dmnacgefvd7wzsy2j2mr", "stellar": { "maxUintBits": 127, diff --git a/releases/cosmwasm/2025-01-ITS-v1.2.1.md b/releases/cosmwasm/2025-01-ITS-v1.2.1.md index cb124f587..fe95ac689 100644 --- a/releases/cosmwasm/2025-01-ITS-v1.2.1.md +++ b/releases/cosmwasm/2025-01-ITS-v1.2.1.md @@ -10,7 +10,8 @@ | **Devnet Amplifier** | Deployed | 2025-04-24 | | **Stagenet** | Deployed | 2025-05-07 | | **Testnet** | Deployed | 2025-05-08 | -| **Mainnet** | - | TBD | +| **Mainnet** | Deployed | 2025-05-15 | + [Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) From 14854a02cde7ba1eac425437d11c3cbf1da3b60a Mon Sep 17 00:00:00 2001 From: isi8787 <38940784+isi8787@users.noreply.github.com> Date: Thu, 15 May 2025 12:29:15 -0400 Subject: [PATCH 65/71] chore: add hyperliquid to stagenet (#750) Co-authored-by: Milap Sheth --- axelar-chains-config/info/stagenet.json | 122 ++++++++++++++++++ .../evm/2025-05-Hyperliquid-GMP-v6.0.4.md | 6 +- 2 files changed, 126 insertions(+), 2 deletions(-) diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index d8348cac8..3cbe99f83 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2194,6 +2194,94 @@ "address": "0x35eAd6089aBF6233C3E0086CD3C0eF849bdE95c3" } } + }, + "hyperliquid": { + "name": "Hyperliquid", + "axelarId": "hyperliquid", + "chainId": 998, + "rpc": "https://rpc.hyperliquid-testnet.xyz/evm", + "tokenSymbol": "HYPE", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Hyperliquid Explorer", + "url": "https://app.hyperliquid-testnet.xyz/explorer" + }, + "contracts": { + "ConstAddressDeployer": { + "address": "0x98B2920D53612483F91F12Ed7754E51b4A77919e", + "deployer": "0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F", + "deploymentMethod": "create", + "codehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe", + "predeployCodehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe" + }, + "Create3Deployer": { + "address": "0x6513Aedb4D1593BA12e50644401D976aebDc90d8", + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "deploymentMethod": "create2", + "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", + "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92", + "salt": "Create3Deployer" + }, + "AxelarGateway": { + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "operator": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "proxyDeploymentArgs": [ + "0xC5578b1c63CE803B9f7f185652CC1E14Af887b8f", + "0xBeF25f4733b9d451072416360609e5A4c115293E", + "0x000000000000000000000000bef25f4733b9d451072416360609e5a4c115293e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000004a00b200000000000000000000000000000000000000000000000000000000000000050000000000000000000000004ed1fd87673ed52b810710e1e81c10df10906f40000000000000000000000000000000000000000000000000000000000000000100000000000000000000000054059b18cf1b10d648d922e00c149e68b3d77e90000000000000000000000000000000000000000000000000000000000000000100000000000000000000000057c026c5a2dcb35fd220f3436ff4096978066bb50000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d368332a3cb3ea8a38144508c1ddea649c4d23fd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f48dfdc4f1666701ba74efa1d8491f4811c064a40000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "df91b47514003f2391afa1cdbbddbf255f0d60238caf300ce79c1a20d891429e", + "address": "0x5A4fA5187BddD93097dE4F6062a2E96C82Ea2d61", + "implementation": "0xC5578b1c63CE803B9f7f185652CC1E14Af887b8f", + "implementationCodehash": "0xdb6568a375157569ae09110eb2490d0690624e767be81cbac72bbaebf0566a09", + "deploymentMethod": "create", + "previousSignersRetention": 15, + "domainSeparator": "0x55effa6536498e73caa573e7ad8326d3d4628878a9e4dc8b461ed5706ad585c2", + "minimumRotationDelay": 300, + "connectionType": "amplifier", + "owner": "0xBeF25f4733b9d451072416360609e5A4c115293E" + }, + "Operators": { + "owner": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "address": "0xc5C525B7Bb2a7Ce95C13Ee5aBdB7F8fd3cb77392", + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "AxelarGasService": { + "collector": "0xc5C525B7Bb2a7Ce95C13Ee5aBdB7F8fd3cb77392", + "salt": "AxelarGasService", + "address": "0xeE1d04E4F9F9AdEB7be7d6996f4A726773460A87", + "implementation": "0x39dA9388Ec10347BB08aA3d464631ab14553afe4", + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E" + }, + "InterchainTokenService": { + "salt": "ITS v2.1.0", + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "proxySalt": "ITS v1.0.0", + "tokenManagerDeployer": "0x8d73f4350f1d0384e097aaC88d3e04Af94A95984", + "interchainToken": "0xE6575486955D887BcFcFaDfaacF891C462cfab6B", + "interchainTokenDeployer": "0x48a6464Adad6Ef96286BC738dfE1a89249f67D24", + "tokenManager": "0x790bD31aCF3a0548b4e71f2fB6785f6844aA286e", + "tokenHandler": "0x95C7e8e04440bD85c336147e2964b2F8331F23aD", + "gatewayCaller": "0xb8Dcc3f2971072d556d8E33284725B3A6f83adFd", + "implementation": "0x7566C3f4A589Cd84F995d12eFB72D8c54dEc272B", + "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", + "address": "0x0FCb262571be50815627C16Eca1f5F3D342FF5a5" + }, + "InterchainTokenFactory": { + "deployer": "0xBeF25f4733b9d451072416360609e5A4c115293E", + "salt": "ITS Factory v1.0.0", + "implementation": "0x27Dae89620Ed5f3111d85D44ceFc6EdB7fe74551", + "address": "0x35eAd6089aBF6233C3E0086CD3C0eF849bdE95c3" + } + } } }, "axelar": { @@ -2371,6 +2459,21 @@ "domainSeparator": "0x2dbc42136ba0394d31cf1f35344a182ecf00210b42b9b8bf3234c3da201a9ca6", "address": "axelar1vs8rvpuyhq40tn4suq4jamx3fe9gqlszds0z8s39ta4txz95ryws8xnpk0" }, + "hyperliquid": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv", + "signingThreshold": [ + "51", + "100" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa", + "codeId": 21, + "domainSeparator": "0x55effa6536498e73caa573e7ad8326d3d4628878a9e4dc8b461ed5706ad585c2", + "address": "axelar12cmpmynpn38tvg0t57lc8wd8cvw724sz95kr80a08mhghztex5lqfk2yv5" + }, "storeCodeProposalId": "69", "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a", "lastUploadedCodeId": 21 @@ -2402,6 +2505,10 @@ "stellar-2025-q1": { "codeId": 22, "address": "axelar1lkrxspjqge3dkuwgfw4mjtmxjnyx8pr7tm9ksszvlh4c3u3z2nlswxexcz" + }, + "hyperliquid": { + "codeId": 22, + "address": "axelar1um4eyzmkpxhkpv3ytzaawqjzjxfddv2cjlep936glj87jg24zccqw86q2w" } }, "VotingVerifier": { @@ -2495,6 +2602,21 @@ "codeId": 24, "address": "axelar1t49krzwl0sc6z8qwdst5d7kmgn3xutjtp4ku8u2c06quy7w8hp4q5zsqn2" }, + "hyperliquid": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "serviceName": "amplifier", + "sourceGatewayAddress": "0x5A4fA5187BddD93097dE4F6062a2E96C82Ea2d61", + "votingThreshold": [ + "51", + "100" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55", + "codeId": 24, + "address": "axelar1n72sdsdclpffc0jw5mf7vc97zpy6czqw9glmcqhm8sp73nczu57sn3kplc" + }, "storeCodeProposalId": "72", "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708", "lastUploadedCodeId": 24 diff --git a/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md b/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md index ae5342fc6..b6977a075 100644 --- a/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md +++ b/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md @@ -134,7 +134,9 @@ c. Fund one account with HYPE on both HyperCore and Hyperliquid EVM. Steps to pr - Provision USDC on Arbitrum - Use their trading app https://app.hyperliquid.xyz/trade and connect wallet. - Buy HYPE with USDC balance - - Under `balances` section connect wallet again to perform an EVM transfer. + - Under `balances` section connect wallet again to perform an EVM transfer. + + Note: Above flow has been tested. In order to preserve nonces do not transfer funds from EVM to Hypercore d. Update the `./hyperliquid-python-sdk/examples/config.json`: @@ -229,7 +231,7 @@ node evm/deploy-contract.js -c Operators -m create2 node evm/operators.js --action addOperator --args $OPERATOR_ADDRESS ``` -9. Deploy GasService (set the `AxelarGasService.collector` to `Operators` address in config, which you will receive at step 6) +9. Deploy GasService (set the `AxelarGasService.collector` to `Operators` address in config, which you will receive at step 7) | Network | `deployer address` | `deployMethod` | | -------------------- | -------------------------------------------- | -------------- | From 02691bd9b58f9690ce6d12163aa9c4b4d508fe45 Mon Sep 17 00:00:00 2001 From: SDavidson1177 Date: Fri, 16 May 2025 15:09:54 -0400 Subject: [PATCH 66/71] fix(cosmwasm): add router and multisig to coordinator instantiation script (#757) --- cosmwasm/utils.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cosmwasm/utils.js b/cosmwasm/utils.js index c016a07c5..a071e43eb 100644 --- a/cosmwasm/utils.js +++ b/cosmwasm/utils.js @@ -204,6 +204,8 @@ const makeCoordinatorInstantiateMsg = (config, _options, contractConfig) => { } = config; const { ServiceRegistry: { address: registryAddress }, + Multisig: { address: multisigAddress }, + Router: { address: routerAddress }, } = contracts; const { governanceAddress } = contractConfig; @@ -215,7 +217,7 @@ const makeCoordinatorInstantiateMsg = (config, _options, contractConfig) => { throw new Error('Missing or invalid ServiceRegistry.address in axelar info'); } - return { governance_address: governanceAddress, service_registry: registryAddress }; + return { governance_address: governanceAddress, service_registry: registryAddress, router_address: routerAddress, multisig_address: multisigAddress }; }; const makeServiceRegistryInstantiateMsg = (_config, _options, contractConfig) => { From aeeb933640c919b6dc6a366b78743b72966bd525 Mon Sep 17 00:00:00 2001 From: CJ Cobb <46455409+cjcobb23@users.noreply.github.com> Date: Fri, 16 May 2025 19:56:51 -0400 Subject: [PATCH 67/71] docs(releases): add release doc for multisig 2.1.0 (#758) --- .../info/devnet-amplifier.json | 8 +-- releases/cosmwasm/2025-05-Multisig-v2.1.0.md | 68 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 releases/cosmwasm/2025-05-Multisig-v2.1.0.md diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index efc8356da..3056207cf 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -1128,12 +1128,12 @@ "Multisig": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", "blockExpiry": 10, - "codeId": 1273, - "lastUploadedCodeId": 1273, + "codeId": 1302, + "lastUploadedCodeId": 1302, "address": "axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r", "executeProposalId": "55", - "storeCodeProposalId": "571", - "storeCodeProposalCodeHash": "9b0d47bb3c780594e5ef1e649d8ec12842aa3592f5dce4223150967e14ac380e" + "storeCodeProposalId": "580", + "storeCodeProposalCodeHash": "cd6109a37eab844941ea09266e54bf3fdb18bfb55e02a0ed91aa5a8d47aea2ec" }, "Coordinator": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", diff --git a/releases/cosmwasm/2025-05-Multisig-v2.1.0.md b/releases/cosmwasm/2025-05-Multisig-v2.1.0.md new file mode 100644 index 000000000..f9f4a588d --- /dev/null +++ b/releases/cosmwasm/2025-05-Multisig-v2.1.0.md @@ -0,0 +1,68 @@ +# Cosmwasm Multisig v2.1.0 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 | +| **Deployment** | TBD | + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 05-10-2025 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/multisig-v2.1.0) + +## Background + +Changes in this release: + +1. Accept arbitrary length message to sign. Allows for stateless sig verification callback. + +## Deployment + +- This rollout upgrades the amplifier multisig contract from `v2.0.0` to `v2.1.0` +- There is a no state migration involved + +1. Upload new Multisig contract + +| environment | INIT_ADDRESSES | RUN_AS_ACCOUNT | +| :-----: | :---: | :---: | +| devnet-amplifier | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| stagenet | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| testnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| mainnet | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +```bash +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v2.1.0" -d "Upload Multisig contract v2.1.0" -r $RUN_AS_ACCOUNT --deposit 2000000000 --instantiateAddresses $INIT_ADDRESSES --version 2.1.0 +``` + +2. Upgrade Multisig contract + +There is no state migration needed during upgrade. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c Multisig \ + -t "Migrate Multisig to v2.1.0" \ + -d "Multisig to v2.1.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit 2000000000 +``` + +## Checklist + +Verify multisig contract version + +```bash +axelard query wasm contract-state raw $MULTISIG_ADDRESS 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` +Expected output + +```bash +{"contract":"multisig","version":"2.1.0"} +``` + + From a6c7075e3c9b845ae83bc8f90f0cd05fd750f1a0 Mon Sep 17 00:00:00 2001 From: Foivos Date: Mon, 19 May 2025 10:30:16 +0300 Subject: [PATCH 68/71] feat: migrate Multisig to v1.2.0 on mainnet (#710) Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth Co-authored-by: blockchainguyy Co-authored-by: isaac markus Co-authored-by: isi8787 <38940784+isi8787@users.noreply.github.com> --- axelar-chains-config/info/mainnet.json | 9 +++++---- releases/cosmwasm/2025-05-Multisig-v1.2.0.md | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 65351ae04..8a62176b4 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -2997,11 +2997,12 @@ "adminAddress": "axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "261", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e", - "codeId": 14, + "storeCodeProposalId": "316", + "storeCodeProposalCodeHash": "6898517f95da74cbc8c59223cc0f0f6b89e95911c321cf3be87e999935366687", + "codeId": 30, "address": "axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5", - "executeProposalId": "244" + "executeProposalId": "244", + "lastUploadedCodeId": 30 }, "MultisigProver": { "flow": { diff --git a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md index 665ca01fd..5333edc36 100644 --- a/releases/cosmwasm/2025-05-Multisig-v1.2.0.md +++ b/releases/cosmwasm/2025-05-Multisig-v1.2.0.md @@ -10,7 +10,7 @@ | **Devnet Amplifier** | Deployed | 2025-05-06 | | **Stagenet** | Deployed | 2025-05-08 | | **Testnet** | Deployed | 2025-05-06 | -| **Mainnet** | - | TBD | +| **Mainnet** | Deployed | 2025-05-15 | [Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/interchain-token-service-v1.2.1) From a2165a88dbf85d7e0e4bb2f4f162fafb8a4cd6c2 Mon Sep 17 00:00:00 2001 From: Foivos Date: Mon, 19 May 2025 10:38:26 +0300 Subject: [PATCH 69/71] feat: add default values for wasm proposal (#707) Co-authored-by: Milap Sheth Co-authored-by: eguajardo Co-authored-by: Milap Sheth Co-authored-by: blockchainguyy Co-authored-by: Attiss Ngo <92927591+AttissNgo@users.noreply.github.com> --- .../info/devnet-amplifier.json | 7 +- axelar-chains-config/info/mainnet.json | 6 + axelar-chains-config/info/stagenet.json | 8 +- axelar-chains-config/info/testnet.json | 8 +- common/utils.js | 14 + cosmwasm/README.md | 38 +- cosmwasm/cli-utils.js | 13 +- cosmwasm/submit-proposal.js | 63 +++- cosmwasm/utils.js | 31 -- .../cosmwasm/EVM-CosmWasm-Release-Template.md | 357 ++++++++++++++++++ releases/evm/EVM-GMP-Release-Template.md | 242 ++++++++++++ releases/evm/EVM-ITS-Release-Template.md | 102 +++++ 12 files changed, 810 insertions(+), 79 deletions(-) create mode 100644 releases/cosmwasm/EVM-CosmWasm-Release-Template.md create mode 100644 releases/evm/EVM-GMP-Release-Template.md create mode 100644 releases/evm/EVM-ITS-Release-Template.md diff --git a/axelar-chains-config/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 3056207cf..172ed8155 100644 --- a/axelar-chains-config/info/devnet-amplifier.json +++ b/axelar-chains-config/info/devnet-amplifier.json @@ -1494,6 +1494,11 @@ "grpc": "devnet-amplifier.axelar.dev:9090", "tokenSymbol": "AMPLIFIER", "gasPrice": "0.00005uamplifier", - "gasLimit": "auto" + "gasLimit": "auto", + "govProposalDepositAmount": "100000000", + "govProposalInstantiateAddresses": [ + "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9" + ] } } diff --git a/axelar-chains-config/info/mainnet.json b/axelar-chains-config/info/mainnet.json index 8a62176b4..18c6f80a9 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -2942,6 +2942,12 @@ "axelarscanApi": "https://api.axelarscan.io", "gasPrice": "0.007uaxl", "gasLimit": "auto", + "govProposalDepositAmount": "2000000000", + "govProposalInstantiateAddresses": [ + "axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2", + "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am" + ], "contracts": { "ServiceRegistry": { "governanceAccount": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 3cbe99f83..55e32a012 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -2655,6 +2655,12 @@ "tokenSymbol": "AXL", "axelarscanApi": "https://stagenet.api.axelarscan.io", "gasPrice": "0.007uaxl", - "gasLimit": "auto" + "gasLimit": "auto", + "govProposalDepositAmount": "2000000000", + "govProposalInstantiateAddresses": [ + "axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm", + "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky" + ] } } diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 9e9a86fba..e5be518f5 100644 --- a/axelar-chains-config/info/testnet.json +++ b/axelar-chains-config/info/testnet.json @@ -3176,6 +3176,12 @@ "tokenSymbol": "AXL", "axelarscanApi": "https://testnet.api.axelarscan.io", "gasPrice": "0.007uaxl", - "gasLimit": "auto" + "gasLimit": "auto", + "govProposalDepositAmount": "2000000000", + "govProposalInstantiateAddresses": [ + "axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2", + "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7" + ] } } diff --git a/common/utils.js b/common/utils.js index b10dca4cd..dddac851c 100644 --- a/common/utils.js +++ b/common/utils.js @@ -20,6 +20,8 @@ const pascalToSnake = (str) => str.replace(/([A-Z])/g, (group) => `_${group.toLo const pascalToKebab = (str) => str.replace(/([A-Z])/g, (group) => `-${group.toLowerCase()}`).replace(/^-/, ''); +const camelToTitle = (str) => str.replace(/([A-Z])/g, (group) => ` ${group}`).replace(/^./, (firstChar) => firstChar.toUpperCase()); + const VERSION_REGEX = /^\d+\.\d+\.\d+$/; const SHORT_COMMIT_HASH_REGEX = /^[a-f0-9]{7,}$/; @@ -614,6 +616,16 @@ function encodeITSDestination(config, destinationChain, destinationAddress) { } } +const getProposalConfig = (config, env, key) => { + try { + const value = config.axelar?.[key]; + if (value === undefined) throw new Error(`Key "${key}" not found in config for ${env}`); + return value; + } catch (error) { + throw new Error(`Failed to load config value "${key}" for ${env}: ${error.message}`); + } +}; + module.exports = { loadConfig, saveConfig, @@ -656,6 +668,7 @@ module.exports = { downloadContractCode, pascalToKebab, pascalToSnake, + camelToTitle, readContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX, @@ -668,4 +681,5 @@ module.exports = { getCurrentVerifierSet, asciiToBytes, encodeITSDestination, + getProposalConfig, }; diff --git a/cosmwasm/README.md b/cosmwasm/README.md index 540c0a20f..d274fb806 100644 --- a/cosmwasm/README.md +++ b/cosmwasm/README.md @@ -167,7 +167,7 @@ node submit-proposal.js -m -e -t { } if (options.runAs) { - program.addOption( - new Option('-r, --runAs ', 'the address that will execute the message. Defaults to governance address').default( - governanceAddress, - ), - ); + program.addOption(new Option('-r, --runAs ', 'the address that will execute the message. Defaults to governance address')); } }; @@ -131,7 +127,6 @@ const addStoreProposalOptions = (program) => { ); program.addOption( new Option('-i, --instantiateAddresses ', 'comma separated list of addresses allowed to instantiate') - .default([]) .argParser((addresses) => addresses.split(',').map((address) => address.trim())), ); }; @@ -171,9 +166,9 @@ const addMigrateOptions = (program) => { }; const addProposalOptions = (program) => { - program.addOption(new Option('-t, --title ', 'title of proposal').makeOptionMandatory(true)); - program.addOption(new Option('-d, --description <description>', 'description of proposal').makeOptionMandatory(true)); - program.addOption(new Option('--deposit <deposit>', 'the proposal deposit').makeOptionMandatory(true)); + program.addOption(new Option('-t, --title <title>', 'title of proposal')); + program.addOption(new Option('-d, --description <description>', 'description of proposal')); + program.addOption(new Option('--deposit <deposit>', 'the proposal deposit')); }; module.exports = { diff --git a/cosmwasm/submit-proposal.js b/cosmwasm/submit-proposal.js index 2ad4c81a1..024b7c8c5 100644 --- a/cosmwasm/submit-proposal.js +++ b/cosmwasm/submit-proposal.js @@ -16,7 +16,6 @@ const { getAmplifierBaseContractConfig, getAmplifierContractConfig, getCodeId, - addDefaultInstantiateAddresses, getChainTruncationParams, decodeProposalAttributes, encodeStoreCodeProposal, @@ -27,8 +26,9 @@ const { encodeParameterChangeProposal, encodeMigrateContractProposal, submitProposal, + governanceAddress, } = require('./utils'); -const { saveConfig, loadConfig, printInfo, prompt, getChainConfig, itsEdgeContract, readContractCode } = require('../common'); +const { saveConfig, loadConfig, printInfo, printError, prompt, getChainConfig, itsEdgeContract, readContractCode, getProposalConfig, camelToTitle } = require('../common'); const { StoreCodeProposal, StoreAndInstantiateContractProposal, @@ -80,7 +80,6 @@ const callSubmitProposal = async (client, wallet, config, options, proposal) => const storeCode = async (client, wallet, config, options) => { const { contractName } = options; const contractBaseConfig = getAmplifierBaseContractConfig(config, contractName); - await addDefaultInstantiateAddresses(client, config, options); const proposal = encodeStoreCodeProposal(options); @@ -97,7 +96,6 @@ const storeCode = async (client, wallet, config, options) => { const storeInstantiate = async (client, wallet, config, options) => { const { contractName, instantiate2 } = options; const { contractConfig, contractBaseConfig } = getAmplifierContractConfig(config, options); - await addDefaultInstantiateAddresses(client, config, options); if (instantiate2) { throw new Error('instantiate2 not supported for storeInstantiate'); @@ -215,9 +213,36 @@ const migrate = async (client, wallet, config, options) => { await callSubmitProposal(client, wallet, config, options, proposal); }; -const mainProcessor = async (processor, options) => { +function addGovProposalDefaults(options, config, env, commandName) { + const { runAs, deposit, instantiateAddresses, title, contractName, version, description} = options; + + if (!runAs) + options.runAs = env == 'devnet-amplifier'? 'axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9' : governanceAddress; + + if (!deposit) + options.deposit = getProposalConfig(config, env, 'govProposalDepositAmount'); + + if (!instantiateAddresses) + options.instantiateAddresses = getProposalConfig(config, env, 'govProposalInstantiateAddresses'); + + if ((['execute', 'paramChange', 'its-hub-register-chains'].includes(commandName)) && (!title || !description)) { + printError(`Missing options: --title and --description are required with ${commandName} command.`); + process.exit(1); + } + + if (!title) + options.title = `${camelToTitle(commandName)} ${contractName} contract${version ? ` ${version}` : ''}`; + + if (!description) + options.description = options.title; + + return options; +} + +const mainProcessor = async (processor, options, commandName) => { const { env } = options; const config = loadConfig(env); + addGovProposalDefaults(options, config, env, commandName) initContractConfig(config, options); @@ -237,8 +262,8 @@ const programHandler = () => { const storeCmd = program .command('store') .description('Submit a wasm binary proposal') - .action((options) => { - mainProcessor(storeCode, options); + .action((options, cmd) => { + mainProcessor(storeCode, options, cmd.name()); }); addAmplifierOptions(storeCmd, { contractOptions: true, @@ -251,8 +276,8 @@ const programHandler = () => { const storeInstantiateCmd = program .command('storeInstantiate') .description('Submit and instantiate a wasm contract proposal') - .action((options) => { - mainProcessor(storeInstantiate, options); + .action((options, cmd) => { + mainProcessor(storeInstantiate, options, cmd.name()); }); addAmplifierOptions(storeInstantiateCmd, { contractOptions: true, @@ -266,8 +291,8 @@ const programHandler = () => { const instantiateCmd = program .command('instantiate') .description('Submit an instantiate wasm contract proposal') - .action((options) => { - mainProcessor(instantiate, options); + .action((options, cmd) => { + mainProcessor(instantiate, options, cmd.name()); }); addAmplifierOptions(instantiateCmd, { contractOptions: true, @@ -283,8 +308,8 @@ const programHandler = () => { const executeCmd = program .command('execute') .description('Submit an execute wasm contract proposal') - .action((options) => { - mainProcessor(execute, options); + .action((options, cmd) => { + mainProcessor(execute, options, cmd.name()); }); addAmplifierOptions(executeCmd, { contractOptions: true, executeProposalOptions: true, proposalOptions: true, runAs: true }); @@ -292,25 +317,25 @@ const programHandler = () => { .command('its-hub-register-chains') .description('Submit an execute wasm contract proposal to register an InterchainTokenService chain') .argument('<chains...>', 'list of chains to register on InterchainTokenService hub') - .action((chains, options) => { + .action((chains, options, cmd) => { options.chains = chains; - mainProcessor(registerItsChain, options); + mainProcessor(registerItsChain, options, cmd.name()); }); addAmplifierOptions(registerItsChainCmd, { proposalOptions: true, runAs: true }); const paramChangeCmd = program .command('paramChange') .description('Submit a parameter change proposal') - .action((options) => { - mainProcessor(paramChange, options); + .action((options, cmd) => { + mainProcessor(paramChange, options, cmd.name()); }); addAmplifierOptions(paramChangeCmd, { paramChangeProposalOptions: true, proposalOptions: true }); const migrateCmd = program .command('migrate') .description('Submit a migrate contract proposal') - .action((options) => { - mainProcessor(migrate, options); + .action((options, cmd) => { + mainProcessor(migrate, options, cmd.name()); }); addAmplifierOptions(migrateCmd, { contractOptions: true, diff --git a/cosmwasm/utils.js b/cosmwasm/utils.js index a071e43eb..ed4656d4e 100644 --- a/cosmwasm/utils.js +++ b/cosmwasm/utils.js @@ -831,36 +831,6 @@ const fetchCodeIdFromContract = async (client, contractConfig) => { return codeId; }; -const addDefaultInstantiateAddresses = async (client, config, options) => { - const { contractConfig } = getAmplifierContractConfig(config, options); - - if (!contractConfig.address) { - return; - } - - const contract = await client.getContract(contractConfig.address); - - let { instantiateAddresses } = options; - - if (!instantiateAddresses) { - instantiateAddresses = []; - } - - if (contract.admin && !instantiateAddresses.includes(contract.admin)) { - instantiateAddresses.push(contract.admin); - printWarn( - `Contract ${contractConfig.address} admin address ${contract.admin} was not included in instantiateAddresses list. Adding it by default.`, - ); - } - - if (contract.creator && !instantiateAddresses.includes(contract.creator)) { - instantiateAddresses.push(contract.creator); - printWarn( - `Contract ${contractConfig.address} creator address ${contract.creator} was not included in instantiateAddresses list. Adding it by default.`, - ); - } -}; - const getChainTruncationParams = (config, chainConfig) => { const key = chainConfig.axelarId.toLowerCase(); const chainTruncationParams = config.axelar.contracts.InterchainTokenService[key]; @@ -1201,7 +1171,6 @@ module.exports = { migrateContract, fetchCodeIdFromCodeHash, fetchCodeIdFromContract, - addDefaultInstantiateAddresses, getChainTruncationParams, decodeProposalAttributes, encodeStoreCodeProposal, diff --git a/releases/cosmwasm/EVM-CosmWasm-Release-Template.md b/releases/cosmwasm/EVM-CosmWasm-Release-Template.md new file mode 100644 index 000000000..d1ab198bf --- /dev/null +++ b/releases/cosmwasm/EVM-CosmWasm-Release-Template.md @@ -0,0 +1,357 @@ +# < ChainName > GMP Amplifier vX.X.X + +| | **Owner** | +| -------------- | ----------------------------------------- | +| **Created By** | @yourGithubUsername <user@interoplabs.io> | +| **Deployment** | @yourGithubUsername <user@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | -------- | +| **Devnet Amplifier** | - | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Amplifier Releases](https://github.com/axelarnetwork/axelar-amplifier/releases) +- [VotingVerifier vX.X.X](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/voting-verifier-v1.1.0) `add link to Voting Verifier release` +- [Gateway vX.X.X](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/gateway-v1.1.1) `add link to Gateway release` +- [MultisigProver vX.X.X](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/multisig-prover-v1.1.1) `add link to Multisig Prover release` + +## Background + +These are the instructions for deploying Amplifier contracts for `<ChainName>` connection. + +### Pre-requisites + +Predict the [External Gateway](../evm/path-to-GMP-release-doc) address, as `VotingVerifier` deployment requires the `sourceGatewayAddress` which is the External Gateway address. + +| Network | `minimumRotationDelay` | `deploymentType` | `deployer` | +| -------------------- | ---------------------- | ---------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | + +```bash +node evm/deploy-amplifier-gateway.js -m [deploymentType] --minimumRotationDelay [minimumRotationDelay] --predictOnly +``` + +## Deployment + +- Create an `.env` config + +```yaml +MNEMONIC=<cosm wasm deployer key mnemonic> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAIN=<chain name> +``` + +| Network | `deployer address` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2` | + +- Confirm `VotingVerifier`, `Gateway` and `MultisigProver` contracts are already stored in `$ENV.json` + +```bash +VotingVerifier (v1.1.0) -> "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708" +Gateway (v1.1.1) -> "storeCodeProposalCodeHash": "2ba600ee0d162184c9387eaf6fad655f1d75db548f93e379f0565cb2042d856f" +MultisigProver (v1.1.1) -> "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a" +``` + +- Add config in `$ENV.json` to deploy Amplifier contracts. + +| Network | `governanceAddress` | `adminAddress` | +| -------------------- | ----------------------------------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | +| **Mainnet** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + +| Network | `serviceName` | `votingThreshold` | `signingThreshold` | `confirmationHeight` | +| -------------------- | ------------- | ----------------- | ------------------ | -------------------- | +| **Devnet-amplifier** | `validators` | `["6", "10"]` | `["6", "10"]` | `1` | +| **Stagenet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | +| **Testnet** | `amplifier` | `["51", "100"]` | `["51", "100"]` | `1` | +| **Mainnet** | `amplifier` | `["2", "3"]` | `["2", "3"]` | `1` | + +```bash +# Add under `config.axelar.contracts.VotingVerifier` based on Network +"$CHAIN" : { + "governanceAddress": "[governance address]", + "serviceName": "[service name]", + "sourceGatewayAddress": "[external gateway address]", + "votingThreshold": "[voting threshold]", + "blockExpiry": 10, + "confirmationHeight": 1000000, # if $CHAIN uses a custom finality mechanism such as the "finalized" tag, set this value very high (i.e. 1000000) to prevent accidental use + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55" +} + +# Add under `config.axelar.contracts.MultisigProver` based on Network +"$CHAIN" : { + "governanceAddress": "[governance address]", + "adminAddress": "[admin address]", + "signingThreshold": "[signing threshold]", + "serviceName": "[service name]", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa" +} +``` + +### Instantiate Amplifier contracts + +| Network | `CONTRACT_ADMIN` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | +| **Testnet** | `axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | +| **Mainnet** | `axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | + +`CONTRACT_ADMIN` is the wasm contract admin address for contract upgrades. + +1. Instantiate `VotingVerifier` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c VotingVerifier --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +2. Instantiate `Gateway` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c Gateway --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +3. Instantiate `MultisigProver` + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c MultisigProver --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +4. Set environment variables + +- These variables are network-specific + +```bash +VOTING_VERIFIER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.VotingVerifier[\"$CHAIN\"].address" | tr -d '"') +GATEWAY=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.Gateway[\"$CHAIN\"].address" | tr -d '"') +MULTISIG_PROVER=$(cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.MultisigProver[\"$CHAIN\"].address" | tr -d '"') +MULTISIG=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Multisig.address | tr -d '"') +REWARDS=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Rewards.address | tr -d '"') +ROUTER=$(cat ./axelar-chains-config/info/$ENV.json | jq .axelar.contracts.Router.address | tr -d '"') +``` + +- Gov proposal environment variables. Update these for each network + +| Network | `PROVER_ADMIN` | `REWARD_AMOUNT` | +| -------------------- | ----------------------------------------------- | ------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `1000000uamplifier` | +| **Stagenet** | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | `1000000uaxl` | +| **Testnet** | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | `1000000uaxl` | +| **Mainnet** | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | `1000000uaxl` | + +```bash +PROVER_ADMIN=[prover admin who is responsible for the contract's operations] +REWARD_AMOUNT=[reward amount] +EPOCH_DURATION=[epoch duration according to the environment] +``` + +- Add a community post for the mainnet proposal. i.e: https://community.axelar.network/t/proposal-add-its-hub-to-mainnet/3227 + +- Note: all the following governance proposals should be submitted at one time so deployment doesn't get held up while waiting for voting. [ITS proposal](../evm/EVM-ITS-Release-Template.md) should also be submitted at this time if possible. + +5. Register Gateway at the Router + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Router \ + -t "Register Gateway for $CHAIN" \ + -d "Register Gateway address for $CHAIN at Router contract" \ + --msg "{ + \"register_chain\": { + \"chain\": \"$CHAIN\", + \"gateway_address\": \"$GATEWAY\", + \"msg_id_format\": \"hex_tx_hash_and_event_index\" + } + }" +``` + +```bash +axelard q wasm contract-state smart $ROUTER "{\"chain_info\": \"$CHAIN\"}" --output json | jq . +# You should see something like this: +{ + "data": { + "name": \"$CHAIN\", + "gateway": { + "address": "axelar1jah3ac59xke2r266yjhh45tugzsvnlzsefyvx6jgp0msk6tp7vqqaktuz2" + }, + "frozen_status": 0, + "msg_id_format": "hex_tx_hash_and_event_index" + } +} +``` + +6. Register prover contract on coordinator + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Coordinator \ + -t "Register Multisig Prover for $CHAIN" \ + -d "Register Multisig Prover address for $CHAIN at Coordinator contract" \ + --msg "{ + \"register_prover_contract\": { + \"chain_name\": \"$CHAIN\", + \"new_prover_addr\": \"$MULTISIG_PROVER\" + } + }" +``` + +7. Authorize `$CHAIN` Multisig prover on Multisig + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Multisig \ + -t "Authorize Multisig Prover for $CHAIN" \ + -d "Authorize Multisig Prover address for $CHAIN at Multisig contract" \ + --msg "{ + \"authorize_callers\": { + \"contracts\": { + \"$MULTISIG_PROVER\": \"$CHAIN\" + } + } + }" +``` + +```bash +axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"contract_address\": \"$MULTISIG_PROVER\", \"chain_name\": \"$CHAIN\"}}" --output json | jq . +# Result should look like: +{ + "data": true +} +``` + +8. Create reward pool for voting verifier + +#### Rewards + +| Network | `epoch_duration` | `participation_threshold` | `rewards_per_epoch` | +| -------------------- | ---------------- | ------------------------- | ------------------- | +| **Devnet-amplifier** | `100` | `[\"7\", \"10\"]` | `100` | +| **Stagenet** | `600` | `[\"7\", \"10\"]` | `100` | +| **Testnet** | `600` | `[\"7\", \"10\"]` | `100` | +| **Mainnet** | `14845` | `[\"8\", \"10\"]` | `TBD` | + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in $CHAIN voting verifier" \ + -d "Create pool for $CHAIN in $CHAIN voting verifier" \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"$EPOCH_DURATION\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$VOTING_VERIFIER\" + } + } + }" +``` + +9. Create reward pool for multisig + +```bash +node cosmwasm/submit-proposal.js execute \ + -c Rewards \ + -t "Create pool for $CHAIN in axelar multisig" \ + -d "Create pool for $CHAIN in axelar multisig" \ + --msg "{ + \"create_pool\": { + \"params\": { + \"epoch_duration\": \"$EPOCH_DURATION\", + \"participation_threshold\": [participation threshold], + \"rewards_per_epoch\": \"[rewards per epoch]\" + }, + \"pool_id\": { + \"chain_name\": \"$CHAIN\", + \"contract\": \"$MULTISIG\" + } + } + }" +``` + +10. Add funds to reward pools from a wallet containing the reward funds `$REWARD_AMOUNT` + +```bash +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$MULTISIG\" } } }" --amount $REWARD_AMOUNT --from $WALLET + +axelard tx wasm execute $REWARDS "{ \"add_rewards\": { \"pool_id\": { \"chain_name\": \"$CHAIN\", \"contract\": \"$VOTING_VERIFIER\" } } }" --amount $REWARD_AMOUNT --from $WALLET +``` + +Check reward pool to confirm funding worked: + +```bash +node cosmwasm/query.js rewards -n $CHAIN +``` + +11. Update `ampd` with the `$CHAIN` chain configuration. Verifiers should use their own `$CHAIN` RPC node for the `http_url` in production. + +| Network | `http_url` | +| -------------------- | ----------------- | +| **Devnet-amplifier** | [testnet RPC URL] | +| **Stagenet** | [testnet RPC URL] | +| **Testnet** | [testnet RPC URL] | +| **Mainnet** | [mainnet RPC URL] | + +```bash +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmMsgVerifier" + +[[handlers]] +chain_finalization="RPCFinalizedBlock" +chain_name="$CHAIN" +chain_rpc_url=[http url] +cosmwasm_contract="$VOTING_VERIFIER" +type="EvmVerifierSetVerifier" +``` + +12. Update `ampd` with the `$CHAIN` chain configuration. + +```bash +ampd register-chain-support "[service name]" $CHAIN +``` + +13. Create genesis verifier set + +Note that this step can only be run once a sufficient number of verifiers have registered. + +| Network | `min_num_verifiers` | +| -------------------- | ------------------- | +| **Devnet-amplifier** | 3 | +| **Stagenet** | 3 | +| **Testnet** | 21 | +| **Mainnet** | 25 | + +```bash +axelard tx wasm execute $MULTISIG_PROVER '"update_verifier_set"' --from $PROVER_ADMIN --gas auto --gas-adjustment 1.2 +``` + +Query the multisig prover for active verifier set + +```bash +axelard q wasm contract-state smart $MULTISIG_PROVER '"current_verifier_set"' +``` + +## Checklist + +The [GMP checklist for $CHAIN](../evm/path-to-GMP-release-doc) will test GMP calls. diff --git a/releases/evm/EVM-GMP-Release-Template.md b/releases/evm/EVM-GMP-Release-Template.md new file mode 100644 index 000000000..579d4af83 --- /dev/null +++ b/releases/evm/EVM-GMP-Release-Template.md @@ -0,0 +1,242 @@ +# < ChainName > GMP vX.X.X + +| | **Owner** | +| -------------- | ----------------------------------------- | +| **Created By** | @yourGithubUsername <user@interoplabs.io> | +| **Deployment** | @yourGithubUsername <user@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | -------- | +| **Devnet Amplifier** | - | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Releases] add link to Github release here + +## Background + +Describe release content here + +## Deployment + +Create an `.env` config. Local environment variable `CHAIN` should be set to `<chain name>`. + +```yaml +PRIVATE_KEY=<deployer private key> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAINS=<chain name> +``` + +An initial chain config needs to be added to `${ENV}.json` file under `CHAIN` key. + +Update npm dependencies (including contracts) + +```bash +npm ci +``` + +#### Devnet-Amplifier / Stagenet / Testnet + +```bash +"$CHAIN": { + "name": "<chain name>", + "axelarId": "$CHAIN", + "chainId": <chain id>, + "rpc": "<RPC URL>", + "tokenSymbol": "<token symbol>", + "confirmations": <confirmations>, + "finality": "finalized", # if no custom finality mechanism, use "confirmationHeight" + "decimals": <decimals>, + "approxFinalityWaitTime": <finality wait time>, + "chainType": "evm", + "explorer": { + "name": "<explorer name>", + "url": "<explorer URL>", + "api": "<explorer API (optional)>" + }, + "contracts": {} + } +``` + +#### Mainnet + +```bash +"$CHAIN": { + "name": "<chain name", + "axelarId": "$CHAIN", + "chainId": <chain id>, + "rpc": "<RPC URL>", + "tokenSymbol": "<token symbol>", + "confirmations": <confirmations>, + "finality": "finalized", # if no custom finality mechanism, use "confirmationHeight" + "decimals": <decimals>, + "approxFinalityWaitTime": <finality wait time>, + "chainType": "evm", + "explorer": { + "name": "<explorer name>", + "url": "<explorer URL>", + "api": "<explorer API (optional)>" + }, + "contracts": {} + } +``` + +1. Fund the following addresses with native tokens on chain: + +| Network | Addresses | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Mainnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | + +2. Deploy `ConstAddrDeployer`: + +- `stagenet` and `testnet` use the same contract address, so we only deploy on `testnet`. + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Testnet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | +| **Mainnet** | `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | + +```bash +node evm/deploy-contract.js -c ConstAddressDeployer -m create --artifactPath ../evm/legacy/ConstAddressDeployer.json +``` + +3. Deploy `Create3Deployer`: + +- `stagenet` and `testnet` use the same contract address, so we only deploy on `testnet`. + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Testnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +```bash +node evm/deploy-contract.js -c Create3Deployer -m create2 +``` + +4. Waste nonce, this step should only be performed on `stagenet`, `testnet` and `mainnet`. To generate the same `AmplifierGateway` address as older EVM chains we need to waste 2 nonce on the deployer key. + +```bash +node evm/send-tokens.js -r 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --amount 0.0001 # burn nonce 0 +node evm/send-tokens.js -r 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --amount 0.0001 # burn nonce 1 +``` + +Note that since we only get one chance with the official deployer key nonce, the entire deployment flow should be run from a test account first. + +5. Deploy Gateway contract + +| Network | `minimumRotationDelay` | `deploymentType` | `deployer` | +| -------------------- | ---------------------- | ---------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0` | `create3` | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `300` | `create` | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `3600` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `86400` | `create` | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | + +```bash +node evm/deploy-amplifier-gateway.js -m [deploymentType] --minimumRotationDelay [minimumRotationDelay] +``` + +6. Deploy `Operators` + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +```bash +node evm/deploy-contract.js -c Operators -m create2 +``` + +7. After deploying the Operators contract, register the following operators according to their environment + +| Network | `operators` | +| -------------------- | ------------------------------------------------------------------------------------------ | +| **Devnet-amplifier** | `<your operator address>` | +| **Stagenet** | `0x7054acf1b2d01e33b86235458edf0046cc354293`, `0xf669ed1ebc608c48f58b6e290df566ede7fb1103` | +| **Testnet** | `0x8f23e84c49624a22e8c252684129910509ade4e2`, `0x3b401fa00191acb03c24ebb7754fe35d34dd1abd` | +| **Mainnet** | `0x0CDeE446bD3c2E0D11568eeDB859Aa7112BE657a`, `0x1a07a2Ee043Dd3922448CD53D20Aae88a67e486E` | + +```bash +node evm/operators.js --action addOperator --args $OPERATOR_ADDRESS +``` + +8. Deploy GasService (set the `AxelarGasService.collector` to `Operators` contract address in config, which you will receive at step 6) + +| Network | `deployer address` | `deployMethod` | +| -------------------- | -------------------------------------------- | -------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | `create2` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | `create2` | +| **Testnet** | `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85` | `create` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | `create2` | + +```bash +node evm/deploy-upgradable.js -c AxelarGasService -m [deployMethod] --args '{"collector": "$OPERATOR_ADDRESS"}' +``` + +8. Transfer ownership for Gateway, Operators and Gas Service contracts on `mainnet` and `testnet` + +```bash +# Only for mainnet and official testnet connection +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + +## Checklist + +The following checks should be performed after the rollout + +### EVM -> EVM GMP call with CHAIN as source + +1. Send a GMP call + +```bash +node evm/gateway.js -n $CHAIN --action callContract --destinationChain [destination-chain] --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +node evm/gateway.js -n [destination-chain] --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n [destination-chain] --action isContractCallApproved --commandID [command-id] --sourceChain $CHAIN --sourceAddress 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payloadHash [payload-hash] +``` + +### EVM -> CHAIN GMP call with CHAIN as destination + +1. Send a GMP call + +```bash +node evm/gateway.js -n [destination-chain] --action callContract --destinationChain $CHAIN --destination 0xba76c6980428A0b10CFC5d8ccb61949677A61233 --payload 0x1234 +``` + +2. Route GMP call via Amplifier + +- https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages + +3. Submit proof with multisig session id + +```bash +node evm/gateway.js -n $CHAIN --action submitProof --multisigSessionId [multisig session id] +``` + +4. Confirm whether the message is approved + +```bash +node evm/gateway.js -n $CHAIN --action isContractCallApproved --commandID [command-id] --sourceChain [destination-chain] --sourceAddress [source-address] --destination [destination-address] --payloadHash [payload-hash] +``` diff --git a/releases/evm/EVM-ITS-Release-Template.md b/releases/evm/EVM-ITS-Release-Template.md new file mode 100644 index 000000000..7a9839054 --- /dev/null +++ b/releases/evm/EVM-ITS-Release-Template.md @@ -0,0 +1,102 @@ +# < ChainName > GMP vX.X.X + +| | **Owner** | +| -------------- | ----------------------------------------- | +| **Created By** | @yourGithubUsername <user@interoplabs.io> | +| **Deployment** | @yourGithubUsername <user@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | -------- | +| **Devnet Amplifier** | - | TBD | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Releases] add link to Github release here + +## Background + +Describe release content here + +## Deployment + +Ensure that [<Chain's GMP>](../evm/path-to-GMP-release-doc) is deployed first. + +```bash +# Clone latest main and update deps +npm ci +``` + +Create an `.env` config + +```yaml +PRIVATE_KEY=<deployer private key> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAIN=<chain name> +``` + +| Network | `deployer address` | +| -------------------- | -------------------------------------------- | +| **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | +| **Testnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | +| **Mainnet** | `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05` | + +### Devnet Amplifier + +```bash +node evm/deploy-its.js -s "v2.1.0 devnet-amplifier" -m create2 --proxySalt 'v1.0.0 devnet-amplifier' +``` + +### Stagenet / Testnet / Mainnet + +```bash +node evm/deploy-its.js -s "v2.1.0" -m create2 --proxySalt 'v1.0.0' +``` + +### Verify Upgraded ITS Contracts + +Please follow this [instruction](https://github.com/axelarnetwork/axelar-contract-deployments/tree/main/evm#contract-verification) to verify ITS contracts on EVM chains. + +## Register <ChainName> ITS on ITS Hub + +```bash +node cosmwasm/submit-proposal.js \ + its-hub-register-chains $CHAIN \ + -t "Register $CHAIN on ITS Hub" \ + -d "Register $CHAIN on ITS Hub" +``` + +## Set <ChainName> as trusted chain on remote ITS contracts + +Set `<ChainName>` as trusted chain on remote ITS contracts for EVM and non-EVM chains. + +```bash +node evm/its.js set-trusted-chains $CHAIN hub -n all +``` + +## Checklist + +The following checks should be performed after the rollout. + +- Run post-deployment checks. + +```bash +node evm/its.js checks -n $CHAIN -y +``` + +- Run the following for two EVM chains (one Amplifier, one consensus, with different decimals for each token) + +```bash +# Create a token on chain. Substitute the `minter-address` below with the deployer key +node evm/interchainTokenFactory.js --action deployInterchainToken --minter [minter-address] --name "test" --symbol "TST" --decimals 6 --initialSupply 10000 --salt "salt1234" -n $CHAIN + +# Deploy token to a remote chain + node evm/interchainTokenFactory.js --action deployRemoteInterchainToken --destinationChain [destination-chain] --salt "salt1234" --gasValue 1000000000000000000 -y -n $CHAIN + +# Transfer token to remote chain +node evm/its.js interchain-transfer [destination-chain] [tokenId] [recipient] 1 --gasValue 1000000000000000000 -n $CHAIN + +# Transfer token back from remote chain +node evm/its.js interchain-transfer $CHAIN [tokenId] [destination-address] 1 --gasValue 1000000000000000000 -n [destination-chain] +``` From 79451fcff3948402b50f421e376db66cc6207787 Mon Sep 17 00:00:00 2001 From: Blockchain Guy <ayusht11@outlook.com> Date: Mon, 19 May 2025 18:27:19 +0530 Subject: [PATCH 70/71] feat: add pre-commit for private RPC & EOL check (#746) --- .husky/pre-commit | 2 + .husky/scripts/detect-private-rpc.sh | 58 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100755 .husky/scripts/detect-private-rpc.sh diff --git a/.husky/pre-commit b/.husky/pre-commit index 5c21d7f51..6f0d4c589 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -2,3 +2,5 @@ echo "Running 'npm run build' pre-commit..." npm run build + +bash ./.husky/scripts/detect-private-rpc.sh diff --git a/.husky/scripts/detect-private-rpc.sh b/.husky/scripts/detect-private-rpc.sh new file mode 100755 index 000000000..e00b5158b --- /dev/null +++ b/.husky/scripts/detect-private-rpc.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +SENSITIVE_RPC_PATTERNS=( + 'https:\/\/[a-z0-9-]+\.quiknode\.pro\/[a-f0-9]{32,}' + 'https:\/\/blastapi\.io\/dashboard\/project\/[a-f0-9\-]{36}' + 'https:\/\/[a-z0-9-]+\.infura\.io\/v3\/[a-f0-9]{32}' + 'https:\/\/\d+\.rpc\.thirdweb\.com\/[a-f0-9]{32}' + 'https:\/\/[^ ]*\/[a-f0-9]{32,}\/?' + 'https:\/\/[^ ]*\?(.*key|token|auth)=.+' + 'https:\/\/[^ ]+:[^ @]+@[^ ]+' +) + +FOUND=0 + +# Get list of staged files that are Added, Copied, or Modified +FILES=$(git diff --cached --name-only --diff-filter=ACM) + +for file in $FILES; do + # --- EOL Check --- + if [ -f "$file" ]; then + last_byte=$(tail -c 1 "$file" | od -An -t u1 | tr -d ' ') + if [ "$last_byte" != "10" ]; then + echo "File '$file' does not end with a newline (EOL)." + FOUND=1 + fi + fi + + # -- Private RPC Check -- + while IFS= read -r line; do + # Skip empty lines or lines starting with '+' + if [[ -z "$line" || "$line" =~ ^\+[^+] ]]; then + # Extract the actual content (remove leading '+') + line_content=$(echo "$line" | sed 's/^+//') + # Skip bypassable lines + if echo "$line_content" | grep -q 'skip-check'; then + continue + fi + + for pattern in "${SENSITIVE_RPC_PATTERNS[@]}"; do + if echo "$line_content" | grep -E -i "$pattern" > /dev/null; then + echo "Sensitive pattern detected: $pattern" + echo "File: $file" + echo "Line: $line_content" + echo "Add '# skip-check' if intentional" + echo "" + FOUND=1 + fi + done + fi + done < <(git diff --cached --unified=0 "$file" | grep '^+[^+]') +done + +if [[ "$FOUND" -eq 1 ]]; then + echo "Commit blocked." + exit 1 +fi + +exit 0 From 840e0233c1b80b0c4f32a3b89ccbd85a8a865cc7 Mon Sep 17 00:00:00 2001 From: k4m4 <nikolaskam@gmail.com> Date: Thu, 27 Mar 2025 13:30:17 +0200 Subject: [PATCH 71/71] feat: add xrpl to stagenet config --- axelar-chains-config/info/stagenet.json | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 55e32a012..6062122f4 100644 --- a/axelar-chains-config/info/stagenet.json +++ b/axelar-chains-config/info/stagenet.json @@ -1911,6 +1911,54 @@ "finality": "1", "approxFinalityWaitTime": 1 }, + "xrpl": { + "name": "XRPL", + "axelarId": "xrpl", + "rpc": "https://s.altnet.rippletest.net:51234", + "wssRpc": "wss://s.altnet.rippletest.net:51233", + "tokenSymbol": "XRP", + "decimals": 6, + "networkType": "testnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://testnet.xrpl.org" + }, + "contracts": { + "InterchainTokenService": { + "address": "rpjRVZbKbb5UmSEcgp6C6U4GzQQF4mEpbR", + "initialSigner": "r4sGKptWj2nEjgYUh2pccVrPmfzZvNfANu", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ] + }, + "AxelarGateway": { + "address": "rpjRVZbKbb5UmSEcgp6C6U4GzQQF4mEpbR", + "initialSigner": "r4sGKptWj2nEjgYUh2pccVrPmfzZvNfANu", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ] + } + } + }, "xrpl-evm": { "name": "XRPL EVM", "axelarId": "xrpl-evm",