diff --git a/solana/MCM.mk b/solana/MCM.mk index 505346a7..33aa511c 100644 --- a/solana/MCM.mk +++ b/solana/MCM.mk @@ -63,7 +63,7 @@ mcm-multisig-init: --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID) \ --chain-id $(MCM_CHAIN_ID)" \ - output=artifacts/mcm-multisig-init.json + output=$(or $(MCM_MULTISIG_INIT_ARTIFACT),artifacts/mcm-multisig-init.json) .PHONY: mcm-signers-init mcm-signers-init: @@ -75,7 +75,7 @@ mcm-signers-init: --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID) \ --total $(MCM_SIGNER_COUNT)" \ - output=artifacts/mcm-signers-init.json + output=$(or $(MCM_SIGNERS_INIT_ARTIFACT),artifacts/mcm-signers-init.json) .PHONY: mcm-signers-append mcm-signers-append: @@ -87,7 +87,7 @@ mcm-signers-append: --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID) \ --signers $(MCM_SIGNERS)" \ - output=artifacts/mcm-signers-append.json + output=$(or $(MCM_SIGNERS_APPEND_ARTIFACT),artifacts/mcm-signers-append.json) .PHONY: mcm-signers-finalize mcm-signers-finalize: @@ -98,7 +98,7 @@ mcm-signers-finalize: --mcm-program-id $(MCM_PROGRAM_ID) \ --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID)" \ - output=artifacts/mcm-signers-finalize.json + output=$(or $(MCM_SIGNERS_FINALIZE_ARTIFACT),artifacts/mcm-signers-finalize.json) .PHONY: mcm-signers-clear mcm-signers-clear: @@ -109,7 +109,7 @@ mcm-signers-clear: --mcm-program-id $(MCM_PROGRAM_ID) \ --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID)" \ - output=artifacts/mcm-signers-clear.json + output=$(or $(MCM_SIGNERS_CLEAR_ARTIFACT),artifacts/mcm-signers-clear.json) .PHONY: mcm-signers-set-config mcm-signers-set-config: @@ -124,7 +124,7 @@ mcm-signers-set-config: --group-quorums $(MCM_GROUP_QUORUMS) \ --group-parents $(MCM_GROUP_PARENTS) \ $(if $(filter true,$(MCM_CLEAR_ROOT)),--clear-root)" \ - output=artifacts/mcm-signers-set-config.json + output=$(or $(MCM_SIGNERS_SET_CONFIG_ARTIFACT),artifacts/mcm-signers-set-config.json) .PHONY: mcm-signatures-init mcm-signatures-init: @@ -136,7 +136,7 @@ mcm-signatures-init: --authority $(AUTHORITY) \ --proposal $(MCM_PROPOSAL_OUTPUT) \ --total $(MCM_SIGNATURES_COUNT)" \ - output=artifacts/mcm-signatures-init.json + output=$(or $(MCM_SIGNATURES_INIT_ARTIFACT),artifacts/mcm-signatures-init.json) .PHONY: mcm-signatures-append mcm-signatures-append: @@ -148,7 +148,7 @@ mcm-signatures-append: --authority $(AUTHORITY) \ --proposal $(MCM_PROPOSAL_OUTPUT) \ --signatures $(MCM_SIGNATURES)" \ - output=artifacts/mcm-signatures-append.json + output=$(or $(MCM_SIGNATURES_APPEND_ARTIFACT),artifacts/mcm-signatures-append.json) .PHONY: mcm-signatures-finalize mcm-signatures-finalize: @@ -159,7 +159,7 @@ mcm-signatures-finalize: --mcm-program-id $(MCM_PROGRAM_ID) \ --authority $(AUTHORITY) \ --proposal $(MCM_PROPOSAL_OUTPUT)" \ - output=artifacts/mcm-signatures-finalize.json + output=$(or $(MCM_SIGNATURES_FINALIZE_ARTIFACT),artifacts/mcm-signatures-finalize.json) .PHONY: mcm-signatures-clear mcm-signatures-clear: @@ -170,7 +170,7 @@ mcm-signatures-clear: --mcm-program-id $(MCM_PROGRAM_ID) \ --authority $(AUTHORITY) \ --proposal $(MCM_PROPOSAL_OUTPUT)" \ - output=artifacts/mcm-signatures-clear.json + output=$(or $(MCM_SIGNATURES_CLEAR_ARTIFACT),artifacts/mcm-signatures-clear.json) .PHONY: mcm-ownership-transfer mcm-ownership-transfer: @@ -182,7 +182,7 @@ mcm-ownership-transfer: --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID) \ --proposed-owner $(MCM_PROPOSED_OWNER)" \ - output=artifacts/mcm-ownership-transfer.json + output=$(or $(MCM_OWNERSHIP_TRANSFER_ARTIFACT),artifacts/mcm-ownership-transfer.json) .PHONY: mcm-ownership-accept mcm-ownership-accept: @@ -193,7 +193,7 @@ mcm-ownership-accept: --mcm-program-id $(MCM_PROGRAM_ID) \ --authority $(AUTHORITY) \ --multisig-id $(MCM_MULTISIG_ID)" \ - output=artifacts/mcm-ownership-accept.json + output=$(or $(MCM_OWNERSHIP_ACCEPT_ARTIFACT),artifacts/mcm-ownership-accept.json) .PHONY: mcm-proposal-set-root mcm-proposal-set-root: @@ -204,7 +204,7 @@ mcm-proposal-set-root: --mcm-program-id $(MCM_PROGRAM_ID) \ --authority $(AUTHORITY) \ --proposal $(MCM_PROPOSAL_OUTPUT)" \ - output=artifacts/mcm-proposal-set-root.json + output=$(or $(MCM_PROPOSAL_SET_ROOT_ARTIFACT),artifacts/mcm-proposal-set-root.json) .PHONY: mcm-proposal-execute mcm-proposal-execute: @@ -217,7 +217,7 @@ mcm-proposal-execute: --proposal $(MCM_PROPOSAL_OUTPUT) \ $(if $(MCM_START_INDEX),--start-index $(MCM_START_INDEX)) \ $(if $(MCM_OPERATION_COUNT),--operation-count $(MCM_OPERATION_COUNT))" \ - output=artifacts/mcm-proposal-execute.json + output=$(or $(MCM_PROPOSAL_EXECUTE_ARTIFACT),artifacts/mcm-proposal-execute.json) ## # Proposal creation commands (read-only, create proposal files) @@ -246,7 +246,8 @@ mcm-proposal-update-signers: --signer-groups $(MCM_SIGNER_GROUPS) \ --group-quorums $(MCM_GROUP_QUORUMS) \ --group-parents $(MCM_GROUP_PARENTS) \ - $(if $(filter true,$(MCM_CLEAR_ROOT)),--clear-root) + $(if $(filter true,$(MCM_CLEAR_ROOT)),--clear-root) \ + $(if $(filter true,$(MCM_CLEAR_SIGNERS)),--clear-signers) .PHONY: mcm-proposal-bridge-pause mcm-proposal-bridge-pause: diff --git a/solana/Makefile b/solana/Makefile index 88bf1461..2456bca9 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -37,7 +37,7 @@ install-eip712sign: .PHONY: install-mcmctl install-mcmctl: - go install github.com/base/mcm-go/cmd/mcmctl@89e88905998a0dd10fe75dad99b8121bfe5dca93 + go install github.com/base/mcm-go/cmd/mcmctl@66ad0d9e28ecc1ef0b3b1504bdc5d40da413b678 .PHONY: deps deps: install-mcmctl install-eip712sign @@ -73,7 +73,7 @@ sol-confirm-cmd: sol-confirm: @echo "==> Confirming signature: $$SIG"; \ mkdir -p $(dir $(output)); \ - solana confirm $$SIG -v --output json --url $(SOL_RPC_URL) >> $(output) + solana confirm $$SIG -v --output json --url $(SOL_RPC_URL) > $(output) ## # Solana Native Commands diff --git a/solana/mainnet/2025-10-27-signers-update-mcm-1/.env b/solana/mainnet/2025-10-27-signers-update-mcm-1/.env new file mode 100644 index 00000000..285ab094 --- /dev/null +++ b/solana/mainnet/2025-10-27-signers-update-mcm-1/.env @@ -0,0 +1,46 @@ +## +# Common MCM Proposal Variables +## + +# MCM program ID (base58 encoded) +MCM_PROGRAM_ID=Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX + +# MCM multisig ID (32 bytes hex with 0x prefix) +MCM_MULTISIG_ID=0x0000000000000000000000000000000000000000000000000000000000000001 + +# Timestamp until which the proposal is valid and can be executed +MCM_VALID_UNTIL= + +# Set to true if you want to override the previous root when registering the proposal, omit or set to false otherwise +# If set to true, it allows to override the (proposal) root even if there are outstanding operations left to execute in the previous proposal +MCM_OVERRIDE_PREVIOUS_ROOT=false + +# Total number of signatures required to execute the proposal +MCM_SIGNATURES_COUNT=1 + +# MCM proposal signatures +MCM_SIGNATURES= + +# Output file for the MCM proposal +MCM_PROPOSAL_OUTPUT=proposal.json + +# Authority account that will sign and submit MCM transactions +AUTHORITY=~/.config/solana/id.json + +## +# MCM Proposal Variables Specific to Signers Update +## + +# Comma-separated list of new EVM signer addresses (20 bytes hex string, with 0x prefix) +MCM_NEW_SIGNERS=0x1841CB3C2ce6870D0417844C817849da64E6e937,0x5B154B8587168CB984Ff610F5De74289D8f68874,0x541a833E4303EB56a45bE7E8E4A908db97568d1e,0x4427683AA1f0ff25ccDC4a5Db83010c1DE9b5fF4,0xA31E1c38d5c37D8ECd0e94C80C0F7FD624d009A3,0xB37B2D42cb0C10ebf96279CcECa2cBFc47C6f236,0x24c3AE1AeDB8142D32BB6d3B988f5910F272D53b,0x644e3DedB0e4F83Bfcf8F9992964d240224B74dc,0x7Ad8E6B7B1f6D66F49559f20053Cef8a7b6c488E,0x5468985B560D966dEDEa2DAF493f5756101137DC,0x26c72586FB396325F58718152FEFA94E93Cf177b,0xa3D3c103442F162856163d564b983ae538c6202D,0x49243DcE94e0f5A1B08b9556bBEc5a84363c3839 + +# New signers configuration (see https://github.com/smartcontractkit/chainlink-ccip/blob/main/chains/solana/contracts/programs/mcm/src/lib.rs#L141-L157) +MCM_SIGNER_GROUPS=0,0,0,0,0,0,0,0,0,0,0,0,0 +MCM_GROUP_QUORUMS=3 +MCM_GROUP_PARENTS=0 + +# Set to true to clear the previous pending signers when registering the new signers, omit or set to false otherwise +MCM_CLEAR_SIGNERS=false + +# Set to true to clear the previous root when registering the new signers, omit or set to false otherwise +MCM_CLEAR_ROOT=false diff --git a/solana/mainnet/2025-10-27-signers-update-mcm-1/FACILITATORS.md b/solana/mainnet/2025-10-27-signers-update-mcm-1/FACILITATORS.md new file mode 100644 index 00000000..8f7ed97d --- /dev/null +++ b/solana/mainnet/2025-10-27-signers-update-mcm-1/FACILITATORS.md @@ -0,0 +1,128 @@ +# Facilitator Instructions: Signers Update MCM 1 + +## Overview + +As a Facilitator, you are responsible for: +1. Preparing the new signers configuration +2. Creating the MCM proposal +3. Committing and pushing the proposal to the repo +4. Coordinating with Signers +5. Collecting signatures +6. Executing the proposal on-chain + +## Prerequisites + +```bash +cd contract-deployments +git pull +cd solana/mainnet/2025-10-27-signers-update-mcm-1 +make deps +``` + +Ensure you have: +- `mcmctl` installed (via `make deps`) +- `eip712sign` installed (via `make deps`) +- A funded Solana wallet configured + +## Phase 1: Prepare and Generate Proposal + +### 1.1. Update .env with signers configuration + +Set the following in `.env`: + +```bash +MCM_PROGRAM_ID= +MCM_MULTISIG_ID= +MCM_VALID_UNTIL= +MCM_OVERRIDE_PREVIOUS_ROOT=false # or true if needed +MCM_PROPOSAL_OUTPUT=proposal.json + +# New signers configuration +MCM_NEW_SIGNERS=0xADDRESS1,0xADDRESS2,0xADDRESS3 +MCM_SIGNER_GROUPS=0,0,1 +MCM_GROUP_QUORUMS=2,1 +MCM_GROUP_PARENTS=0,0 +MCM_CLEAR_SIGNERS=false # or true if needed +MCM_CLEAR_ROOT=false # or true if needed +``` + +### 1.2. Generate proposal + +```bash +make step1-create-proposal +``` + +This creates the proposal file (default `proposal.json` or whatever is set in `MCM_PROPOSAL_OUTPUT`). + +### 1.3. Review proposal + +Open and review the generated proposal file to verify: +- All new signers are included +- Signer groups are correctly assigned +- Group quorums are appropriate +- Group parent relationships are correct +- Valid until timestamp is appropriate + +### 1.4. Commit and push + +```bash +git add . +git commit -m "Add MCM signers update proposal" +git push +``` + +## Phase 2: Coordinate with Signers and Collect Signatures + +Coordinate with Signers to collect their signatures. Each Signer will run `make sign` and provide their signature. + +Concatenate all signatures in the format: `0xSIG1,0xSIG2,0xSIG3` + +Once you have all required signatures, update `.env`: + +```bash +MCM_SIGNATURES_COUNT= +MCM_SIGNATURES=0xSIG1,0xSIG2,0xSIG3 +``` + +## Phase 3: Execute Proposal + +```bash +make step3-execute-proposal +``` + +This command executes all the necessary steps: +- Initialize signatures account +- Append signatures +- Finalize signatures +- Set root +- Execute proposal +- Print the new configuration + +## Phase 4: Verification + +### 4.1. Verify MCM configuration + +Check that: +- All new signers are present +- Old signers (if removed) are no longer present +- Signers are in the correct groups +- Group quorums are set correctly +- Group parent relationships are correct + +### 4.2. View on Solana Explorer + +Visit the Solana Explorer for your network: +- Mainnet: https://explorer.solana.com/ +- Devnet: https://explorer.solana.com/?cluster=devnet + +Search for the execution transaction to verify the update. + +### 4.3. Update README + +Update the Status line in README.md to: + +```markdown +Status: [EXECUTED](https://explorer.solana.com/tx/?cluster=) +``` + +Replace `` with the execution transaction signature and `` with the appropriate cluster (devnet, mainnet-beta, etc.). diff --git a/solana/mainnet/2025-10-27-signers-update-mcm-1/Makefile b/solana/mainnet/2025-10-27-signers-update-mcm-1/Makefile new file mode 100644 index 00000000..707f445c --- /dev/null +++ b/solana/mainnet/2025-10-27-signers-update-mcm-1/Makefile @@ -0,0 +1,27 @@ +include ../.env +include .env + +include ../../Makefile + +## +# MCM Signers Update Workflow +## + +# Step 1: Create signers update proposal +.PHONY: step1-create-proposal +step1-create-proposal: + @echo "==> Step 1: Creating MCM signers update proposal..." + make mcm-proposal-update-signers + +# Step 2: Sign proposal +.PHONY: sign +sign: + @echo "==> Step 2: Signing proposal..." + make mcm-sign + +# Step 3: Execute proposal (signatures + set-root + execute) +.PHONY: step3-execute-proposal +step3-execute-proposal: + @echo "==> Step 3: Executing MCM proposal..." + make mcm-all + make mcm-signers-print-config diff --git a/solana/mainnet/2025-10-27-signers-update-mcm-1/README.md b/solana/mainnet/2025-10-27-signers-update-mcm-1/README.md new file mode 100644 index 00000000..4fa957c8 --- /dev/null +++ b/solana/mainnet/2025-10-27-signers-update-mcm-1/README.md @@ -0,0 +1,51 @@ +# Signers Update MCM 1 + +Status: PENDING + +## Description + +This task updates the signers configuration for a Multi-Chain Multisig (MCM) instance. This includes adding or removing signers, modifying signer groups, adjusting group quorums, and updating group parent relationships. + +## Procedure for Signers + +### 1. Update repo + +```bash +cd contract-deployments +git pull +cd solana/mainnet/2025-10-27-signers-update-mcm-1 +make deps +``` + +### 2. Setup Ledger + +Your Ledger needs to be connected and unlocked. The **Ethereum application** needs to be opened on Ledger with the message "Application is ready". + +### 3. Sign the proposal + +```bash +make sign +``` + +This command will: +1. Display the proposal hash +2. Prompt you to sign on your Ledger +3. Output your signature + +**Verify on your Ledger**: Check that the data you're signing matches the proposal hash displayed in the terminal. + +After signing, you will see output like: + +``` +Signature: 1234567890abcdef... +``` + +### 4. Send signature to Facilitator + +Copy the **entire signature** and send it to the Facilitator via your secure communication channel. + +**That's it!** The Facilitator will collect all signatures and execute the proposal. + +## For Facilitators + +See [FACILITATORS.md](./FACILITATORS.md) for complete instructions on preparing, executing, and verifying this task. diff --git a/solana/setup-templates/template-mcm-signers-update/.env b/solana/setup-templates/template-mcm-signers-update/.env index 61a9f70d..91b673a0 100644 --- a/solana/setup-templates/template-mcm-signers-update/.env +++ b/solana/setup-templates/template-mcm-signers-update/.env @@ -39,5 +39,8 @@ MCM_SIGNER_GROUPS= MCM_GROUP_QUORUMS= MCM_GROUP_PARENTS= +# Set to true to clear the previous pending signers when registering the new signers, omit or set to false otherwise +MCM_CLEAR_SIGNERS= + # Set to true to clear the previous root when registering the new signers, omit or set to false otherwise MCM_CLEAR_ROOT= diff --git a/solana/setup-templates/template-mcm-signers-update/FACILITATORS.md b/solana/setup-templates/template-mcm-signers-update/FACILITATORS.md index da028aae..caf692a8 100644 --- a/solana/setup-templates/template-mcm-signers-update/FACILITATORS.md +++ b/solana/setup-templates/template-mcm-signers-update/FACILITATORS.md @@ -42,6 +42,7 @@ MCM_NEW_SIGNERS=0xADDRESS1,0xADDRESS2,0xADDRESS3 MCM_SIGNER_GROUPS=0,0,1 MCM_GROUP_QUORUMS=2,1 MCM_GROUP_PARENTS=0,0 +MCM_CLEAR_SIGNERS=false # or true if needed MCM_CLEAR_ROOT=false # or true if needed ``` diff --git a/solana/setup-templates/template-mcm-signers-update/Makefile b/solana/setup-templates/template-mcm-signers-update/Makefile index 15391353..707f445c 100644 --- a/solana/setup-templates/template-mcm-signers-update/Makefile +++ b/solana/setup-templates/template-mcm-signers-update/Makefile @@ -24,4 +24,4 @@ sign: step3-execute-proposal: @echo "==> Step 3: Executing MCM proposal..." make mcm-all - make mcm-print-config + make mcm-signers-print-config