From 075095d2b23d9af3d9a416b6062f292561750e74 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Mon, 27 Oct 2025 19:02:04 +0100 Subject: [PATCH 1/4] feat(solana): prepare mainnet MCM deployment --- solana/mainnet/2025-10-27-deploy-mcm/.env | 70 ++++++++ .../mainnet/2025-10-27-deploy-mcm/.gitignore | 2 + solana/mainnet/2025-10-27-deploy-mcm/Makefile | 149 ++++++++++++++++++ .../2025-10-27-deploy-mcm/patches/id.patch | 12 ++ 4 files changed, 233 insertions(+) create mode 100644 solana/mainnet/2025-10-27-deploy-mcm/.env create mode 100644 solana/mainnet/2025-10-27-deploy-mcm/.gitignore create mode 100644 solana/mainnet/2025-10-27-deploy-mcm/Makefile create mode 100644 solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch diff --git a/solana/mainnet/2025-10-27-deploy-mcm/.env b/solana/mainnet/2025-10-27-deploy-mcm/.env new file mode 100644 index 00000000..beeeeb28 --- /dev/null +++ b/solana/mainnet/2025-10-27-deploy-mcm/.env @@ -0,0 +1,70 @@ +SOLANA_VERSION=1.17.25 +ANCHOR_VERSION=0.29.0 + +# Variables for cloning the MCM repo +MCM_REPO=https://github.com/base/chainlink-ccip/ +MCM_COMMIT=efe0405f3e2fa6789a57ec510e101828040a384b +ID_PATCH=patches/id.patch + +# Variables for deploying and sending transactions +CLUSTER=mainnet +AUTHORITY=~/.config/solana/id.json +MCM_KEYPAIR=./mcm-keypair.json + +# Signature of the deployWithMaxDataLen tx (used to generate the deployment artifacts) +MCM_DEPLOY_SIGNATURE= + +# General variables for MCM +MCM_PROGRAM_ID=Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX # Same as devnet +MCM_MULTISIG_ID_0=0x0000000000000000000000000000000000000000000000000000000000000000 +MCM_MULTISIG_ID_1=0x0000000000000000000000000000000000000000000000000000000000000001 +MCM_CHAIN_ID=0 +MCM_AUTHORITY_0= +MCM_AUTHORITY_1= +MCM_MULTISIG_INIT_ARTIFACT_0=artifacts/mcm-multisig-init-0.json +MCM_MULTISIG_INIT_ARTIFACT_1=artifacts/mcm-multisig-init-1.json + +# Variables for configuring signers for multisig 0 and 1. +# Note: Both multisigs are deployed with the same signers configuration to ease deployment. +# After deployment, the signers configuration for both multisigs MUST be updated to the correct configuration. +MCM_SIGNER_COUNT=1 +MCM_SIGNERS=0xb2d9a52e76841279EF0372c534C539a4f68f8C0B +MCM_SIGNER_GROUPS=0 +MCM_GROUP_QUORUMS=1 +MCM_GROUP_PARENTS=0 +MCM_SIGNERS_INIT_ARTIFACT_0=artifacts/mcm-signers-init-0.json +MCM_SIGNERS_INIT_ARTIFACT_1=artifacts/mcm-signers-init-1.json +MCM_SIGNERS_APPEND_ARTIFACT_0=artifacts/mcm-signers-append-0.json +MCM_SIGNERS_APPEND_ARTIFACT_1=artifacts/mcm-signers-append-1.json +MCM_SIGNERS_FINALIZE_ARTIFACT_0=artifacts/mcm-signers-finalize-0.json +MCM_SIGNERS_FINALIZE_ARTIFACT_1=artifacts/mcm-signers-finalize-1.json +MCM_SIGNERS_SET_CONFIG_ARTIFACT_0=artifacts/mcm-signers-set-config-0.json +MCM_SIGNERS_SET_CONFIG_ARTIFACT_1=artifacts/mcm-signers-set-config-1.json + +# Variables for transfering multisig 0 ownership to its own authority +MCM_VALID_UNTIL= +MCM_OVERRIDE_PREVIOUS_ROOT=false +MCM_SIGNATURES_COUNT=1 +MCM_SIGNATURES_0= +MCM_SIGNATURES_1= +MCM_PROPOSAL_OUTPUT_0=accept_ownership_proposal_0.json +MCM_PROPOSAL_OUTPUT_1=accept_ownership_proposal_1.json +MCM_OWNERSHIP_TRANSFER_ARTIFACT_0=artifacts/mcm-ownership-transfer-0.json +MCM_OWNERSHIP_TRANSFER_ARTIFACT_1=artifacts/mcm-ownership-transfer-1.json +MCM_SIGNATURES_INIT_ARTIFACT_0=artifacts/mcm-signatures-init-0.json +MCM_SIGNATURES_INIT_ARTIFACT_1=artifacts/mcm-signatures-init-1.json +MCM_SIGNATURES_APPEND_ARTIFACT_0=artifacts/mcm-signatures-append-0.json +MCM_SIGNATURES_APPEND_ARTIFACT_1=artifacts/mcm-signatures-append-1.json +MCM_SIGNATURES_FINALIZE_ARTIFACT_0=artifacts/mcm-signatures-finalize-0.json +MCM_SIGNATURES_FINALIZE_ARTIFACT_1=artifacts/mcm-signatures-finalize-1.json +MCM_PROPOSAL_SET_ROOT_ARTIFACT_0=artifacts/mcm-proposal-set-root-0.json +MCM_PROPOSAL_SET_ROOT_ARTIFACT_1=artifacts/mcm-proposal-set-root-1.json +MCM_PROPOSAL_EXECUTE_ARTIFACT_0=artifacts/mcm-proposal-execute-0.json +MCM_PROPOSAL_EXECUTE_ARTIFACT_1=artifacts/mcm-proposal-execute-1.json + +# Variables for transferring MCM upgrade authority +SOL_PROGRAM_ID=$(MCM_PROGRAM_ID) +NEW_UPGRADE_AUTHORITY=$(MCM_AUTHORITY_0) + +# Signature of the set-upgrade-authority tx (used to generate the set-upgrade-authority artifacts) +SET_UPGRADE_AUTHORITY_SIGNATURE= diff --git a/solana/mainnet/2025-10-27-deploy-mcm/.gitignore b/solana/mainnet/2025-10-27-deploy-mcm/.gitignore new file mode 100644 index 00000000..2edeed2d --- /dev/null +++ b/solana/mainnet/2025-10-27-deploy-mcm/.gitignore @@ -0,0 +1,2 @@ +chainlink-ccip/ +*keypair.json diff --git a/solana/mainnet/2025-10-27-deploy-mcm/Makefile b/solana/mainnet/2025-10-27-deploy-mcm/Makefile new file mode 100644 index 00000000..770a2a0b --- /dev/null +++ b/solana/mainnet/2025-10-27-deploy-mcm/Makefile @@ -0,0 +1,149 @@ +include ../.env +include .env + +include ../../Makefile + +## +# Project Setup +## + +.PHONY: install-rust +install-rust: + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +.PHONY: install-solana-cli +install-solana-cli: + curl -sSfL https://release.anza.xyz/v$(SOLANA_VERSION)/install | sh + +.PHONY: install-anchor +install-anchor: + cargo install --git https://github.com/coral-xyz/anchor --tag v$(ANCHOR_VERSION) anchor-cli --force + +.PHONY: setup-deps +setup-deps: install-rust install-solana-cli install-anchor + +## +# Deployment Workflow +## + +# Step 1: Clone and patch the MCM program +.PHONY: step1-clone-and-patch +step1-clone-and-patch: + @echo "==> Step 1: Cloning and patching the MCM program..." + rm -rf chainlink-ccip + git clone --filter=blob:none $(MCM_REPO) chainlink-ccip + cd chainlink-ccip && \ + git checkout $(MCM_COMMIT) && \ + git apply ../$(ID_PATCH) + +# Step 2: Build and deploy the MCM program +.PHONY: step2-build-and-deploy +step2-build-and-deploy: + @echo "==> Step 2: Building and deploying the MCM program..." + mkdir -p chainlink-ccip/chains/solana/contracts/target/deploy/ && \ + cp $(MCM_KEYPAIR) chainlink-ccip/chains/solana/contracts/target/deploy/mcm-keypair.json + cd chainlink-ccip/chains/solana/contracts && \ + anchor build -p mcm && \ + anchor deploy --provider.cluster $(CLUSTER) --provider.wallet $(AUTHORITY) -p mcm + +# Step 3: Generate deploy artifacts (use solana explorer to get the signature of the deployWithMaxDataLen tx) +.PHONY: step3-generate-deploy-artifacts +step3-generate-deploy-artifacts: + @echo "==> Step 3: Generating MCM deploy artifacts..." + make sol-confirm SIG=$(MCM_DEPLOY_SIGNATURE) output=artifacts/mcm-deploy-artifacts.json + +# Step 4: Initialize the multisigs(inherited from parent) +.PHONY: step4-init-multisigs +step4-init-multisigs: + @echo "==> Step 4: Initializing MCM multisigs..." + make mcm-multisig-init \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_0) \ + MCM_MULTISIG_INIT_ARTIFACT=$(MCM_MULTISIG_INIT_ARTIFACT_0) + make mcm-multisig-init \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_1) \ + MCM_MULTISIG_INIT_ARTIFACT=$(MCM_MULTISIG_INIT_ARTIFACT_1) + @echo "==> MCM multisig authority for multisig 0..." + make mcm-multisig-print-authority \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_0) + @echo "==> MCM multisig authority for multisig 1..." + make mcm-multisig-print-authority \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_1) + +# Step 5: Initialize the signers for multisigs(inherited from parent) +.PHONY: step5-init-signers +step5-init-signers: + @echo "==> Step 5: Initializing MCM signers for multisigs..." + make mcm-signers-all \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_0) \ + MCM_SIGNERS_INIT_ARTIFACT=$(MCM_SIGNERS_INIT_ARTIFACT_0) \ + MCM_SIGNERS_APPEND_ARTIFACT=$(MCM_SIGNERS_APPEND_ARTIFACT_0) \ + MCM_SIGNERS_FINALIZE_ARTIFACT=$(MCM_SIGNERS_FINALIZE_ARTIFACT_0) \ + MCM_SIGNERS_SET_CONFIG_ARTIFACT=$(MCM_SIGNERS_SET_CONFIG_ARTIFACT_0) + make mcm-signers-all \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_1) \ + MCM_SIGNERS_INIT_ARTIFACT=$(MCM_SIGNERS_INIT_ARTIFACT_1) \ + MCM_SIGNERS_APPEND_ARTIFACT=$(MCM_SIGNERS_APPEND_ARTIFACT_1) \ + MCM_SIGNERS_FINALIZE_ARTIFACT=$(MCM_SIGNERS_FINALIZE_ARTIFACT_1) \ + MCM_SIGNERS_SET_CONFIG_ARTIFACT=$(MCM_SIGNERS_SET_CONFIG_ARTIFACT_1) + +# Step 6: Create accept-ownership proposals (inherited from parent) +.PHONY: step6-create-accept-ownership-proposals +step6-create-accept-ownership-proposals: + @echo "==> Step 6: Creating MCM accept-ownership proposals..." + make mcm-proposal-accept-ownership \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_0) \ + MCM_PROPOSAL_OUTPUT=$(MCM_PROPOSAL_OUTPUT_0) + make mcm-proposal-accept-ownership \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_1) \ + MCM_PROPOSAL_OUTPUT=$(MCM_PROPOSAL_OUTPUT_1) + +# Step 7: Sign the proposals (inherited from parent) +.PHONY: step7-sign-proposals +step7-sign-proposals: + @echo "==> Step 7: Signing MCM proposals..." + make mcm-sign \ + MCM_PROPOSAL_OUTPUT=$(MCM_PROPOSAL_OUTPUT_0) + make mcm-sign \ + MCM_PROPOSAL_OUTPUT=$(MCM_PROPOSAL_OUTPUT_1) + +# Step 8: Execute ownership transfers (inherited from parent) +.PHONY: step8-execute-ownership-transfers +step8-execute-ownership-transfers: + @echo "==> Step 8: Executing MCM ownership transfers..." + make mcm-ownership-transfer \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_0) \ + MCM_PROPOSED_OWNER=$(MCM_AUTHORITY_0) \ + MCM_OWNERSHIP_TRANSFER_ARTIFACT=$(MCM_OWNERSHIP_TRANSFER_ARTIFACT_0) + make mcm-all \ + MCM_PROPOSAL_OUTPUT=$(MCM_PROPOSAL_OUTPUT_0) \ + MCM_SIGNATURES=$(MCM_SIGNATURES_0) \ + MCM_SIGNATURES_INIT_ARTIFACT=$(MCM_SIGNATURES_INIT_ARTIFACT_0) \ + MCM_SIGNATURES_APPEND_ARTIFACT=$(MCM_SIGNATURES_APPEND_ARTIFACT_0) \ + MCM_SIGNATURES_FINALIZE_ARTIFACT=$(MCM_SIGNATURES_FINALIZE_ARTIFACT_0) \ + MCM_PROPOSAL_SET_ROOT_ARTIFACT=$(MCM_PROPOSAL_SET_ROOT_ARTIFACT_0) \ + MCM_PROPOSAL_EXECUTE_ARTIFACT=$(MCM_PROPOSAL_EXECUTE_ARTIFACT_0) + make mcm-ownership-transfer \ + MCM_MULTISIG_ID=$(MCM_MULTISIG_ID_1) \ + MCM_PROPOSED_OWNER=$(MCM_AUTHORITY_1) \ + MCM_OWNERSHIP_TRANSFER_ARTIFACT=$(MCM_OWNERSHIP_TRANSFER_ARTIFACT_1) + make mcm-all \ + MCM_PROPOSAL_OUTPUT=$(MCM_PROPOSAL_OUTPUT_1) \ + MCM_SIGNATURES=$(MCM_SIGNATURES_1) \ + MCM_SIGNATURES_INIT_ARTIFACT=$(MCM_SIGNATURES_INIT_ARTIFACT_1) \ + MCM_SIGNATURES_APPEND_ARTIFACT=$(MCM_SIGNATURES_APPEND_ARTIFACT_1) \ + MCM_SIGNATURES_FINALIZE_ARTIFACT=$(MCM_SIGNATURES_FINALIZE_ARTIFACT_1) \ + MCM_PROPOSAL_SET_ROOT_ARTIFACT=$(MCM_PROPOSAL_SET_ROOT_ARTIFACT_1) \ + MCM_PROPOSAL_EXECUTE_ARTIFACT=$(MCM_PROPOSAL_EXECUTE_ARTIFACT_1) + +# Step 9: Transfer upgrade authority (inherited from parent) +.PHONY: step9-transfer-upgrade-authority +step9-transfer-upgrade-authority: + @echo "==> Step 9: Transferring MCM upgrade authority..." + make sol-program-set-upgrade-authority + make sol-program-show + +# Step 10: Generate set-upgrade-authority artifacts (use solana explorer to get the signature of the set-upgrade-authority tx) +.PHONY: step10-generate-set-upgrade-authority-artifacts +step10-generate-set-upgrade-authority-artifacts: + @echo "==> Step 10: Generating MCM set-upgrade-authority artifacts..." + make sol-confirm SIG=$(SET_UPGRADE_AUTHORITY_SIGNATURE) output=artifacts/set-upgrade-authority-artifacts.json diff --git a/solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch b/solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch new file mode 100644 index 00000000..35c4e6d3 --- /dev/null +++ b/solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch @@ -0,0 +1,12 @@ +diff --git a/chains/solana/contracts/programs/mcm/src/lib.rs b/chains/solana/contracts/programs/mcm/src/lib.rs +index a2e1d0b3..f2420a45 100644 +--- a/chains/solana/contracts/programs/mcm/src/lib.rs ++++ b/chains/solana/contracts/programs/mcm/src/lib.rs +@@ -1,6 +1,6 @@ + use anchor_lang::prelude::*; + +-declare_id!("5vNJx78mz7KVMjhuipyr9jKBKcMrKYGdjGkgE4LUmjKk"); ++declare_id!("Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX"); + + use program::Mcm; + From abf0d9638f0810c3642fb183b8adfb53ef2f5a98 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Mon, 27 Oct 2025 19:44:32 +0100 Subject: [PATCH 2/4] chore(solana): use chain_id 1 for mainnet --- solana/mainnet/2025-10-27-deploy-mcm/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solana/mainnet/2025-10-27-deploy-mcm/.env b/solana/mainnet/2025-10-27-deploy-mcm/.env index beeeeb28..acb53e53 100644 --- a/solana/mainnet/2025-10-27-deploy-mcm/.env +++ b/solana/mainnet/2025-10-27-deploy-mcm/.env @@ -18,7 +18,7 @@ MCM_DEPLOY_SIGNATURE= MCM_PROGRAM_ID=Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX # Same as devnet MCM_MULTISIG_ID_0=0x0000000000000000000000000000000000000000000000000000000000000000 MCM_MULTISIG_ID_1=0x0000000000000000000000000000000000000000000000000000000000000001 -MCM_CHAIN_ID=0 +MCM_CHAIN_ID=1 MCM_AUTHORITY_0= MCM_AUTHORITY_1= MCM_MULTISIG_INIT_ARTIFACT_0=artifacts/mcm-multisig-init-0.json From b93e1e8f55a4e3ed83c7f8188f049cffdab984e1 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Tue, 28 Oct 2025 15:28:08 +0100 Subject: [PATCH 3/4] chore(solana): add funding step to fund MCM authorities --- solana/mainnet/2025-10-27-deploy-mcm/.env | 3 +++ solana/mainnet/2025-10-27-deploy-mcm/Makefile | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/solana/mainnet/2025-10-27-deploy-mcm/.env b/solana/mainnet/2025-10-27-deploy-mcm/.env index acb53e53..77c31db4 100644 --- a/solana/mainnet/2025-10-27-deploy-mcm/.env +++ b/solana/mainnet/2025-10-27-deploy-mcm/.env @@ -68,3 +68,6 @@ NEW_UPGRADE_AUTHORITY=$(MCM_AUTHORITY_0) # Signature of the set-upgrade-authority tx (used to generate the set-upgrade-authority artifacts) SET_UPGRADE_AUTHORITY_SIGNATURE= + +# Variables for funding MCM authorities +SOL_AMOUNT=0.5 diff --git a/solana/mainnet/2025-10-27-deploy-mcm/Makefile b/solana/mainnet/2025-10-27-deploy-mcm/Makefile index 770a2a0b..870ecf85 100644 --- a/solana/mainnet/2025-10-27-deploy-mcm/Makefile +++ b/solana/mainnet/2025-10-27-deploy-mcm/Makefile @@ -147,3 +147,10 @@ step9-transfer-upgrade-authority: step10-generate-set-upgrade-authority-artifacts: @echo "==> Step 10: Generating MCM set-upgrade-authority artifacts..." make sol-confirm SIG=$(SET_UPGRADE_AUTHORITY_SIGNATURE) output=artifacts/set-upgrade-authority-artifacts.json + +# Step 11: Fund MCM authorities (inherited from parent) +.PHONY: step11-fund-mcm-authorities +step11-fund-mcm-authorities: + @echo "==> Step 11: Funding MCM authorities..." + make sol-transfer SOL_RECIPIENT=$(MCM_AUTHORITY_0) output=artifacts/fund-mcm-authority-0.json + make sol-transfer SOL_RECIPIENT=$(MCM_AUTHORITY_1) output=artifacts/fund-mcm-authority-1.json From 3d97af383dcb8f83d0aa0d8494588b64e5b5a260 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Wed, 29 Oct 2025 16:04:05 +0100 Subject: [PATCH 4/4] chore(solana): simplify deployment to same address --- solana/mainnet/2025-10-27-deploy-mcm/.env | 1 - solana/mainnet/2025-10-27-deploy-mcm/Makefile | 4 ++-- .../mainnet/2025-10-27-deploy-mcm/patches/id.patch | 12 ------------ 3 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch diff --git a/solana/mainnet/2025-10-27-deploy-mcm/.env b/solana/mainnet/2025-10-27-deploy-mcm/.env index 77c31db4..80296c83 100644 --- a/solana/mainnet/2025-10-27-deploy-mcm/.env +++ b/solana/mainnet/2025-10-27-deploy-mcm/.env @@ -4,7 +4,6 @@ ANCHOR_VERSION=0.29.0 # Variables for cloning the MCM repo MCM_REPO=https://github.com/base/chainlink-ccip/ MCM_COMMIT=efe0405f3e2fa6789a57ec510e101828040a384b -ID_PATCH=patches/id.patch # Variables for deploying and sending transactions CLUSTER=mainnet diff --git a/solana/mainnet/2025-10-27-deploy-mcm/Makefile b/solana/mainnet/2025-10-27-deploy-mcm/Makefile index 870ecf85..93658d95 100644 --- a/solana/mainnet/2025-10-27-deploy-mcm/Makefile +++ b/solana/mainnet/2025-10-27-deploy-mcm/Makefile @@ -33,8 +33,7 @@ step1-clone-and-patch: rm -rf chainlink-ccip git clone --filter=blob:none $(MCM_REPO) chainlink-ccip cd chainlink-ccip && \ - git checkout $(MCM_COMMIT) && \ - git apply ../$(ID_PATCH) + git checkout $(MCM_COMMIT) # Step 2: Build and deploy the MCM program .PHONY: step2-build-and-deploy @@ -43,6 +42,7 @@ step2-build-and-deploy: mkdir -p chainlink-ccip/chains/solana/contracts/target/deploy/ && \ cp $(MCM_KEYPAIR) chainlink-ccip/chains/solana/contracts/target/deploy/mcm-keypair.json cd chainlink-ccip/chains/solana/contracts && \ + anchor keys sync && \ anchor build -p mcm && \ anchor deploy --provider.cluster $(CLUSTER) --provider.wallet $(AUTHORITY) -p mcm diff --git a/solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch b/solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch deleted file mode 100644 index 35c4e6d3..00000000 --- a/solana/mainnet/2025-10-27-deploy-mcm/patches/id.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/chains/solana/contracts/programs/mcm/src/lib.rs b/chains/solana/contracts/programs/mcm/src/lib.rs -index a2e1d0b3..f2420a45 100644 ---- a/chains/solana/contracts/programs/mcm/src/lib.rs -+++ b/chains/solana/contracts/programs/mcm/src/lib.rs -@@ -1,6 +1,6 @@ - use anchor_lang::prelude::*; - --declare_id!("5vNJx78mz7KVMjhuipyr9jKBKcMrKYGdjGkgE4LUmjKk"); -+declare_id!("Ea5qsVs2kwQXi7LMAh3Qg5YKpuPQbW7oqvYaPXUwBwoX"); - - use program::Mcm; -