# 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: ```solidity 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:** ```bash # 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:** ```bash # 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 ```bash ./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 ```bash # 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 ```bash # 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:** ```bash AMOUNT_WEI=$(cast --to-wei "$AMOUNT" ether) ``` ✅ Correct - uses `cast --to-wei` for exact conversion 2. **Sends exact amount:** ```bash 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:** ```bash # 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** ```bash 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.