Skip to content
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
1f5471b
coordinator migration defaults to multisig prover/chain map
SDavidson1177 Oct 1, 2025
e81cf1f
Merge branch 'main' into fix/coordinator-migration-default-provers
SDavidson1177 Oct 2, 2025
c89a85d
querying coordinator and multisig ids
SDavidson1177 Oct 2, 2025
57a9f42
can check prover chain map in coordinator
SDavidson1177 Oct 2, 2025
ced75a5
complete check of coordinator v2 migration state
SDavidson1177 Oct 2, 2025
1072b58
coordinator migration doc now uses script to check state
SDavidson1177 Oct 2, 2025
9942222
minor reformatting
SDavidson1177 Oct 2, 2025
e1477a8
minor reformatting
SDavidson1177 Oct 2, 2025
942d50e
Merge branch 'fix/coordinator-migration-default-provers' into feat/co…
SDavidson1177 Oct 2, 2025
0bc31f9
minor text change
SDavidson1177 Oct 3, 2025
ad44fdb
reformatting
SDavidson1177 Oct 6, 2025
1f1b1c8
add migration script for multisig
SDavidson1177 Oct 6, 2025
f0dbecf
add multisig.ts
SDavidson1177 Oct 6, 2025
6996aa1
make proposal default
SDavidson1177 Oct 6, 2025
f51888b
Merge branch 'fix/coordinator-migration-default-provers' into feat/co…
SDavidson1177 Oct 6, 2025
bcc4043
use coordinator address
SDavidson1177 Oct 6, 2025
20da8e6
Merge branch 'main' into fix/coordinator-migration-default-provers
SDavidson1177 Oct 6, 2025
acf9ff0
Merge branch 'fix/coordinator-migration-default-provers' into feat/co…
SDavidson1177 Oct 6, 2025
0cdb77d
use printInfo and printError
SDavidson1177 Oct 6, 2025
3f7b23a
reformatting
SDavidson1177 Oct 7, 2025
ca73407
use migration script for multisig
SDavidson1177 Oct 7, 2025
c758356
fix cursor errors
SDavidson1177 Oct 7, 2025
0b47eca
Merge branch 'main' into fix/coordinator-migration-default-provers
SDavidson1177 Oct 9, 2025
8ef3ebb
bug fix and update coordinator version to 2.1.1
SDavidson1177 Oct 9, 2025
b20152f
Merge branch 'main' into fix/coordinator-migration-default-provers
SDavidson1177 Oct 9, 2025
357ad52
Merge branch 'fix/coordinator-migration-default-provers' into feat/co…
SDavidson1177 Oct 9, 2025
85fdda3
bug fix with json parsing
SDavidson1177 Oct 9, 2025
39cf073
Revert "bug fix with json parsing"
SDavidson1177 Oct 9, 2025
bb70da5
json parse fix
SDavidson1177 Oct 9, 2025
02fcde9
create command to add coordinator to instantiate params
SDavidson1177 Oct 10, 2025
5287dd5
add update instantiate config to docs
SDavidson1177 Oct 10, 2025
dba73eb
Merge branch 'main' into feat/coordiantor-instantiation
SDavidson1177 Oct 10, 2025
008a903
fix formatting
SDavidson1177 Oct 14, 2025
7d9f12f
Merge branch 'main' into feat/coordiantor-instantiation
SDavidson1177 Oct 16, 2025
51e071f
account for single address permission
SDavidson1177 Oct 16, 2025
cddc708
check single address for permission
SDavidson1177 Oct 16, 2025
09cd735
Merge branch 'main' into feat/coordiantor-instantiation
SDavidson1177 Oct 16, 2025
2cddfb2
add code info details utils command
SDavidson1177 Oct 20, 2025
53baf2e
Merge branch 'main' into feat/coordiantor-instantiation
SDavidson1177 Oct 20, 2025
43d132d
reformatting
SDavidson1177 Oct 20, 2025
7ac45e1
reformatting
SDavidson1177 Oct 20, 2025
22cd820
Merge branch 'main' into feat/coordiantor-instantiation
SDavidson1177 Oct 20, 2025
900a305
more reformatting
SDavidson1177 Oct 20, 2025
e78c24e
add contractName field
SDavidson1177 Oct 22, 2025
a6fa02b
Merge branch 'main' into feat/coordiantor-instantiation
SDavidson1177 Oct 22, 2025
49d0b8b
update instantiate params in migration doc
SDavidson1177 Oct 22, 2025
848ad03
minor reformatting
SDavidson1177 Oct 22, 2025
eb88566
add try finally to getCodeDetails
SDavidson1177 Oct 22, 2025
a627c2d
make camel case
SDavidson1177 Oct 22, 2025
b5ea912
...
SDavidson1177 Oct 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion cosmwasm/migrate/coordinator.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate';
import { StdFee } from '@cosmjs/stargate';
import { AccessType } from 'cosmjs-types/cosmwasm/wasm/v1/types';

