From fc46887c386bf0f526b95fa249f637537b11beab Mon Sep 17 00:00:00 2001 From: Jack Chuma Date: Mon, 2 Mar 2026 12:21:55 -0500 Subject: [PATCH 1/3] improve base makefile usability --- base/Makefile | 136 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 96 insertions(+), 40 deletions(-) diff --git a/base/Makefile b/base/Makefile index 519dea9..f6db6bb 100644 --- a/base/Makefile +++ b/base/Makefile @@ -1,36 +1,92 @@ -include .env -# BASE_RPC=https://base-sepolia.cbhq.net -BASE_RPC=https://mainnet.base.org +# Environment mapping: ENV -> RPC URL, deployment file, BRIDGE_ENVIRONMENT +# Usage: make ENV={testnet-alpha|testnet-prod|mainnet} +VALID_ENVS := testnet-alpha testnet-prod mainnet + +ifeq ($(ENV),testnet-alpha) + BASE_RPC := https://base-sepolia.cbhq.net + DEPLOYMENT_FILE := deployments/base_sepolia_alpha.json + BRIDGE_ENV := alpha +else ifeq ($(ENV),testnet-prod) + BASE_RPC := https://base-sepolia.cbhq.net + DEPLOYMENT_FILE := deployments/base_sepolia_prod.json + BRIDGE_ENV := prod +else ifeq ($(ENV),mainnet) + BASE_RPC := https://mainnet.base.org + DEPLOYMENT_FILE := deployments/base_mainnet.json + BRIDGE_ENV := mainnet +endif ifndef LEDGER_ACCOUNT override LEDGER_ACCOUNT = 0 endif -# Update values in this section to specify token recipients / token amount -#################################################################################################### -# mainnet, sepolia_alpha or sepolia_prod -ENV_NAME=mainnet - -SOLANA_SOL_RECEIVER = 0x6e0019e37547b086395a9a6834f731bab5b631004ac22a6c9102047301e40c77 -USER_SPL_ATA = 0xfc6697ab185712eed628c12e499a3f4c2d4f73ced9dcc6eab8658bea86adb0e7 -USER_REMOTE_ERC20_ATA = 0x7227267f49cac157705e1a5f7ac9f9933c902ae5368cbcc2a12e06d0566f826c -USER_REMOTE_ETH_ATA = 0x3e506b04e88dab39a3687fc5eb822c18f8301fc09cfe945c3394fc6baf9aef25 +# Recipient addresses and amount (override via make args or env vars) +SOLANA_SOL_RECEIVER ?= 0x6e0019e37547b086395a9a6834f731bab5b631004ac22a6c9102047301e40c77 +USER_SPL_ATA ?= 0xfc6697ab185712eed628c12e499a3f4c2d4f73ced9dcc6eab8658bea86adb0e7 +USER_REMOTE_ERC20_ATA ?= 0x7227267f49cac157705e1a5f7ac9f9933c902ae5368cbcc2a12e06d0566f826c +USER_REMOTE_ETH_ATA ?= 0x3e506b04e88dab39a3687fc5eb822c18f8301fc09cfe945c3394fc6baf9aef25 -AMOUNT = 1000000000 -#################################################################################################### +AMOUNT ?= 1000000000 -BRIDGE = $(shell jq -r '.Bridge' deployments/base_$(ENV_NAME).json) -LOCAL_SOL = $(shell jq -r '.WrappedSOL' deployments/base_$(ENV_NAME).json) -REMOTE_SOL = $(shell jq -r '.RemoteSOL' deployments/base_$(ENV_NAME).json) -LOCAL_SPL = $(shell jq -r '.WrappedSPL' deployments/base_$(ENV_NAME).json) -REMOTE_SPL = $(shell jq -r '.RemoteSPL' deployments/base_$(ENV_NAME).json) -REMOTE_ERC20 = $(shell jq -r '.RemoteERC20' deployments/base_$(ENV_NAME).json) -REMOTE_ETH = $(shell jq -r '.RemoteETH' deployments/base_$(ENV_NAME).json) +# Contract addresses (read from deployment file) +BRIDGE = $(shell jq -r '.Bridge' $(DEPLOYMENT_FILE)) +LOCAL_SOL = $(shell jq -r '.WrappedSOL' $(DEPLOYMENT_FILE)) +REMOTE_SOL = $(shell jq -r '.RemoteSOL' $(DEPLOYMENT_FILE)) +LOCAL_SPL = $(shell jq -r '.WrappedSPL' $(DEPLOYMENT_FILE)) +REMOTE_SPL = $(shell jq -r '.RemoteSPL' $(DEPLOYMENT_FILE)) +REMOTE_ERC20 = $(shell jq -r '.RemoteERC20' $(DEPLOYMENT_FILE)) +REMOTE_ETH = $(shell jq -r '.RemoteETH' $(DEPLOYMENT_FILE)) LOCAL_ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE LOCAL_ERC20 = 0x4870D23984Dd663005EB8E2b616e4Ef62630183c -# LOCAL_ERC20 = 0x62C1332822983B8412A6Ffda0fd77cd7d5733Ee9 + +# Environment validation +.PHONY: validate-env +validate-env: +ifndef ENV + $(error ENV is required. Usage: make ENV={testnet-alpha|testnet-prod|mainnet}) +endif +ifeq ($(filter $(ENV),$(VALID_ENVS)),) + $(error Invalid ENV='$(ENV)'. Must be one of: $(VALID_ENVS)) +endif + +.PHONY: help +help: + @echo "Usage: make ENV={testnet-alpha|testnet-prod|mainnet}" + @echo "" + @echo "Environments:" + @echo " testnet-alpha Base Sepolia (alpha deployment)" + @echo " testnet-prod Base Sepolia (prod deployment)" + @echo " mainnet Base Mainnet" + @echo "" + @echo "Bridge targets (require ENV):" + @echo " bridge-sol-to-solana Bridge wrapped SOL to Solana" + @echo " bridge-spl-to-solana Bridge wrapped SPL to Solana" + @echo " bridge-erc20-to-solana Bridge ERC20 to Solana" + @echo " bridge-eth-to-solana Bridge ETH to Solana" + @echo "" + @echo "Deployment targets (require ENV):" + @echo " deploy Deploy bridge contracts" + @echo " upgrade Upgrade bridge contracts" + @echo " dev-deploy Deploy + create wrapped tokens" + @echo " create-wrapped-spl Create wrapped SPL token" + @echo " create-mock-token Deploy a mock ERC20" + @echo "" + @echo "Query targets (require ENV):" + @echo " check-root Check the bridge root" + @echo " check-count Check the bridge message count" + @echo "" + @echo "Other targets:" + @echo " deps Install forge dependencies" + @echo " bindings Generate Go bindings" + @echo " coverage Run test coverage" + @echo "" + @echo "Overridable variables:" + @echo " AMOUNT Token amount (default: 1000000000)" + @echo " SOLANA_SOL_RECEIVER SOL recipient address" + @echo " LEDGER_ACCOUNT Ledger HD account index (default: 0)" check: @echo $(REMOTE_ERC20) @@ -64,24 +120,24 @@ coverage: dev-deploy: deploy create-wrapped-sol create-wrapped-spl .PHONY: deploy -deploy: - BRIDGE_ENVIRONMENT=$(ENV_NAME) forge script DeployScript --account testnet-admin --rpc-url $(BASE_RPC) --sender $(shell cast wallet address --account testnet-admin) --broadcast -vvvv +deploy: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) forge script DeployScript --account testnet-admin --rpc-url $(BASE_RPC) --sender $(shell cast wallet address --account testnet-admin) --broadcast -vvvv .PHONY: upgrade -upgrade: - BRIDGE_ENVIRONMENT=$(ENV_NAME) forge script UpgradeScript --account testnet-upgrade --rpc-url $(BASE_RPC) --broadcast -vvvv +upgrade: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) forge script UpgradeScript --account testnet-upgrade --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: create-wrapped-spl -create-wrapped-spl: - BRIDGE_ENVIRONMENT=$(ENV_NAME) TOKEN_NAME=WrappedSPL TOKEN_SYMBOL=wSPL REMOTE_TOKEN=$(REMOTE_SPL) TOKEN_DECIMALS=9 forge script CreateTokenScript --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv +create-wrapped-spl: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) TOKEN_NAME=WrappedSPL TOKEN_SYMBOL=wSPL REMOTE_TOKEN=$(REMOTE_SPL) TOKEN_DECIMALS=9 forge script CreateTokenScript --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: create-mock-token -create-mock-token: +create-mock-token: validate-env ADMIN=0x644e3DedB0e4F83Bfcf8F9992964d240224B74dc forge script DeployERC20 --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: bridge-sol-to-solana -bridge-sol-to-solana: - BRIDGE_ENVIRONMENT=$(ENV_NAME) \ +bridge-sol-to-solana: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) \ LOCAL_TOKEN=$(LOCAL_SOL) \ REMOTE_TOKEN=$(REMOTE_SOL) \ TO=$(SOLANA_SOL_RECEIVER) \ @@ -89,8 +145,8 @@ bridge-sol-to-solana: forge script BridgeTokensToSolanaScript --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: bridge-spl-to-solana -bridge-spl-to-solana: - BRIDGE_ENVIRONMENT=$(ENV_NAME) \ +bridge-spl-to-solana: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) \ LOCAL_TOKEN=$(LOCAL_SPL) \ REMOTE_TOKEN=$(REMOTE_SPL) \ TO=$(USER_SPL_ATA) \ @@ -98,8 +154,8 @@ bridge-spl-to-solana: forge script BridgeTokensToSolanaScript --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: bridge-erc20-to-solana -bridge-erc20-to-solana: - BRIDGE_ENVIRONMENT=$(ENV_NAME) \ +bridge-erc20-to-solana: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) \ LOCAL_TOKEN=$(LOCAL_ERC20) \ REMOTE_TOKEN=$(REMOTE_ERC20) \ TO=$(USER_REMOTE_ERC20_ATA) \ @@ -108,8 +164,8 @@ bridge-erc20-to-solana: forge script BridgeTokensToSolanaScript --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: bridge-eth-to-solana -bridge-eth-to-solana: - BRIDGE_ENVIRONMENT=$(ENV_NAME) \ +bridge-eth-to-solana: validate-env + BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) \ LOCAL_TOKEN=$(LOCAL_ETH) \ REMOTE_TOKEN=$(REMOTE_ETH) \ TO=$(USER_REMOTE_ETH_ATA) \ @@ -117,9 +173,9 @@ bridge-eth-to-solana: forge script BridgeTokensToSolanaScript --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" --rpc-url $(BASE_RPC) --broadcast -vvvv .PHONY: check-root -check-root: - @ cast call $(BRIDGE) "getRoot()" --rpc-url https://base-sepolia-dev.cbhq.net:8545 +check-root: validate-env + @ cast call $(BRIDGE) "getRoot()" --rpc-url $(BASE_RPC) .PHONY: check-count -check-count: - @ cast call 0xCdfe10f911eD5039E031D6a7be3a0F97fA061C38 "count()" --rpc-url https://base-sepolia-dev.cbhq.net:8545 +check-count: validate-env + @ cast call $(BRIDGE) "count()" --rpc-url $(BASE_RPC) From 8d9627b61a4c26e157da72115424a2b5180e1f35 Mon Sep 17 00:00:00 2001 From: Jack Chuma Date: Mon, 2 Mar 2026 12:35:13 -0500 Subject: [PATCH 2/3] pr feedback --- base/Makefile | 16 +++++++--------- base/deployments/base_mainnet.json | 3 ++- base/deployments/base_sepolia_alpha.json | 3 ++- base/deployments/base_sepolia_prod.json | 3 ++- base/deployments/template.json | 3 ++- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/base/Makefile b/base/Makefile index f6db6bb..af90b70 100644 --- a/base/Makefile +++ b/base/Makefile @@ -30,7 +30,10 @@ USER_REMOTE_ETH_ATA ?= 0x3e506b04e88dab39a3687fc5eb822c18f8301fc09cfe945c3394fc6 AMOUNT ?= 1000000000 -# Contract addresses (read from deployment file) +# Contract addresses (read from deployment file, only when ENV is set) +LOCAL_ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE + +ifdef DEPLOYMENT_FILE BRIDGE = $(shell jq -r '.Bridge' $(DEPLOYMENT_FILE)) LOCAL_SOL = $(shell jq -r '.WrappedSOL' $(DEPLOYMENT_FILE)) REMOTE_SOL = $(shell jq -r '.RemoteSOL' $(DEPLOYMENT_FILE)) @@ -38,9 +41,8 @@ LOCAL_SPL = $(shell jq -r '.WrappedSPL' $(DEPLOYMENT_FILE)) REMOTE_SPL = $(shell jq -r '.RemoteSPL' $(DEPLOYMENT_FILE)) REMOTE_ERC20 = $(shell jq -r '.RemoteERC20' $(DEPLOYMENT_FILE)) REMOTE_ETH = $(shell jq -r '.RemoteETH' $(DEPLOYMENT_FILE)) - -LOCAL_ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE -LOCAL_ERC20 = 0x4870D23984Dd663005EB8E2b616e4Ef62630183c +LOCAL_ERC20 = $(shell jq -r '.LocalERC20' $(DEPLOYMENT_FILE)) +endif # Environment validation .PHONY: validate-env @@ -70,7 +72,6 @@ help: @echo "Deployment targets (require ENV):" @echo " deploy Deploy bridge contracts" @echo " upgrade Upgrade bridge contracts" - @echo " dev-deploy Deploy + create wrapped tokens" @echo " create-wrapped-spl Create wrapped SPL token" @echo " create-mock-token Deploy a mock ERC20" @echo "" @@ -88,7 +89,7 @@ help: @echo " SOLANA_SOL_RECEIVER SOL recipient address" @echo " LEDGER_ACCOUNT Ledger HD account index (default: 0)" -check: +check: validate-env @echo $(REMOTE_ERC20) .PHONY: deps @@ -116,9 +117,6 @@ bindings: coverage: @ forge coverage --no-match-coverage "(script|test)" -.PHONY: dev-deploy -dev-deploy: deploy create-wrapped-sol create-wrapped-spl - .PHONY: deploy deploy: validate-env BRIDGE_ENVIRONMENT=$(BRIDGE_ENV) forge script DeployScript --account testnet-admin --rpc-url $(BASE_RPC) --sender $(shell cast wallet address --account testnet-admin) --broadcast -vvvv diff --git a/base/deployments/base_mainnet.json b/base/deployments/base_mainnet.json index acf1ef0..0a61466 100644 --- a/base/deployments/base_mainnet.json +++ b/base/deployments/base_mainnet.json @@ -9,5 +9,6 @@ "RemoteERC20": "", "RemoteETH": "", "WrappedSOL": "0x311935Cd80B76769bF2ecC9D8Ab7635b2139cf82", - "WrappedSPL": "" + "WrappedSPL": "", + "LocalERC20": "0x4870D23984Dd663005EB8E2b616e4Ef62630183c" } diff --git a/base/deployments/base_sepolia_alpha.json b/base/deployments/base_sepolia_alpha.json index efe79dd..8687378 100644 --- a/base/deployments/base_sepolia_alpha.json +++ b/base/deployments/base_sepolia_alpha.json @@ -9,5 +9,6 @@ "RemoteERC20": "0xba6a03ad9fe4921c8a5a4e8d3ef0a8d76ac6137ea1213879512abc24c6ab4376", "RemoteETH": "0x79f4f1fa82df5ae874eaff38c8288c15a0317eab263a6a2f4ed32ca9224ba62c", "WrappedSOL": "0x003512146Fd54b71f926C7Fd4B7bd20Fc84E22c5", - "WrappedSPL": "0x80351342c4dd23C78c0837C640E041a239e67cD8" + "WrappedSPL": "0x80351342c4dd23C78c0837C640E041a239e67cD8", + "LocalERC20": "0x62C1332822983B8412A6Ffda0fd77cd7d5733Ee9" } diff --git a/base/deployments/base_sepolia_prod.json b/base/deployments/base_sepolia_prod.json index 641b6c6..3b7fc20 100644 --- a/base/deployments/base_sepolia_prod.json +++ b/base/deployments/base_sepolia_prod.json @@ -9,5 +9,6 @@ "RemoteERC20": "0xc7cfe164b0b61064d6f23734f906c8141788be442d94495852d8af53b40e3212", "RemoteETH": "0xcb3d6f70c63eee106144cdf6cf934901b684be88171380e87a3f8d03f720a185", "WrappedSOL": "0xCace0c896714DaF7098FFD8CC54aFCFe0338b4BC", - "WrappedSPL": "0x955C7356776F9304feD38ed5AeC5699436C7C614" + "WrappedSPL": "0x955C7356776F9304feD38ed5AeC5699436C7C614", + "LocalERC20": "0x62C1332822983B8412A6Ffda0fd77cd7d5733Ee9" } diff --git a/base/deployments/template.json b/base/deployments/template.json index 80b87f9..4b5f861 100644 --- a/base/deployments/template.json +++ b/base/deployments/template.json @@ -9,5 +9,6 @@ "WrappedSOL": "", "WrappedSPL": "", "RemoteERC20": "", - "RemoteETH": "" + "RemoteETH": "", + "LocalERC20": "" } From c522a9a27cbd7dea9190f604d98e6d1b3daf724e Mon Sep 17 00:00:00 2001 From: Jack Chuma Date: Mon, 2 Mar 2026 12:46:56 -0500 Subject: [PATCH 3/3] remove unneeded command --- base/Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/base/Makefile b/base/Makefile index af90b70..6870b13 100644 --- a/base/Makefile +++ b/base/Makefile @@ -89,9 +89,6 @@ help: @echo " SOLANA_SOL_RECEIVER SOL recipient address" @echo " LEDGER_ACCOUNT Ledger HD account index (default: 0)" -check: validate-env - @echo $(REMOTE_ERC20) - .PHONY: deps deps: clean-lib forge-deps