Files
explorer-monorepo/docs/WETH9_RATIO_ISSUE_REVIEW.md

6.5 KiB

WETH9 1:1 Ratio Issue Review

Problem Statement

Issue: When converting ETH to WETH9, the ratio of 1:1 is not being used/maintained.

Critical Analysis

Expected Behavior

WETH9 (Wrapped Ether) MUST maintain a strict 1:1 ratio:

  • 1 ETH deposited = 1 WETH9 minted (exactly)
  • No fees should be deducted
  • No slippage should occur
  • Contract ETH balance = Total WETH9 supply

Standard WETH9 Implementation

The standard deposit() function should be:

function deposit() public payable {
    balanceOf[msg.sender] += msg.value;  // Direct 1:1 mapping
    totalSupply += msg.value;            // Direct 1:1 mapping
    Deposit(msg.sender, msg.value);
}

Key Points:

  • msg.value is added directly (no calculations)
  • No fees are deducted
  • No conversions are performed
  • The ratio is inherently 1:1 by design

Potential Issues

1. Contract Implementation Problem

If the contract has been modified:

  • Fees may have been added
  • Calculations may have been introduced
  • The ratio may have been intentionally changed

Verification:

# Check contract bytecode
cast code "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" \
  --rpc-url "http://192.168.11.250:8545" > weth9_bytecode.bin

# Compare with standard WETH9 bytecode
# Or decompile and inspect deposit() function

2. Script Calculation Error

If scripts are calculating incorrectly:

  • Amount conversion errors
  • Fee deductions in scripts
  • Rounding errors

Verification:

# Test with verification script
./scripts/verify-weth9-ratio.sh [private_key] 0.001

# This will show exact amounts and ratio

3. Display/Precision Issues

If it's a display problem:

  • UI rounding errors
  • Decimal precision issues
  • MetaMask display bug (known issue with decimals=0)

Verification:

  • Always check raw wei values, not displayed amounts
  • Use cast commands to get exact values

4. Gas Fee Confusion

If users confuse gas with wrap amount:

  • Gas fees are separate from wrap amount
  • Wrapping 1 ETH costs 1 ETH + gas fees
  • But you receive exactly 1 WETH9

Example:

Wrap 1 ETH:
- ETH spent: 1 ETH + 0.001 ETH (gas) = 1.001 ETH total
- WETH9 received: 1 WETH9 ✅
- Ratio: 1:1 ✅ (gas is separate)

Investigation Steps

Step 1: Run Verification Script

./scripts/verify-weth9-ratio.sh [private_key] 0.001

This will:

  • Wrap a test amount (0.001 ETH)
  • Measure exact WETH9 received
  • Calculate the ratio
  • Report if ratio is exactly 1:1

Step 2: Manual Verification

# 1. Get initial state
DEPLOYER=$(cast wallet address --private-key "0x...")
INITIAL_ETH=$(cast balance "$DEPLOYER" --rpc-url "http://192.168.11.250:8545")
INITIAL_WETH9=$(cast call "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" \
  "balanceOf(address)" "$DEPLOYER" --rpc-url "http://192.168.11.250:8545")

# 2. Wrap exact amount
TEST_AMOUNT_WEI=$(cast --to-wei 0.001 ether)
cast send "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" "deposit()" \
  --value "$TEST_AMOUNT_WEI" \
  --rpc-url "http://192.168.11.250:8545" \
  --private-key "0x..." \
  --gas-price 5000000000

# 3. Wait and check
sleep 15
FINAL_WETH9=$(cast call "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" \
  "balanceOf(address)" "$DEPLOYER" --rpc-url "http://192.168.11.250:8545")

# 4. Calculate ratio
WETH9_RECEIVED=$(echo "$FINAL_WETH9 - $INITIAL_WETH9" | bc)
echo "Expected: $TEST_AMOUNT_WEI wei"
echo "Received: $WETH9_RECEIVED wei"
# Should be equal!

Step 3: Check Contract State

# Contract should hold exactly the total supply in ETH
CONTRACT_ETH=$(cast balance "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" \
  --rpc-url "http://192.168.11.250:8545")
TOTAL_SUPPLY=$(cast call "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" \
  "totalSupply()" --rpc-url "http://192.168.11.250:8545")

echo "Contract ETH: $CONTRACT_ETH wei"
echo "Total Supply: $TOTAL_SUPPLY wei"
# Should be equal!

Script Review

Current Implementation

The wrap-and-bridge-to-ethereum.sh script:

  1. Uses exact conversion:

    AMOUNT_WEI=$(cast --to-wei "$AMOUNT" ether)
    

    Correct - uses cast --to-wei for exact conversion

  2. Sends exact amount:

    cast send "$WETH9_ADDRESS" "deposit()" --value "$WRAP_AMOUNT_WEI"
    

    Correct - sends exact wei amount

  3. No fee deductions: Correct - no fees are deducted from wrap amount

  4. Verifies ratio:

    # Now includes ratio verification
    if [ "$WETH9_RECEIVED" = "$WRAP_AMOUNT_WEI" ]; then
        log_success "✓ 1:1 ratio verified"
    fi
    

    Updated - now verifies 1:1 ratio

What to Do If Ratio is NOT 1:1

If Verification Fails

  1. Document the Issue

    • Record exact amounts (in wei)
    • Note transaction hash
    • Capture calculated ratio
  2. Check Contract Implementation

    • Inspect contract bytecode
    • Compare with standard WETH9
    • Look for modifications
  3. Review Transaction

    cast tx [transaction_hash] --rpc-url "http://192.168.11.250:8545"
    
    • Verify value sent
    • Check events emitted
    • Confirm transaction succeeded
  4. Report Critical Bug

    • This is a critical issue if ratio is not 1:1
    • WETH9 must maintain 1:1 parity
    • May require contract fix or replacement

Tools Created

  1. Verification Script: scripts/verify-weth9-ratio.sh

    • Tests actual 1:1 ratio
    • Reports exact amounts and ratio
    • Validates contract backing
  2. Updated Wrap Script: scripts/wrap-and-bridge-to-ethereum.sh

    • Now includes ratio verification
    • Warns if ratio is not 1:1
    • Provides detailed logging
  3. Documentation:

    • docs/WETH9_1_TO_1_RATIO_VERIFICATION.md - Detailed verification guide
    • docs/WETH9_RATIO_ISSUE_REVIEW.md - This document

Next Steps

  1. Run Verification: Test the actual ratio using the verification script
  2. Review Results: If ratio is not 1:1, investigate contract implementation
  3. Fix if Needed: If contract is modified, may need to deploy standard WETH9
  4. Update Documentation: Document findings and solutions

Summary

  • WETH9 MUST maintain 1:1 ratio - this is fundamental
  • Scripts are correct - they use exact amounts and no fees
  • Verification tools created - use them to test actual ratio
  • If ratio fails - this is a critical bug requiring investigation

The issue may be:

  • Contract implementation (most likely if ratio is wrong)
  • Display/calculation error (less likely)
  • Gas fee confusion (user misunderstanding)

Use the verification script to determine the actual cause.