diff --git a/packages/contracts-bedrock/scripts/SetupCustomGasToken.s.sol b/packages/contracts-bedrock/scripts/SetupCustomGasToken.s.sol index 1f55bda79cd89..4306bc75f1c26 100644 --- a/packages/contracts-bedrock/scripts/SetupCustomGasToken.s.sol +++ b/packages/contracts-bedrock/scripts/SetupCustomGasToken.s.sol @@ -19,9 +19,8 @@ import { Constants } from "src/libraries/Constants.sol"; /// @dev This script: /// 1. Pre-checks L1 configuration /// 2. Deploys DepositedOKBAdapter with designated owner -/// 3. Adds designated owner address to whitelist for deposits -/// 4. Sets gas paying token in SystemConfig storage -/// 5. Post-checks configuration +/// 3. Sets gas paying token in SystemConfig storage +/// 4. Post-checks configuration contract SetupCustomGasToken is Script { // Addresses to be loaded from deployment artifacts address systemConfigProxy; diff --git a/test-pp-op/cgt-only-contract.sh b/test-pp-op/cgt-only-contract.sh deleted file mode 100755 index e322ed1a8e832..0000000000000 --- a/test-pp-op/cgt-only-contract.sh +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -echo "Custom Gas Token Demo: only modify contract, without modifying sequencer code" -set -e - -ROOT_DIR=$(git rev-parse --show-toplevel) -PWD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -cd $PWD_DIR - -source .env - -echo "🔧 Setting up Custom Gas Token (CGT) configuration..." -echo "" - -# Run the Foundry script to deploy and configure CGT -echo "📝 Step 1: Running Foundry setup script..." -cd $ROOT_DIR/packages/contracts-bedrock -export SYSTEM_CONFIG_PROXY_ADDRESS=$SYSTEM_CONFIG_PROXY_ADDRESS -export OPTIMISM_PORTAL_PROXY_ADDRESS=$OPTIMISM_PORTAL_PROXY_ADDRESS - -# Capture forge script output -# forge script scripts/SetupCustomGasToken.s.sol:SetupCustomGasToken \ -# --rpc-url "$L1_RPC_URL" \ -# --private-key "$DEPLOYER_PRIVATE_KEY" - -FORGE_OUTPUT=$(forge script scripts/SetupCustomGasToken.s.sol:SetupCustomGasToken \ - --rpc-url "$L1_RPC_URL" \ - --private-key "$DEPLOYER_PRIVATE_KEY" \ - --broadcast 2>&1) - -echo "$FORGE_OUTPUT" - -# Extract contract addresses from forge output -OKB_TOKEN=$(echo "$FORGE_OUTPUT" | grep "MockOKB deployed at:" | awk '{print $NF}') -ADAPTER_ADDRESS=$(echo "$FORGE_OUTPUT" | grep "DepositedOKBAdapter deployed at:" | awk '{print $NF}') - -# Query initial OKB total supply -INIT_TOTAL_SUPPLY=$(cast call "$OKB_TOKEN" "totalSupply()(uint256)" --rpc-url "$L1_RPC_URL") -echo "" -echo "📊 Initial OKB Total Supply: $INIT_TOTAL_SUPPLY" - -echo "" -echo "✅ L1 Custom Gas Token setup complete!" -echo "" -echo "📋 Deployed Contract Addresses:" -echo " OKB Token: $OKB_TOKEN" -echo " Adapter: $ADAPTER_ADDRESS" -echo "" - -# Check if L2 is running before verifying L2 configuration -if curl -s -X POST "$L2_RPC_URL" \ - -H "Content-Type: application/json" \ - -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - > /dev/null 2>&1; then - - echo "📝 Step 2: Verifying L2 configuration..." - echo "" - - # Call L1Block predeploy to check configuration - L1_BLOCK_ADDR="0x4200000000000000000000000000000000000015" - - # Check isCustomGasToken - IS_CUSTOM_GAS_TOKEN=$(cast call "$L1_BLOCK_ADDR" \ - "isCustomGasToken()(bool)" \ - --rpc-url "$L2_RPC_URL") - - echo " L1Block.isCustomGasToken(): $IS_CUSTOM_GAS_TOKEN" - - # Check gasPayingTokenName - TOKEN_NAME=$(cast call "$L1_BLOCK_ADDR" \ - "gasPayingTokenName()(string)" \ - --rpc-url "$L2_RPC_URL") - - echo " L1Block.gasPayingTokenName(): $TOKEN_NAME" - - # Check gasPayingTokenSymbol - TOKEN_SYMBOL=$(cast call "$L1_BLOCK_ADDR" \ - "gasPayingTokenSymbol()(string)" \ - --rpc-url "$L2_RPC_URL") - - echo " L1Block.gasPayingTokenSymbol(): $TOKEN_SYMBOL" - - echo "" - if [ "$IS_CUSTOM_GAS_TOKEN" = "true" ]; then - echo "✅ L2 Custom Gas Token configuration verified!" - else - echo "⚠️ WARNING: L2 custom gas token not yet active" - echo " The L2 chain needs to process the setCustomGasToken transaction" - echo " This will happen automatically when the chain processes L1 data" - fi -else - echo "⚠️ L2 node is not running yet - skipping L2 verification" - echo " Please verify L2 configuration after the L2 node starts" -fi - -echo "" -echo "🎉 Custom Gas Token setup script completed!" -echo "" - -# Perform test deposit -if [ -n "$OKB_TOKEN" ] && [ -n "$ADAPTER_ADDRESS" ]; then - echo "📝 Step 3: Performing test deposit..." - echo "" - - DEPOSIT_AMOUNT="7999000000000000" - - # L2 recipient address - L2_RECIPIENT=0x70997970C51812dc3A010C7d01b50e0d17dc79C9 - - INIT_BALANCE=$(cast balance $L2_RECIPIENT --rpc-url $L2_RPC_URL) - echo " Deposit Amount: $DEPOSIT_AMOUNT" - echo " L2 Recipient: $L2_RECIPIENT" - echo " Initial Balance: $INIT_BALANCE" - echo "" - - # Check deployer's OKB balance before proceeding - DEPLOYER_ADDRESS=$(cast wallet address --private-key "$DEPLOYER_PRIVATE_KEY") - DEPLOYER_OKB_BALANCE=$(cast call "$OKB_TOKEN" "balanceOf(address)(uint256)" "$DEPLOYER_ADDRESS" --rpc-url "$L1_RPC_URL") - echo " Deployer ($DEPLOYER_ADDRESS) OKB Balance: $DEPLOYER_OKB_BALANCE" - echo "" - - # Step 3a: Approve the adapter to spend OKB - cast send "$OKB_TOKEN" \ - "approve(address,uint256)" \ - "$ADAPTER_ADDRESS" \ - "$DEPOSIT_AMOUNT" \ - --rpc-url "$L1_RPC_URL" \ - --private-key "$DEPLOYER_PRIVATE_KEY" - - # Step 3b: Perform the deposit - cast send "$ADAPTER_ADDRESS" \ - "deposit(address,uint256,uint64,bool,bytes)" \ - "$L2_RECIPIENT" \ - "$DEPOSIT_AMOUNT" \ - "100000" \ - "false" \ - "0x" \ - --rpc-url "$L1_RPC_URL" \ - --private-key "$DEPLOYER_PRIVATE_KEY" - - echo "" - echo "✅ Test deposit transaction sent!" - echo "" - echo "⏳ Waiting for L2 to process the deposit..." - echo " Checking balance every 5 seconds..." - echo "" - - # Expected final balance - EXPECTED_BALANCE=$((INIT_BALANCE + DEPOSIT_AMOUNT)) - - # Timeout after 5 minutes (60 attempts * 5 seconds) - MAX_ATTEMPTS=60 - ATTEMPT=0 - - while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do - CURRENT_BALANCE=$(cast balance $L2_RECIPIENT --rpc-url $L2_RPC_URL) - - echo " [Attempt $((ATTEMPT + 1))/$MAX_ATTEMPTS] Current Balance: $CURRENT_BALANCE (Expected: $EXPECTED_BALANCE)" - - if [ "$CURRENT_BALANCE" = "$EXPECTED_BALANCE" ]; then - echo "" - echo "🎉 Deposit processed successfully!" - echo "" - - # Query OKB total supply after successful deposit - DEPOSIT_FINAL_TOTAL_SUPPLY=$(cast call "$OKB_TOKEN" "totalSupply()(uint256)" --rpc-url "$L1_RPC_URL") - - echo "📊 Final Status:" - echo " Initial Balance: $INIT_BALANCE" - echo " Deposit Amount: $DEPOSIT_AMOUNT" - echo " Final Balance: $CURRENT_BALANCE" - echo " L2 Recipient: $L2_RECIPIENT" - echo "" - echo "🔥 OKB Token Supply Status:" - echo " Initial Total Supply: $INIT_TOTAL_SUPPLY" - echo " Final Total Supply: $DEPOSIT_FINAL_TOTAL_SUPPLY" - echo "" - break - fi - - ATTEMPT=$((ATTEMPT + 1)) - - if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then - sleep 5 - fi - done - - if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then - echo "" - echo "⚠️ WARNING: Deposit not processed within timeout period (5 minutes)" - echo " Current Balance: $CURRENT_BALANCE" - echo " Expected Balance: $EXPECTED_BALANCE" - echo "" - echo "📚 Troubleshooting:" - echo " 1. Check if L2 node is running and syncing" - echo " 2. Check L1 transaction status" - echo " 3. Monitor TransactionDeposited events on OptimismPortal: $OPTIMISM_PORTAL_PROXY_ADDRESS" - echo " 4. Manually check balance: cast balance $L2_RECIPIENT --rpc-url $L2_RPC_URL" - fi -fi diff --git a/test/example.env b/test/example.env index 31a95c84db6b8..001927817141d 100644 --- a/test/example.env +++ b/test/example.env @@ -31,6 +31,7 @@ L1_BEACON_URL_IN_DOCKER=http://l1-beacon-chain:3500 SAFE_ADDRESS=0x0000000000000000000000000000000000000000 TRANSACTOR=0x0000000000000000000000000000000000000000 +DEPLOYER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 DEPLOYER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 SEQUENCER_P2P_KEY=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba OP_BATCHER_PRIVATE_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a @@ -45,6 +46,8 @@ SYSTEM_CONFIG_PROXY_ADDRESS=0x330cff9f99a75bc9c71750b5c60fdc0eff1789e1 PROXY_ADMIN=0x922d6956c99e12dfeb3224dea977d0939758a1fe PROPOSER_ADDRESS=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 OPTIMISM_PORTAL_PROXY_ADDRESS=0xc8e8b7b181db301f27aef90ed285787a3ce179e9 +# For testing, Adapter owner is the deployer +OKB_ADAPTER_OWNER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 # OKB Token Address on L1. If not set, a new MockOKB will be deployed. OKB_TOKEN_ADDRESS=0x75231f58b43240c9718dd58b4967c5114342a86c diff --git a/test/setup-cgt-function.sh b/test/setup-cgt-function.sh index 2e2217db77942..c60710bf8a83e 100755 --- a/test/setup-cgt-function.sh +++ b/test/setup-cgt-function.sh @@ -92,6 +92,7 @@ setup_cgt() { # Export required environment variables for the setup script export SYSTEM_CONFIG_PROXY_ADDRESS="$SYSTEM_CONFIG_PROXY_ADDRESS" export OPTIMISM_PORTAL_PROXY_ADDRESS="$OPTIMISM_PORTAL_PROXY_ADDRESS" + export OKB_ADAPTER_OWNER_ADDRESS="$OKB_ADAPTER_OWNER_ADDRESS" # Temporarily disable set -e to capture forge output properly set +e @@ -129,15 +130,4 @@ setup_cgt() { echo " OKB Token: $OKB_TOKEN" echo " Adapter: $ADAPTER_ADDRESS" echo "" - - # Save OKB_TOKEN_ADDRESS to .env file for the test script to use - echo "💾 Updating .env with OKB token address..." - - # Update OKB_TOKEN_ADDRESS in .env - sed_inplace "s/^OKB_TOKEN_ADDRESS=.*/OKB_TOKEN_ADDRESS=$OKB_TOKEN_ADDRESS/" "$PWD_DIR/.env" - - echo " ✅ OKB token address updated in .env file" - echo " 💡 ADAPTER_ADDRESS can be queried from SystemConfig.gasPayingToken()" - echo " 💡 INIT_TOTAL_SUPPLY can be queried from OKB token contract" - echo "" } diff --git a/test/test-cgt.sh b/test/test-cgt.sh index e0944baa8d7fa..70a231b9bc4ac 100755 --- a/test/test-cgt.sh +++ b/test/test-cgt.sh @@ -2,21 +2,22 @@ set -e ROOT_DIR=$(git rev-parse --show-toplevel) -PWD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd $PWD_DIR +# Use current working directory to allow symlinks to work +# This way test/ and test-pp-op/ can each use their own .env +PWD_DIR="$(pwd)" -source .env - -# Check if CGT has been set up (OKB_TOKEN_ADDRESS should be in .env) -if [ -z "$OKB_TOKEN_ADDRESS" ]; then - echo "❌ ERROR: OKB_TOKEN_ADDRESS not found in .env" - echo "" - echo "Please run '2-deploy-op-contracts.sh' first to set up CGT and configure OKB token." - echo "" +# Validate we're in a test directory with .env +if [ ! -f "$PWD_DIR/.env" ]; then + echo "❌ ERROR: .env file not found in current directory: $PWD_DIR" + echo "Please run this script from a test directory (test/ or test-pp-op/)" exit 1 fi +source .env + +SYSTEM_CONFIG_PROXY_ADDRESS=$(jq -r '.opChainDeployments[0].SystemConfigProxy' $PWD_DIR/config-op/state.json) + # Query ADAPTER_ADDRESS from SystemConfig.gasPayingToken() echo "📝 Querying ADAPTER_ADDRESS from SystemConfig..." ADAPTER_ADDRESS=$(cast call "$SYSTEM_CONFIG_PROXY_ADDRESS" "gasPayingToken()(address,uint8)" --rpc-url "$L1_RPC_URL" | head -n1) @@ -26,6 +27,15 @@ if [ -z "$ADAPTER_ADDRESS" ] || [ "$ADAPTER_ADDRESS" = "0x0000000000000000000000 exit 1 fi +# Query OKB_TOKEN_ADDRESS from the adapter +echo "📝 Querying OKB_TOKEN_ADDRESS from adapter..." +OKB_TOKEN_ADDRESS=$(cast call "$ADAPTER_ADDRESS" "OKB()(address)" --rpc-url "$L1_RPC_URL") +if [ -z "$OKB_TOKEN_ADDRESS" ] || [ "$OKB_TOKEN_ADDRESS" = "0x0000000000000000000000000000000000000000" ]; then + echo "❌ ERROR: Could not query OKB_TOKEN_ADDRESS from adapter" + echo " Adapter address: $ADAPTER_ADDRESS" + exit 1 +fi + # Query INIT_TOTAL_SUPPLY from OKB token contract echo "📝 Querying INIT_TOTAL_SUPPLY from OKB token..." INIT_TOTAL_SUPPLY=$(cast call "$OKB_TOKEN_ADDRESS" "totalSupply()(uint256)" --rpc-url "$L1_RPC_URL") @@ -96,22 +106,40 @@ if [ -n "$OKB_TOKEN_ADDRESS" ] && [ -n "$ADAPTER_ADDRESS" ]; then DEPOSIT_AMOUNT="7999000000000000" - # L2 recipient address - L2_RECIPIENT=0x70997970C51812dc3A010C7d01b50e0d17dc79C9 + # Get deployer address and verify it's the adapter owner + DEPLOYER_ADDRESS=$(cast wallet address --private-key "$DEPLOYER_PRIVATE_KEY") + ADAPTER_OWNER=$(cast call "$ADAPTER_ADDRESS" "owner()(address)" --rpc-url "$L1_RPC_URL") - INIT_BALANCE=$(cast balance $L2_RECIPIENT --rpc-url $L2_RPC_URL) - echo " Deposit Amount: $DEPOSIT_AMOUNT" - echo " L2 Recipient: $L2_RECIPIENT" - echo " Initial Balance: $INIT_BALANCE" + echo " Deployer Address: $DEPLOYER_ADDRESS" + echo " Adapter Owner: $ADAPTER_OWNER" + + if [ "$DEPLOYER_ADDRESS" != "$ADAPTER_OWNER" ]; then + echo "" + echo "❌ ERROR: Deployer is not the adapter owner" + echo " This script assumes deployer has ownership of the adapter" + echo " Current owner: $ADAPTER_OWNER" + exit 1 + fi + + echo " ✅ Deployer is verified as adapter owner" echo "" - # Check deployer's OKB balance before proceeding - DEPLOYER_ADDRESS=$(cast wallet address --private-key "$DEPLOYER_PRIVATE_KEY") + # Check deployer's OKB balance DEPLOYER_OKB_BALANCE=$(cast call "$OKB_TOKEN_ADDRESS" "balanceOf(address)(uint256)" "$DEPLOYER_ADDRESS" --rpc-url "$L1_RPC_URL") - echo " Deployer ($DEPLOYER_ADDRESS) OKB Balance: $DEPLOYER_OKB_BALANCE" + echo " Deployer OKB Balance: $DEPLOYER_OKB_BALANCE" + echo "" + + # Step 2a: Add deployer to whitelist + echo " Adding deployer to whitelist..." + cast send "$ADAPTER_ADDRESS" \ + "addToWhitelistBatch(address[])" \ + "[$DEPLOYER_ADDRESS]" \ + --rpc-url "$L1_RPC_URL" \ + --private-key "$DEPLOYER_PRIVATE_KEY" + echo " ✅ Deployer added to whitelist" echo "" - # Step 2a: Approve the adapter to spend OKB + # Step 2b: Approve the adapter to spend OKB cast send "$OKB_TOKEN_ADDRESS" \ "approve(address,uint256)" \ "$ADAPTER_ADDRESS" \ @@ -119,7 +147,10 @@ if [ -n "$OKB_TOKEN_ADDRESS" ] && [ -n "$ADAPTER_ADDRESS" ]; then --rpc-url "$L1_RPC_URL" \ --private-key "$DEPLOYER_PRIVATE_KEY" - # Step 2b: Perform the deposit + # L2 recipient address + L2_RECIPIENT=$DEPLOYER_ADDRESS + + # Step 2c: Perform the deposit cast send "$ADAPTER_ADDRESS" \ "deposit(address,uint256)" \ "$L2_RECIPIENT" \ @@ -134,6 +165,13 @@ if [ -n "$OKB_TOKEN_ADDRESS" ] && [ -n "$ADAPTER_ADDRESS" ]; then echo " Checking balance every 5 seconds..." echo "" + INIT_BALANCE=$(cast balance $L2_RECIPIENT --rpc-url $L2_RPC_URL) + echo " Deposit From $DEPLOYER_ADDRESS to $L2_RECIPIENT" + echo " Deposit Amount: $DEPOSIT_AMOUNT" + echo " L2 Recipient: $L2_RECIPIENT" + echo " L2 Recipient Initial Balance: $INIT_BALANCE" + echo "" + # Expected final balance EXPECTED_BALANCE=$((INIT_BALANCE + DEPOSIT_AMOUNT))