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.valueis 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
castcommands 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:
-
Uses exact conversion:
AMOUNT_WEI=$(cast --to-wei "$AMOUNT" ether)✅ Correct - uses
cast --to-weifor exact conversion -
Sends exact amount:
cast send "$WETH9_ADDRESS" "deposit()" --value "$WRAP_AMOUNT_WEI"✅ Correct - sends exact wei amount
-
No fee deductions: ✅ Correct - no fees are deducted from wrap amount
-
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
-
Document the Issue
- Record exact amounts (in wei)
- Note transaction hash
- Capture calculated ratio
-
Check Contract Implementation
- Inspect contract bytecode
- Compare with standard WETH9
- Look for modifications
-
Review Transaction
cast tx [transaction_hash] --rpc-url "http://192.168.11.250:8545"- Verify value sent
- Check events emitted
- Confirm transaction succeeded
-
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
-
Verification Script:
scripts/verify-weth9-ratio.sh- Tests actual 1:1 ratio
- Reports exact amounts and ratio
- Validates contract backing
-
Updated Wrap Script:
scripts/wrap-and-bridge-to-ethereum.sh- Now includes ratio verification
- Warns if ratio is not 1:1
- Provides detailed logging
-
Documentation:
docs/WETH9_1_TO_1_RATIO_VERIFICATION.md- Detailed verification guidedocs/WETH9_RATIO_ISSUE_REVIEW.md- This document
Next Steps
- Run Verification: Test the actual ratio using the verification script
- Review Results: If ratio is not 1:1, investigate contract implementation
- Fix if Needed: If contract is modified, may need to deploy standard WETH9
- 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.