Skip to content
Open
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
24 changes: 18 additions & 6 deletions contracts/evm-gateway/.env.example
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
# Sepolia Testnet Configuration
SEPOLIA_RPC_URL=YOUR_RPC_RUL
ETH_MAINNET_RPC_URL=YOUR_RPC_RUL
POLYGON_RPC_URL=YOUR_RPC_RUL
# RPC URLs
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_KEY
BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
ARB_SEPOLIA_RPC_URL=https://sepolia-rollup.arbitrum.io/rpc
BSC_TESTNET_RPC_URL=https://data-seed-prebsc-1-s1.binance.org:8545
PUSH_CHAIN_RPC_URL=https://evm.rpc-testnet-donut-node1.push.org/

# Optional: Etherscan API Key for verification
ETHERSCAN_API_KEY=your_etherscan_api_key_here
# Private Keys (must have 0x prefix)
PRIVATE_KEY_sepolia=0x...
PRIVATE_KEY_base_sepolia=0x...
PRIVATE_KEY_arb_sepolia=0x...
PRIVATE_KEY_bsc_testnet=0x...
PRIVATE_KEY_push_chain=0x...

# Etherscan API Keys
ETHERSCAN_API_KEY=...
BASESCAN_API_KEY=...
ARBISCAN_API_KEY=...
BSCSCAN_API_KEY=...
219 changes: 219 additions & 0 deletions contracts/evm-gateway/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
.PHONY: help deploy-gateway deploy-gateway-v0 deploy-gateway-pc verify-gateway verify-gateway-v0 verify-gateway-pc upgrade-gateway upgrade-gateway-v0 upgrade-vault upgrade-gateway-pc upgrade-vault-pc

# Default network
network ?= sepolia

# Map network names to foundry chain names
ifeq ($(network),sepolia)
CHAIN = sepolia
else ifeq ($(network),base_sepolia)
CHAIN = base_sepolia
else ifeq ($(network),arb_sepolia)
CHAIN = arb_sepolia
else ifeq ($(network),bsc_testnet)
CHAIN = bsc_testnet
else ifeq ($(network),push_chain)
CHAIN = push_chain
else
$(error Unknown network: $(network). Supported: sepolia, base_sepolia, arb_sepolia, bsc_testnet, push_chain)
endif

help:
@echo "════════════════════════════════════════════════════════════════"
@echo " DEPLOYMENT COMMANDS"
@echo "════════════════════════════════════════════════════════════════"
@echo ""
@echo " make deploy-gateway network=<network>"
@echo " Deploy UniversalGateway + Vault (new, no USDT)"
@echo ""
@echo " make deploy-gateway-v0 network=<network>"
@echo " Deploy UniversalGatewayV0 (legacy with USDT)"
@echo ""
@echo " make deploy-gateway-pc network=<network>"
@echo " Deploy UniversalGatewayPC + VaultPC (Push Chain)"
@echo ""
@echo "════════════════════════════════════════════════════════════════"
@echo " VERIFICATION COMMANDS"
@echo "════════════════════════════════════════════════════════════════"
@echo ""
@echo " make verify-gateway network=<network>"
@echo " make verify-gateway-v0 network=<network>"
@echo " make verify-gateway-pc network=<network>"
@echo ""
@echo "════════════════════════════════════════════════════════════════"
@echo " UPGRADE COMMANDS"
@echo "════════════════════════════════════════════════════════════════"
@echo ""
@echo " make upgrade-gateway network=<network> PROXY_ADDRESS=0x... PROXY_ADMIN_ADDRESS=0x..."
@echo " Upgrade UniversalGateway"
@echo ""
@echo " make upgrade-gateway-v0 network=<network> PROXY_ADDRESS=0x... PROXY_ADMIN_ADDRESS=0x..."
@echo " Upgrade UniversalGatewayV0"
@echo ""
@echo " make upgrade-vault network=<network> PROXY_ADDRESS=0x... PROXY_ADMIN_ADDRESS=0x..."
@echo " Upgrade Vault"
@echo ""
@echo " make upgrade-gateway-pc network=<network> PROXY_ADDRESS=0x... PROXY_ADMIN_ADDRESS=0x..."
@echo " Upgrade UniversalGatewayPC"
@echo ""
@echo " make upgrade-vault-pc network=<network> PROXY_ADDRESS=0x... PROXY_ADMIN_ADDRESS=0x..."
@echo " Upgrade VaultPC"
@echo ""
@echo "════════════════════════════════════════════════════════════════"
@echo " NETWORKS: sepolia, base_sepolia, arb_sepolia, bsc_testnet, push_chain"
@echo "════════════════════════════════════════════════════════════════"

