织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 比特币 > 比特币资讯

一文详解 Opyn 合约被黑始末(2)

时间:2020-08-06 08:56来源:未知 作者:admin 点击:
可以看到 exercise 函数允许传入多个 vaultsToExerciseFrom,然后通过 for 循环调用 _exercise 函数对各个 vaultsToExerciseFrom 进行处理,现在我们切入 _exercise 函数进行

可以看到 exercise 函数允许传入多个 vaultsToExerciseFrom,然后通过 for 循环调用 _exercise 函数对各个 vaultsToExerciseFrom 进行处理,现在我们切入 _exercise 函数进行具体的分析

function _exercise(        uint256 oTokensToExercise,        address payable vaultToExerciseFrom) internal {        // 1. before exercise window: revert        require(            isExerciseWindow(),            "Can't exercise outside of the exercise window"        );        require(hasVault(vaultToExerciseFrom), "Vault does not exist");        Vault storage vault = vaults[vaultToExerciseFrom];        require(oTokensToExercise > 0, "Can't exercise 0 oTokens");        // Check correct amount of oTokens passed in)        require(            oTokensToExercise <= vault.oTokensIssued,            "Can't exercise more oTokens than the owner has"        );        // Ensure person calling has enough oTokens        require(            balanceOf(msg.sender) >= oTokensToExercise,            "Not enough oTokens"        );        // 1. Check sufficient underlying        // 1.1 update underlying balances        uint256 amtUnderlyingToPay = underlyingRequiredToExercise(            oTokensToExercise        );        vault.underlying = vault.underlying.add(amtUnderlyingToPay);        // 2. Calculate Collateral to pay        // 2.1 Payout enough collateral to get (strikePrice * oTokens) amount of collateral        uint256 amtCollateralToPay = calculateCollateralToPay(            oTokensToExercise,            Number(1, 0)        );        // 2.2 Take a small fee on every exercise        uint256 amtFee = calculateCollateralToPay(            oTokensToExercise,            transactionFee        );        totalFee = totalFee.add(amtFee);        uint256 totalCollateralToPay = amtCollateralToPay.add(amtFee);        require(            totalCollateralToPay <= vault.collateral,            "Vault underwater, can't exercise"        );        // 3. Update collateral + oToken balances        vault.collateral = vault.collateral.sub(totalCollateralToPay);        vault.oTokensIssued = vault.oTokensIssued.sub(oTokensToExercise);        // 4. Transfer in underlying, burn oTokens + pay out collateral        // 4.1 Transfer in underlying        if (isETH(underlying)) {            require(msg.value == amtUnderlyingToPay, "Incorrect msg.value");        } else {            require(                underlying.transferFrom(                    msg.sender,                    address(this),                    amtUnderlyingToPay                ),                "Could not transfer in tokens"            );        }        // 4.2 burn oTokens        _burn(msg.sender, oTokensToExercise);        // 4.3 Pay out collateral        transferCollateral(msg.sender, amtCollateralToPay);        emit Exercise(            amtUnderlyingToPay,            amtCollateralToPay,            msg.sender,            vaultToExerciseFrom        );    } (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容