import { printError, printInfo } from '../../common';
import { encodeMigrateContractProposal, submitProposal } from '../utils';
import { encodeMigrateContractProposal, encodeUpdateInstantiateConfigProposal, submitProposal } from '../utils';
import { MigrationOptions, ProtocolContracts } from './types';

// eslint-disable-next-line @typescript-eslint/no-require-imports
Expand Down Expand Up @@ -334,3 +335,48 @@ export async function checkMigration(
printError(`no migration check script found for coordinator ${version}`);
}
}

export async function instantiatePermissions(
client: typeof SigningCosmWasmClient,
options: MigrationOptions,
config,
senderAddress: string,
coordinatorAddress: string,
permittedAddresses: string[],
codeId: number,
fee: string | StdFee,
) {
permittedAddresses.push(coordinatorAddress);

const updateMsg: string = JSON.stringify([
{
codeId: codeId,
instantiatePermission: {
permission: AccessType.ACCESS_TYPE_ANY_OF_ADDRESSES,
addresses: permittedAddresses,
},
},
]);

printInfo(`Update Msg: ${JSON.stringify(updateMsg)}`);

const updateOptions = {
msg: updateMsg,
title: options.title,
description: options.description,
runAs: senderAddress,
deposit: options.deposit,
};

const proposal = encodeUpdateInstantiateConfigProposal(updateOptions);

if (!options.dry) {
try {
printInfo(`Executing migration...\n${JSON.stringify(updateOptions)}`);
await submitProposal(client, config, updateOptions, proposal, fee);
printInfo('Migration proposal successfully submitted');
} catch (e) {
printError(`Error: ${e}`);
}
}
}
56 changes: 51 additions & 5 deletions cosmwasm/migrate/migrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import { FullConfig } from '../../common/config';
import { addAmplifierOptions, addAmplifierQueryContractOptions } from '../cli-utils';
import { ClientManager, mainProcessor, mainQueryProcessor } from '../processor';
import { getContractInfo } from '../query';
import { checkMigration as checkMigrationCoordinator, migrate as migrateCoordinator } from './coordinator';
import { checkMigration as checkMigrationCoordinator, instantiatePermissions, migrate as migrateCoordinator } from './coordinator';
import { migrate as migrateMultisig } from './multisig';
import { MigrationCheckOptions, MigrationOptions } from './types';
import { InstantiatePermission, MigrationCheckOptions, MigrationOptions } from './types';