# ═══════════════════════════════════════════════════════════════════════
# DEPLOYMENT
# ═══════════════════════════════════════════════════════════════════════

deploy-gateway:
@echo "Deploying UniversalGateway + Vault to $(network)..."
@NETWORK=$(network) forge script script/deployment/DeployUniversalGateway.sol:DeployUniversalGateway \
--rpc-url $(CHAIN) \
--broadcast \
--via-ir
@echo "✅ Deployment complete! Run 'make verify-gateway network=$(network)' to verify contracts."

deploy-gateway-v0:
@echo "Deploying UniversalGatewayV0 to $(network)..."
@NETWORK=$(network) forge script script/deployment/DeployUniversalGatewayV0.sol:DeployUniversalGatewayV0 \
--rpc-url $(CHAIN) \
--broadcast \
--via-ir
@echo "✅ Deployment complete! Run 'make verify-gateway-v0 network=$(network)' to verify contracts."

deploy-gateway-pc:
@echo "Deploying UniversalGatewayPC + VaultPC to $(network)..."
@NETWORK=$(network) forge script script/deployment/DeployUniversalGatewayPC.sol:DeployUniversalGatewayPC \
--rpc-url $(CHAIN) \
--broadcast \
--slow \
--via-ir
@echo "✅ Deployment complete! Verify manually if needed."

# ═══════════════════════════════════════════════════════════════════════
# VERIFICATION
# ═══════════════════════════════════════════════════════════════════════

verify-gateway:
@echo "Use broadcast receipts to verify contracts manually:"
@echo "Check: broadcast/DeployUniversalGateway.sol/*/run-latest.json"
@echo ""
@echo "Example: forge verify-contract <PROXY_ADDRESS> src/UniversalGateway.sol:UniversalGateway --chain $(CHAIN)"

verify-gateway-v0:
@echo "Use broadcast receipts to verify contracts manually:"
@echo "Check: broadcast/DeployUniversalGatewayV0.sol/*/run-latest.json"
@echo ""
@echo "Example: forge verify-contract <PROXY_ADDRESS> src/UniversalGatewayV0.sol:UniversalGatewayV0 --chain $(CHAIN)"

verify-gateway-pc:
@echo "Use broadcast receipts to verify contracts manually:"
@echo "Check: broadcast/DeployUniversalGatewayPC.sol/*/run-latest.json"
@echo ""
@echo "Example: forge verify-contract <PROXY_ADDRESS> src/UniversalGatewayPC.sol:UniversalGatewayPC --chain $(CHAIN)"

# ═══════════════════════════════════════════════════════════════════════
# UPGRADE
# ═══════════════════════════════════════════════════════════════════════

