Dex

Reference

Dex

Dex.sol

目标

  1. 玩家持有TokenA,TokenB各10个
  2. Dex持有TokenA,TokenB各100个
  3. 榨干Dex池子中的 TokenATokenB

分析

price

    function getSwapPrice(
    address from,
    address to,
    uint256 amount
) public view returns (uint256) {
    return ((amount * IERC20(to).balanceOf(address(this))) /
        IERC20(from).balanceOf(address(this)));
}
  1. 在兑换Token时,依靠Dex池子中TokwnA/TokenB的数量锚定

  2. 问题在于,每次交易完成后,都会更新当前池子的Token数量

    playerTokenAplayerTokenBDexTokenADexTokenB
    1010100100
    02011090
    24086110
    03011080
    41069110
    06511045
    11020090
  3. 按照上述兑换表格,最后会清空 Dex 池子中的 TokenA,攻击者的 (TokenA,TokenB) 的余额从(10,10)更新为(110,20)。