async function migrate(
client: ClientManager,
Expand Down Expand Up @@ -45,7 +45,7 @@ async function checkMigration(
client: CosmWasmClient,
config: FullConfig,
options: MigrationCheckOptions,
args: string[],
_args: string[],
_fee: string | StdFee,
): Promise<void> {
const contract_address = options.address ?? config.axelar.contracts[options.contractName]?.address;
Expand All @@ -58,10 +58,40 @@ async function checkMigration(
}
}

async function coordinatorInstantiatePermissions(
client: ClientManager,
config: FullConfig,
options: MigrationOptions,
args: string[],
fee: string | StdFee,
): Promise<void> {
const senderAddress = client.accounts[0].address;
const contractAddress = options.address ?? config.axelar.contracts['Coordinator']?.address;
if (args.length < 2 || args[0] === undefined || args[1] === undefined) {
throw new Error('code_id and current_permissions arguments are required');
}
const codeId = Number(args[0]);
if (isNaN(codeId)) {
throw new Error('code_id must be a valid number');
}

const permissions: InstantiatePermission = JSON.parse(args[1]);
if (permissions.permission && permissions.permission === 'Everybody') {
throw new Error(`coordinator is already allowed to instantiate code id ${codeId}`);
}

const permitted_addresses = permissions.addresses ?? [];
if (permitted_addresses.includes(contractAddress)) {
throw new Error(`coordinator is already allowed to instantiate code id ${codeId}`);
}

return instantiatePermissions(client, options, config, senderAddress, contractAddress, permitted_addresses, codeId, fee);
}

const programHandler = () => {
const program = new Command();

program.name('migrate').version('1.0.0').description('Automation for migrating Amplifier contracts');
program.name('migrate').version('1.1.0').description('Automation for migrating Amplifier contracts');

addAmplifierOptions(
program
Expand All @@ -85,12 +115,28 @@ const programHandler = () => {
.addOption(new Option('--address <address>', 'address of contract to check'))
.addOption(new Option('--coordinator <coordinator address>', 'coordinator address'))
.addOption(new Option('--multisig <multisig address>', 'multisig address'))
.description('check migration succeeded')
.description('Check migration succeeded')
.action((options: MigrationCheckOptions) => {
mainQueryProcessor(checkMigration, options, []);
}),
);

addAmplifierOptions(
program
.command('coordinator-instantiate-permissions')
.argument('<code_id>', 'coordinator will have instantiate permissions for this code id')
.argument('<current_permissions>', 'current instantiate permissions for given contract')
.addOption(new Option('--address <address>', 'contract address (overrides config)'))
.option('--dry', 'only generate migration msg')
.description('Give coordinator instantiate permissions for the given code id')
.action((codeId: string, currentPermissions: string, options: MigrationOptions) => {
mainProcessor(coordinatorInstantiatePermissions, options, [codeId, currentPermissions]);
}),
{
proposalOptions: true,
},
);

program.parse();
};

Expand Down
2 changes: 1 addition & 1 deletion cosmwasm/migrate/multisig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,6 @@ export async function migrate(
case '2.1.0':
return multisigToVersion2_3_1(client, options, config, senderAddress, multisigAddress, codeId, fee);
default:
printError(`no migration script found for coordinator ${version}`);
printError(`no migration script found for multisig ${version}`);
}
}
8 changes: 8 additions & 0 deletions cosmwasm/migrate/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export interface MigrationOptions extends Options {
dry?: boolean;
direct?: boolean;
ignoreChains?: string;
title?: string;
description?: string;
}

export interface MigrationCheckOptions extends Options {
Expand All @@ -20,3 +22,9 @@ export interface ProtocolContracts {
router: string;
multisig: string;
}

export interface InstantiatePermission {
permission?: string;
address?: string;
addresses?: string[];
}
20 changes: 20 additions & 0 deletions cosmwasm/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const {
InstantiateContract2Proposal,
ExecuteContractProposal,
MigrateContractProposal,
UpdateInstantiateConfigProposal,
} = require('cosmjs-types/cosmwasm/wasm/v1/proposal');
const { ParameterChangeProposal } = require('cosmjs-types/cosmos/params/v1beta1/params');
const { AccessType } = require('cosmjs-types/cosmwasm/wasm/v1/types');
Expand Down Expand Up @@ -968,6 +969,15 @@ const getParameterChangeParams = ({ title, description, changes }) => ({
})),
});

const getUpdateInstantiateParams = (options) => {
const { msg } = options;

return {
...getSubmitProposalParams(options),
accessConfigUpdates: JSON.parse(msg),
};
};

const getMigrateContractParams = (config, options) => {
const { msg, chainName } = options;

Expand Down Expand Up @@ -1048,6 +1058,15 @@ const encodeParameterChangeProposal = (options) => {
};
};

const encodeUpdateInstantiateConfigProposal = (options) => {
const proposal = UpdateInstantiateConfigProposal.fromPartial(getUpdateInstantiateParams(options));

return {
typeUrl: '/cosmwasm.wasm.v1.UpdateInstantiateConfigProposal',
value: Uint8Array.from(UpdateInstantiateConfigProposal.encode(proposal).finish()),
};
};