upgrade-gateway:
@echo "Upgrading UniversalGateway on $(network)..."
@if [ -z "$(PROXY_ADDRESS)" ]; then \
echo "Auto-detecting proxy from broadcast folder..."; \
SCRIPT_DIR="broadcast/DeployUniversalGateway.sol"; \
LATEST=$$(find $$SCRIPT_DIR -name "run-latest.json" ! -path "*/dry-run/*" -type f -exec ls -t {} + 2>/dev/null | head -1); \
if [ -z "$$LATEST" ]; then echo "❌ No deployment found. Deploy first or provide PROXY_ADDRESS=0x..."; exit 1; fi; \
if command -v jq >/dev/null 2>&1; then \
PROXY=$$(jq -r '.transactions[] | select(.contractName == "TransparentUpgradeableProxy" and (.transaction.to == null or .transaction.to == "")) | .contractAddress' $$LATEST 2>/dev/null | head -1); \
else \
PROXY=$$(cat $$LATEST | grep -B2 -A5 '"contractName": "TransparentUpgradeableProxy"' | grep -B3 '"to": null' | grep '"contractAddress"' | tail -1 | cut -d'"' -f4); \
fi; \
if [ -z "$$PROXY" ] || [ "$$PROXY" = "null" ]; then echo "❌ Could not find Gateway proxy address in deployment"; exit 1; fi; \
echo "Found Gateway Proxy: $$PROXY (ProxyAdmin auto-detected from storage slot)"; \
NETWORK=$(network) PROXY_ADDRESS=$$PROXY forge script script/upgrade/UpgradeUniversalGateway.sol:UpgradeUniversalGateway --rpc-url $(CHAIN) --broadcast --via-ir; \
else \
echo "Using provided PROXY_ADDRESS: $(PROXY_ADDRESS)"; \
NETWORK=$(network) PROXY_ADDRESS=$(PROXY_ADDRESS) forge script script/upgrade/UpgradeUniversalGateway.sol:UpgradeUniversalGateway --rpc-url $(CHAIN) --broadcast --via-ir; \
fi

upgrade-gateway-v0:
@echo "Upgrading UniversalGatewayV0 on $(network)..."
@if [ -z "$(PROXY_ADDRESS)" ]; then \
echo "Auto-detecting proxy from broadcast folder..."; \
SCRIPT_DIR="broadcast/DeployUniversalGatewayV0.sol"; \
LATEST=$$(find $$SCRIPT_DIR -name "run-latest.json" ! -path "*/dry-run/*" -type f -exec ls -t {} + 2>/dev/null | head -1); \
if [ -z "$$LATEST" ]; then echo "❌ No deployment found. Deploy first or provide PROXY_ADDRESS=0x..."; exit 1; fi; \
if command -v jq >/dev/null 2>&1; then \
PROXY=$$(jq -r '.transactions[] | select(.contractName == "TransparentUpgradeableProxy" and (.transaction.to == null or .transaction.to == "")) | .contractAddress' $$LATEST 2>/dev/null | head -1); \
else \
PROXY=$$(cat $$LATEST | grep -B2 -A5 '"contractName": "TransparentUpgradeableProxy"' | grep -B3 '"to": null' | grep '"contractAddress"' | tail -1 | cut -d'"' -f4); \
fi; \
if [ -z "$$PROXY" ] || [ "$$PROXY" = "null" ]; then echo "❌ Could not find proxy address in deployment"; exit 1; fi; \
echo "Found Gateway Proxy: $$PROXY (ProxyAdmin auto-detected from storage slot)"; \
NETWORK=$(network) PROXY_ADDRESS=$$PROXY forge script script/upgrade/UpgradeUniversalGatewayV0.sol:UpgradeUniversalGatewayV0 --rpc-url $(CHAIN) --broadcast --via-ir; \
else \
echo "Using provided PROXY_ADDRESS: $(PROXY_ADDRESS)"; \
NETWORK=$(network) PROXY_ADDRESS=$(PROXY_ADDRESS) forge script script/upgrade/UpgradeUniversalGatewayV0.sol:UpgradeUniversalGatewayV0 --rpc-url $(CHAIN) --broadcast --via-ir; \
fi

