diff --git a/base/Makefile b/base/Makefile index 519dea9..6870b13 100644 --- a/base/Makefile +++ b/base/Makefile @@ -1,39 +1,93 @@ -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 +# 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 -SOLANA_SOL_RECEIVER = 0x6e0019e37547b086395a9a6834f731bab5b631004ac22a6c9102047301e40c77 -USER_SPL_ATA = 0xfc6697ab185712eed628c12e499a3f4c2d4f73ced9dcc6eab8658bea86adb0e7 -USER_REMOTE_ERC20_ATA = 0x7227267f49cac157705e1a5f7ac9f9933c902ae5368cbcc2a12e06d0566f826c -USER_REMOTE_ETH_ATA = 0x3e506b04e88dab39a3687fc5eb822c18f8301fc09cfe945c3394fc6baf9aef25 +AMOUNT ?= 1000000000 -AMOUNT = 1000000000 -#################################################################################################### +# Contract addresses (read from deployment file, only when ENV is set) +LOCAL_ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE -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) +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)) +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_ERC20 = $(shell jq -r '.LocalERC20' $(DEPLOYMENT_FILE)) +endif -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 -check: - @echo $(REMOTE_ERC20) +.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 " 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)" .PHONY: deps deps: clean-lib forge-deps @@ -60,28 +114,25 @@ bindings: coverage: @ forge coverage --no-match-coverage "(script|test)" -.PHONY: dev-deploy -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 +140,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 +149,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 +159,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 +168,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) 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": "" }