Skip to content

Commit f76b253

Browse files
authored
feat(solana): prepare MCM 0 signers update task on Solana mainnet (#482)
* chore(solana): minor changes to makefiles * chore: bump mcmctl dependency version and fix update signers template * feat(solana): prepare MCM 0 signers update task on Solana mainnet
1 parent 50f6bd5 commit f76b253

File tree

4 files changed

+252
-0
lines changed

4 files changed

+252
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
##
2+
# Common MCM Proposal Variables
3+
##
4+
5+
# MCM program ID (base58 encoded)
6+
MCM_PROGRAM_ID=Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX
7+
8+
# MCM multisig ID (32 bytes hex with 0x prefix)
9+
MCM_MULTISIG_ID=0x0000000000000000000000000000000000000000000000000000000000000000
10+
11+
# Timestamp until which the proposal is valid and can be executed
12+
MCM_VALID_UNTIL=
13+
14+
# Set to true if you want to override the previous root when registering the proposal, omit or set to false otherwise
15+
# If set to true, it allows to override the (proposal) root even if there are outstanding operations left to execute in the previous proposal
16+
MCM_OVERRIDE_PREVIOUS_ROOT=false
17+
18+
# Total number of signatures required to execute the proposal
19+
MCM_SIGNATURES_COUNT=1
20+
21+
# MCM proposal signatures
22+
MCM_SIGNATURES=
23+
24+
# Output file for the MCM proposal
25+
MCM_PROPOSAL_OUTPUT=proposal.json
26+
27+
# Authority account that will sign and submit MCM transactions
28+
AUTHORITY=~/.config/solana/id.json
29+
30+
##
31+
# MCM Proposal Variables Specific to Signers Update
32+
##
33+
34+
# Comma-separated list of new EVM signer addresses (20 bytes hex string, with 0x prefix)
35+
MCM_NEW_SIGNERS=0x6CD3850756b7894774Ab715D136F9dD02837De50,0x3cd692eCE8b6573A2220ae00d0dEb98f0DfFA9a1,0x1c870776B168A9ffAE80c51f050C611eDd246741,0x3Dad2200849925Bb46d9bF05aFa5f7F213F4c18E,0xB011a32ED8b4F70D9943A2199F539bbeCd7b62F7,0xf9e320f3dA12E68af219d9E2A490Dd649f6B177c
36+
37+
# New signers configuration (see https://github.com/smartcontractkit/chainlink-ccip/blob/main/chains/solana/contracts/programs/mcm/src/lib.rs#L141-L157)
38+
MCM_SIGNER_GROUPS=0,0,0,0,0,0
39+
MCM_GROUP_QUORUMS=3
40+
MCM_GROUP_PARENTS=0
41+
42+
# Set to true to clear the previous pending signers when registering the new signers, omit or set to false otherwise
43+
MCM_CLEAR_SIGNERS=false
44+
45+
# Set to true to clear the previous root when registering the new signers, omit or set to false otherwise
46+
MCM_CLEAR_ROOT=false
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Facilitator Instructions: Signers Update MCM 0
2+
3+
## Overview
4+
5+
As a Facilitator, you are responsible for:
6+
1. Preparing the new signers configuration
7+
2. Creating the MCM proposal
8+
3. Committing and pushing the proposal to the repo
9+
4. Coordinating with Signers
10+
5. Collecting signatures
11+
6. Executing the proposal on-chain
12+
13+
## Prerequisites
14+
15+
```bash
16+
cd contract-deployments
17+
git pull
18+
cd solana/mainnet/2025-10-27-signers-update-mcm-0
19+
make deps
20+
```
21+
22+
Ensure you have:
23+
- `mcmctl` installed (via `make deps`)
24+
- `eip712sign` installed (via `make deps`)
25+
- A funded Solana wallet configured
26+
27+
## Phase 1: Prepare and Generate Proposal
28+
29+
### 1.1. Update .env with signers configuration
30+
31+
Set the following in `.env`:
32+
33+
```bash
34+
MCM_PROGRAM_ID=<mcm-program-id>
35+
MCM_MULTISIG_ID=<multisig-id>
36+
MCM_VALID_UNTIL=<unix-timestamp>
37+
MCM_OVERRIDE_PREVIOUS_ROOT=false # or true if needed
38+
MCM_PROPOSAL_OUTPUT=proposal.json
39+
40+
# New signers configuration
41+
MCM_NEW_SIGNERS=0xADDRESS1,0xADDRESS2,0xADDRESS3
42+
MCM_SIGNER_GROUPS=0,0,1
43+
MCM_GROUP_QUORUMS=2,1
44+
MCM_GROUP_PARENTS=0,0
45+
MCM_CLEAR_SIGNERS=false # or true if needed
46+
MCM_CLEAR_ROOT=false # or true if needed
47+
```
48+
49+
### 1.2. Generate proposal
50+
51+
```bash
52+
make step1-create-proposal
53+
```
54+
55+
This creates the proposal file (default `proposal.json` or whatever is set in `MCM_PROPOSAL_OUTPUT`).
56+
57+
### 1.3. Review proposal
58+
59+
Open and review the generated proposal file to verify:
60+
- All new signers are included
61+
- Signer groups are correctly assigned
62+
- Group quorums are appropriate
63+
- Group parent relationships are correct
64+
- Valid until timestamp is appropriate
65+
66+
### 1.4. Commit and push
67+
68+
```bash
69+
git add .
70+
git commit -m "Add MCM signers update proposal"
71+
git push
72+
```
73+
74+
## Phase 2: Coordinate with Signers and Collect Signatures
75+
76+
Coordinate with Signers to collect their signatures. Each Signer will run `make sign` and provide their signature.
77+
78+
Concatenate all signatures in the format: `0xSIG1,0xSIG2,0xSIG3`
79+
80+
Once you have all required signatures, update `.env`:
81+
82+
```bash
83+
MCM_SIGNATURES_COUNT=<number-of-signatures>
84+
MCM_SIGNATURES=0xSIG1,0xSIG2,0xSIG3
85+
```
86+
87+
## Phase 3: Execute Proposal
88+
89+
```bash
90+
make step3-execute-proposal
91+
```
92+
93+
This command executes all the necessary steps:
94+
- Initialize signatures account
95+
- Append signatures
96+
- Finalize signatures
97+
- Set root
98+
- Execute proposal
99+
- Print the new configuration
100+
101+
## Phase 4: Verification
102+
103+
### 4.1. Verify MCM configuration
104+
105+
Check that:
106+
- All new signers are present
107+
- Old signers (if removed) are no longer present
108+
- Signers are in the correct groups
109+
- Group quorums are set correctly
110+
- Group parent relationships are correct
111+
112+
### 4.2. View on Solana Explorer
113+
114+
Visit the Solana Explorer for your network:
115+
- Mainnet: https://explorer.solana.com/
116+
- Devnet: https://explorer.solana.com/?cluster=devnet
117+
118+
Search for the execution transaction to verify the update.
119+
120+
### 4.3. Update README
121+
122+
Update the Status line in README.md to:
123+
124+
```markdown
125+
Status: [EXECUTED](https://explorer.solana.com/tx/<transaction-signature>?cluster=<network>)
126+
```
127+
128+
Replace `<transaction-signature>` with the execution transaction signature and `<network>` with the appropriate cluster (devnet, mainnet-beta, etc.).
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
include ../.env
2+
include .env
3+
4+
include ../../Makefile
5+
6+
##
7+
# MCM Signers Update Workflow
8+
##
9+
10+
# Step 1: Create signers update proposal
11+
.PHONY: step1-create-proposal
12+
step1-create-proposal:
13+
@echo "==> Step 1: Creating MCM signers update proposal..."
14+
make mcm-proposal-update-signers
15+
16+
# Step 2: Sign proposal
17+
.PHONY: sign
18+
sign:
19+
@echo "==> Step 2: Signing proposal..."
20+
make mcm-sign
21+
22+
# Step 3: Execute proposal (signatures + set-root + execute)
23+
.PHONY: step3-execute-proposal
24+
step3-execute-proposal:
25+
@echo "==> Step 3: Executing MCM proposal..."
26+
make mcm-all
27+
make mcm-signers-print-config
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Signers Update MCM 0
2+
3+
Status: PENDING
4+
5+
## Description
6+
7+
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.
8+
9+
## Procedure for Signers
10+
11+
### 1. Update repo
12+
13+
```bash
14+
cd contract-deployments
15+
git pull
16+
cd solana/mainnet/2025-10-27-signers-update-mcm-0
17+
make deps
18+
```
19+
20+
### 2. Setup Ledger
21+
22+
Your Ledger needs to be connected and unlocked. The **Ethereum application** needs to be opened on Ledger with the message "Application is ready".
23+
24+
### 3. Sign the proposal
25+
26+
```bash
27+
make sign
28+
```
29+
30+
This command will:
31+
1. Display the proposal hash
32+
2. Prompt you to sign on your Ledger
33+
3. Output your signature
34+
35+
**Verify on your Ledger**: Check that the data you're signing matches the proposal hash displayed in the terminal.
36+
37+
After signing, you will see output like:
38+
39+
```
40+
Signature: 1234567890abcdef...
41+
```
42+
43+
### 4. Send signature to Facilitator
44+
45+
Copy the **entire signature** and send it to the Facilitator via your secure communication channel.
46+
47+
**That's it!** The Facilitator will collect all signatures and execute the proposal.
48+
49+
## For Facilitators
50+
51+
See [FACILITATORS.md](./FACILITATORS.md) for complete instructions on preparing, executing, and verifying this task.

0 commit comments

Comments
 (0)