Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
31 changes: 16 additions & 15 deletions solana/MCM.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions solana/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
46 changes: 46 additions & 0 deletions solana/mainnet/2025-10-27-signers-update-mcm-1/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
##
# Common MCM Proposal Variables
##

# MCM program ID (base58 encoded)
MCM_PROGRAM_ID=Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expected deployed address of our MCM program


# 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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


# 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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
128 changes: 128 additions & 0 deletions solana/mainnet/2025-10-27-signers-update-mcm-1/FACILITATORS.md
Original file line number Diff line number Diff line change
@@ -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-program-id>
MCM_MULTISIG_ID=<multisig-id>
MCM_VALID_UNTIL=<unix-timestamp>
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=<number-of-signatures>
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/<transaction-signature>?cluster=<network>)
```

Replace `<transaction-signature>` with the execution transaction signature and `<network>` with the appropriate cluster (devnet, mainnet-beta, etc.).
27 changes: 27 additions & 0 deletions solana/mainnet/2025-10-27-signers-update-mcm-1/Makefile
Original file line number Diff line number Diff line change
@@ -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
Loading