const encodeMigrateContractProposal = (config, options) => {
const proposal = MigrateContractProposal.fromPartial(getMigrateContractParams(config, options));

Expand Down Expand Up @@ -1448,6 +1467,7 @@ module.exports = {
encodeInstantiate2Proposal,
encodeExecuteContractProposal,
encodeParameterChangeProposal,
encodeUpdateInstantiateConfigProposal,
encodeMigrateContractProposal,
submitProposal,
isValidCosmosAddress,
Expand Down
32 changes: 27 additions & 5 deletions releases/cosmwasm/2025-09-Coordinator-v2.1.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c

1. The coordinator now stores both the router and multisig contract addresses in its state. This information will be given to the coordinator after it is instantiated using the *RegisterProtocol* message. The service registry address will also be registered using *RegisterProtocol*, where it was previously in the coordinator's instantiate message.
1. Previously, registering a chain with the coordinator involved specifying only the multisig prover's address. Now, registration must also include the corresponding gateway and voting verifier addresses.
1. The coordinator's migration script will default to using the provided prover/chain pairs instead of the prover/chain pairs registered in its state.

### Multisig v2.3.1

Expand All @@ -47,6 +48,11 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c
- This rollout upgrades the amplifier coordinator contract from `v1.1.0` to `v2.1.1`, the multisig contract from `v2.1.0` to `v2.3.1`, and the router from `v1.2.0` to `v1.3.0`.
- State migration is required for all three contracts.

| Component | Versions Tested
| ---------------- | ---------------- |
| Cosmos SDK | 0.47.x |
| Wasm | 0.34.x |

1. Retrieve coordinator address from the appropriate config file for the environment. (ENV: devnet, testnet, stagenet or mainnet)

```bash
Expand Down Expand Up @@ -109,7 +115,7 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c
--deposit $DEPOSIT_VALUE
```

Provide coordinator address to the multisig.
Provide coordinator address to the multisig, and migrate using the contract deployment scripts.

```bash
ts-node cosmwasm/migrate/migrate.ts migrate <multisig_code_id> \
Expand All @@ -118,8 +124,6 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c
-d $DEPOSIT_VALUE \
```

The `default_authorized_provers` object should correspond to the chain/prover pairs located at `axelar.contracts.MultisigProver` in `$ENV.json`.

1. Migrate to Coordinator v2.1.1 using the contract deployment scripts

```bash
Expand All @@ -133,6 +137,19 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c

**Warning:** Using the `--ignoreChains [chains to ignore...]` flag might introduce protocol breaking behaviour, so it should be used only in a test environment. Coordinator v2 requires the gateways, verifiers and provers for each chain to be unique. You may ignore chains in the event that there are multiple chains that use the same verifier. This is possible because the protocol allows different gateways to be instantiated with the same verifier.

1. (Optional) Give the Coordinator Permission to Instantiate Gateway, Verifier and Prover

The coordinator needs to have permission from the wasm module to instantiate gateways, verifiers and provers. You may retrieve these code ids by checking `.axelar.contracts.Gateway.$CHAIN.codeId`, `.axelar.contracts.VotingVerifier.$CHAIN.codeId` and `.axelar.contracts.MultisigProver.$CHAIN.codeId` respectively. To get the current instantiate permissions for a particular code id, run the following command:

```bash
axelard q wasm code-info <code id> --node <node rpc>
```

We have provided a script that submits a proposal to append the coordinator's address to the list of allowed addresses for a given code id. A proposal will not be created if the coordinator is already allowed to instantiate that contract. To execute that script, run:

```bash
ts-node cosmwasm/migrate/migrate.ts coordinator-instantiate-permissions <code id> "'$(axelard q wasm code-info <code id> --node <node rpc> --output json | jq -c .instantiate_permission)'" --deposit 100000000 -e devnet-amplifier -t $TITLE -d $DESCRIPTION -m $MNEMONIC
```
## Checklist

1. Verify router contract version
Expand Down Expand Up @@ -172,7 +189,7 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c
Expected output

```bash
{contract: 'multisig', version: '2.3.0'}
{contract: 'multisig', version: '2.3.1'}
```

1. Verify the coordinator address is stored on the multisig
Expand Down Expand Up @@ -210,4 +227,9 @@ The coordinator can now deploy a gateway, voting verifier, and multisig prover c
ts-node cosmwasm/migrate/migrate.ts check -e $ENV -c Coordinator
```

You may manually specify the address of the coordinator and multisig by using the `--coordinator` and `--multisig` flags respectively.
You may optionally specify the address of the coordinator and multisig by using the `--coordinator` and `--multisig` flags respectively.

Expected Output
```bash
✅ Migration succeeded!
```