upgrade-vault:
@echo "Upgrading Vault on $(network)..."
@if [ -z "$(PROXY_ADDRESS)" ]; then \
echo "Auto-detecting proxy from broadcast folder..."; \
SCRIPT_DIR="broadcast/DeployUniversalGateway.sol"; \
LATEST=$$(find $$SCRIPT_DIR -name "run-latest.json" ! -path "*/dry-run/*" -type f -exec ls -t {} + 2>/dev/null | head -1); \
if [ -z "$$LATEST" ]; then echo "❌ No deployment found. Deploy first or provide PROXY_ADDRESS=0x..."; exit 1; fi; \
if command -v jq >/dev/null 2>&1; then \
PROXY=$$(jq -r '.transactions[] | select((.contractName == "Vault" or (.contractName == "TransparentUpgradeableProxy" and (.transaction.to == null or .transaction.to == ""))) and .contractAddress != null) | .contractAddress' $$LATEST 2>/dev/null | grep -v "^$$" | tail -1); \
else \
PROXY=$$(cat $$LATEST | grep -B5 '"contractName": "Vault"' | grep '"contractAddress"' | tail -1 | cut -d'"' -f4); \
fi; \
if [ -z "$$PROXY" ] || [ "$$PROXY" = "null" ]; then echo "❌ Could not find Vault proxy address in deployment"; exit 1; fi; \
echo "Found Vault Proxy: $$PROXY (ProxyAdmin auto-detected from storage slot)"; \
NETWORK=$(network) PROXY_ADDRESS=$$PROXY forge script script/upgrade/UpgradeVault.sol:UpgradeVault --rpc-url $(CHAIN) --broadcast --via-ir; \
else \
echo "Using provided PROXY_ADDRESS: $(PROXY_ADDRESS)"; \
NETWORK=$(network) PROXY_ADDRESS=$(PROXY_ADDRESS) forge script script/upgrade/UpgradeVault.sol:UpgradeVault --rpc-url $(CHAIN) --broadcast --via-ir; \
fi

upgrade-gateway-pc:
@echo "Upgrading UniversalGatewayPC on $(network)..."
@if [ -z "$(PROXY_ADDRESS)" ]; then \
echo "Auto-detecting proxy from broadcast folder..."; \
SCRIPT_DIR="broadcast/DeployUniversalGatewayPC.sol"; \
LATEST=$$(find $$SCRIPT_DIR -name "run-latest.json" ! -path "*/dry-run/*" -type f -exec ls -t {} + 2>/dev/null | head -1); \
if [ -z "$$LATEST" ]; then echo "❌ No deployment found. Deploy first or provide PROXY_ADDRESS=0x..."; exit 1; fi; \
if command -v jq >/dev/null 2>&1; then \
PROXY=$$(jq -r '.transactions[] | select(.contractName == "TransparentUpgradeableProxy" and (.transaction.to == null or .transaction.to == "")) | .contractAddress' $$LATEST 2>/dev/null | tail -1); \
else \
PROXY=$$(cat $$LATEST | grep -B2 -A5 '"contractName": "TransparentUpgradeableProxy"' | grep -B3 '"to": null' | grep '"contractAddress"' | tail -1 | cut -d'"' -f4); \
fi; \
if [ -z "$$PROXY" ] || [ "$$PROXY" = "null" ]; then echo "❌ Could not find GatewayPC proxy address in deployment"; exit 1; fi; \
echo "Found Gateway Proxy: $$PROXY (ProxyAdmin auto-detected from storage slot)"; \
NETWORK=$(network) PROXY_ADDRESS=$$PROXY forge script script/upgrade/UpgradeUniversalGatewayPC.sol:UpgradeUniversalGatewayPC --rpc-url $(CHAIN) --broadcast --slow --via-ir; \
else \
echo "Using provided PROXY_ADDRESS: $(PROXY_ADDRESS)"; \
NETWORK=$(network) PROXY_ADDRESS=$(PROXY_ADDRESS) forge script script/upgrade/UpgradeUniversalGatewayPC.sol:UpgradeUniversalGatewayPC --rpc-url $(CHAIN) --broadcast --slow --via-ir; \
fi

