Monoswap合约中未检验流动性的使用者to是不是为msg.sender。_removeLiquidity涵数中,获得调用者(进攻合约)最后一次加上流动性的时间戳,回到結果是0,因而第445行的检验根据。第446行,topLPHolderOf要不是调用者(进攻合约)详细地址,第447行的检验根据。自此清除流动性有关编码中,再无msg.sender有关的实际操作。
Monoswap合约的代币兑换全过程为:查验兑换主要参数是不是一切正常,随后测算应I/O代币的总数及其代币兑换后的价格,最终实行兑换实际操作并将新的代币价格载入帐簿。以上逻辑性在不一样种代币兑换的过程中会一切正常运作。可是在相同代币兑换时,将发生两处问题:
(1) 在_getNewPrice函数测算应I/O代币总数时,未充分考虑兑换全过程中买卖池代币储藏量的变动,相同代币是根据同样的原始价格开展兑换后价格的测算。
(2)在最后一步升级代币全过程中,未充分考虑相同代币开展兑换时,兑出代币的价格升级实际操作会遮盖兑入代币升级的实际操作。该系统漏洞造成MONO代币兑换MONO代币时,MONO的价格出现异常提高。除此之外不仅网络攻击应用的swapExactTokenForToken函数存有该问题,swapTokenForExactToken函数也存有该问题。