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/actions/setup-stellar/action.yaml b/.github/actions/setup-stellar/action.yaml new file mode 100644 index 000000000..cb04ee560 --- /dev/null +++ b/.github/actions/setup-stellar/action.yaml @@ -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/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 new file mode 100644 index 000000000..1d6384810 --- /dev/null +++ b/.github/workflows/test-stellar.yaml @@ -0,0 +1,234 @@ +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: Build + run: npm run build + + - name: Setup Stellar network + uses: ./.github/actions/setup-stellar + + ###### 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 }} + + - 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 }} + + - 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 '[]' + 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/.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/.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..6f0d4c589 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + +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 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.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 new file mode 100644 index 000000000..3e34f683d --- /dev/null +++ b/.prettierrc.ts @@ -0,0 +1,50 @@ +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'], + 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 8d3ac6670..2b1c58727 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,35 @@ Install dependencies via `npm ci` +Build the project via +`npm run build` + ## Deployment Instructions - [EVM](./evm/README.md) - [Cosmwasm](./cosmwasm/README.md) - [Sui](./sui/README.md) - [Stellar](./stellar/README.md) +- [XRPL](./xrpl/README.md) + +## Javascript -> Typescript Migration + +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` +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/info/devnet-amplifier.json b/axelar-chains-config/info/devnet-amplifier.json index 152fb2969..0eb30bb4a 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": { @@ -537,6 +543,7 @@ "chainId": 545, "rpc": "https://testnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -629,11 +636,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", @@ -643,7 +650,8 @@ "AxelarGateway": { "address": "CDWXQAUFE26XOYFWW2M3RSZPBOXHWCGLUTR5NZTFEGOV6YZQJPVARUKX", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", + "version": "1.1.1", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", "operator": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", @@ -662,12 +670,14 @@ "threshold": "1" } ] - } + }, + "connectionType": "amplifier" }, "AxelarOperators": { "address": "CDOWLXRHI3JVLTDXUZK4AA5RYT4MO53KGGHWRVTMLI6C74HJPAG5W7WO", "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", - "wasmHash": "82acfafba05ef400104d172664e8d30dbadca6e21e97fa9ae2e1c06c9148be1d", + "wasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2", + "version": "1.1.1", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q" } @@ -675,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", @@ -692,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": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", + "version": "1.2.0", "initializeArgs": { "owner": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", "operator": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", @@ -712,6 +726,13 @@ "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" } + }, + "Multicall": { + "address": "CC2OSV5HNXFQIG6QQ6LK5L2NYXO62H4DQ3MVXXBLEXJ36KSN6Y4S7ODD", + "deployer": "GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} } } }, @@ -719,11 +740,11 @@ "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", "finality": "1", - "decimals": 9, "approxFinalityWaitTime": 1, "contracts": { "Utils": { @@ -788,7 +809,8 @@ }, "domainSeparator": "0xa5ea3e93481643015f6273d6938484afb463de5c25f980ec72b63d56ebd55d55", "operator": "0x1471a8acf730a05a7d720e52c7ef94024c7351502c83b80da5583db2f6b0b8df", - "minimumRotationDelay": 0 + "minimumRotationDelay": 0, + "connectionType": "amplifier" }, "RelayerDiscovery": { "address": "0x6f8472f2d4e5d6bebc620403946ad49f7ce81fe0191902640932100118cd62f9", @@ -942,6 +964,300 @@ "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", + "decimals": 6, + "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 + ], + "connectionType": "amplifier" + }, + "InterchainTokenService": { + "address": "rGAbJZEzU6WaYv5y1LfyN7LBBcQJ3TxsKC", + "initialSigner": "rpqRL9c13HYuCLefSrqkqHPPV4FgxTazQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14 + ] + } + } + }, + "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" + } + } + }, + "monad": { + "name": "Monad", + "axelarId": "monad", + "chainId": 10143, + "rpc": "https://testnet-rpc.monad.xyz", + "tokenSymbol": "MON", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "MonVision", + "url": "https://testnet.monadexplorer.com" + }, + "contracts": { + "ConstAddressDeployer": { + "address": "0x27a3daf3b243104E9b0afAe6b56026a416B852C9", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "deploymentMethod": "create", + "codehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe", + "predeployCodehash": "0x8fda47a596dfba923270da84e0c32a2d0312f1c03389f83e16f2b5a35ed37fbe" + }, + "Create3Deployer": { + "address": "0x066b0D7E70D94686cB8576A2ec459cE609ca5364", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "deploymentMethod": "create2", + "codehash": "0xf0ad66defbe082df243d4d274e626f557f97579c5c9e19f33d8093d6160808b7", + "predeployCodehash": "0x73fc31262c4bad113c79439fd231281201c7c7d45b50328bd86bccf37684bf92", + "salt": "Create3Deployer" + }, + "AxelarGateway": { + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "operator": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "proxyDeploymentArgs": [ + "0x6b8bb608432cDc5bCA05ECCA89fd33EbfE437Fd9", + "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "0x000000000000000000000000ba76c6980428a0b10cfc5d8ccb61949677a612330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000006ce33e000000000000000000000000000000000000000000000000000000000000000500000000000000000000000040e0122633f2f81ab18854eff39d954a26793060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000051380cbf0777990e197a3e498ffafd26143e35f8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000061373485594010371dfbf3a8f8bd1736bfda7c0900000000000000000000000000000000000000000000000000000000000000010000000000000000000000009b027e69b79099feb3dd1478c574dc986671bea10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c70aa87b38e6ab3c0df6e56338f96a5c00e653080000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "11ee4fb8ce164424f754f184ccc0821d5f41486fcd99bf3ca6782e9295dd7529", + "address": "0xA0c562047BcD4007ED3c38556c1C29429daC15F4", + "implementation": "0x6b8bb608432cDc5bCA05ECCA89fd33EbfE437Fd9", + "implementationCodehash": "0x9ee0e14ade4a07f0267af22e9fe810aad687651ca0a2462399fd79f9c77c7735", + "deploymentMethod": "create3", + "previousSignersRetention": 15, + "domainSeparator": "0xd9d7fdc2c95115b28769eb237330c7eefa879ebab0fab16e19064bd71e109f60", + "minimumRotationDelay": 0, + "connectionType": "amplifier", + "owner": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "salt": "AxelarAmplifierGateway" + }, + "Operators": { + "owner": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "address": "0xcBA75dd553f70E9Ca0c49415a31F2214fb9090F3", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "AxelarGasService": { + "collector": "0xcBA75dd553f70E9Ca0c49415a31F2214fb9090F3", + "salt": "AxelarGasService", + "address": "0x3bd1a26205022d270469ED5596f07855761126E7", + "implementation": "0x650D4c0C64A5dbe57b65C51A25dd06B5186A2015", + "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233" + } + } + }, + "berachain": { + "name": "Berachain", + "axelarId": "berachain", + "chainId": 80069, + "rpc": "https://bepolia.rpc.berachain.com", + "tokenSymbol": "BERA", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Berascan", + "url": "https://testnet.berascan.com/", + "api": "https://api-testnet.berascan.com/api" + }, + "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", + "0x000000000000000000000000ba76c6980428a0b10cfc5d8ccb61949677a612330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000006c64bd000000000000000000000000000000000000000000000000000000000000000400000000000000000000000040e0122633f2f81ab18854eff39d954a26793060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000061373485594010371dfbf3a8f8bd1736bfda7c0900000000000000000000000000000000000000000000000000000000000000010000000000000000000000009b027e69b79099feb3dd1478c574dc986671bea10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c70aa87b38e6ab3c0df6e56338f96a5c00e653080000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "960d44b570cafd896edd6a19e799e9e3b68f8e7a8721fabb7fa8c01aefd713b5", + "address": "0xA7938970ebF2E35E2789dc8C3019754c2ed762A8", + "implementation": "0x75c216B93337e23c8b1DD4F4fB818CA48511Aa2B", + "implementationCodehash": "0x1f9ac5309f45cf25738851a1326ba3cec4cb1084dfd658338688bdefb6899578", + "deploymentMethod": "create3", + "previousSignersRetention": 15, + "domainSeparator": "0xde451736aa7e61c58baa7e02a0531c535a0dd8d3b5a04973d99336f34efad68b", + "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": "0x514cBF3e6CC9d6B58EeDf9c10d4eC48dD15F2fb8", + "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": { @@ -971,12 +1287,12 @@ "Multisig": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", "blockExpiry": 10, - "codeId": 851, - "lastUploadedCodeId": 851, + "codeId": 1302, + "lastUploadedCodeId": 1302, "address": "axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r", "executeProposalId": "55", - "storeCodeProposalId": "72", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e" + "storeCodeProposalId": "580", + "storeCodeProposalCodeHash": "cd6109a37eab844941ea09266e54bf3fdb18bfb55e02a0ed91aa5a8d47aea2ec" }, "Coordinator": { "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", @@ -1129,6 +1445,51 @@ "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" + }, + "monad": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "serviceName": "validators", + "sourceGatewayAddress": "0xA0c562047BcD4007ED3c38556c1C29429daC15F4", + "votingThreshold": [ + "6", + "10" + ], + "blockExpiry": 10, + "confirmationHeight": 1000000, + "msgIdFormat": "hex_tx_hash_and_event_index", + "addressFormat": "eip55", + "codeId": 854, + "address": "axelar1yrenh2gnkgrv23mlpxke2gce6rhfsqhyzzlsgqxrla7x565md2yq7lsjet" + }, + "berachain": { + "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": "axelar1uypvvkd820cs4t6y47hqszawegwyrxaxr9ehpla74e98g0rezr5sw9lj4z" + }, "storeCodeProposalId": "78", "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708" }, @@ -1159,6 +1520,33 @@ "stellar-2025-q1": { "codeId": 848, "address": "axelar1tatg2n9gsq6vkkafm6pv8hsunr236wgdk4gdc7lw0hs2e3cnspmsw75rld" + }, + "plume-2": { + "codeId": 848, + "address": "axelar1unafus3vpt7nawfzdjf7u26g2rl855lpkqussxmtl5r2njaz39mqrmyv7g" + }, + "monad": { + "codeId": 848, + "address": "axelar18xawfj42lhkvca2j79wlumenr9yujnzece9p7upcrywn7f5cewcslnap46" + }, + "berachain": { + "codeId": 848, + "address": "axelar129htsgeyygnc6mlhxxjsdrtu2yj8wam83ur6mcdlvdttvk3zlecqwdjnl0" + } + }, + "XrplMultisigProver": { + "xrpl-dev": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "adminAddress": "axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs", + "signingThreshold": [ + "2", + "3" + ], + "serviceName": "validators", + "verifierSetDiffThreshold": 1, + "address": "axelar1ys83sedjffmqh70aksejmx3fy3q2d7twm3msurk7wn3l6nkwxp0sfelzhl", + "xrplTransactionFee": 300, + "ticketCountThreshold": 5 } }, "MultisigProver": { @@ -1257,8 +1645,73 @@ "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" + }, + "monad": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "adminAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "signingThreshold": [ + "6", + "10" + ], + "serviceName": "validators", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa", + "codeId": 855, + "domainSeparator": "0xd9d7fdc2c95115b28769eb237330c7eefa879ebab0fab16e19064bd71e109f60", + "address": "axelar1drccpywtcuf7hm7xyper9ktlpmtjlq37v5ps8ax59lel4csv0xdq3gyaaj" + }, + "berachain": { + "governanceAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "adminAddress": "axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9", + "signingThreshold": [ + "6", + "10" + ], + "serviceName": "validators", + "verifierSetDiffThreshold": 0, + "encoder": "abi", + "keyType": "ecdsa", + "codeId": 855, + "domainSeparator": "0xde451736aa7e61c58baa7e02a0531c535a0dd8d3b5a04973d99336f34efad68b", + "address": "axelar1xdg6lezehttusu8zfr5jnshn7d3k2jjzlmr43m6ssmxd048zjv6s4h5unj" + }, "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", @@ -1268,6 +1721,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 3c03d0e7f..dea74f32f 100644 --- a/axelar-chains-config/info/mainnet.json +++ b/axelar-chains-config/info/mainnet.json @@ -1,11 +1,139 @@ { "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", "chainId": 1, "rpc": "https://mainnet.infura.io/v3/a4812158fbab4a2aaa849e6f4a6dc605", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -147,6 +275,7 @@ "chainId": 43114, "rpc": "https://api.avax.network/ext/bc/C/rpc", "tokenSymbol": "AVAX", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -269,8 +398,9 @@ "name": "Fantom", "axelarId": "Fantom", "chainId": 250, - "rpc": "https://rpc.ftm.tools", + "rpc": "https://fantom-mainnet.public.blastapi.io", "tokenSymbol": "FTM", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -399,6 +529,7 @@ "chainId": 137, "rpc": "https://polygon-rpc.com", "tokenSymbol": "MATIC", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -526,6 +657,7 @@ "chainId": 1284, "rpc": "https://rpc.api.moonbeam.network", "tokenSymbol": "GLMR", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -648,8 +780,9 @@ "name": "Binance", "axelarId": "binance", "chainId": 56, - "rpc": "https://bscrpc.com", + "rpc": "https://bsc-mainnet.public.blastapi.io", "tokenSymbol": "BNB", + "decimals": 18, "wrappedSymbol": "WBNB", "chainType": "evm", "contracts": { @@ -789,6 +922,7 @@ "chainId": 42161, "rpc": "https://arb1.arbitrum.io/rpc", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -912,138 +1046,13 @@ "finality": "finalized", "approxFinalityWaitTime": 25 }, - "celo": { - "name": "Celo", - "axelarId": "celo", - "chainId": 42220, - "rpc": "https://forno.celo.org", - "tokenSymbol": "CELO", - "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", "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": { @@ -2496,12 +2516,12 @@ "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", "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", @@ -2730,7 +2751,7 @@ "AxelarGateway": { "address": "CD6VSKXB4HY2DWU7EP2PUIYTBJBJ36LDJXEZN4NSXFYF5YP37DDFX6NF", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", "initializeArgs": { "owner": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", "operator": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", @@ -2749,35 +2770,41 @@ "threshold": "1" } ] - } + }, + "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", @@ -2787,7 +2814,7 @@ "InterchainTokenService": { "address": "CBDBMIOFHGWUFRYH3D3STI2DHBOWGDDBCRKQEUB4RGQEBVG74SEED6C6", "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", - "wasmHash": "7ebdf38b7df81ad0deaae0d09b3123b6f1617ffae9618382c5d11acb7b991191", + "wasmHash": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", "initializeArgs": { "owner": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", "operator": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", @@ -2798,7 +2825,15 @@ "nativeTokenAddress": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" - } + }, + "version": "1.2.0" + }, + "Multicall": { + "address": "CC5LVKQA73ZVVUBAOCV5INV4TXPMELBFJ6XTQUBJTP4O2LSUKAA7VHLZ", + "deployer": "GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "initializeArgs": {} } }, "approxFinalityWaitTime": 1, @@ -2806,6 +2841,132 @@ "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" + } + } + }, + "xrpl": { + "name": "XRPL", + "axelarId": "xrpl", + "rpc": "https://s1.ripple.com:51234", + "wssRpc": "wss://s1.ripple.com", + "tokenSymbol": "XRP", + "decimals": 6, + "networkType": "mainnet", + "chainType": "xrpl", + "finality": "1", + "approxFinalityWaitTime": 1, + "explorer": { + "name": "XRPL Explorer", + "url": "https://livenet.xrpl.org" + }, + "contracts": { + "InterchainTokenService": { + "address": "rfmS3zqrQrka8wVyhXifEeyTwe8AMz2Yhw" + }, + "AxelarGateway": { + "address": "rfmS3zqrQrka8wVyhXifEeyTwe8AMz2Yhw", + "connectionType": "amplifier", + "initialSigner": "rJJAmTa5f9rNmBtvUMmFKn2KoX2o8QhiQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ] + } + } } }, "axelar": { @@ -2818,6 +2979,12 @@ "axelarscanApi": "https://api.axelarscan.io", "gasPrice": "0.007uaxl", "gasLimit": "auto", + "govProposalDepositAmount": "2000000000", + "govProposalInstantiateAddresses": [ + "axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2", + "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am" + ], "contracts": { "ServiceRegistry": { "governanceAccount": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", @@ -2873,11 +3040,12 @@ "adminAddress": "axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "261", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e", - "codeId": 14, + "storeCodeProposalId": "322", + "storeCodeProposalCodeHash": "cd6109a37eab844941ea09266e54bf3fdb18bfb55e02a0ed91aa5a8d47aea2ec", + "codeId": 33, "address": "axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5", - "executeProposalId": "244" + "executeProposalId": "244", + "lastUploadedCodeId": 33 }, "MultisigProver": { "flow": { @@ -2924,6 +3092,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, @@ -2944,6 +3127,10 @@ "stellar": { "codeId": 17, "address": "axelar1t46envzujl4kmhst6myg364v00f8jcyjespw6tr00r3ycd0pehxqetqrpm" + }, + "xrpl-evm": { + "codeId": 17, + "address": "axelar1vvdukrmxdylvnn8e59s3gnn49lutv3n9tg4vnsttn33a8zulgfssl62q69" } }, "VotingVerifier": { @@ -2991,22 +3178,41 @@ "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, "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, "maxDecimalsWhenTruncating": 255 + }, + "xrpl": { + "maxUintBits": 256, + "maxDecimalsWhenTruncating": 255 } }, "AxelarnetGateway": { @@ -3017,6 +3223,54 @@ "codeId": 22, "address": "axelar18vsne7lns36uvm8gv2cv5jl2lghts0xm7dvzpqzn70dl56gk9hvsgu9sqg" } + }, + "XrplVotingVerifier": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj", + "serviceName": "amplifier", + "votingThreshold": [ + "2", + "3" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "address": "axelar14rd4uyrqyl0tw75gjn8zqfppmy08t3x3wrsujeqp37l0hghduanscfvkz6", + "codeId": 34 + }, + "storeCodeProposalId": "323", + "storeCodeProposalCodeHash": "7055d307103d5bcbed4c9465f40084acdb0f154a8dda0d8c0ee68f865892874a", + "lastUploadedCodeId": 34 + }, + "XrplGateway": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj", + "address": "axelar15dsw0qqnvumnsukjtwt040wnelwrglgslqcqsa7d62f2neuv7slq7rq7zd", + "codeId": 35 + }, + "storeCodeProposalId": "324", + "storeCodeProposalCodeHash": "9c626d4ab34d3e8cd7426b72ad476b8adce05bed3274ca1b35523e66bbcf7688", + "lastUploadedCodeId": 35 + }, + "XrplMultisigProver": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj", + "signingThreshold": [ + "2", + "3" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 0, + "xrplTransactionFee": 5000, + "ticketCountThreshold": 50, + "address": "axelar15mhhuf887t6nfx2t0vuc6kx9w2uk65h939awmz6n7r6ggzyf659st25hff", + "codeId": 36 + }, + "storeCodeProposalId": "325", + "storeCodeProposalCodeHash": "bee1192a8ae1d8928127bbb23e259cfadf817b930c5176cf83f7985240a7254a", + "lastUploadedCodeId": 36 } } } diff --git a/axelar-chains-config/info/stagenet.json b/axelar-chains-config/info/stagenet.json index 43170a4f0..d4047c505 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": { @@ -593,6 +599,7 @@ "chainId": 421614, "rpc": "https://sepolia-rollup.arbitrum.io/rpc", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -696,6 +703,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 +745,7 @@ "chainId": 59141, "rpc": "https://rpc.sepolia.linea.build", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -845,6 +854,7 @@ "chainId": 80002, "rpc": "https://rpc-amoy.polygon.technology", "tokenSymbol": "MATIC", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -953,6 +963,7 @@ "chainId": 84532, "rpc": "https://sepolia.base.org", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1065,6 +1076,7 @@ "chainId": 168587773, "rpc": "https://sepolia.blast.io/", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1177,6 +1189,7 @@ "chainId": 2522, "rpc": "https://rpc.testnet.frax.com", "tokenSymbol": "frxETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1288,6 +1301,7 @@ "chainId": 5003, "rpc": "https://rpc.sepolia.mantle.xyz", "tokenSymbol": "MNT", + "decimals": 18, "chainType": "evm", "confirmations": 2, "explorer": { @@ -1396,6 +1410,7 @@ "chainId": 11155420, "rpc": "https://sepolia.optimism.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1508,6 +1523,7 @@ "chainId": 545, "rpc": "https://testnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1602,6 +1618,7 @@ "chainId": 296, "rpc": "https://testnet.hashio.io/api", "tokenSymbol": "HBAR", + "decimals": 8, "confirmations": 1, "finality": "finalized", "approxFinalityWaitTime": 1, @@ -1674,10 +1691,10 @@ "name": "Sui", "axelarId": "sui", "networkType": "testnet", - "rpc": "https://sui-testnet-rpc.publicnode.com:443", + "rpc": "https://sui-testnet-rpc.publicnode.com", "tokenSymbol": "SUI", - "chainType": "sui", "decimals": 9, + "chainType": "sui", "explorer": { "name": "Suiscan", "url": "https://suiscan.xyz/testnet" @@ -1721,7 +1738,8 @@ }, "domainSeparator": "0x254a1ae90417f8649798698e95a1140808a701c38c8f5723a930b9d0666e54b4", "operator": "0x8e3d8f44a89f6bf3573ee0d559722bef0f46c215153caca12322e1ed93046c1f", - "minimumRotationDelay": 0 + "minimumRotationDelay": 0, + "connectionType": "amplifier" }, "Utils": { "address": "0xaa789bbc9d03a48d29e950ecbc9bc78918e1696e4a76adf7230416f0f49e4838", @@ -1893,15 +1911,64 @@ "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 + ], + "connectionType": "amplifier" + } + } + }, "xrpl-evm": { "name": "XRPL EVM", "axelarId": "xrpl-evm", "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 +2056,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", @@ -2002,7 +2069,8 @@ "AxelarGateway": { "address": "CDERZ3XLJKWZR2NFUNFO5LS7TBDFRHHLMTE2JTE6C7VXGZMGF6DEGXFC", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", + "version": "1.1.1", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2021,12 +2089,14 @@ "threshold": "1" } ] - } + }, + "connectionType": "amplifier" }, "AxelarOperators": { "address": "CBRMCHA6EEVQJVKIBDLOXGZSOPUXMYXYMKPNVNNFCDBIP7VEFQCHBLXR", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "82acfafba05ef400104d172664e8d30dbadca6e21e97fa9ae2e1c06c9148be1d", + "wasmHash": "8e0d3c6ace7b80c80d945eaca495ff2cea7de12e9cf736dcf1fb9aaee07b4dd2", + "version": "1.1.1", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3" } @@ -2034,16 +2104,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", @@ -2051,15 +2123,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": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", + "version": "1.2.0", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2071,6 +2145,190 @@ "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" } + }, + "Multicall": { + "address": "CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK", + "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "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" + } + } + }, + "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" } } } @@ -2146,10 +2404,10 @@ "adminAddress": "axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "73", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e", - "codeId": 25, - "lastUploadedCodeId": 6, + "storeCodeProposalId": "166", + "storeCodeProposalCodeHash": "cd6109a37eab844941ea09266e54bf3fdb18bfb55e02a0ed91aa5a8d47aea2ec", + "codeId": 42, + "lastUploadedCodeId": 42, "address": "axelar143vjln56ke4pjmj5ut7u3358ywyfl7h5rg58js8gprr39664wcqs72vs3u", "executeProposalId": "18", "flow": { @@ -2235,6 +2493,36 @@ "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" + }, + "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 @@ -2256,12 +2544,20 @@ "codeId": 22, "address": "axelar1u6t0zgqc3y8qdymrr7t95vp6gkgdg5lekcgt8r46w5w36kqcp8csy4k93j" }, + "plume": { + "codeId": 22, + "address": "axelar1mnu5s858ptnwqt9dkr2u7v3u4pa5z27arwzxlp9smf64n3xp4u3qyhvgj5" + }, "storeCodeProposalId": "70", "storeCodeProposalCodeHash": "2ba600ee0d162184c9387eaf6fad655f1d75db548f93e379f0565cb2042d856f", "lastUploadedCodeId": 22, "stellar-2025-q1": { "codeId": 22, "address": "axelar1lkrxspjqge3dkuwgfw4mjtmxjnyx8pr7tm9ksszvlh4c3u3z2nlswxexcz" + }, + "hyperliquid": { + "codeId": 22, + "address": "axelar1um4eyzmkpxhkpv3ytzaawqjzjxfddv2cjlep936glj87jg24zccqw86q2w" } }, "VotingVerifier": { @@ -2340,16 +2636,46 @@ "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" + }, + "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 }, "InterchainTokenService": { - "storeCodeProposalId": "102", - "storeCodeProposalCodeHash": "174688fff71f479dca62066a9db5bb417e8b38db2d066650bf20e7e2b623f854", + "storeCodeProposalId": "150", + "storeCodeProposalCodeHash": "36c758c8e36951369ff2b5f9590485edab6c302e7c1b385415ecc6e08185d738", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky", - "codeId": 29, + "codeId": 37, "address": "axelar1ph8qufmsh556e40uk0ceaufc06nwhnw0ksgdqqk6ldszxchh8llq8x52dk", "sui": { "maxUintBits": 64, @@ -2359,7 +2685,7 @@ "maxUintBits": 127, "maxDecimalsWhenTruncating": 255 }, - "lastUploadedCodeId": 29 + "lastUploadedCodeId": 37 }, "AxelarnetGateway": { "storeCodeProposalId": "68", @@ -2368,6 +2694,53 @@ "address": "axelar1s9amtxejrdlsunwdf0cclhjtezdp6wmurxxnh45gfvtpa2jrsusqv934n6", "codeId": 20, "lastUploadedCodeId": 20 + }, + "XrplGateway": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv", + "codeId": 49, + "address": "axelar1vr89h7je4zw4hxhdt7aycqq6end3kf9wvj4unv63s8pcenrrutrs88kn57" + }, + "storeCodeProposalId": "182", + "storeCodeProposalCodeHash": "9c626d4ab34d3e8cd7426b72ad476b8adce05bed3274ca1b35523e66bbcf7688", + "lastUploadedCodeId": 49 + }, + "XrplVotingVerifier": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "serviceName": "amplifier", + "votingThreshold": [ + "51", + "100" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "codeId": 50, + "address": "axelar1ecj3spvgkkmngslmvlft25cpws836x5t9y45qyzl5ezh2ny60fes4h2kq6" + }, + "storeCodeProposalId": "184", + "storeCodeProposalCodeHash": "7055d307103d5bcbed4c9465f40084acdb0f154a8dda0d8c0ee68f865892874a", + "lastUploadedCodeId": 50 + }, + "XrplMultisigProver": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv", + "signingThreshold": [ + "51", + "100" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 0, + "xrplTransactionFee": 5000, + "ticketCountThreshold": 5, + "codeId": 52, + "address": "axelar17mnfwue8mw5t2q9gmndz3m50070fmm0ffa0tunh2dujmuy398rtsrjyw2k" + }, + "storeCodeProposalId": "192", + "storeCodeProposalCodeHash": "bee1192a8ae1d8928127bbb23e259cfadf817b930c5176cf83f7985240a7254a", + "lastUploadedCodeId": 52 } }, "axelarId": "axelar", @@ -2378,6 +2751,12 @@ "tokenSymbol": "AXL", "axelarscanApi": "https://stagenet.api.axelarscan.io", "gasPrice": "0.007uaxl", - "gasLimit": "auto" + "gasLimit": "auto", + "govProposalDepositAmount": "100000000", + "govProposalInstantiateAddresses": [ + "axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm", + "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky" + ] } } diff --git a/axelar-chains-config/info/testnet.json b/axelar-chains-config/info/testnet.json index 287ee6183..2335465b8 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": { @@ -89,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", @@ -129,6 +131,7 @@ "chainId": 43113, "rpc": "https://api.avax-test.network/ext/bc/C/rpc", "tokenSymbol": "AVAX", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -180,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", @@ -241,6 +245,7 @@ "chainId": 4002, "rpc": "https://rpc.testnet.fantom.network", "tokenSymbol": "FTM", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -298,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", @@ -362,6 +368,7 @@ "chainId": 1287, "rpc": "https://moonbeam-alpha.api.onfinality.io/public", "tokenSymbol": "DEV", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -453,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", @@ -479,6 +487,7 @@ "chainId": 97, "rpc": "https://bsc-testnet-rpc.publicnode.com", "tokenSymbol": "BNB", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasPriceAdjustment": 1.4 @@ -571,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", @@ -604,6 +614,7 @@ "chainId": 44787, "rpc": "https://alfajores-forno.celo-testnet.org", "tokenSymbol": "CELO", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -655,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", @@ -719,6 +731,7 @@ "chainId": 2221, "rpc": "https://evm.testnet.kava.io", "tokenSymbol": "KAVA", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -808,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", @@ -830,6 +844,7 @@ "chainId": 314159, "rpc": "https://api.calibration.node.glif.io/rpc/v1", "tokenSymbol": "FIL", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -918,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", @@ -946,6 +962,7 @@ "chainId": 534351, "rpc": "https://sepolia-rpc.scroll.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -1031,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", @@ -1064,6 +1082,7 @@ "chainId": 13473, "rpc": "https://rpc.testnet.immutable.com", "tokenSymbol": "IMX", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -1147,7 +1166,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1175,6 +1195,7 @@ "chainId": 421614, "rpc": "https://sepolia-rollup.arbitrum.io/rpc", "tokenSymbol": "ETH", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -1259,7 +1280,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x3AB8A7be32b7a1A12686258aDda1C005E2fcb4EC" + "gatewayCaller": "0x3AB8A7be32b7a1A12686258aDda1C005E2fcb4EC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1286,6 +1308,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 +1398,7 @@ "chainId": 2522, "rpc": "https://rpc.testnet.frax.com", "tokenSymbol": "frxETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1466,7 +1490,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1489,6 +1514,7 @@ "chainId": 11155420, "rpc": "https://sepolia.optimism.io", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1586,7 +1612,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1604,6 +1631,7 @@ "chainId": 84532, "rpc": "https://sepolia.base.org", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "gasOptions": { "gasLimit": 8000000 @@ -1701,7 +1729,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1717,8 +1746,9 @@ "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", "gasOptions": { "gasLimit": 8000000 @@ -1816,7 +1846,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1834,6 +1865,7 @@ "chainId": 5003, "rpc": "https://rpc.sepolia.mantle.xyz", "tokenSymbol": "MNT", + "decimals": 18, "confirmations": 2, "chainType": "evm", "onchainGasEstimate": { @@ -1928,7 +1960,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x8150f03DceB9D9464Cb472c4b926B6e958cE4daa" + "gatewayCaller": "0x8150f03DceB9D9464Cb472c4b926B6e958cE4daa", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -1946,6 +1979,7 @@ "chainId": 80002, "rpc": "https://rpc-amoy.polygon.technology", "tokenSymbol": "MATIC", + "decimals": 18, "confirmations": 2, "chainType": "evm", "contracts": { @@ -2030,7 +2064,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2057,6 +2092,7 @@ "chainId": 59141, "rpc": "https://rpc.sepolia.linea.build", "tokenSymbol": "ETH", + "decimals": 18, "chainType": "evm", "contracts": { "AxelarGateway": { @@ -2140,7 +2176,8 @@ "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", - "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC" + "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2168,6 +2205,7 @@ "chainId": 545, "rpc": "https://testnet.evm.nodes.onflow.org", "tokenSymbol": "FLOW", + "decimals": 18, "chainType": "evm", "contracts": { "ConstAddressDeployer": { @@ -2233,7 +2271,8 @@ "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", - "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C" + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2261,6 +2300,7 @@ "chainId": 296, "rpc": "https://testnet.hashio.io/api", "tokenSymbol": "HBAR", + "decimals": 8, "confirmations": 1, "finality": "finalized", "approxFinalityWaitTime": 1, @@ -2332,11 +2372,11 @@ "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", "finality": "1", - "decimals": 9, "approxFinalityWaitTime": 1, "explorer": { "name": "Suiscan", @@ -2380,7 +2420,8 @@ }, "domainSeparator": "0xf221c54a1a478f48c840a24cf2b96f77c9bc369a40570744b8fedd91df001624", "operator": "0xadc53ffb50d2fc245ddb88223619b837f743fbd420745d97a3c3e14e0beb7940", - "minimumRotationDelay": 0 + "minimumRotationDelay": 0, + "connectionType": "amplifier" }, "Utils": { "address": "0x9d817589ae367cc3f3bc9ca40394be79e5853bfca98014f27acfd4da9db78421", @@ -2546,92 +2587,52 @@ } } }, - "xrpl-evm-test-1": { - "name": "XRPL EVM", - "axelarId": "xrpl-evm-test-1", - "chainId": 1449000, - "rpc": "https://rpc.testnet.xrplevm.org", + "xrpl": { + "name": "XRPL", + "axelarId": "xrpl", + "rpc": "https://s.altnet.rippletest.net:51234", + "wssRpc": "wss://s.altnet.rippletest.net:51233", "tokenSymbol": "XRP", - "confirmations": 1, - "finality": "finalized", - "decimals": 18, + "decimals": 6, + "networkType": "testnet", + "chainType": "xrpl", + "finality": "1", "approxFinalityWaitTime": 1, - "chainType": "evm", "explorer": { - "name": "Blockscout", - "url": "https://explorer.testnet.xrplevm.org/", - "api": "https://explorer.testnet.xrplevm.org/api/" + "name": "XRPL Explorer", + "url": "https://testnet.xrpl.org" }, "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" + "address": "rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2", + "initialSigner": "rJJAmTa5f9rNmBtvUMmFKn2KoX2o8QhiQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ] }, - "InterchainTokenFactory": { - "deployer": "0xba76c6980428A0b10CFC5d8ccb61949677A61233", - "salt": "ITS Factory v1.0.0", - "implementation": "0x56858a5bD9928858cd0307f22C3FE8791a784253", - "address": "0x0E7620b73a53980f2138B43314fa944AE990d387" + "AxelarGateway": { + "address": "rNrjh1KGZk2jBR3wPfAQnoidtFFYQKbQn2", + "initialSigner": "rJJAmTa5f9rNmBtvUMmFKn2KoX2o8QhiQ9", + "transferRate": 0, + "tickSize": 6, + "domain": "axelar.foundation", + "flags": [ + 4, + 12, + 13, + 14, + 8, + 6 + ], + "connectionType": "amplifier" } } }, @@ -2641,9 +2642,9 @@ "chainId": 1449000, "rpc": "https://rpc.testnet.xrplevm.org", "tokenSymbol": "XRP", + "decimals": 18, "confirmations": 1, "finality": "finalized", - "decimals": 18, "approxFinalityWaitTime": 1, "chainType": "evm", "explorer": { @@ -2714,7 +2715,8 @@ "gatewayCaller": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", - "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C" + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" }, "InterchainTokenFactory": { "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", @@ -2730,11 +2732,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", @@ -2744,7 +2746,7 @@ "AxelarGateway": { "address": "CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I", "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", - "wasmHash": "4e0df4342d505504d3e7fde2cf664fe896b8a01ed992426192968189ed83e821", + "wasmHash": "d68610690fa381aace03f16ef591334d61e808bcba0ac9e3a15d76df492aff24", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2763,29 +2765,34 @@ "threshold": "1" } ] - } + }, + "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", @@ -2793,15 +2800,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": "cd078e4d495a61a113a6ba457f5efa4579c5bc41a396779fd82f164aa75e9942", "initializeArgs": { "owner": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", "operator": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", @@ -2812,7 +2820,104 @@ "nativeTokenAddress": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "interchainTokenWasmHash": "85693704d656eb99af464d553a0a8d99b62d039223e72e86b98655def0d345ca", "tokenManagerWasmHash": "4164f47872741793bc682f6fb124623c6c1eb64e342b73319c11d05c2e0e39b0" - } + }, + "version": "1.2.0" + }, + "Multicall": { + "address": "CC6BXRCUQFAJ64NDLEZCS4FDL6GN65FL2KDOKCRHFWPMPKRWQNBA4YR2", + "deployer": "GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3", + "wasmHash": "0c491cc15edf95dbc131cbac07dc3035f05a9e6fd180d2733b9315685323df26", + "version": "1.0.1", + "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 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": "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "operator": "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "proxyDeploymentArgs": [ + "0x05823c334150a48ACD5D325fBA16147c21bA3653", + "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "0x000000000000000000000000b8cd93c83a974649d76b1c19f311f639e62272bc0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000001237f2700000000000000000000000000000000000000000000000000000000000000160000000000000000000000000e3c1ac746bd5d47fa44f77a6e3a700eadd9e1bc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000001f2eb0420e6aac6e25154639a37587bbc4b256d6000000000000000000000000000000000000000000000000000000000000000100000000000000000000000020aecd082d8788639f2a4afb8563f62aee2183f2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000024449d80a8c616cff227b37a1461ebd059529d140000000000000000000000000000000000000000000000000000000000000001000000000000000000000000380dda1ce71d1922b37db6079ca6e26b2b65da4b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000414b06d536092988aa828a3209a0331be53a126f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000004acc331501a4cde2bea4a3703ccf328f2833182500000000000000000000000000000000000000000000000000000000000000010000000000000000000000005cdf30e201017cb3aaab487949af41e7225e2d1600000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ff6e6fb7f3804fee29aa2ff75dd889c8e09eb7e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070a97c7328a22e012d6e7c7f0615a19f6761b617000000000000000000000000000000000000000000000000000000000000000100000000000000000000000083313ac5d1e023cbca79a18b9ec5ab7875746335000000000000000000000000000000000000000000000000000000000000000100000000000000000000000092ec015a988cf083c6ad0627f37df05937687e7900000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ce4f02aab880308bc8db8cc6e4ec9a2a8cded5b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a8f56991b33b07ccac084be1d2a246d1c82fa73e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b00e4c94faa6698ad2c3b64af7c94071d5eeb2d00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b9f5ea2331ef8224b56576db506afc88f8b070480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c4db1d3fcf418d4baf61f173eef18c6fb40132fb0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c89566ef25f70cbf3507d5b3c6605129ef9d508c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cbfa786fbdbb8779063fd7580a22da8f306eb8240000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cee3d5699cbfd940b7ee9ac71518120d5f8f67570000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e19404210888776d57780666d0a435298da6d7cf0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e6a16d54e432883da61ce9130b1cd0240025ce620000000000000000000000000000000000000000000000000000000000000001" + ], + "initialVerifierSetId": "43df6f363aabca5b666e8a5888e845e47a0513f14c0912e1721303bab71be87a", + "address": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "implementation": "0x05823c334150a48ACD5D325fBA16147c21bA3653", + "implementationCodehash": "0x91f090fcebc0bfc3c8bc4627888f753de8f7f3a840a584f5eb1e5539c1f3d2d6", + "deploymentMethod": "create", + "previousSignersRetention": 15, + "domainSeparator": "0xecb35aaefd4f374fa1ea62bc6280f4150361977ad6ecad5f2ef878a89feb214e", + "minimumRotationDelay": 3600, + "connectionType": "amplifier", + "owner": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05" + }, + "Operators": { + "owner": "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "address": "0x7F83F5cA2AE4206AbFf8a3C3668e88ce5F11C0B5", + "deployer": "0xB8Cd93C83A974649D76B1c19f311f639e62272BC", + "deploymentMethod": "create2", + "codehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "predeployCodehash": "0xc561dc32ef670c929db9d7fbf6b5f6c074a62a30602481ba3b88912ca6d79feb", + "salt": "Operators" + }, + "AxelarGasService": { + "collector": "0x7F83F5cA2AE4206AbFf8a3C3668e88ce5F11C0B5", + "address": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6", + "implementation": "0xCD6b34FaF1FD1056C728A27426AB6807f84BAa1b", + "deployer": "0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85", + "owner": "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": "0x336B1C1FDa843C7f323B954C6525cB8EcB2b2aFC", + "implementation": "0xd4B79294cd4B1f3C0781Da83B846C7558D9ee921", + "predeployCodehash": "0x08a4a556c4db879b4f24104d13a8baf86915d58b12c81b382dfea2a82d2856cf", + "address": "0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C" + }, + "InterchainTokenFactory": { + "deployer": "0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05", + "salt": "ITS Factory v1.0.0", + "implementation": "0x9c551097d890E16f407a1e675490a2359B3933FD", + "address": "0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66" } } } @@ -2876,10 +2981,10 @@ "adminAddress": "axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7", "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "blockExpiry": 10, - "storeCodeProposalId": "173", - "storeCodeProposalCodeHash": "765929ba3060cdfa5573ec621cb91b3a77f7d9fbc8d1b953f545876bb5abb05e", - "codeId": 16, - "lastUploadedCodeId": 16, + "storeCodeProposalId": "308", + "storeCodeProposalCodeHash": "cd6109a37eab844941ea09266e54bf3fdb18bfb55e02a0ed91aa5a8d47aea2ec", + "codeId": 54, + "lastUploadedCodeId": 54, "address": "axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5", "executeProposalId": "115", "flow": { @@ -2900,7 +3005,7 @@ "keyType": "ecdsa", "domainSeparator": "0x79191ee0824b0f995492dc4ac6e737040f4d9fd4501f6078e56671da70968259", "codeId": 18, - "address": "axelar1rsuejfntt4rs2y8dn4dd3acszs00zyg9wpnsc6fmhevcp6plu5qspzn7e0" + "address": "axelar1rsuejfntt4rs2y8dn4dd3acszs00zyg9wpnsc6fmhevcp6x5qspzn7e0" }, "hedera": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", @@ -2932,7 +3037,7 @@ "domainSeparator": "0xf221c54a1a478f48c840a24cf2b96f77c9bc369a40570744b8fedd91df001624", "address": "axelar1v8jrupu2rqpskwgtr69max0ajul92q8z5mdxd505m2hu3xc5jzcqm8zyc6" }, - "xrpl-evm-test-1": { + "xrpl-evm": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", "signingThreshold": [ @@ -2944,10 +3049,10 @@ "encoder": "abi", "keyType": "ecdsa", "codeId": 18, - "domainSeparator": "0x2214f7ca91c3424e236cedad6111c856315c14847a06255275a9df3de28aa015", - "address": "axelar1fxjzgyhuvst30frp773jnyvy4sj9839t23fkfsfnr3gun0w740uqfhwe4g" + "domainSeparator": "0xeb44c1eb3bd40a2edf0460706f78432da381d227c5d4e480234d19c864c8e00c", + "address": "axelar198xehj5htckk75s8wcamxerxtdc45669zdqjmr69guveqntj9f6s5rqq55" }, - "xrpl-evm": { + "stellar-2025-q1": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", "signingThreshold": [ @@ -2956,13 +3061,13 @@ ], "serviceName": "amplifier", "verifierSetDiffThreshold": 0, - "encoder": "abi", - "keyType": "ecdsa", + "encoder": "stellar_xdr", + "keyType": "ed25519", "codeId": 18, - "domainSeparator": "0xeb44c1eb3bd40a2edf0460706f78432da381d227c5d4e480234d19c864c8e00c", - "address": "axelar198xehj5htckk75s8wcamxerxtdc45669zdqjmr69guveqntj9f6s5rqq55" + "domainSeparator": "0xf9a0a7d720169b49cd9d4351ec9eab0e6a49161d7258a3b507e93cd11fe8b315", + "address": "axelar1cypnpcqk4zpk32stl7dutv3cdnag0q2v5a7dzfxh4jukrzxagxpqgjl5sr" }, - "stellar-2025-q1": { + "plume": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", "signingThreshold": [ @@ -2971,11 +3076,11 @@ ], "serviceName": "amplifier", "verifierSetDiffThreshold": 0, - "encoder": "stellar_xdr", - "keyType": "ed25519", + "encoder": "abi", + "keyType": "ecdsa", "codeId": 18, - "domainSeparator": "0xf9a0a7d720169b49cd9d4351ec9eab0e6a49161d7258a3b507e93cd11fe8b315", - "address": "axelar1cypnpcqk4zpk32stl7dutv3cdnag0q2v5a7dzfxh4jukrzxagxpqgjl5sr" + "domainSeparator": "0xecb35aaefd4f374fa1ea62bc6280f4150361977ad6ecad5f2ef878a89feb214e", + "address": "axelar1ll4yhqtldlgqwqthyffqln3cyr2f8ydzhv0djpjyp6sk4v5k4kqqrs60s7" }, "storeCodeProposalId": "175", "storeCodeProposalCodeHash": "00428ef0483f103a6e1a5853c4b29466a83e5b180cc53a00d1ff9d022bc2f03a", @@ -2994,10 +3099,6 @@ "codeId": 24, "address": "axelar1svl69e32m240xgjluezrvpudjn92usrn3dqzfm2tzn3zqkn76d6qfse593" }, - "xrpl-evm-test-1": { - "codeId": 24, - "address": "axelar1jah3ac59xke2r266yjhh45tugzsvnlzsefyvx6jgp0msk6tp7vqqaktuz2" - }, "xrpl-evm": { "codeId": 24, "address": "axelar1vvdukrmxdylvnn8e59s3gnn49lutv3n9tg4vnsttn33a8zulgfssl62q69" @@ -3008,6 +3109,10 @@ "stellar-2025-q1": { "codeId": 24, "address": "axelar1h5mvyzjjara9a5jk4psayas6pg9c55llay02mmaprzmfk5r6epfqqadvs4" + }, + "plume": { + "codeId": 24, + "address": "axelar163ee8p7xne8een7v3hwz6zxh339v6s8js3v5c9520mlnzd7nxneq5eq86v" } }, "VotingVerifier": { @@ -3056,10 +3161,10 @@ "codeId": 26, "address": "axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh" }, - "xrpl-evm-test-1": { + "xrpl-evm": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "serviceName": "amplifier", - "sourceGatewayAddress": "0xA1eBb6A4b856dF8bf6c3aCa88a9115a9ab3b2E02", + "sourceGatewayAddress": "0xe432150cce91c13a887f7D836923d5597adD8E31", "votingThreshold": [ "51", "100" @@ -3069,12 +3174,12 @@ "msgIdFormat": "hex_tx_hash_and_event_index", "addressFormat": "eip55", "codeId": 26, - "address": "axelar1wn27x0th9amw5z59tssn5f9hwraevla8xx7ksur570npfpkckr9s257vet" + "address": "axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" }, - "xrpl-evm": { + "stellar-2025-q1": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "serviceName": "amplifier", - "sourceGatewayAddress": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "sourceGatewayAddress": "CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I", "votingThreshold": [ "51", "100" @@ -3082,36 +3187,36 @@ "blockExpiry": 10, "confirmationHeight": 1, "msgIdFormat": "hex_tx_hash_and_event_index", - "addressFormat": "eip55", + "addressFormat": "stellar", "codeId": 26, - "address": "axelar1q8kn9t39ddpce42atk0d6wpdudr6djqxmz689m3nxy92ck0nnftqxfsuyk" + "address": "axelar1a4wt84rllhuwpdvymj4tql6cugfsmdmau9ufmzcm329yx9st96eqx05uam" }, - "stellar-2025-q1": { + "plume": { "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", "serviceName": "amplifier", - "sourceGatewayAddress": "CCSNWHMQSPTW4PS7L32OIMH7Z6NFNCKYZKNFSWRSYX7MK64KHBDZDT5I", + "sourceGatewayAddress": "0xe432150cce91c13a887f7D836923d5597adD8E31", "votingThreshold": [ "51", "100" ], "blockExpiry": 10, - "confirmationHeight": 1, + "confirmationHeight": 1000000, "msgIdFormat": "hex_tx_hash_and_event_index", - "addressFormat": "stellar", + "addressFormat": "eip55", "codeId": 26, - "address": "axelar1a4wt84rllhuwpdvymj4tql6cugfsmdmau9ufmzcm329yx9st96eqx05uam" + "address": "axelar1nrdqke6tcxjuymg5gyd9x3yg35n3wrgarnj3sqskp98z2xnvlx9q82f63t" }, "storeCodeProposalId": "183", "storeCodeProposalCodeHash": "d9412440820a51bc48bf41a77ae39cfb33101ddc6562323845627ea2042bf708", "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, @@ -3120,6 +3225,10 @@ "stellar-2025-q1": { "maxUintBits": 127, "maxDecimalsWhenTruncating": 255 + }, + "xrpl": { + "maxUintBits": 256, + "maxDecimalsWhenTruncating": 255 } }, "AxelarnetGateway": { @@ -3133,6 +3242,53 @@ "address": "axelar1kq687tszm67hr5ws5pqhtchc8uatxur8r4rm4xgclyghetthtlzs9pnqfl" }, "lastUploadedCodeId": 17 + }, + "XrplMultisigProver": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", + "signingThreshold": [ + "51", + "100" + ], + "serviceName": "amplifier", + "verifierSetDiffThreshold": 1, + "xrplTransactionFee": 5000, + "ticketCountThreshold": 5, + "codeId": 57, + "address": "axelar1k82qfzu3l6rvc7twlp9lpwsnav507czl6xyrk0xv287t4439ymvsl6n470" + }, + "storeCodeProposalId": "312", + "storeCodeProposalCodeHash": "bee1192a8ae1d8928127bbb23e259cfadf817b930c5176cf83f7985240a7254a", + "lastUploadedCodeId": 57 + }, + "XrplVotingVerifier": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "serviceName": "amplifier", + "votingThreshold": [ + "51", + "100" + ], + "blockExpiry": 10, + "confirmationHeight": 1, + "codeId": 56, + "address": "axelar1pnynr6wnmchutkv6490mdqqxkz54fnrtmq8krqhvglhsqhmu7wzsnc86sy" + }, + "storeCodeProposalCodeHash": "7055d307103d5bcbed4c9465f40084acdb0f154a8dda0d8c0ee68f865892874a", + "lastUploadedCodeId": 56, + "storeCodeProposalId": "311" + }, + "XrplGateway": { + "xrpl": { + "governanceAddress": "axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj", + "adminAddress": "axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35", + "codeId": 55, + "address": "axelar18qltw4382s5qz0rgzfxz67mr83smk580hewlkfd33l5tmcdp8unqw35glh" + }, + "storeCodeProposalId": "310", + "storeCodeProposalCodeHash": "9c626d4ab34d3e8cd7426b72ad476b8adce05bed3274ca1b35523e66bbcf7688", + "lastUploadedCodeId": 55 } }, "axelarId": "axelar", @@ -3143,6 +3299,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/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/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/axelar-chains-config/tests/schema/index.js b/axelar-chains-config/tests/schema/index.js index 1d7a571b3..bebe502e9 100644 --- a/axelar-chains-config/tests/schema/index.js +++ b/axelar-chains-config/tests/schema/index.js @@ -21,16 +21,32 @@ export const contractValueSchema = { required: ['address'], }; +export const axelarGatewaySchema = { + id: '/info/chains.contracts.AxelarGateway', + type: 'object', + properties: { + 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, + }, skipRevertTests: { type: 'boolean', }, @@ -78,15 +94,27 @@ 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 = { id: '/info.chains', type: 'object', patternProperties: { - '^[a-z]+$': { + '^[a-z][a-z0-9-]*$': { $ref: chainValueSchema.id, }, }, @@ -110,6 +138,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; } 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 +``` diff --git a/common/cli-utils.js b/common/cli-utils.js index 308553522..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'); @@ -65,18 +66,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/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..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,}$/; @@ -258,17 +260,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; } /** @@ -591,6 +601,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); @@ -602,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, @@ -644,6 +668,7 @@ module.exports = { downloadContractCode, pascalToKebab, pascalToSnake, + camelToTitle, readContractCode, VERSION_REGEX, SHORT_COMMIT_HASH_REGEX, @@ -656,4 +681,5 @@ module.exports = { getCurrentVerifierSet, asciiToBytes, encodeITSDestination, + getProposalConfig, }; diff --git a/cosmwasm/README.md b/cosmwasm/README.md index 4a3441cbe..d274fb806 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. @@ -167,7 +167,7 @@ node submit-proposal.js -m -e -t +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/cli-utils.js b/cosmwasm/cli-utils.js index 0ff32c5e2..e53f957a1 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'); @@ -79,14 +79,16 @@ const addAmplifierOptions = (program, options) => { } 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')); } }; +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())); @@ -125,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())), ); }; @@ -165,11 +166,12 @@ 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 = { addAmplifierOptions, + addAmplifierQueryOptions, }; diff --git a/cosmwasm/deploy-contract.js b/cosmwasm/deploy-contract.js index 3b93a942d..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'); @@ -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/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/rotate-signers.js b/cosmwasm/rotate-signers.js new file mode 100644 index 000000000..7ac1cd984 --- /dev/null +++ b/cosmwasm/rotate-signers.js @@ -0,0 +1,125 @@ +'use strict'; + +require('../common/cli-utils'); + +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 client.queryContractSmart(config.axelar.contracts.MultisigProver[chain].address, 'next_verifier_set'); +}; + +const getVerifierSetStatus = async (config, chain, client, verifierStatus) => { + return 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 <chain>') + .description('Update verifier set') + .action((chain, options) => { + processCommand(updateVerifierSet, options, [chain]); + }); + addAmplifierOptions(updateVerifiersCmd, {}); + + const confirmVerifiersCmd = program + .command('confirm-verifier-rotation <chain> <txHash>') + .description('Confirm verifier rotation') + .action((chain, txHash, options) => { + processCommand(confirmVerifierRotation, options, [chain, txHash]); + }); + addAmplifierOptions(confirmVerifiersCmd, {}); + + program.parse(); +}; + +if (require.main === module) { + programHandler(); +} diff --git a/cosmwasm/submit-proposal.js b/cosmwasm/submit-proposal.js index 8db0ef64a..024b7c8c5 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'); @@ -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/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/cosmwasm/utils.js b/cosmwasm/utils.js index 008c8b588..dd4f24385 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; @@ -49,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 }); @@ -196,6 +204,8 @@ const makeCoordinatorInstantiateMsg = (config, _options, contractConfig) => { } = config; const { ServiceRegistry: { address: registryAddress }, + Multisig: { address: multisigAddress }, + Router: { address: routerAddress }, } = contracts; const { governanceAddress } = contractConfig; @@ -207,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) => { @@ -291,6 +301,74 @@ 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 { adminAddress, 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(adminAddress)) { + throw new Error(`Missing or invalid XrplVotingVerifier[${chainName}].adminAddress 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 { + admin_address: adminAddress, + 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 +444,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 +527,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 { @@ -516,7 +776,7 @@ const makeAxelarnetGatewayInstantiateMsg = (config, _options, contractConfig) => }; const makeInterchainTokenServiceInstantiateMsg = (config, _options, contractConfig) => { - const { adminAddress, governanceAddress } = contractConfig; + const { adminAddress, governanceAddress, operatorAddress } = contractConfig; const { axelar: { contracts }, } = config; @@ -532,6 +792,7 @@ const makeInterchainTokenServiceInstantiateMsg = (config, _options, contractConf return { governance_address: governanceAddress, admin_address: adminAddress, + operator_address: operatorAddress, axelarnet_gateway_address: axelarnetGatewayAddress, }; }; @@ -575,36 +836,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]; @@ -864,7 +1095,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'); @@ -895,14 +1126,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, @@ -919,6 +1162,7 @@ module.exports = { CONTRACTS, governanceAddress, prepareWallet, + prepareDummyWallet, prepareClient, fromHex, getSalt, @@ -932,7 +1176,6 @@ module.exports = { migrateContract, fetchCodeIdFromCodeHash, fetchCodeIdFromContract, - addDefaultInstantiateAddresses, getChainTruncationParams, decodeProposalAttributes, encodeStoreCodeProposal, diff --git a/evm/README.md b/evm/README.md index 9d439a5f4..0cbf1e5c7 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). @@ -158,6 +158,28 @@ To decode function calldata: Function: Unrecognized function call ``` +### Top Up Accounts + +To top up multiple accounts from a single wallet with native cryptocurrency or ERC20 tokens, you can use the following command: + +```bash +node evm/top-up.js [native|token] -n <chain> --target <target-balance> --threshold <threshold> --addresses-to-derive [number-of-accounts] +``` + +Example usage: + +```bash +# For native crypto +node evm/top-up.js native -n xrpl-evm -t 50 --threshold 0 --addresses-to-derive 3 + +# For ERC20 tokens +node evm/top-up.js token -n xrpl-evm -t 10000 --threshold 0 --addresses-to-derive 3 --contract 0x02D0f033d365d0D1b6a4377bfc6cB9D87bE16Ab7 --decimals 0 +``` + +You can use `--addresses-to-derive` to derive multiple accounts from a mnemonic set in the MNEMONIC environment variable, or use `--addresses` to specify a list of addresses to top up. + +For ERC20 token top ups, you must specify the contract address using `--contract` option. + ## InterchainGovernance To update the min deposit on Axelar with a param change proposal, you can generate the proposal via 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/cli-utils.js b/evm/cli-utils.js index 112e8ed2c..a081643f8 100644 --- a/evm/cli-utils.js +++ b/evm/cli-utils.js @@ -41,8 +41,29 @@ const addEvmOptions = (program, options = {}) => { return program; }; +const addTopUpOptions = (program) => { + program.addOption(new Option('-t, --target <target>', 'target balance for each account').makeOptionMandatory(true)); + program.addOption( + new Option('--threshold <threshold>', 'top up accounts only if the balance is below this threshold').makeOptionMandatory(true), + ); + program.addOption(new Option('-u, --units', 'amounts are set in smallest unit')); + program.addOption( + new Option( + '--addresses-to-derive <addresses-to-derive>', + 'number of addresses to derive from mnemonic. Derived addresses will be added to the list of addresses to fund set by using --addresses option', + ).env('DERIVE_ACCOUNTS'), + ); + program.addOption( + new Option('--addresses <addresses>', 'comma separated list of addresses to top up') + .default([]) + .argParser((addresses) => addresses.split(',').map((address) => address.trim())), + ); + program.addOption(new Option('-m, --mnemonic <mnemonic>', 'mnemonic').env('MNEMONIC')); +}; + module.exports = { ...exportedCliUtils, addBaseOptions, addEvmOptions, + addTopUpOptions, }; 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/deploy-its.js b/evm/deploy-its.js index 6cbb2008d..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, ); @@ -188,7 +187,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 +203,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 +219,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 +235,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 +251,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 +267,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 +297,7 @@ async function deployAll(config, wallet, chain, options) { printInfo('ITS Implementation args', args); - return await deployContract( + return deployContract( proxyDeployMethod, wallet, InterchainTokenService, @@ -325,7 +324,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 +340,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 +359,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/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'); 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/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/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/top-up.js b/evm/top-up.js new file mode 100644 index 000000000..7f9322f79 --- /dev/null +++ b/evm/top-up.js @@ -0,0 +1,115 @@ +const { loadConfig, printInfo } = require('../common/index.js'); +const { addBaseOptions } = require('../common/cli-utils.js'); +const { addTopUpOptions } = require('./cli-utils.js'); + +const { getWallet } = require('./sign-utils.js'); +const { getContractJSON, deriveAccounts, printWalletInfo } = require('./utils.js'); + +const { Command } = require('commander'); +const ethers = require('ethers'); + +const topUpAccounts = async (wallet, options, addressesToFund, decimals, token) => { + const { target, threshold, units } = options; + + let targetUnits; + let thresholdUnits; + + if (units) { + targetUnits = ethers.BigNumber.from(target); + thresholdUnits = ethers.BigNumber.from(threshold); + } else { + targetUnits = ethers.utils.parseUnits(target, decimals); + thresholdUnits = ethers.utils.parseUnits(threshold, decimals); + } + + printInfo('Target balance', ethers.utils.formatUnits(targetUnits, decimals)); + printInfo('Threshold', ethers.utils.formatUnits(thresholdUnits, decimals)); + + if (thresholdUnits.gt(targetUnits)) { + throw new Error('threshold must be less than or equal to target balance'); + } + + for (const address of addressesToFund) { + console.log('='.repeat(20)); + printInfo(`Funding account with ${token ? 'ERC20 tokens' : 'native cryptocurrency'}`, address); + + const balance = token ? await token.balanceOf(address) : await wallet.provider.getBalance(address); + + printInfo('Current balance', ethers.utils.formatUnits(balance, decimals)); + + if (balance.gte(thresholdUnits)) { + printInfo('Account has sufficient balance. Skipping...'); + continue; + } + + const amount = targetUnits.sub(balance); + + const tx = token ? await token.transfer(address, amount) : await wallet.sendTransaction({ to: address, value: amount }); + await tx.wait(); + + printInfo('Amount transferred', ethers.utils.formatUnits(amount, decimals)); + } +}; + +const topUpNative = async (wallet, options, addressesToFund) => { + topUpAccounts(wallet, options, addressesToFund, 18, false); +}; + +const topUpToken = async (wallet, options, addressesToFund) => { + const { contract, decimals } = options; + const token = new ethers.Contract(contract, getContractJSON('ERC20').abi, wallet); + const tokenDecimals = decimals || (await token.decimals()); + + topUpAccounts(wallet, options, addressesToFund, tokenDecimals, token); +}; + +const mainProcessor = async (processor, options) => { + const { env, privateKey, chainNames, addressesToDerive, addresses, mnemonic } = options; + const config = loadConfig(env); + + const rpc = config.chains[chainNames].rpc; + const provider = new ethers.providers.JsonRpcProvider(rpc); + const wallet = await getWallet(privateKey, provider); + + await printWalletInfo(wallet, options); + + let addressesToFund = addresses; + + if (addressesToDerive) { + const derivedAccounts = await deriveAccounts(mnemonic, addressesToDerive); + addressesToFund = addressesToFund.concat(derivedAccounts.map((account) => account.address)); + } + + await processor(wallet, options, addressesToFund); +}; + +const programHandler = () => { + const program = new Command(); + program.name('top-up').description('Top up multiple accounts with native cryptocurrency or ERC20 tokens from a single wallet'); + + const topUpNativeCmd = program + .command('native') + .description('Top up multiple accounts with native cryptocurrency from a single wallet') + .action((options) => { + mainProcessor(topUpNative, options); + }); + addBaseOptions(topUpNativeCmd, {}); + addTopUpOptions(topUpNativeCmd); + + const topUpTokenCmd = program + .command('token') + .description('Top up multiple accounts with ERC20 tokens from a single wallet') + .requiredOption('--contract <contract>', 'ERC20 token contract address') + .option('-d, --decimals <decimals>', 'token decimals, if not provided, the contract will be queried for the decimals') + .action((options) => { + mainProcessor(topUpToken, options); + }); + addBaseOptions(topUpTokenCmd, {}); + addTopUpOptions(topUpTokenCmd); + + program.parse(); +}; + +if (require.main === module) { + programHandler(); +} diff --git a/evm/utils.js b/evm/utils.js index c6be00e7e..7e861aa3a 100644 --- a/evm/utils.js +++ b/evm/utils.js @@ -5,10 +5,21 @@ const { ethers } = require('hardhat'); const { ContractFactory, Contract, - utils: { computeAddress, getContractAddress, keccak256, isAddress, getCreate2Address, defaultAbiCoder, isHexString, hexZeroPad }, + utils: { + computeAddress, + getContractAddress, + keccak256, + isAddress, + getCreate2Address, + defaultAbiCoder, + isHexString, + hexZeroPad, + HDNode, + }, constants: { AddressZero, HashZero }, getDefaultProvider, BigNumber, + Wallet, } = ethers; const fs = require('fs'); const path = require('path'); @@ -426,7 +437,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 +457,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', { @@ -710,8 +721,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 +764,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; @@ -1043,6 +1052,25 @@ const verifyContractByName = (env, chain, name, contract, args, options = {}) => const isConsensusChain = (chain) => chain.contracts.AxelarGateway?.connectionType !== 'amplifier'; +const deriveAccounts = async (mnemonic, quantity) => { + const hdNode = HDNode.fromMnemonic(mnemonic); + const accounts = []; + + for (let i = 0; i < quantity; i++) { + const path = `m/44'/60'/0'/0/${i}`; + const derivedNode = hdNode.derivePath(path); + + const wallet = new Wallet(derivedNode.privateKey); + + accounts.push({ + address: wallet.address, + privateKey: wallet.privateKey, + }); + } + + return accounts; +}; + module.exports = { ...require('../common/utils'), deployCreate, @@ -1083,4 +1111,5 @@ module.exports = { getQualifiedContractName, verifyContractByName, isConsensusChain, + deriveAccounts, }; diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 000000000..68b464de4 --- /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..d714d8e86 --- /dev/null +++ b/index.ts @@ -0,0 +1,5 @@ +'use strict'; + +import { getBytecodeHash, importNetworks, printObj, readJSON, verifyContract, writeJSON } from './evm'; + +export { printObj, readJSON, writeJSON, importNetworks, verifyContract, getBytecodeHash }; diff --git a/package-lock.json b/package-lock.json index f0921d96a..28ee570b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,23 +21,38 @@ "axios": "^1.7.2", "csv-parser": "^3.0.0", "path": "^0.12.7", - "toml": "^3.0.0" + "toml": "^3.0.0", + "xrpl": "4.2.5" }, "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", + "jszip": "^3.10.1", + "husky": "^9.1.7", "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" @@ -181,6 +196,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", @@ -362,7 +504,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" }, @@ -1334,12 +1475,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" } @@ -1348,15 +1521,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" @@ -1987,7 +2158,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" @@ -2230,12 +2400,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", @@ -2446,40 +2610,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" @@ -2497,7 +2690,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" }, @@ -2515,7 +2707,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", @@ -2539,8 +2730,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", @@ -2583,12 +2773,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", @@ -2611,15 +2795,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": { @@ -2632,11 +2815,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", @@ -2676,127 +2862,385 @@ "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==", "dev": true }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true, - "peer": true - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz", - "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==", - "dev": true, - "peer": true - }, - "node_modules/abstract-level": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", - "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", + "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": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" + "@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": ">=12" + "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/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "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, - "bin": { - "acorn": "bin/acorn" + "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": ">=0.4.0" + "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/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "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, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "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/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "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, - "peer": true, "dependencies": { - "acorn": "^8.11.0" + "@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": ">=0.4.0" + "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/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "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": ">=0.3.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "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": { - "debug": "4" + "@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": ">= 6.0.0" + "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/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "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": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "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", + "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", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "peer": true + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz", + "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==", + "dev": true, + "peer": true + }, + "node_modules/abstract-level": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", + "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -2937,8 +3381,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", @@ -2951,47 +3394,10 @@ "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==", - "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", @@ -3012,83 +3418,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", @@ -3141,7 +3470,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" } @@ -3151,6 +3479,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" }, @@ -3479,6 +3808,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", @@ -3497,6 +3827,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" @@ -3510,6 +3841,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" @@ -3873,7 +4205,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", @@ -3889,7 +4220,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", @@ -3905,7 +4235,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" }, @@ -3918,7 +4247,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" } @@ -3928,7 +4256,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", @@ -3943,7 +4270,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" } @@ -3952,15 +4278,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" } @@ -3970,7 +4294,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" } @@ -3980,7 +4303,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" }, @@ -3993,7 +4315,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" } @@ -4082,8 +4403,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/cosmjs-types": { "version": "0.9.0", @@ -4133,8 +4453,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", @@ -4200,57 +4519,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", @@ -4456,6 +4724,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", @@ -4521,71 +4790,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", @@ -4607,6 +4811,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" }, @@ -4614,47 +4819,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", @@ -4870,254 +5034,6 @@ "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==", - "dev": true, - "dependencies": { - "get-stdin": "^6.0.0" - }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" - }, - "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" - } - }, - "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==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "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==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "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==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "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", @@ -5134,30 +5050,6 @@ "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", @@ -5635,7 +5527,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", @@ -5652,7 +5543,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" }, @@ -5746,7 +5636,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" }, @@ -5823,6 +5712,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" } @@ -5898,26 +5788,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" } @@ -5928,15 +5799,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", @@ -5960,6 +5822,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", @@ -5994,6 +5857,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" @@ -6002,32 +5866,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", @@ -6666,18 +6504,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", @@ -6698,26 +6524,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" }, @@ -6730,6 +6542,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" }, @@ -6768,6 +6581,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" }, @@ -6870,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", @@ -6910,6 +6739,13 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, "node_modules/immutable": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", @@ -6972,20 +6808,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", @@ -7030,56 +6852,6 @@ "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==", - "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", @@ -7092,22 +6864,6 @@ "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", @@ -7136,6 +6892,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" }, @@ -7148,6 +6905,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" }, @@ -7158,39 +6916,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", @@ -7200,21 +6925,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", @@ -7229,6 +6939,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", @@ -7264,18 +6975,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", @@ -7285,22 +6984,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", @@ -7324,6 +7007,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", @@ -7335,77 +7019,17 @@ }, "funding": { "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-retry-allowed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", - "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", - "engines": { - "node": ">=12" - }, - "funding": { - "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" - }, + } + }, + "node_modules/is-retry-allowed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", + "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-typed-array": { @@ -7413,6 +7037,7 @@ "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" }, @@ -7442,55 +7067,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", @@ -7515,6 +7091,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", @@ -7561,6 +7143,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", @@ -7579,18 +7173,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", @@ -7613,6 +7195,66 @@ "node": "*" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/keccak": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", @@ -7722,6 +7364,16 @@ "libsodium-sumo": "^0.7.15" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7747,8 +7399,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", @@ -7823,8 +7474,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", @@ -7838,6 +7488,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" } @@ -7890,7 +7541,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" } @@ -7907,7 +7557,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" @@ -8295,6 +7944,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" }, @@ -8310,76 +7960,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", @@ -8438,23 +8018,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", @@ -8610,6 +8173,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", @@ -8642,6 +8211,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" } @@ -8708,8 +8278,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/promise": { "version": "8.3.0", @@ -8806,12 +8375,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", @@ -8930,65 +8493,10 @@ "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==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/req-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", @@ -9048,6 +8556,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", @@ -9117,6 +8626,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", @@ -9194,25 +8744,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", @@ -9232,27 +8763,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", @@ -9445,6 +8961,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", @@ -9457,35 +8974,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", @@ -9568,6 +9056,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", @@ -9587,6 +9076,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" @@ -9603,6 +9093,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", @@ -9621,6 +9112,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", @@ -10038,8 +9530,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", @@ -10055,62 +9546,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", @@ -10123,15 +9558,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", @@ -10174,6 +9600,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" }, @@ -10236,7 +9663,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", @@ -10252,7 +9678,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" } @@ -10262,7 +9687,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" } @@ -10415,12 +9839,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", @@ -10436,7 +9871,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" } @@ -10446,7 +9880,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", @@ -10490,23 +9923,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", @@ -10587,7 +10007,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", @@ -10607,12 +10026,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", @@ -10628,7 +10052,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", @@ -10649,7 +10072,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" } @@ -10659,7 +10081,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" }, @@ -10672,7 +10093,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" }, @@ -10688,85 +10108,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", @@ -10785,9 +10130,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" @@ -10801,7 +10146,6 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -10820,24 +10164,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", @@ -10851,9 +10177,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", @@ -10967,8 +10293,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", @@ -11313,75 +10638,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", @@ -11430,7 +10692,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" @@ -11444,7 +10705,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" } @@ -11498,6 +10758,32 @@ } } }, + "node_modules/xrpl": { + "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", + "@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", @@ -11579,7 +10865,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 ca02435b2..17d3ef9ad 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,14 @@ "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'", + "prepare": "husky" }, "repository": { "type": "git", @@ -36,23 +39,39 @@ "axios": "^1.7.2", "csv-parser": "^3.0.0", "path": "^0.12.7", - "toml": "^3.0.0" + "toml": "^3.0.0", + "xrpl": "4.2.5" }, "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", + "husky": "^9.1.7", "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", + "form-data": "^4.0.0", + "jszip": "^3.10.1" }, "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/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): <TYPE> <CHAIN> <ENV> <VERSION> 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 ([<email>]) | +| **Deployment** | @ gh_username ([<email>]) | | **Network** | **Deployment Status** | **Date** | |-------------|----------------------|----------| 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..ee6bfc1c4 --- /dev/null +++ b/releases/ampd/2025-04-03-ampd-v1.6.0.md @@ -0,0 +1,121 @@ + +# Ampd v1.6.0 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 <cj@interoplabs.io> | +| **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-evm' +cosmwasm_contract = 'axelar1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqecnww6' +type = 'MultisigSigner' +``` + +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: +``` +[[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' +``` + +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-2025-q1" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +chain_name="xrpl-evm" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="MultisigSigner" + +[[handlers]] +multisig_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +multisig_prover_contract="axelar1k82qfzu3l6rvc7twlp9lpwsnav507czl6xyrk0xv287t4439ymvsl6n470" +type="XRPLMultisigSigner" + +``` + +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. + + diff --git a/releases/ampd/2025-05-20-ampd-v1.8.0.md b/releases/ampd/2025-05-20-ampd-v1.8.0.md new file mode 100644 index 000000000..eab1b841d --- /dev/null +++ b/releases/ampd/2025-05-20-ampd-v1.8.0.md @@ -0,0 +1,88 @@ +# Ampd v1.8.0 + +| | **Owner** | +|-----------|------------| +| **Created By** | @cjcobb23 <cj@interoplabs.io> | +| **Deployment** | TBD + +| **Network** | **Deployment Status** | **Date** | +|-------------|----------------------|----------| +| **Devnet Amplifier** | Deployed | 2025-05-19 | +| **Stagenet** | - | TBD | +| **Testnet** | Deployed | 2025-05-20 | +| **Mainnet** | - | TBD | + + +[Release](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/ampd-v1.8.0) + +## Background +This ampd release makes changes to XRPL support that aim to increase robustness. +A config change is introduced, affecting the base config as well as XRPL specific config. + +## Config change + +The basic config, regardless of supported chains, requires some additions. The below sections need to be added: +``` +[tm_grpc_timeout] +nanos="0" +secs="5" + +[tofnd_config.timeout] +nanos="0" +secs="3" + +[grpc] +ip_addr = '127.0.0.1' +port = 9090 +global_concurrency_limit = 1024 +concurrency_limit_per_connection = 32 +request_timeout = '30s' +``` +The first two sections control timeout settings for `axelard` gRPC connections and `tofnd` connections. + +The last section controls configuration options for a gRPC server that runs within the ampd process. +This server is not used for anything at the moment, though will be in future versions. +However, be sure the specified port is available. Notably, `axelard` uses port 9090 for gRPC, +so if running ampd and axelard on the same machine, specify a different port. + +The XRPL config entries have changed. Below are the updated entries for testnet: +``` +[[handlers]] +chain_name="xrpl" +chain_rpc_url="https://s.altnet.rippletest.net:51234" +cosmwasm_contract="axelar1pnynr6wnmchutkv6490mdqqxkz54fnrtmq8krqhvglhsqhmu7wzsnc86sy" +type="XRPLMsgVerifier" + +[[handlers]] +chain_name="xrpl" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="XRPLMultisigSigner" +``` + +Below are the updated entries for mainnet: +``` +[[handlers]] +chain_name="xrpl" +chain_rpc_url=[http url] +cosmwasm_contract="axelar14rd4uyrqyl0tw75gjn8zqfppmy08t3x3wrsujeqp37l0hghduanscfvkz6" +type="XRPLMsgVerifier" + +[[handlers]] +chain_name="xrpl" +cosmwasm_contract="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5" +type="XRPLMultisigSigner" +``` + +## 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.8.0) + +### Post Deployment Checklist +Run the below command to output the version: +``` +$ ampd --version +ampd 1.8.0 +``` + +Check `ampd` logs to ensure it restarts fine. Monitor voting and signing for your verifier on axelarscan to verify it's operating correctly. + + 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 <ayush@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | + +| **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 <proposal_id> [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 + 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 <haiyi@interoplabs.io> | +| **Deployment** | @RiceAndMeet <steven@interoplabs.io> | + +| **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 +``` + 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..fe95ac689 --- /dev/null +++ b/releases/cosmwasm/2025-01-ITS-v1.2.1.md @@ -0,0 +1,141 @@ +# Cosmwasm ITS v1.2.1 + +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @cjcobb23 <cj@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-04-24 | +| **Stagenet** | Deployed | 2025-05-07 | +| **Testnet** | Deployed | 2025-05-08 | +| **Mainnet** | Deployed | 2025-05-15 | + + +[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 + +| 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 $DEPOSIT_VALUE --instantiateAddresses $INIT_ADDRESSES --version 1.2.1 +``` + +| 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. + +```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":"$PROVER_ADMIN"}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## 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 +``` + + 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..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 @@ -3,7 +3,7 @@ | | **Owner** | | -------------- | -------------------------------------- | | **Created By** | @blockchainguyy <ayush@interoplabs.io> | -| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io> | | **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) @@ -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` | @@ -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 @@ -281,7 +227,7 @@ axelard q wasm contract-state smart $MULTISIG "{\"is_caller_authorized\": {\"con | **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 \ @@ -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,22 +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 -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 . +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. @@ -365,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. 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..e0341fe61 --- /dev/null +++ b/releases/cosmwasm/2025-02-XRPL-v1.0.0.md @@ -0,0 +1,429 @@ +# XRPL Amplifier + +| | **Owner** | +| -------------- | ---------------------------------------------------------------------------------------------------------- | +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @canhtrinh <canh@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **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": "<chain-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 +node cosmwasm/query.js rewards -n $CHAIN +``` + +## Checklist + +The [XRPL checklist](../xrpl/2025-02-v1.0.0.md) will test GMP & ITS calls. 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 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 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **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. 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 <nikolas@commonprefix.com> | +| **Deployment** | @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **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. 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 <nikolas@commonprefix.com> | +| **Deployment** | @@blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **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. diff --git a/releases/cosmwasm/2025-05-Berachain-GMP-v6.0.4.md b/releases/cosmwasm/2025-05-Berachain-GMP-v6.0.4.md new file mode 100644 index 000000000..53c04894c --- /dev/null +++ b/releases/cosmwasm/2025-05-Berachain-GMP-v6.0.4.md @@ -0,0 +1,361 @@ +# Berachain GMP v6.0.4 + +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @blockchainguyy <ayush@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-20 | +| **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 Berachain connection. + +### Pre-requisites + +Predict the [External Gateway](../evm/2025-05-Berachain-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 `berachain`. + +```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` | `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] +``` + +- `--runAs $RUN_AS_ACCOUNT` & `--runAs` are not required. +- 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-Berachain-ITS-v2.1.0.md) if possible. + + +1. 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` + 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://bepolia.rpc.berachain.com | +| **Stagenet** | https://bepolia.rpc.berachain.com | +| **Testnet** | https://bepolia.rpc.berachain.com | +| **Mainnet** | https://rpc.berachain.com/ | + +```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 [Berachain GMP checklist](../evm/2025-05-Berachain-GMP-v6.0.4.md) will test GMP. 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 <isaac@interoplabs.io> | +| **Deployment** | @isi8787 <isaac@interoplabs.io> | + +| **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/cosmwasm/2025-05-Monad-GMP-v6.0.4.md b/releases/cosmwasm/2025-05-Monad-GMP-v6.0.4.md new file mode 100644 index 000000000..266a74b59 --- /dev/null +++ b/releases/cosmwasm/2025-05-Monad-GMP-v6.0.4.md @@ -0,0 +1,357 @@ +# MonadGMP Amplifier v6.0.4 + +| | **Owner** | +| -------------- | ----------------------------------------- | +| **Created By** | @AttissNgo <attiss@interoplabs.io> | +| **Deployment** | @AttissNgo <attiss@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | -------- | +| **Devnet Amplifier** | Completed | 2025-05-22 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +- [Amplifier Releases](https://github.com/axelarnetwork/axelar-amplifier/releases) +- [VotingVerifier v6.0.4](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/voting-verifier-v1.1.0) `add link to Voting Verifier release` +- [Gateway v6.0.4](https://github.com/axelarnetwork/axelar-amplifier/releases/tag/gateway-v1.1.1) `add link to Gateway release` +- [MultisigProver v6.0.4](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 `Monad` connection. + +### Pre-requisites + +Predict the [External Gateway](../evm/2025-05-Monad-GMP-v6.0.4.md) 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** | 5 | +| **Mainnet** | 5 | + +```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/2025-05-Monad-GMP-v6.0.4.md) will test GMP calls. 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..5333edc36 --- /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 <cj@interoplabs.io> | +| **Deployment** | @isi8787 <isaac@interoplabs.io>, @blockchainguyy <ayush@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-06 | +| **Stagenet** | Deployed | 2025-05-08 | +| **Testnet** | Deployed | 2025-05-06 | +| **Mainnet** | Deployed | 2025-05-15 | + +[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 | `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 $DEPOSIT_AMOUNT --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 $DEPOSIT_AMOUNT +``` + +## 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"} +``` + + 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..116db2ab1 --- /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 <cj@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | - | TBD | +| **Stagenet** | Deployed | 2025-05-08 | +| **Testnet** | Deployed | 2025-05-08 | +| **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 + +| 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 Multisig -t "Upload Multisig contract v1.2.1" -d "Upload Multisig contract v1.2.1" -r $RUN_AS_ACCOUNT --deposit $DEPOSIT_VALUE --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 $DEPOSIT_VALUE +``` + +## 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"} +``` + + 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..01bb47862 --- /dev/null +++ b/releases/cosmwasm/2025-05-Multisig-v2.0.0.md @@ -0,0 +1,58 @@ +# Cosmwasm Multisig v2.0.0 + +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @cjcobb23 <cj@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-10 | +| **Stagenet** | Deployed | 2025-05-20 | +| **Testnet** | - | TBD | +| **Mainnet** | Deployed | 2025-05-20 | + +[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 + +```bash +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v2.0.0" -d "Upload Multisig contract v2.0.0" --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 +``` + +## 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"} +``` 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..2db6d339a --- /dev/null +++ b/releases/cosmwasm/2025-05-Multisig-v2.1.0.md @@ -0,0 +1,59 @@ +# Cosmwasm Multisig v2.1.0 + +| | **Owner** | +| -------------- | ------------------------------------- | +| **Created By** | @cjcobb23 <cj@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-10 | +| **Stagenet** | Deployed | 2025-05-20 | +| **Testnet** | Deployed | 2025-05-19 | +| **Mainnet** | Deployed | 2025-05-19 | + + +[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 + +```bash +node cosmwasm/submit-proposal.js store -c Multisig -t "Upload Multisig contract v2.1.0" -d "Upload Multisig contract v2.1.0" --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 +``` + +## 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"} +``` 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..cfbf2e512 --- /dev/null +++ b/releases/cosmwasm/2025-05-Plume-GMP-v6.0.4.md @@ -0,0 +1,372 @@ +# Plume GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @AttissNgo <attiss@interoplabs.io> | +| **Deployment** | @AttissNgo <attiss@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-30 | +| **Stagenet** | Completed | 2025-05-06 | +| **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` | `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 `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 + +### 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://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. + +| 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/cosmwasm/2025-05-XRPL-v1.2.0.md b/releases/cosmwasm/2025-05-XRPL-v1.2.0.md new file mode 100644 index 000000000..c104fbd41 --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPL-v1.2.0.md @@ -0,0 +1,178 @@ +# XRPL Amplifier v1.2.0 + +| | **Owner** | +| -------------- | --------------------------------------------------------------------------------------------------------- | +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Complete | 2025-05-12 | +| **Stagenet** | Complete | 2025-05-22 | +| **Testnet** | Complete | 2025-05-13 | +| **Mainnet** | Complete | 2025-05-15 | + +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` | `VERIFIER_ADMIN` | +| -------------------- | --------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `100000000` | `axelar1lsasewgqj7698e9a25v3c9kkzweee9cvejq5cs` | +| **Stagenet** | `100000000` | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `2000000000` | `axelar1dtfpfmvpq03l8qcxvrweahcakzgh52xavpumqv` | +| **Mainnet** | `2000000000` | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + + +```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= +VERIFIER_ADMIN= +``` + +```bash +source .env +``` + +1. 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" + +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" + +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" +``` + +5. Migrate contracts. + +| Network | `ADMIN_ADDRESS` | +| -------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1l7vz4m5g92kvga050vk9ycjynywdlk4zhs07dv` | +| **Testnet** | `axelar17qafmnc4hrfa96cq37wg5l68sxh354pj6eky35` | +| **Mainnet** | `axelar1pczf792wf3p3xssk4dmwfxrh6hcqnrjp70danj` | + +```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 + +node cosmwasm/submit-proposal.js migrate \ + -c XrplGateway \ + -t "Migrate XRPLGateway to v1.2.0" \ + -d "Migrate XRPLGateway to v1.2.0" \ + --msg '{}' \ + --fetchCodeId + +node cosmwasm/submit-proposal.js migrate \ + -c XrplVotingVerifier \ + -t "Migrate XRPLVotingVerifier to v1.2.0" \ + -d "Migrate XRPLVotingVerifier to v1.2.0" \ + --msg "{\"admin_address\": \"ADMIN_ADDRESS\"}" \ + --fetchCodeId +``` + +## 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. diff --git a/releases/cosmwasm/2025-05-XRPL.md b/releases/cosmwasm/2025-05-XRPL.md new file mode 100644 index 000000000..35321b94e --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPL.md @@ -0,0 +1,511 @@ +# XRPL Amplifier + +| | **Owner** | +| -------------- | ---------------------------------------------------------------------------------------------------------- | +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-04-19 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | Deployed | 2025-05-26 | + +- [Amplifier Releases](https://github.com/commonprefix/axelar-amplifier/releases) +- [XRPLVotingVerifier v1.3.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-voting-verifier-v1.3.0) +- [XRPLGateway v1.3.0](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.3.0) +- [XRPLMultisigProver v1.4.1](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.4.1) + +## 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` | `5000` | `50` | + +```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]", + "adminAddress": "[admin 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.3.0/xrpl_voting_verifier.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.4.1/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-gateway/1.3.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.3.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.4.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.3.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. + +``` +7055d307103d5bcbed4c9465f40084acdb0f154a8dda0d8c0ee68f865892874a wasm/xrpl_voting_verifier.wasm +bee1192a8ae1d8928127bbb23e259cfadf817b930c5176cf83f7985240a7254a wasm/xrpl_multisig_prover.wasm +9c626d4ab34d3e8cd7426b72ad476b8adce05bed3274ca1b35523e66bbcf7688 wasm/xrpl_gateway.wasm +``` + +4. Add `INIT_ADDRESSES` to `.env`. + +| Network | `INIT_ADDRESSES` | `RUN_AS_ACCOUNT` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **Devnet-amplifier** | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | `axelar1zlr7e5qf3sz7yf890rkh9tcnu87234k6k7ytd9` | +| **Stagenet** | `axelar1pumrull7z8y5kc9q4azfrmcaxd8w0779kg6anm,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12qvsvse32cjyw60ztysd3v655aj5urqeup82ky` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Testnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar12f2qn005d4vl03ssjq07quz6cja72w5ukuchv7` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | +| **Mainnet** | `axelar1uk66drc8t9hwnddnejjp92t22plup0xd036uc2,axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj,axelar1nctnr9x0qexemeld5w7w752rmqdsqqv92dw9am` | `axelar10d07y265gmmuvt4z0w9aw880jnsr700j7v9daj` | + +> **_NOTE:_** +> Set `RUN_AS_ACCOUNT` to an EOA account's address instead of the governance address to avoid having to instantiate the contracts via another governance proposal. + +```yaml +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +``` + +5. Store `XRPLVotingVerifier`. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplVotingVerifier \ + -t "Upload XRPLVotingVerifier contract v1.3.0" \ + -d "Upload XRPLVotingVerifier contract v1.3.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.3.0" \ + -d "Upload XRPLGateway contract v1.3.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.4.1" \ + -d "Upload XRPLMultisigProver contract v1.4.1" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +8. Set environment variables. + +- Network-specific environment variables: These variables need to be updated by the network. + +Modify the CosmWasm `submit-proposal` script as follows: + +```diff +--- a/cosmwasm/submit-proposal.js ++++ b/cosmwasm/submit-proposal.js +@@ -45,7 +45,14 @@ const { addAmplifierOptions } = require('./cli-utils'); + const predictAddress = async (client, contractConfig, options) => { + const { contractName, salt, chainName, runAs } = options; + +- const { checksum } = await client.getCodeDetails(contractConfig.codeId); ++ const checksums = { ++ XrplVotingVerifier: '7055d307103d5bcbed4c9465f40084acdb0f154a8dda0d8c0ee68f865892874a', ++ XrplMultisigProver: 'bee1192a8ae1d8928127bbb23e259cfadf817b930c5176cf83f7985240a7254a', ++ XrplGateway: '9c626d4ab34d3e8cd7426b72ad476b8adce05bed3274ca1b35523e66bbcf7688', ++ }; ++ ++ const checksum = checksums[contractName]; + const contractAddress = instantiate2Address(fromHex(checksum), runAs, getSalt(salt, contractName, chainName), 'axelar'); + + printInfo(`Predicted address for ${chainName ? chainName.concat(' ') : ''}${contractName}. Address`, contractAddress); +@@ -120,7 +127,7 @@ const instantiate = async (client, wallet, config, options) => { + const { contractName, instantiate2, predictOnly } = options; + const { contractConfig } = getAmplifierContractConfig(config, options); + +- contractConfig.codeId = await getCodeId(client, config, options); + + let contractAddress; +``` + +Run it for each XRPL Amplifier contract, to predict its address: + +```bash +node cosmwasm/submit-proposal.js instantiate \ + --predictOnly \ + -c XrplVotingVerifier \ + -n $CHAIN \ + -t "Instanitate XRPLVotingVerifier contract v1.3.0" \ + -d "Instantiate XRPLVotingVerifier contract v1.3.0" \ + --deposit $DEPOSIT_VALUE \ + --runAs $RUN_AS_ACCOUNT + +node cosmwasm/submit-proposal.js instantiate \ + --predictOnly \ + -c XrplGateway \ + -n $CHAIN \ + -t "Instanitate XRPLGateway contract v1.3.0" \ + -d "Instanitate XRPLGateway contract v1.3.0" \ + --deposit $DEPOSIT_VALUE \ + --runAs $RUN_AS_ACCOUNT + +node cosmwasm/submit-proposal.js instantiate \ + --predictOnly \ + -c XrplMultisigProver \ + -n $CHAIN \ + -t "Instanitate XRPLMultisigProver contract v1.4.1" \ + -d "Instanitate XRPLMultisigProver contract v1.4.1" \ + --deposit $DEPOSIT_VALUE \ + --runAs $RUN_AS_ACCOUNT +``` + +Update `.env` accordingly: + +```bash +XRPL_VOTING_VERIFIER= # predicted address +XRPL_GATEWAY= # predicted address +XRPL_MULTISIG_PROVER= # predicted address +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] +ROUTER=[router contract address] +MULTISIG=[multisig contract address] +``` + +### Register XRPLGateway on Router + +9. 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": "<chain-name>", + "gateway": { + "address": "axelar1hzz0s0ucrhdp6tue2lxk3c03nj6f60qy463we7lgx0wudd72ctmsee8enx" + }, + "frozen_status": 0, + "msg_id_format": "hex_tx_hash" + } +} +``` + +### Update verifiers + +10. 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" +``` + +11. 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 +``` + +### Register Amplifier contracts on Coordinator & Multisig + +12. 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\" + } + }" +``` + +13. 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 +} +``` + +### Create reward pools + +14. 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"]` | `1260000000` | + +```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\" + } + } + }" +``` + +15. 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\" + } + } + }" +``` + +16. 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 +``` + +17. Ensure the reward pools were created correctly. + +```bash +node cosmwasm/query.js rewards -n $CHAIN +``` + +### Instantiate Amplifier contracts + +Once the `store` proposals have been executed, instantiate the XRPL CosmWasm contracts: + +- Confirm `XrplVotingVerifier(v1.3.0)`, `XrplGateway(v1.3.0)` and `XrplMultisigProver(v1.4.1)` contracts are already stored in `$ENV.json`: + +```bash +XrplVotingVerifier(v1.3.0) -> "storeCodeProposalCodeHash": "TBD" +XrplGateway(v1.3.0) -> "storeCodeProposalCodeHash": "TBD" +XrplMultisigProver(v1.4.1) -> "storeCodeProposalCodeHash": "TBD" +``` + +| 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] +``` + +18. Instantiate `XRPLVotingVerifier`. + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c XrplVotingVerifier --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +19. Instantiate `XRPLGateway`. + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c XrplGateway --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +20. Instantiate `XRPLMultisigProver`. + +```bash +node ./cosmwasm/deploy-contract.js instantiate -c XrplMultisigProver --fetchCodeId --instantiate2 --admin $CONTRACT_ADMIN +``` + +21. Ensure instantiated contract addresses match predicted ones. + +```bash +cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.XrplVotingVerifier[\"$CHAIN\"].address" | tr -d '"' | grep $XRPL_VOTING_VERIFIER +cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.XrplGateway[\"$CHAIN\"].address" | tr -d '"' | grep $XRPL_GATEWAY +cat ./axelar-chains-config/info/$ENV.json | jq ".axelar.contracts.XrplMultisigProver[\"$CHAIN\"].address" | tr -d '"' | grep $XRPL_MULTISIG_PROVER +``` + +## Checklist + +The [XRPL checklist](../xrpl/2025-02-v1.0.0.md) will test GMP & ITS calls. diff --git a/releases/cosmwasm/2025-05-XRPLGateway-v1.3.0.md b/releases/cosmwasm/2025-05-XRPLGateway-v1.3.0.md new file mode 100644 index 000000000..a820f48c2 --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPLGateway-v1.3.0.md @@ -0,0 +1,119 @@ +# XRPLGateway v1.3.0 + +| | **Owner** | +|----------------|------------------------------------------------------------------------------------------------------------| +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-05-19 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-gateway-v1.3.0) + +## Background + +Changes in this release: + +1. Emit ITS events + +## Deployment + +- This rollout upgrades XRPLGateway from `v1.2.0` to `v1.3.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` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **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.3.0/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.3.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. + +``` +9c626d4ab34d3e8cd7426b72ad476b8adce05bed3274ca1b35523e66bbcf7688 wasm/xrpl_gateway.wasm +``` + +4. Store `XRPLGateway` contract. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplGateway \ + -t "Upload XRPLGateway contract v1.3.0" \ + -d "Upload XRPLGatway contract v1.3.0" \ + -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.3.0" \ + -d "Migrate XRPLGateway to v1.3.0" \ + --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.3.0"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. diff --git a/releases/cosmwasm/2025-05-XRPLMultisigProver-v1.3.1.md b/releases/cosmwasm/2025-05-XRPLMultisigProver-v1.3.1.md new file mode 100644 index 000000000..6a187a7c7 --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPLMultisigProver-v1.3.1.md @@ -0,0 +1,119 @@ +# XRPLMultisigProver v1.3.1 + +| | **Owner** | +|----------------|------------------------------------------------------------------------------------------------------------| +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-05-14 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.3.1) + +## Background + +Changes in this release: + +1. Pass full unsigned TX as digest to multisig, making `VerifySignature` stateless + +## Deployment + +- This rollout upgrades XRPLMultisigProver from `v1.2.0` to `v1.3.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` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **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_MULTISIG_PROVER= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download `XRPLMultisigProver` wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.3.1/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +``` + +3. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.3.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 +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +3e8d8f416b230db6810f04aa7c9badd8d5fe183c00916ab24f953de365d4a7f8 wasm/xrpl_multisig_prover.wasm +``` + +4. Store `XRPLMultisigProver` contract. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplMultisigProver \ + -t "Upload XRPLMultisigProver contract v1.3.1" \ + -d "Upload XRPLMultisigProver contract v1.3.1" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +6. Migrate `XRPLMultisigProver` contract. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplMultisigProver \ + -t "Migrate XRPLMultisigProver to v1.3.1" \ + -d "Migrate XRPLMultisigProver to v1.3.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify `XRPLMultisigProver` contract version: + +```bash +axelard query wasm contract-state raw $XRPL_MULTISIG_PROVER 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-multisig-prover","version":"1.3.1"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. diff --git a/releases/cosmwasm/2025-05-XRPLMultisigProver-v1.4.1.md b/releases/cosmwasm/2025-05-XRPLMultisigProver-v1.4.1.md new file mode 100644 index 000000000..b56bf7abd --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPLMultisigProver-v1.4.1.md @@ -0,0 +1,120 @@ +# XRPLMultisigProver v1.4.1 + +| | **Owner** | +|----------------|------------------------------------------------------------------------------------------------------------| +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-05-19 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-multisig-prover-v1.4.1) + +## Background + +Changes in this release: + +1. Emit events upon prover message confirmation +1. Revert if interchain transfer data is not `None` + +## Deployment + +- This rollout upgrades XRPLMultisigProver from `v1.3.1` to `v1.4.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` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **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_MULTISIG_PROVER= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download `XRPLMultisigProver` wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.4.1/xrpl_multisig_prover.wasm --directory-prefix=$ARTIFACT_PATH +``` + +3. Download and verify checksum. + +```bash +wget -O checksums.txt $RELEASES_BASE_URL/releases/cosmwasm/xrpl-multisig-prover/1.4.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 +``` + +3. Make sure your output matches with the following expected output before proceeding. + +``` +bee1192a8ae1d8928127bbb23e259cfadf817b930c5176cf83f7985240a7254a wasm/xrpl_multisig_prover.wasm +``` + +4. Store `XRPLMultisigProver` contract. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplMultisigProver \ + -t "Upload XRPLMultisigProver contract v1.4.1" \ + -d "Upload XRPLMultisigProver contract v1.4.1" \ + -a "$ARTIFACT_PATH/xrpl_multisig_prover.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +6. Migrate `XRPLMultisigProver` contract. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplMultisigProver \ + -t "Migrate XRPLMultisigProver to v1.4.1" \ + -d "Migrate XRPLMultisigProver to v1.4.1" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify `XRPLMultisigProver` contract version: + +```bash +axelard query wasm contract-state raw $XRPL_MULTISIG_PROVER 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-multisig-prover","version":"1.4.1"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. diff --git a/releases/cosmwasm/2025-05-XRPLVotingVerifier-v1.3.0.md b/releases/cosmwasm/2025-05-XRPLVotingVerifier-v1.3.0.md new file mode 100644 index 000000000..1ed69c287 --- /dev/null +++ b/releases/cosmwasm/2025-05-XRPLVotingVerifier-v1.3.0.md @@ -0,0 +1,119 @@ +# XRPLVotingVerifier v1.3.0 + +| | **Owner** | +|----------------|------------------------------------------------------------------------------------------------------------| +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io>, @isi8787 <isaac@interoplabs.io>, @k4m4 <nikolas@commonprefix.com> | + +| **Network** | **Deployment Status** | **Date** | +|----------------------|-----------------------|------------| +| **Devnet Amplifier** | Deployed | 2025-05-19 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/commonprefix/axelar-amplifier/releases/tag/xrpl-voting-verifier-v1.3.0) + +## Background + +Changes in this release: + +1. Allow admin to `ChangeAdmin` + +## Deployment + +- This rollout upgrades XRPLVotingVerifier from `v1.2.0` to `v1.3.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` | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **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_VOTING_VERIFIER= +INIT_ADDRESSES= +RUN_AS_ACCOUNT= +DEPOSIT_VALUE= +``` + +```bash +source .env +``` + +2. Download `XRPLVotingVerifier` wasm bytecode. + +```bash +mkdir $ARTIFACT_PATH +wget $RELEASES_BASE_URL/releases/cosmwasm/xrpl-voting-verifier/1.3.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-voting-verifier/1.3.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. + +``` +7055d307103d5bcbed4c9465f40084acdb0f154a8dda0d8c0ee68f865892874a wasm/xrpl_voting_verifier.wasm +``` + +4. Store `XRPLVotingVerifier` contract. + +```bash +node cosmwasm/submit-proposal.js store \ + -c XrplVotingVerifier \ + -t "Upload XRPLVotingVerifier contract v1.3.0" \ + -d "Upload XRPLVotingVerifier contract v1.3.0" \ + -a "$ARTIFACT_PATH/xrpl_voting_verifier.wasm" \ + --deposit $DEPOSIT_VALUE \ + --instantiateAddresses $INIT_ADDRESSES +``` + +6. Migrate `XRPLVotingVerifier` contract. + +```bash +node cosmwasm/submit-proposal.js migrate \ + -c XrplVotingVerifier \ + -t "Migrate XRPLVotingVerifier to v1.3.0" \ + -d "Migrate XRPLVotingVerifier to v1.3.0" \ + --msg '{}' \ + --fetchCodeId \ + --deposit $DEPOSIT_VALUE +``` + +## Checklist + +Verify `XRPLVotingVerifier` contract version: + +```bash +axelard query wasm contract-state raw $XRPL_VOTING_VERIFIER 636F6E74726163745F696E666F -o json | jq -r '.data' | base64 -d +``` + +Expected output + +```bash +{"contract":"xrpl-voting-verifier","version":"1.3.0"} +``` + +Follow the [XRPL checklist](../xrpl/2025-02-v1.0.0.md) to ensure that all flows are still functioning as expected. diff --git a/releases/cosmwasm/EVM-CosmWasm-Release-Template.md b/releases/cosmwasm/EVM-CosmWasm-Release-Template.md new file mode 100644 index 000000000..06efa88ce --- /dev/null +++ b/releases/cosmwasm/EVM-CosmWasm-Release-Template.md @@ -0,0 +1,369 @@ +# < 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\" + } + }" +``` + +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\" + } + } + }" +``` + +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 +``` + +11. Confirm proposals have passed + +- Check proposals on block explorer (i.e. https://axelarscan.io/proposals) + - "Register Gateway for `$CHAIN`" + - "Register Multisig Prover for `$CHAIN`" + - "Authorize Multisig Prover for `$CHAIN`" + - "Create pool for `$CHAIN` in `$CHAIN` voting verifier" + - "Create pool for `$CHAIN` in axelar multisig" + - (optional) "Register `$CHAIN` on ITS Hub" + +- Check Gateway registered at Router +```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" + } +} +``` + +- Check Multisig Prover authorized on Multisig +```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 +} +``` + +- Check reward pool to confirm funding worked: + +```bash +node cosmwasm/query.js rewards -n $CHAIN +``` + +12. 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/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..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 @@ -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) @@ -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 @@ -90,7 +90,7 @@ npm ci | Network | Addresses | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Devnet-amplifier** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | -| **Stagenet** | `0xba76c6980428A0b10CFC5d8ccb61949677A61233` | +| **Stagenet** | `0xBeF25f4733b9d451072416360609e5A4c115293E` | | **Testnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | | **Mainnet** | `0xB8Cd93C83A974649D76B1c19f311f639e62272BC`, `0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05`, `0x5b593E7b1725dc6FcbbFe80b2415B19153F94A85`, `0xE86375704CDb8491a5Ed82D90DceCE02Ee0ac25F` | @@ -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 284d171e9..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) @@ -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`. @@ -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/2025-05-Berachain-GMP-v6.0.4.md b/releases/evm/2025-05-Berachain-GMP-v6.0.4.md new file mode 100644 index 000000000..47697dff6 --- /dev/null +++ b/releases/evm/2025-05-Berachain-GMP-v6.0.4.md @@ -0,0 +1,252 @@ +# Berachain GMP v6.0.4 + +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @blockchainguyy <ayush@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-23 | +| **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 Berachain. +## Deployment + +Create an `.env` config. `CHAIN` should be set to `berachain`. + +```yaml +PRIVATE_KEY=xyz +ENV=xyz +CHAINS=xyz +``` + +An initial chain config needs to be added to `${ENV}.json` file under `CHAINS` key. + +Update npm dependencies (including contracts) + +```bash +npm ci && npm run build +``` + +#### Devnet-Amplifier / Stagenet / Testnet + +```json +"$CHAIN": { + "name": "Berachain", + "axelarId": "$CHAIN", + "chainId": 80069, + "rpc": "https://bepolia.rpc.berachain.com", + "tokenSymbol": "BERA", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Berascan", + "url": "https://testnet.berascan.com/", + "api": "https://api-testnet.berascan.com/api" + }, + "contracts": {} + } +``` + +#### Mainnet + +```json +"$CHAIN": { + "name": "Berachain", + "axelarId": "$CHAIN", + "chainId": 80094, + "rpc": "https://rpc.berachain.com/", + "tokenSymbol": "BERA", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "Berascan", + "url": "https://berascan.com/", + "api": "https://rpc.berachain.com/" + }, + "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 +``` + +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 `collector` to `Operators` address from 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 contracts on mainnet and testnet. + +For Mainnet + +```bash +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 +``` + +For Testnet + +```bash +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 + +The following checks should be performed after the rollout + +### Berachain -> 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 0x1234 +``` + +### EVM -> Berachain 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 0x1234 +``` diff --git a/releases/evm/2025-05-Berachain-ITS-v2.1.0.md b/releases/evm/2025-05-Berachain-ITS-v2.1.0.md new file mode 100644 index 000000000..8cd02a7ac --- /dev/null +++ b/releases/evm/2025-05-Berachain-ITS-v2.1.0.md @@ -0,0 +1,104 @@ +## Berachain ITS v2.1.0 + +| | **Owner** | +| -------------- | -------------------------------------- | +| **Created By** | @blockchainguyy <ayush@interoplabs.io> | +| **Deployment** | @blockchainguyy <ayush@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Deployed | 2025-05-23 | +| **Stagenet** | - | TBD | +| **Testnet** | - | TBD | +| **Mainnet** | - | TBD | + +[Release](https://github.com/axelarnetwork/interchain-token-service/releases/tag/v2.1.0) + +## Background + +- This is the Berachain ITS release. + +## Deployment + +Ensure that [Berachain GMP](../evm/2025-05-Berachain-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 `berachain`. + +```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 Berachain ITS on ITS Hub + +Please refer to `$DEPOSIT_VALUE` and `$RUN_AS_ACCOUNT` from [Berachain GMP Amplifier](../cosmwasm/2025-04-Berachain-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" \ +``` + +## Set Berachain as trusted chain on remote ITS contracts + +Set Berachain 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] +``` 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..b6977a075 --- /dev/null +++ b/releases/evm/2025-05-Hyperliquid-GMP-v6.0.4.md @@ -0,0 +1,304 @@ +# Hyperliquid GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @isi8787 <isaac@interoplabs.io> | +| **Deployment** | @isi8787 <isaac@interoplabs.io> | + +| **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. + + 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`: + +- 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 7) + +| 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 <isaac@interoplabs.io> | +| **Deployment** | @isi8787 <isaac@interoplabs.io> | + +| **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 diff --git a/releases/evm/2025-05-Monad-GMP-v6.0.4.md b/releases/evm/2025-05-Monad-GMP-v6.0.4.md new file mode 100644 index 000000000..bade7d603 --- /dev/null +++ b/releases/evm/2025-05-Monad-GMP-v6.0.4.md @@ -0,0 +1,241 @@ +# Monad GMP v6.0.4 + +| | **Owner** | +| -------------- | ----------------------------------------- | +| **Created By** | @AttissNgo <attiss@interoplabs.io> | +| **Deployment** | @AttissNgo <attiss@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | -------- | +| **Devnet Amplifier** | Completed | 2025-05-23 | +| **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 `monad`. + +```yaml +PRIVATE_KEY=<deployer private key> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAINS=monad +``` + +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": "Monad", + "axelarId": "monad", + "chainId": 10143, + "rpc": "https://testnet-rpc.monad.xyz", + "tokenSymbol": "MON", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "chainType": "evm", + "explorer": { + "name": "MonVision", + "url": "https://testnet.monadexplorer.com" + }, + "contracts": {} + } +``` + +#### Mainnet + +```bash +"$CHAIN": { + "name": "Monad", + "axelarId": "monad", + "chainId": TBD, + "rpc": "TBD", + "tokenSymbol": "MON", + "confirmations": 1, + "finality": "finalized", + "decimals": 18, + "approxFinalityWaitTime": 1, + "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** | `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"}' +``` + +9. 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/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..90f1386ff --- /dev/null +++ b/releases/evm/2025-05-Plume-GMP-v6.0.4.md @@ -0,0 +1,247 @@ +# Plume GMP v6.0.4 + +| | **Owner** | +| -------------- | ---------------------------------- | +| **Created By** | @AttissNgo <attiss@interoplabs.io> | +| **Deployment** | @AttissNgo <attiss@interoplabs.io>, @milapsheth <milap@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-30 | +| **Stagenet** | Completed | 2025-05-07 | +| **Testnet** | Completed | 2025-05-27 | +| **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** | `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 +``` + +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 +# For mainnet +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +# For testnet +node evm/ownership.js -c AxelarGateway --action transferOwnership --newOwner 0x6f24A47Fc8AE5441Eb47EFfC3665e70e69Ac3F05 + +node evm/ownership.js -c AxelarGasService --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..fcc8a7252 --- /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 <attiss@interoplabs.io> | +| **Deployment** | @AttissNgo <attiss@interoplabs.io> | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-30 | +| **Stagenet** | Completed | 2025-05-07 | +| **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 `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] +``` diff --git a/releases/evm/EVM-GMP-Release-Template.md b/releases/evm/EVM-GMP-Release-Template.md new file mode 100644 index 000000000..d0f051f9e --- /dev/null +++ b/releases/evm/EVM-GMP-Release-Template.md @@ -0,0 +1,244 @@ +# < 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 +OPERATORS=$(cat "./axelar-chains-config/info/$ENV.json" | jq ".chains[\"$CHAIN\"].contracts.Operators.address" | tr -d '"') + +node evm/deploy-upgradable.js -c AxelarGasService -m [deployMethod] --args "{\"collector\": \"$OPERATORS\"}" +``` + +9. 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] +``` 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 +``` 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 (<ahram@interoplabs.io>) | +| **Deployment** | @RiceAndMeet (<steven@interoplabs.io>) | | **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 +- <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 +- <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 770d3a76f..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 (<ahram@interoplabs.io>) | +| **Deployment** | @RiceAndMeet (<steven@interoplabs.io>) | | **Network** | **Deployment Status** | **Date** | | -------------------- | --------------------- | ---------- | @@ -37,7 +37,7 @@ CHAIN=<stellar-2025-q1|stellar> 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 @@ -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: <https://community.axelar.network/t/proposal-add-its-hub-to-mainnet/3227> ```bash node cosmwasm/submit-proposal.js \ @@ -108,7 +108,7 @@ ITS_HUB_ADDRESS=<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 +- <https://docs.axelar.dev/dev/amplifier/chain-integration/relay-messages> ### Stellar to EVM @@ -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=<stellar_deployer_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-GMP-v1.1.0.md b/releases/stellar/2025-03-GMP-v1.1.0.md deleted file mode 100644 index 39aa44203..000000000 --- a/releases/stellar/2025-03-GMP-v1.1.0.md +++ /dev/null @@ -1,189 +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=<stellar_deployer_key> -ENV=<devnet-amplifier|stagenet|testnet|mainnet> -CHAIN=<stellar-2025-q1|stellar> -``` - -A Stellar chain config should already exist under a `${ENV}.json` file under `chains` key. - -### Steps - -1. Request Tokens from Faucet - -```bash -node stellar/faucet.js -``` - -2. Verify deployer address - -| Network | `deployer address` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `GDUITDF2LI3R5HM4KYRLLNRLEWKYBFVZVOEB6HSL7EOW2KO2LD6V4GPM` | -| **Stagenet** | `GAESJFWHAL6ZJC22P32GVWTJQZ6OZ3H5WCVNQ3O2L2XR7EEOJ4PB4I6Y` | -| **Testnet** | `GBAPBVQIFCOMGYHFUIXIEGGATEQMVSVQGVZNN5WWFAVKET6M3M4644EG` | -| **Mainnet** | `GCUIBOS2JPTJSJ3PFMXU4RD67PS5QT7FG3HSXHFZQGVNIYXPYODKRJ7S` | - -3. 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 - -4. Upgrade the `AxelarGateway` contract & migrate storage schema - -```bash -node stellar/deploy-contract.js upgrade AxelarGateway --version v1.1.0 --migration-data '[("<sourceChainN>", "<messageIdN>")]' -``` - -5. 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 - -6. Upgrade `AxelarOperators` & migrate storage schema - -```bash -node stellar/deploy-contract.js upgrade AxelarOperators --version v1.1.0 --migration-data '["<operatorN>"]' -``` - -7. 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 - -```bash -node stellar/deploy-contract.js upgrade AxelarGasService --version v1.1.0 -``` - -9. Deploy the `AxelarExample` contract with dummy ITS address -- 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 -``` - -## 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=<evm_deployer_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=<stellar_deployer_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..8503973c2 --- /dev/null +++ b/releases/stellar/2025-03-GMP-v1.1.1.md @@ -0,0 +1,205 @@ +# Stellar GMP v1.1.1 + +| | **Owner** | +| -------------- | ------------------------------------ | +| **Created By** | @nbayindirli (<noah@interoplabs.io>) | +| **Deployment** | @nbayindirli (<noah@interoplabs.io>) | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-08 | +| **Stagenet** | Completed | 2025-04-08 | +| **Testnet** | Completed | 2025-04-13 | +| **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) + +## 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=<stellar_deployer_key> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAIN=<stellar-2025-q1|stellar> +``` + +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** | `GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3` | + +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","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 + +```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 '<[["<sourceChainN>", "<messageIdN>"]]>' +``` + +- 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 '["<operatorN>"]' +``` + +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.3 + +```bash +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 +``` + +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`. + +### Stellar → EVM + +1. Send a GMP call + +```bash +node stellar/gmp.js send [destination-chain] [destination-address] 0x1234 --gas-amount 1000000 +``` + +2. Verify message was passed successfully via the AxelarScan link below. + +| 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://axelarscan.io/) | + +### EVM → Stellar + +1. Send a GMP call + +```bash +node evm/gateway.js -n [source-chain] --action callContract --destinationChain $CHAIN --destination [destination-address] --payload 0x1234 +``` + +2. Verify message was passed successfully via the AxelarScan link below. + +| 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://axelarscan.io/) | diff --git a/releases/stellar/2025-03-ITS-v1.1.0.md b/releases/stellar/2025-03-ITS-v1.1.0.md deleted file mode 100644 index e68e9b45f..000000000 --- a/releases/stellar/2025-03-ITS-v1.1.0.md +++ /dev/null @@ -1,192 +0,0 @@ -# Stellar ITS 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 | - -- [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) - -## Background - -- This is the v1.1.0 Stellar ITS release. - -Contract changes in the release: - -- See changes in [GMP v1.1.0](./2025-02-GMP-v1.1.0.md) - -## Deployment - -Ensure that [Stellar GMP](./2025-02-GMP-v1.1.0.md) is upgraded first. - -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=<stellar_deployer_key> -ENV=<devnet-amplifier|stagenet|testnet|mainnet> -CHAIN=<stellar-2025-q1|stellar> -``` - -1. Retrieve full list of tokenIds supported by Stellar ITS - -| Network | `InterchainTokenService storage` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | [source](https://stellar.expert/explorer/testnet/contract/CCD7JXLHOJKQDPKOXQTK6PYACFYQPRC25IVKHQDOMP3ANFMBWO5FZZAN/storage) | -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -| Network | `InterchainTokenService migration data` | -| -------------------- | ---------------------------------------------------------- | -| **Devnet-amplifier** | `TBD` | // TODO: ADD -| **Stagenet** | `TBD` | // TODO: ADD -| **Testnet** | `TBD` | // TODO: ADD -| **Mainnet** | `TBD` | // TODO: ADD - -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. - -4. 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 v1.1.0 --migration-data '[("<tokenIdN>", "<epochN>")]' -``` - -NOTE: InterchainToken + TokenManager contracts will be migrated automatically - -5. 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 - -```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 -``` - -## Checklist - -The following checks should be performed after the rollout - -```bash -ITS_HUB_ADDRESS=<its_hub_address> -``` - -### Execute Command - -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 - -- Note: The final execute step of the GMP call on EVM can be performed via: - -```bash -# Change `PRIVATE_KEY `.env` to EVM -PRIVATE_KEY=<evm_deployer_key> - -node evm/gateway.js -n [destination-chain] --action execute --payload $PAYLOAD --sourceChain axelar --sourceAddress $ITS_HUB_ADDRESS --messageId [message-id] --destination [destination-address] -``` - -1. Deploy Native Interchain Token - -```bash -node stellar/its.js deploy-interchain-token TEST test 18 0x1234 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] --gas-amount 10000000 -``` - -3. Deploy Remote Canonical Token - -```bash -# Use XLM based on network: -# Devnet-Amplifier / Stagenet / Testnet: CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC -# Mainnet: CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA - -node stellar/its.js register-canonical-token [token-address] - -node stellar/its.js deploy-remote-canonical-token [token-address] [destination-chain] --gas-amount 10000000 -``` - -4. Interchain Token Transfer for Canonical Token - -```bash -node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --gas-amount 10000000 -``` - -### EVM to Stellar - -- Note: Execute encode-recipient to get the encoded destination address - -```bash -# Change `PRIVATE_KEY in `.env` to Stellar -PRIVATE_KEY=<stellar_deployer_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] -``` - -1. Deploy Native Interchain Token - -```bash -node evm/interchainTokenFactory.js --action deployInterchainToken -n [source-chain] --destinationChain $CHAIN --salt "salt" --name "test" --symbol "TEST" --decimals 18 - -# Adjust `--gasValue` or add gas directly from axelarscan for mainnet -node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n [source-chain] --destinationChain $CHAIN --salt "salt" --gasValue 1000000000000000000 -``` - -2. Interchain Token Transfer for Native Interchain Token - -```bash -node evm/its.js --action interchainTransfer -n [source-chain] --destinationChain $CHAIN --destinationAddress [encoded-recipient] --tokenId [token-id] --amount [amount] -``` - -3. Deploy Remote Canonical Token - -```bash -node evm/interchainTokenFactory.js --action registerCanonicalInterchainToken -n [source-chain] --destinationChain $CHAIN --tokenAddress [token-address] - -node evm/interchainTokenFactory.js --action deployRemoteCanonicalInterchainToken -n [source-chain] --destinationChain $CHAIN --tokenAddress [token-address] --gasValue 1000000000000000000 -``` - -4. Interchain Token Transfer for Canonical Token - -```bash -node evm/its.js --action interchainTransfer -n [source-chain] --destinationChain $CHAIN --destinationAddress [encoded-recipient] --tokenId [token-id] --amount [amount] --gasValue 1000000000000000000 -``` diff --git a/releases/stellar/2025-03-ITS-v1.1.1.md b/releases/stellar/2025-03-ITS-v1.1.1.md new file mode 100644 index 000000000..c02e24524 --- /dev/null +++ b/releases/stellar/2025-03-ITS-v1.1.1.md @@ -0,0 +1,198 @@ +# Stellar ITS v1.1.1 + +| | **Owner** | +| -------------- | ------------------------------------ | +| **Created By** | @nbayindirli (<noah@interoplabs.io>) | +| **Deployment** | @nbayindirli (<noah@interoplabs.io>) | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-04-08 | +| **Stagenet** | Completed | 2025-04-08 | +| **Testnet** | Completed | 2025-04-13 | +| **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) + +## Background + +- This is the v1.1.1 Stellar ITS release. + +Contract changes in the release: + +- See changes in [GMP v1.1.1](./2025-02-GMP-v1.1.1.md) + +## Deployment + +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. + +```yaml +# Change `PRIVATE_KEY in `.env` to Stellar +PRIVATE_KEY=<stellar_deployer_key> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAIN=<stellar-2025-q1|stellar> +``` + +1. Verify deployer address + +| Network | `deployer address` | +| -------------------- | ---------------------------------------------------------- | +| **Devnet-amplifier** | `GCRN3JXRVXHQTFQFM7NR4TTTORGZDCJWPIOLPQQHL6WMAQGVMWSXJL3Q` | +| **Stagenet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Testnet** | `GBP4FSAOFV5O72AB3YQRDCYVD47W4N7KQK3OJODXSU3OBPNGKX4SQTJ3` | +| **Mainnet** | `GC2SJ4YXCMP2LYXMXBNJMK6SNK4XUR7TGJXY4GA3VACNMCZVCQ6VFGG3` | + +2. Take note of the current bytes value for `TokenManagerWasmHash` via the explorer link below. + +3. Take note of the current bytes value for `InterchainTokenWasmHash` via the explorer link below. + +4. Upload `TokenManager` & retrieve WASM hash + +```bash +node stellar/deploy-contract.js upload TokenManager --version 1.1.1 +``` + +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.1 +``` + +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.2 --migration-data '{"newTokenManagerWasmHash":"<new-token-manager-wasm-hash-bytes-from-above>","newInterchainTokenWasmHash":"<new-interchain-token-wasm-hash-bytes-from-above>"}' +``` + +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=" "sF8KrUqC9SrWClGQyl3oDK2QfbV4LI6jqVpBZhCYRPA=" "+qa+qidI5P8g0RG6rRHsU27kxgjD5Lc+bD/XkGWShKo=" "xHlsRTIOfLZxlLAiX4ruZM+diCMXxWEGmNfBfespLw0=" "0ZLTZvcC/ljjXUjx2SZHEchrQYgiApj2qZ/XfNnACXM=" "JuOWPNpbr6ugOgKTMnzWAl+tyBbSth9pzsPD43NT0j4="` | + +8. Pause the `InterchainTokenService` contract + +```bash +node stellar/contract.js pause InterchainTokenService +``` + +9. Verify `InterchainTokenService` is paused + +```bash +node stellar/contract.js paused InterchainTokenService +``` + +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-tokens "tokenId1" "tokenId2" "tokenIdN" --version 1.1.1 +``` + +NOTE: `InterchainToken` + `TokenManager` contracts will be migrated automatically. + +12. Unpause the `InterchainTokenService` contract + +```bash +node stellar/contract.js unpause InterchainTokenService +``` + +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. + +14. Deploy the `Upgrader` contract + +```bash +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 +``` + +15. Remove the `createUpgradeAuths()` code added in the first step. + +## 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] --gas-amount 10000000 +``` + +3. Deploy Remote Canonical Token + +```bash +# Use XLM based on network: +# Devnet-Amplifier / Stagenet / Testnet: CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC +# Mainnet: CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA + +node stellar/its.js register-canonical-token [token-address] + +node stellar/its.js deploy-remote-canonical-token [token-address] [destination-chain] --gas-amount 10000000 +``` + +4. Interchain Token Transfer for Canonical Token + +```bash +node stellar/its.js interchain-transfer [token-id] [destination-chain] [destination-address] [amount] --gas-amount 10000000 +``` + +### EVM → Stellar + +1. Deploy Native Interchain Token + +```bash +node evm/interchainTokenFactory.js --action deployInterchainToken -n [source-chain] --destinationChain $CHAIN --salt "salt" --name "test" --symbol "TEST" --decimals 18 + +# Adjust `--gasValue` or add gas directly from axelarscan for mainnet +node evm/interchainTokenFactory.js --action deployRemoteInterchainToken -n [source-chain] --destinationChain $CHAIN --salt "salt" --gasValue 1000000000000000000 +``` + +2. Interchain Token Transfer for Native Interchain Token + +```bash +node evm/its.js --action interchainTransfer -n [source-chain] --destinationChain $CHAIN --destinationAddress [encoded-recipient] --tokenId [token-id] --amount [amount] +``` + +3. Deploy Remote Canonical Token + +```bash +node evm/interchainTokenFactory.js --action registerCanonicalInterchainToken -n [source-chain] --destinationChain $CHAIN --tokenAddress [token-address] + +node evm/interchainTokenFactory.js --action deployRemoteCanonicalInterchainToken -n [source-chain] --destinationChain $CHAIN --tokenAddress [token-address] --gasValue 1000000000000000000 +``` + +4. Interchain Token Transfer for Canonical Token + +```bash +node evm/its.js --action interchainTransfer -n [source-chain] --destinationChain $CHAIN --destinationAddress [encoded-recipient] --tokenId [token-id] --amount [amount] --gasValue 1000000000000000000 +``` 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..d5625a686 --- /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 (<ahram@interoplabs.io>) | +| **Deployment** | @ahram (<ahram@interoplabs.io>) | + +| **Network** | **Deployment Status** | **Date** | +| -------------------- | --------------------- | ---------- | +| **Devnet Amplifier** | Completed | 2025-05-13 | +| **Stagenet** | Completed | 2025-05-13 | +| **Testnet** | Completed | 2025-05-13 | +| **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) + +## 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=<stellar_deployer_key> +ENV=<devnet-amplifier|stagenet|testnet|mainnet> +CHAIN=<stellar-2025-q1|stellar> +``` + +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 0x1234 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`. 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..0cf99a5e4 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-devnet-amplifier.md @@ -0,0 +1,61 @@ +# 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 +``` + +### Upgrade AxelarOperators & migrate storage schema + +```bash +node stellar/deploy-contract.js upgrade AxelarOperators --version 1.1.1 --migration-data '["GBM47ULSN4OEQNPECDIMZSDMK6AH2RNICV2VGOYPBVJ4LBFCFFQP2BXM"]' + +Upgraded contract tx: 145d51bafa5c4a8e308b61fc4001f0e4697b35568314510103a166a48127a09f +``` + +### Upgrade the AxelarGasService contract + +```bash +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: d807752dc174fc359caceb839de08eaaf13d0538f9d359bf4ca55ba293254985 +``` + +### Deploy the AxelarExample contract + +```bash +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: 7efa3ad5d37bfb2a91a2f0048c14067f10ef1d70918ef5e0e2341fa3e3404a58 +``` + +### Deploy the Multicall contract + +```bash +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Initialized contract tx: def777bb1acd1ac65304b2776423510a00ac571a007a7396b4a83507e76cfe68 +``` + +## Checklist + +### Stellar → EVM + +```bash +node stellar/gmp.js send avalanche-fuji 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://devnet-amplifier.axelarscan.io/gmp/ff297adfb3b6c28ebc744a4e4b6142a21f33a044a99dd0fe039eafbe08d122b4 +``` + +### 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 new file mode 100644 index 000000000..8dd6352e3 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-stagenet.md @@ -0,0 +1,61 @@ +# 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 +``` + +### 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 +``` + +### Upgrade the AxelarGasService contract + +```bash +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: bf40a43f69cc88bcb6ac1be1a42be4072fb77bf398fa0c70a8149ae0080d15d1 +``` + +### Deploy the AxelarExample contract + +```bash +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: ae1df3153084cc432050d22185db7e1f5bc9bc25468d69d41d98ddf4e75ea6b4 +``` + +### Deploy the Multicall contract + +```bash +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Contract initialized at address: CDY327IFXISX2WW6OFCCHM5VVQ2W3DFT2LPEWOFERSRFLWGPH3RLZVMK +``` + +## Checklist + +### Stellar → EVM + +```bash +node stellar/gmp.js send avalanche 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://stagenet.axelarscan.io/gmp/064a45a48c072f578b69b9b0db21079065f31d00fc752775f8f4efdf4a42714c +``` + +### 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 new file mode 100644 index 000000000..2b320708a --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-GMP-v1.1.1-testnet.md @@ -0,0 +1,61 @@ +# 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 +``` + +### 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 +``` + +### Upgrade the AxelarGasService contract + +```bash +node stellar/deploy-contract.js upgrade AxelarGasService --version 1.1.1 + +Upgraded contract tx: f99abc30cc49226435bfbbeebe7d837e19df2800751cfdb74729a1638a6be70b +``` + +### Deploy the AxelarExample contract + +```bash +node stellar/deploy-contract.js deploy AxelarExample --version 1.0.3 + +Initialized contract tx: 299a0f287c5cad032180af2b91830f4fbb0cff1fa72d93a9e89cc30ab6a01f83 +``` + +### Deploy the Multicall contract + +```bash +node stellar/deploy-contract.js deploy Multicall --version 1.0.1 + +Initialized contract tx: 259c6852bd2f2c483aac772c13b4efd469ace070e198486e80bcfadbba3fef62 +``` + +## Checklist + +### Stellar → EVM + +```bash +node stellar/gmp.js send flow 0xba76c6980428A0b10CFC5d8ccb61949677A61233 0x1234 --gas-amount 100000000 + +https://testnet.axelarscan.io/gmp/adb1d382b277696106fa4ba2e504022e7c9ff1a7310ed70ef61033b5407bc225 +``` + +### EVM → Stellar + +```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 new file mode 100644 index 000000000..a602ef44f --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-devnet-amplifier.md @@ -0,0 +1,242 @@ +# 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 + +Contract uploaded successfully: { +"contractName": "TokenManager", +"wasmHash": "9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c" +} +``` + +### Upload InterchainToken & retrieve WASM hash + +```bash +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 + +```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 + +``` + +### 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 + +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 + +```bash +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 + +Initialized contract tx: 1897e3904d6a9b51ce00ac38e3de2bc6b39042d358264970674b36c9d05f987b +``` + +## Checklist + +### 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 → 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 + +https://devnet-amplifier.axelarscan.io/gmp/0x872c1477838361e1295b19dd753394b679fd280d721ad09568b973d14588345c +``` 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 new file mode 100644 index 000000000..277360b75 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-stagenet.md @@ -0,0 +1,85 @@ +# 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 +``` + +### Upload InterchainToken & retrieve WASM hash + +```bash +node stellar/deploy-contract.js upload InterchainToken --version 1.1.1 + +Uploaded InterchainToken wasm tx: b5e7eed7c5d2d8002d248275362b92fa3472fa9456a165e2602cb9ef3ccb4c64 +``` + +### 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 +``` + +### 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 + +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 + +```bash +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 + +Initialized contract tx: 174c4794d93e49ff246d99fb8563b1d6bfa7d4ef7ad9ed59c1609fcab7587518 +``` + +## Checklist + +### 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 → 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 new file mode 100644 index 000000000..91e4d7307 --- /dev/null +++ b/releases/stellar/logs/v1.1.1/2025-q1/2025-03-ITS-v1.1.1-testnet.md @@ -0,0 +1,383 @@ +# 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 + +Contract uploaded successfully: { +"contractName": "TokenManager", +"wasmHash": "9883cdb6740d685007a88dbd5a1269ffc1550a81a182fed5de3748356d0e342c" +} +``` + +### Upload InterchainToken & retrieve WASM hash + +```bash +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 + +```bash +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) + +```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 + +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 + +```bash +node stellar/deploy-contract.js deploy Upgrader --version 1.1.1 + +Initialized contract tx: f5363c9f3b691d6c64573f1de8635bf77cf7382e21c977dff42344c2f7eaabdf +``` + +## Checklist + +### 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 → 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 +``` 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-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/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 +``` 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/releases/xrpl/2025-02-v1.0.0.md b/releases/xrpl/2025-02-v1.0.0.md new file mode 100644 index 000000000..42e7c6d14 --- /dev/null +++ b/releases/xrpl/2025-02-v1.0.0.md @@ -0,0 +1,279 @@ +# XRPL v1.0.0 + +| | **Owner** | +| -------------- | -------------------------------- | +| **Created By** | @k4m4 <nikolas@commonprefix.com> | +| **Deployment** | @k4m4 <nikolas@commonprefix.com> | + +| **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", + "decimals": 6, + "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", + "decimals": 6, + "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":"<message-id>"},"payload":"<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":"<message-id>"},"payload":"<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 <gas-fee-amount> --payload <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/stellar/README.md b/stellar/README.md index 76ada5c8b..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 @@ -28,13 +28,8 @@ stellar network add \ Create a new Stellar keypair ```bash -stellar keys generate wallet --network testnet - -# Address -stellar keys address wallet - -# Get private key -stellar keys show wallet +# Generate keypair +node stellar/generate-keypair.js ``` Set `PRIVATE_KEY` in `.env` to the above value. @@ -45,6 +40,12 @@ Testnet funds can be obtained via [this link](https://ftl.ai/) or using the `fau node stellar/faucet.js --recipient <address> ``` +Send tokens (if needed) + +```bash +node stellar/send-tokens.js --amount <amount> --recipients <recipients> +``` + ## Deployments Setup @@ -54,6 +55,7 @@ Setup ```bash cargo build +cargo test stellar contract build ``` @@ -68,7 +70,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 +78,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 +```bash +node stellar/deploy-contract.js deploy AxelarExample --version X.Y.Z +``` -- `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` - -### Contract upgrades +## 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 @@ -160,14 +155,20 @@ For migration data of type `bool`, omit the `--migration-data` flag and pass the node stellar/deploy-contract.js upgrade <CONTRACT_NAME> --version <NEW_VERSION> --migration-data true ``` -## Generate bindings +## Uploads -Generate TypeScript bindings for the contract +In order to upload contracts directly to the Stellar network, use the following commands: ```bash -node stellar/generate-bindings.js --artifact-path /path/to/optimized.wasm --contract-id [contract-address] --output-dir ./stellar/bindings/[contract-name] +node stellar/deploy-contract.js upload <CONTRACT_NAME> --version <NEW_VERSION> ``` +```bash +node stellar/deploy-contract.js upload <CONTRACT_NAME> --artifact-path ./axelar-amplifier-stellar/target/wasm32-unknown-unknown/release/<CONTRACT_NAME>.optimized.wasm +``` + +--- + ## Contract Interaction Soroban contracts can be interacted directly via the CLI as well. See the help text for individual contract cmds as follows. @@ -261,7 +262,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 @@ -273,25 +274,45 @@ 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] ``` -#### Encode stellar recipient address to bytes +#### Execute ```bash -node stellar/its.js encode-recipient 'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF' +node stellar/its.js execute [source-chain] [message-id] [source-address] [payload] ``` -#### Execute +#### Get Flow Limit ```bash -node stellar/its.js execute [source-chain] [message-id] [source-address] [payload] +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 @@ -324,7 +345,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/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/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 e902e1056..cd21b0809 100644 --- a/stellar/deploy-contract.js +++ b/stellar/deploy-contract.js @@ -1,385 +1,36 @@ 'use strict'; -const { Address, nativeToScVal, scValToNative, Operation, xdr, authorizeInvocation, rpc } = 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_STELLAR_CONTRACTS, - BytesToScVal, -} = require('./utils'); -const { getDomainSeparator, getChainConfig, addOptionsToCommands } = require('../common'); -const { prompt, validateParameters } = require('../common/utils'); -const { addStoreOptions } = require('../common/cli-utils'); -const { weightedSignersToScVal } = require('./type-utils'); -const { ethers } = require('hardhat'); -const { readFileSync } = require('fs'); -const { - utils: { arrayify, id }, -} = ethers; -require('./cli-utils'); - -const CONTRACT_CONFIGS = { - AxelarGateway: () => [ - new Option('--nonce <nonce>', 'optional nonce for the signer set'), - new Option('--domain-separator <domainSeparator>', 'domain separator (keccak256 hash or "offline")').default('offline'), - new Option('--previous-signers-retention <previousSignersRetention>', 'previous signer retention').default(15).argParser(Number), - new Option('--minimum-rotation-delay <miniumRotationDelay>', '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 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]; - - if (cmdOptions) { - const options = cmdOptions(); - // Add the options to the program - 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 }; - } - - 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.wasmPath) { - throw new Error('--version or --wasm-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 version = sanitizeUpgradeVersion(options.version); - - 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!', 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); - - 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_STELLAR_CONTRACTS).map((contractName) => { - const command = new Command(contractName).description(`Deploy ${contractName} contract`); - - addStoreOptions(command); - addDeployOptions(command); + const command = new Command('deploy-contract').description('Deploy/Upgrade Stellar contracts'); - // Attach the preAction hook to this specific command - 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'); - // Pass contractName directly since it's known in this scope - const contractCodePath = await getContractCodePath(opts, contractName); - Object.assign(opts, { contractCodePath }); - }); + const deployContractCommand = getDeployContractCommands(); + const upgradeContractCommands = getUpgradeContractCommands(); + const uploadContractCommands = getUploadContractCommands(); - // Main action handler - command.action((options) => { - mainProcessor(options, deploy, contractName); - }); + deployContractCommand.forEach((command) => deployCommand.addCommand(command)); + upgradeContractCommands.forEach((command) => upgradeCommand.addCommand(command)); + uploadContractCommands.forEach((command) => uploadCommand.addCommand(command)); - return command; - }); - - // 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 <artifactPath>', 'path to the WASM file')) - .addOption(new Option('--version <version>', 'new version of the contract to upgrade to (e.g., v1.1.0)')) - .addOption(new Option('--migration-data <migrationData>', 'migration data').default(null, '()')) - .addHelpText( - 'after', - ` -Examples: - # using Vec<Address> 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 '()' -`, - ) - .action((options) => { - options.migrationData = sanitizeMigrationData(options.migrationData); - mainProcessor(options, upgrade, contractName); - }); - }); - - // 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 sanitizeMigrationData(migrationData) { - 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(sanitizeMigrationData); - } - - if (parsed !== null && typeof parsed === 'object') { - return Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, sanitizeMigrationData(value)])); - } - - printInfo('Sanitized migration data', parsed); - - return parsed; -} + addOptionsToCommands(deployCommand, addBaseOptions); + addOptionsToCommands(upgradeCommand, addBaseOptions); + addOptionsToCommands(uploadCommand, addBaseOptions); -/* 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); - } + command.addCommand(deployCommand); + command.addCommand(upgradeCommand); + command.addCommand(uploadCommand); - return version; + 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 <nonce>', 'optional nonce for the signer set'), + new Option('--domain-separator <domainSeparator>', 'domain separator (keccak256 hash or "offline")').default('offline'), + new Option('--previous-signers-retention <previousSignersRetention>', 'previous signer retention').default(15).argParser(Number), + new Option('--minimum-rotation-delay <miniumRotationDelay>', '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 <migrationData>', 'migration data').default(null, '()')], + AxelarOperators: () => [new Option('--migration-data <migrationData>', 'migration data').default(null, '()')], + InterchainTokenService: () => [new Option('--migration-data <migrationData>', '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<Address> 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..0614f8991 --- /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, contractName); + 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), + ...(options.version && { version: options.version }), + initializeArgs: serializedArgs, + }; + + printInfo('Contract deployed successfully', chain.contracts[contractName]); +}; + +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, contractName); + 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); + + if (options.version) { + chain.contracts[contractName].version = options.version; + } + + printInfo('Contract upgraded successfully', { contractName, newWasmHash: 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, contractName); + 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, contractName); +}; + +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 ${contractName} 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/generate-bindings.js b/stellar/generate-bindings.js deleted file mode 100644 index 735c9e7d0..000000000 --- a/stellar/generate-bindings.js +++ /dev/null @@ -1,54 +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 } = require('../common'); -const { validateParameters } = require('../common/utils'); -require('./cli-utils'); - -function processCommand(options, _, chain) { - const { artifactPath, contractId, outputDir } = options; - - 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 <artifactPath>', 'path to the WASM file').makeOptionMandatory(true)); - program.addOption(new Option('--contract-id <contractId>', 'contract ID').makeOptionMandatory(true)); - program.addOption( - new Option('--output-dir <outputDir>', 'output directory for the generated bindings').default(path.join(__dirname, 'bindings')), - ); - - program.action((options) => { - const config = loadConfig(options.env); - processCommand(options, config, config.stellar); - }); - - program.parse(); -} - -if (require.main === module) { - main(); -} 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 <signatureScheme>', 'sig scheme').choices(['ed25519']).default('ed25519')); + + program.action((options) => { + mainProcessor(options, processCommand); + }); + + program.parse(); +} diff --git a/stellar/its.js b/stellar/its.js index 3ef86cd35..d37e593d7 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,9 +183,50 @@ 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 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) { @@ -280,10 +325,24 @@ if (require.main === module) { }); program - .command('encode-recipient <recipient>') - .description('Encode stellar address as bytes for ITS recipient') - .action((recipient, options) => { - mainProcessor(encodeRecipient, [recipient], options); + .command('flow-limit <tokenId>') + .description('Get the flow limit for a token') + .action((tokenId, options) => { + mainProcessor(flowLimit, [tokenId], options); + }); + + program + .command('set-flow-limit <tokenId> <flowLimit>') + .description('Set the flow limit for a token') + .action((tokenId, flowLimit, options) => { + mainProcessor(setFlowLimit, [tokenId, flowLimit], options); + }); + + program + .command('remove-flow-limit <tokenId>') + .description('Remove the flow limit for a token') + .action((tokenId, options) => { + mainProcessor(removeFlowLimit, [tokenId], options); }); addOptionsToCommands(program, addBaseOptions); 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 <recipients>', 'comma-separated recipients of tokens').makeOptionMandatory(true)); + program.addOption(new Option('-a, --amount <amount>', 'amount to transfer (in terms of XLM)').makeOptionMandatory(true)); + + program.action((options) => { + mainProcessor(options, processCommand); + }); + + program.parse(); +} diff --git a/stellar/type-utils.js b/stellar/type-utils.js index d177e4351..fd5b18288 100644 --- a/stellar/type-utils.js +++ b/stellar/type-utils.js @@ -96,9 +96,25 @@ function proofToScVal(proof) { ); } +function itsCustomMigrationDataToScValV112(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, + itsCustomMigrationDataToScValV112, }; diff --git a/stellar/utils.js b/stellar/utils.js index b88233f6b..334022c9d 100644 --- a/stellar/utils.js +++ b/stellar/utils.js @@ -16,6 +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 { itsCustomMigrationDataToScValV112 } = require('./type-utils'); const { utils: { arrayify, hexZeroPad, id, isHexString, keccak256 }, BigNumber, @@ -25,8 +26,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', @@ -35,12 +36,21 @@ const SUPPORTED_STELLAR_CONTRACTS = new Set([ 'TokenManager', 'InterchainTokenService', 'Upgrader', + 'Multicall', ]); +const CustomMigrationDataTypeToScValV112 = { + InterchainTokenService: (migrationData) => itsCustomMigrationDataToScValV112(migrationData), +}; + +const VERSIONED_CUSTOM_MIGRATION_DATA_TYPES = { + '1.1.2': CustomMigrationDataTypeToScValV112, +}; + function getNetworkPassphrase(networkType) { switch (networkType) { case 'local': - return Networks.SANDBOX; + return Networks.STANDALONE; case 'futurenet': return Networks.FUTURENET; case 'testnet': @@ -139,9 +149,12 @@ 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. + 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) { @@ -163,7 +176,13 @@ 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.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); @@ -185,18 +204,28 @@ 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) { 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); @@ -221,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); @@ -294,7 +330,7 @@ const getNewSigners = async (wallet, config, chain, options) => { }; } - return await getAmplifierVerifiers(config, chain.axelarId); + return getAmplifierVerifiers(config, chain.axelarId); }; function serializeValue(value) { @@ -380,7 +416,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`); } @@ -416,7 +452,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'); @@ -462,7 +509,84 @@ 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; + + 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; +} + +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}`); + } +} + +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 = { + ...require('ts-node/register') /* enable node during migration */, stellarCmd, ASSET_TYPE_NATIVE, buildTransaction, @@ -476,6 +600,7 @@ module.exports = { getNewSigners, serializeValue, getBalances, + getNativeBalance, createAuthorizedFunc, addressToScVal, hexToScVal, @@ -483,8 +608,12 @@ module.exports = { tokenMetadataToScVal, saltToBytes32, getContractCodePath, + getUploadContractCodePath, isValidAddress, - SUPPORTED_STELLAR_CONTRACTS, + SUPPORTED_CONTRACTS, BytesToScVal, pascalToKebab, + sanitizeMigrationData, + generateKeypair, + isFriendbotSupported, }; diff --git a/sui/README.md b/sui/README.md index 48b3ae084..660f7e158 100644 --- a/sui/README.md +++ b/sui/README.md @@ -432,6 +432,27 @@ Remove trusted chains node sui/its.js remove-trusted-chains <sourceChain> <sourceChain2> ... ``` +## Sui Contract Verification + +This script generates a `verification` folder inside the `move` directory, which contains ZIP files for each contract to be used for verification. Before zipping, a `deps` subdirectory is added to each contract, and the local dependency paths in the `Move.toml` file are updated to reference the `deps` folder. + +1. Ensure that same `move` folder is present in `sui` directory which was generated during contract deployment phase. `move` folder generated by other methods will result in failure of the script + +2. If all contracts need to be verified use `all` instead of `contractName` + +Note: + +- Contracts like `AxelarGateway` have dependencies on `Utils` & `VersionControl` contracts. Make sure these contracts are present and in the `move` folder + +```bash +node sui/verify-contract.js <all/contractName> +``` + +Post-Command Cleanup Steps: + +- Navigate to the `move` folder within the `sui` directory. +- Carefully delete the sub-folder named `verification`, ensuring no other folders are modified. + ## Examples - [GMP Example Guide](docs/gmp.md) 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/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/sui/verify-contract.js b/sui/verify-contract.js new file mode 100644 index 000000000..811e0288f --- /dev/null +++ b/sui/verify-contract.js @@ -0,0 +1,349 @@ +const { Command } = require('commander'); +const fsStandard = require('fs'); +const fs = require('fs').promises; +const path = require('path'); +const axios = require('axios'); +const FormData = require('form-data'); +const JSZip = require('jszip'); +const { printInfo, printError, pascalToSnake, printWarn } = require('../common/utils'); + +const { addBaseOptions } = require('./utils'); + +const BASE_URL = 'https://api.welldonestudio.io/compiler/sui'; +const MOVE_FOLDER_PATH = './sui/move'; +const VERIFICATION_FOLDER_PATH = path.join(MOVE_FOLDER_PATH, 'verification'); +const CONTRACTS = [ + 'Utils', + 'VersionControl', + 'AxelarGateway', + 'GasService', + 'Abi', + 'Operators', + 'Governance', + 'RelayerDiscovery', + 'InterchainTokenService', + 'Squid', + 'Example', +]; + +async function getContractAddress(env, contract) { + const configPath = path.join(__dirname, '../axelar-chains-config', 'info', `${env}.json`); + + try { + const configData = await fs.readFile(configPath, 'utf-8'); + const config = JSON.parse(configData); + const address = config.chains?.sui?.contracts?.[contract]?.address; + if (!address) throw new Error(`Address for contract ${contract} not found`); + return address; + } catch (error) { + throw new Error(`Failed to read config for ${contract}: ${error.message}`); + } +} + +async function copyAndUpdateDependencies(moveFolderPath = MOVE_FOLDER_PATH, contractName = null) { + try { + // Validate moveFolderPath exists + await fs.access(moveFolderPath).catch(() => { + throw new Error(`Move folder path does not exist: ${moveFolderPath}`); + }); + + await fs.mkdir(VERIFICATION_FOLDER_PATH, { recursive: true }); + + const moveContents = await fs.readdir(moveFolderPath, { withFileTypes: true }); + + if (contractName && contractName.toLowerCase() !== 'all') { + // Copy only the specified contract folder + const pascalCaseContract = pascalToSnake(contractName); + const sourcePath = path.join(moveFolderPath, pascalCaseContract); + const destPath = path.join(VERIFICATION_FOLDER_PATH, pascalCaseContract); + await fs.access(sourcePath).catch(() => { + throw new Error(`Contract folder does not exist: ${sourcePath}`); + }); + await fs.cp(sourcePath, destPath, { recursive: true }); + printInfo('Copied to verification folder', `${sourcePath} to ${destPath}`); + } else { + // Copy all folders except verification + for (const item of moveContents) { + if (item.name !== 'verification') { + const sourcePath = path.join(moveFolderPath, item.name); + const destPath = path.join(VERIFICATION_FOLDER_PATH, item.name); + await fs.cp(sourcePath, destPath, { recursive: true }); + printInfo('Copied to verification folder', `${sourcePath} to ${destPath}`); + } + } + } + + // Copy all move folder contents to verification/deps + const centralDepsFolderPath = path.join(VERIFICATION_FOLDER_PATH, 'deps'); + await fs.mkdir(centralDepsFolderPath, { recursive: true }); + + for (const item of moveContents) { + if (item.name !== 'verification') { + const sourcePath = path.join(moveFolderPath, item.name); + const destPath = path.join(centralDepsFolderPath, item.name); + await fs.cp(sourcePath, destPath, { recursive: true }); + printInfo('Copied to central deps', `${sourcePath} to ${destPath}`); + } + } + + const verificationContents = await fs.readdir(VERIFICATION_FOLDER_PATH, { withFileTypes: true }); + + for (const item of verificationContents) { + if (item.isDirectory() && item.name !== 'deps' && item.name !== 'verification') { + const subDirPath = path.join(VERIFICATION_FOLDER_PATH, item.name); + const subDirDepsFolderPath = path.join(subDirPath, 'deps'); + + await fs.mkdir(subDirDepsFolderPath, { recursive: true }); + + const centralDepsContents = await fs.readdir(centralDepsFolderPath, { withFileTypes: true }); + + for (const depItem of centralDepsContents) { + if (depItem.name !== item.name) { + const sourcePath = path.join(centralDepsFolderPath, depItem.name); + const destPath = path.join(subDirDepsFolderPath, depItem.name); + + await fs.cp(sourcePath, destPath, { recursive: true }); + printInfo('Copied to subdirectory deps', `${sourcePath} to ${destPath}`); + } + } + } + } + + const updateTomlInFolder = async (folderPath) => { + const contents = await fs.readdir(folderPath, { withFileTypes: true }); + + for (const item of contents) { + const itemPath = path.join(folderPath, item.name); + + if (item.isDirectory() && item.name !== 'deps' && item.name !== 'verification') { + await updateTomlInFolder(itemPath); + } else if (item.name === 'Move.toml') { + try { + let tomlContent = await fs.readFile(itemPath, 'utf-8'); + + tomlContent = tomlContent.replace(/local\s*=\s*"\.\.\/([^"]+)"/g, 'local = "./deps/$1"'); + + await fs.writeFile(itemPath, tomlContent); + printInfo('Updated Move.toml', itemPath); + } catch (error) { + printInfo('Skipping Move.toml update due to error', `${itemPath}: ${error.message}`); + } + } + } + }; + + await updateTomlInFolder(VERIFICATION_FOLDER_PATH); + + printInfo('Dependency update completed'); + } catch (error) { + printError('Failed to copy and update dependencies', error.message); + } +} + +async function addFolderToZip(folderPath, zipFolder) { + const contents = await fs.readdir(folderPath, { withFileTypes: true }); + + for (const file of contents) { + const filePath = path.join(folderPath, file.name); + + if (file.isDirectory()) { + const newFolder = zipFolder.folder(file.name); + await addFolderToZip(filePath, newFolder); + } else { + const fileData = await fs.readFile(filePath); + zipFolder.file(file.name, fileData); + } + } +} + +async function zipSubdirectories(moveFolderPath = MOVE_FOLDER_PATH, contractName = null) { + try { + // Validate verificationFolderPath exists + await fs.access(VERIFICATION_FOLDER_PATH).catch(() => { + throw new Error(`Verification folder path does not exist: ${VERIFICATION_FOLDER_PATH}`); + }); + + const verificationContents = await fs.readdir(VERIFICATION_FOLDER_PATH, { withFileTypes: true }); + + if (verificationContents.length === 0) { + printInfo('No subdirectories found to zip'); + return; + } + + if (contractName && contractName.toLowerCase() !== 'all') { + // Zip only the specified contract folder + const pascalCaseContract = pascalToSnake(contractName); + const subDirPath = path.join(VERIFICATION_FOLDER_PATH, pascalCaseContract); + const zipFilePath = path.join(VERIFICATION_FOLDER_PATH, `${pascalCaseContract}.zip`); + + await fs.access(subDirPath).catch(() => { + throw new Error(`Subdirectory does not exist: ${subDirPath}`); + }); + + const zip = new JSZip(); + await addFolderToZip(subDirPath, zip.folder(pascalCaseContract)); + + const zipContent = await zip.generateAsync({ + type: 'nodebuffer', + compression: 'DEFLATE', + compressionOptions: { level: 6 }, + }); + + await fs.writeFile(zipFilePath, zipContent); + printInfo('Created ZIP file', zipFilePath); + } else { + // Zip all subdirectories + for (const item of verificationContents) { + if (item.isDirectory() && item.name !== 'deps' && item.name !== 'verification') { + const subDirPath = path.join(VERIFICATION_FOLDER_PATH, item.name); + const zipFilePath = path.join(VERIFICATION_FOLDER_PATH, `${item.name}.zip`); + + await fs.access(subDirPath).catch(() => { + throw new Error(`Subdirectory does not exist: ${subDirPath}`); + }); + + const zip = new JSZip(); + await addFolderToZip(subDirPath, zip.folder(item.name)); + + const zipContent = await zip.generateAsync({ + type: 'nodebuffer', + compression: 'DEFLATE', + compressionOptions: { level: 6 }, + }); + + await fs.writeFile(zipFilePath, zipContent); + printInfo('Created ZIP file', zipFilePath); + } + } + } + + printInfo('ZIP creation completed'); + } catch (error) { + printError('Failed to create ZIP files', error.message); + } +} + +async function checkVerificationStatus(network, packageId) { + try { + const response = await axios.get(`${BASE_URL}/verifications`, { params: { network, packageId } }); + return response.data; + } catch (error) { + throw new Error(`Failed to check verification status: ${error.message}`); + } +} + +async function uploadSourceCode(network, packageId, srcZipPath) { + try { + const form = new FormData(); + form.append('network', network); + form.append('packageId', packageId); + form.append('srcZipFile', fsStandard.createReadStream(srcZipPath)); + const response = await axios.post(`${BASE_URL}/verifications/sources`, form, { headers: form.getHeaders() }); + return response.data.srcFileId; + } catch (error) { + throw new Error(`Failed to upload source code: ${error.message}`); + } +} + +async function verifyPackage(network, packageId, srcFileId, isSrcUploaded) { + try { + const payload = { network, packageId }; + if (!isSrcUploaded && srcFileId) payload.srcFileId = srcFileId; + const response = await axios.post(`${BASE_URL}/verifications`, payload, { headers: { 'Content-Type': 'application/json' } }); + return response.data; + } catch (error) { + throw new Error(`Failed to verify package: ${error.message}`); + } +} + +async function getVerifiedSourceCode(network, packageId) { + try { + const response = await axios.get(`${BASE_URL}/verifications/module-sources/${network}/${packageId}`, { + headers: { accept: 'application/json' }, + }); + return response.data; + } catch (error) { + throw new Error(`Failed to fetch verified source code: ${error.message}`); + } +} + +async function processVerification(network, packageId, srcZipPath) { + printInfo('Checking verification status for package', packageId); + const status = await checkVerificationStatus(network, packageId); + if (!status) return; + printInfo('Verification status', JSON.stringify(status, null, 2)); + + let srcFileId = null; + + if (!status.isSrcUploaded && srcZipPath) { + printInfo('Uploading source code', srcZipPath); + srcFileId = await uploadSourceCode(network, packageId, srcZipPath); + printInfo('Source file uploaded with ID', srcFileId); + } else if (!status.isSrcUploaded) { + throw new Error('Source code not uploaded via Remix and no source zip provided'); + } + + if (!status.isVerified) { + printInfo('Verifying package', packageId); + const verificationResult = await verifyPackage(network, packageId, srcFileId, status.isSrcUploaded); + printInfo('Verification result', JSON.stringify(verificationResult, null, 2)); + if (!verificationResult.isVerified) { + throw new Error('Package verification failed'); + } + } else { + printInfo('Package already verified'); + } + + printInfo('Fetching verified source code', packageId); + const sourceCode = await getVerifiedSourceCode(network, packageId); + printInfo('Verified source code', JSON.stringify(sourceCode, null, 2)); +} + +async function verifyContracts(contractName, options) { + printInfo('Starting contract verification for environment', options.env); + await copyAndUpdateDependencies(MOVE_FOLDER_PATH, contractName); + await zipSubdirectories(MOVE_FOLDER_PATH, contractName); + + const contractsToVerify = contractName.toLowerCase() === 'all' ? CONTRACTS : [contractName]; + let verificationFailed = false; + + if (!CONTRACTS.includes(contractName) && contractName.toLowerCase() !== 'all') { + throw new Error(`Invalid contract name: ${contractName}. Must be one of: ${CONTRACTS.join(', ')} or 'all'`); + } + + for (const contract of contractsToVerify) { + const pascalCaseContract = pascalToSnake(contract); + + try { + const address = await getContractAddress(options.env, contract); + const srcZipPath = path.join(VERIFICATION_FOLDER_PATH, `${pascalCaseContract}.zip`); + await processVerification(options.env, address, srcZipPath); + printInfo('Successfully verified', contract); + } catch (error) { + printError('Failed to verify', `${contract}: ${error.message}`); + verificationFailed = true; + } + } + + if (verificationFailed) { + printWarn('Contract verification process completed with some failures'); + } else { + printInfo('All contracts successfully verified'); + } + printWarn('!! Please complete `Post-Command Cleanup Steps` outlined in the README before retrying.') +} + +if (require.main === module) { + const program = new Command(); + program + .name('verify-contract') + .description('Verify Sui contracts using WELLDONE Studio API.') + .argument('<contractName>', 'Contract name to verify or "all" to verify all contracts') + .action((contractName, options) => { + verifyContracts(contractName, options); + }); + + addBaseOptions(program); + + program.parse(); +} 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 new file mode 100644 index 000000000..c6f24c592 --- /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 && npm run build +``` + +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 <env> -n <chain-name> --initialSigner <xrpl-address> +``` + +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 <env> -n <chain-name> --signerPublicKeys <signer-public-keys> --signerWeights <signer-weights> --quorum <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 <env> -n <source-chain> [token] [amount] [destination-chain] [destination-address] --gasFeeAmount <gas-fee-amount> --payload <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 <env> -n <source-chain> [destination-chain] [destination-address] --gasFeeAmount <gas-fee-amount> --gasFeeToken <gas-fee-token> --payload <payload> +``` + +Here's an example: + +```bash +node xrpl/call-contract.js -e devnet-amplifier -n xrpl-dev xrpl-evm-devnet 0x2F630a1CE68d76ff2113D2F3AE8FB64Abf7d3804 --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 <env> -n <source-chain> --token <token> --amount <amount> --msgId <msg-id> +``` + +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 <env> -n <chain-name> --amount <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 <env> -n <chain-name> --minBalance <min-balance> --amount <amount> --recipient <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 <env> -n <chain-name> [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 <tx-blob> +``` + +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 <env> -n <chain-name> --multisign --from <from> --to <to> --amount <amount> --token <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 <env> -n <chain-name> --multisign --account <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 <env> -n <chain-name> --multisign --account <account> --ticketCount <ticket-count> +``` + +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 <env> -n <source-chain> --multisign --account <account> --transferRate <transfer-rate> --tickSize <tick-size> --domain <domain> --flag <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 <account>', 'XRPL account to configure (default: active wallet)')) + .addOption(new Option('--transferRate <transferRate>', 'account transfer rate')) + .addOption(new Option('--tickSize <tickSize>', 'account tick size')) + .addOption(new Option('--domain <domain>', 'account domain')) + .addOption(new Option('--flag <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>', 'token to use').makeOptionMandatory(true)) + .addOption(new Option('--amount <amount>', 'amount of gas to add').makeOptionMandatory(true)) + .addOption(new Option('--msgId <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>', '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('<txBlob>', '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 "<currency>.<issuer-address>" + 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('<destinationChain> <destinationAddress>') + .addOption(new Option('--payload <payload>', 'payload to call contract at destination address with').makeOptionMandatory(true)) + .addOption( + new Option('--gasFeeToken <gasFeeToken>', 'token to pay gas in ("XRP" or "<currency>.<issuer>")').makeOptionMandatory(true), + ) + .addOption( + new Option('--gasFeeAmount <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..9bb16a9ab --- /dev/null +++ b/xrpl/cli-utils.js @@ -0,0 +1,49 @@ +'use strict'; + +require('../common/cli-utils'); + +const xrpl = require('xrpl'); +const { Option } = require('commander'); +const { addEnvOption } = require('../common/cli-utils'); + +const addWalletOptions = (program, _options = {}) => { + program.addOption( + new Option('--walletKeyType <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 <chainName>', 'chain to run the script over').makeOptionMandatory(true).env('CHAIN')); + + program.addOption(new Option('-p, --privateKey <privateKey>', 'private key').makeOptionMandatory(true).env('PRIVATE_KEY')); + + program.addOption( + new Option('--privateKeyType <privateKeyType>', 'private key type') + .makeOptionMandatory(true) + .choices(['seed']) + .default('seed') + .env('PRIVATE_KEY_TYPE'), + ); + + return program; +}; + +module.exports = { + 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('<address>', '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('<tx-blob>', '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 <transferRate>', 'account transfer rate').default(DEFAULTS.TRANSFER_RATE)) + .addOption(new Option('--tickSize <tickSize>', 'account tick size').default(DEFAULTS.TICK_SIZE)) + .addOption(new Option('--domain <domain>', 'account domain').default(DEFAULTS.DOMAIN)) + .addOption(new Option('--flags <flags...>', 'extra account flags (beyond asfDisableMaster)').default(DEFAULTS.FLAGS)) + .addOption(new Option('--initialSigner <signer>', "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>', 'recipient to request funds for (default: wallet address)')) + .addOption(new Option('--amount <amount>', 'amount of XRP tokens to request from the faucet').default('100')) + .addOption( + new Option( + '--minBalance <amount>', + '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 "<currency>.<issuer-address>" + 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('<token> <amount> <destinationChain> <destinationAddress>') + .addOption(new Option('--payload <payload>', 'payload to call contract at destination address with')) + .addOption(new Option('--gasFeeAmount <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 "<currency>.<issuer-address>" + 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 <from>', 'account to send from (default: active wallet)')) + .addOption(new Option('--to <to>', 'destination account').makeOptionMandatory(true)) + .addOption(new Option('--token <token>', 'token to send ("XRP" or "<currency>.<issuer>")').default('XRP')) + .addOption(new Option('--amount <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 <signerPublicKeys...>', 'public keys of the new signers').makeOptionMandatory(true)) + .addOption(new Option('--signerWeights <signerWeights...>', 'weights of the new signers').makeOptionMandatory(true)) + .addOption(new Option('--quorum <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 <account>', 'XRPL account to configure (default: active wallet)')) + .addOption(new Option('--ticketCount <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('<tokenCurrency> <tokenIssuer>') + .addOption(new Option('-m, --multisign', 'active wallet is a signer of the target XRPL multisig account').default(false)) + .addOption(new Option('--account <account>', 'XRPL account from which to create a trust line (default: active wallet)')) + .addOption(new Option('--limit <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..35c2438a8 --- /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) "<currency>.<issuer-address>" +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 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 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 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 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 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 this.signAndSubmitTx(signer, 'TicketCreate', { TicketCount: ticketCount }, restArgs, options); + } + + async sendAccountSet(signer, { transferRate, tickSize, domain, flag, ...restArgs }, options = { multisign: false, yes: false }) { + return 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 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, +};