upgrade-vault-pc:
@echo "Upgrading VaultPC on $(network)..."
@if [ -z "$(PROXY_ADDRESS)" ]; then \
echo "Auto-detecting proxy from broadcast folder..."; \
SCRIPT_DIR="broadcast/DeployUniversalGatewayPC.sol"; \
LATEST=$$(find $$SCRIPT_DIR -name "run-latest.json" ! -path "*/dry-run/*" -type f -exec ls -t {} + 2>/dev/null | head -1); \
if [ -z "$$LATEST" ]; then echo "❌ No deployment found. Deploy first or provide PROXY_ADDRESS=0x..."; exit 1; fi; \
if command -v jq >/dev/null 2>&1; then \
PROXY=$$(jq -r '.transactions[] | select(.contractName == "TransparentUpgradeableProxy" and (.transaction.to == null or .transaction.to == "")) | .contractAddress' $$LATEST 2>/dev/null | head -1); \
else \
PROXY=$$(cat $$LATEST | grep -B2 -A5 '"contractName": "TransparentUpgradeableProxy"' | grep -B3 '"to": null' | grep '"contractAddress"' | head -1 | cut -d'"' -f4); \
fi; \
if [ -z "$$PROXY" ] || [ "$$PROXY" = "null" ]; then echo "❌ Could not find VaultPC proxy address in deployment"; exit 1; fi; \
echo "Found VaultPC Proxy: $$PROXY (ProxyAdmin auto-detected from storage slot)"; \
NETWORK=$(network) PROXY_ADDRESS=$$PROXY forge script script/upgrade/UpgradeVaultPC.sol:UpgradeVaultPC --rpc-url $(CHAIN) --broadcast --slow --via-ir; \
else \
echo "Using provided PROXY_ADDRESS: $(PROXY_ADDRESS)"; \
NETWORK=$(network) PROXY_ADDRESS=$(PROXY_ADDRESS) forge script script/upgrade/UpgradeVaultPC.sol:UpgradeVaultPC --rpc-url $(CHAIN) --broadcast --slow --via-ir; \
fi
23 changes: 15 additions & 8 deletions contracts/evm-gateway/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,21 +214,28 @@ forge coverage --ir-minimum

## Deployment and Verification

See `script/` and `script/DeployCommands.md` for example commands. Example (Sepolia):
**Deploy:**
```bash
make deploy-gateway network=sepolia
make deploy-gateway-v0 network=sepolia
make deploy-gateway-pc network=push_chain
```

Deploy (proxy + implementation + admin via script):
**Upgrade (auto-detects proxy address if not provided):**
```bash
forge script script/1_DeployGatewayWithProxy.sol:DeployGatewayWithProxy \
--rpc-url $SEPOLIA_RPC_URL --private-key $KEY --broadcast
make upgrade-gateway network=sepolia
make upgrade-gateway-v0 network=sepolia
make upgrade-vault network=sepolia
make upgrade-gateway-pc network=push_chain
make upgrade-vault-pc network=push_chain
```

Upgrade:
**Manual override:**
```bash
forge script script/3_UpgradeGatewayNewImpl.sol:UpgradeGatewayNewImpl \
--rpc-url $SEPOLIA_RPC_URL --private-key $KEY --broadcast
make upgrade-gateway-v0 network=sepolia PROXY_ADDRESS=0x...
```

Verification examples are listed in `script/DeployCommands.md`.
**Networks:** `sepolia`, `base_sepolia`, `arb_sepolia`, `bsc_testnet`, `push_chain`

## Security Notes

Expand Down
42 changes: 42 additions & 0 deletions contracts/evm-gateway/config/chainConfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"sepolia": {
"chainId": 11155111,
"weth": "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14",
"uniswapV3Factory": "0x0227628f3F023bb0B980b67D528571c95c6DaC1c",
"uniswapV3Router": "0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E",
"ethUsdFeed": "0x694AA1769357215DE4FAC081bf1f309aDC325306",
"usdt": "0x7169D38820dfd117C3FA1f22a697dBA58d90BA06",
"usdtUsdFeed": "0xA2F78ab2355fe2f984D808B5CeE7FD0A93D5270E"
},
"base_sepolia": {
"chainId": 84532,
"weth": "0x4200000000000000000000000000000000000006",
"uniswapV3Factory": "0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",
"uniswapV3Router": "0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4",
"ethUsdFeed": "0xE7fab834B68dA8016239845D08F0B8a82fa446f0",
"usdt": "0x9FF5a186f53F6E6964B00320Da1D2024DE11E0cB",
"usdtUsdFeed": "0x3ec8593F930EA45ea58c968260e6e9FF53FC934f"
},
"arb_sepolia": {
"chainId": 421614,
"weth": "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73",
"uniswapV3Factory": "0x248AB79Bbb9bC29bB72f7Cd42F17e054Fc40188e",
"uniswapV3Router": "0x101F443B4d1b059569D643917553c771E1b9663E",
"ethUsdFeed": "0xd30e2101a97dcbAeBCBC04F14C3f624E67A35165",
"usdt": "0x1419d7C74D234fA6B73E06A2ce7822C1d37922f0",
"usdtUsdFeed": "0x80EDee6f667eCc9f63a0a6f55578F870651f06A4"
},
"bsc_testnet": {
"chainId": 97,
"weth": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd",
"uniswapV3Factory": "0x0bEC2a9E08658eAA15935C25cfF953caB2934C85",
"uniswapV3Router": "0x2908Fa14Ef79A774c2bF0ab895948B0e768e4CB0",
"ethUsdFeed": "0x143db3CEEfbdfe5631aDD3E50f7614B6ba708BA7",
"usdt": "0xBC14F348BC9667be46b35Edc9B68653d86013DC5",
"usdtUsdFeed": "0xEca2605f0BCF2BA5966372C99837b1F182d3D620"
},
"push_chain": {
"chainId": 31337,
"universalCore": "0x00000000000000000000000000000000000000C0"
}
}
20 changes: 16 additions & 4 deletions contracts/evm-gateway/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ fs_permissions = [
{ access = "read", path = "./out" },
{ access = "read", path = "./lib" },
{ access = "read", path = "./src" },
{ access = "read", path = "./test" }
{ access = "read", path = "./test" },
{ access = "read", path = "./config" },
]

# remappings
Expand All @@ -47,9 +48,20 @@ remappings = [
"@chainlink/contracts/=lib/chainlink-brownie-contracts/contracts/",
]

# etherscan configuration
# RPC endpoints configuration
[rpc_endpoints]
sepolia = "${SEPOLIA_RPC_URL}"
base_sepolia = "${BASE_SEPOLIA_RPC_URL}"
arb_sepolia = "${ARB_SEPOLIA_RPC_URL}"
bsc_testnet = "${BSC_TESTNET_RPC_URL}"
push_chain = "${PUSH_CHAIN_RPC_URL}"

# Etherscan API keys for verification
[etherscan]
sepolia = { key = "${process.env.ETHERSCAN_API_KEY}" }
sepolia = { key = "${ETHERSCAN_API_KEY}" }
base_sepolia = { key = "${BASESCAN_API_KEY}", url = "https://api-sepolia.basescan.org/api" }
arb_sepolia = { key = "${ARBISCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api" }
bsc_testnet = { key = "${BSCSCAN_API_KEY}", url = "https://api-testnet.bscscan.com/api" }
# FUZZ TESTING CONFIGURATION fuzz testing configuration

[fuzz]
Expand Down Expand Up @@ -166,4 +178,4 @@ fork = true
# Fork URL (set your RPC endpoint)
# fork_url = "https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY"
# Etherscan API key for verification
# etherscan_api_key = "YOUR_ETHERSCAN_API_KEY"
# etherscan_api_key = "YOUR_ETHERSCAN_API_KEY"
Loading