按关键词阅读:
linkOpts[ID].exercised = true;
}
}
对于期权所有者来说 , 以太币或LINK的价格如果超过行权价格 , 就能获利 。 这样一来 , 他们便愿意行使期权 , 以行权价购买通证 。 这次我们必须先确认几个条件 , 即:合约由消息发送者所有;合约还未行权;以及现在期权还没到期 。 如果以上任何一个条件不满足 , 则撤回交易 。
文章插图
示例:交易未满足一个或以上条件时Remix输出的结果 。
如果条件都满足 , 则向卖家支付行权费 , 并向买家支付合约数量的通证 。 行权时 , 买家需以行权价购买每一个通证 。 然而 , 行权价是以美元计价 , 而合约数量是以以太币或LINK计价 。 因此我们需要接入Chainlink喂价计算与行权费等值的以太币或LINK数量 。 换算成等值的以太币或LINK后 , 我们就可以开始转账了 。 转账时需使用之前提过的方法 , 即以太币会调用msg.value/address.transfer函数 , LINK则调用transferFrom函数 。
以上就是成功行使期权的完整交易过程 。 LINK价格是11.56美元 , 合约行权价格是10美元 , 数量1个LINK 。 也就是说 , 买家只需要花10美元而不是11.56美元购便可购买一个LINK 。 10/11.56 = 0.86 , 即买家只需要花0.86个LINK就可以获得1个LINK 。 算上0.1LINK的期权费用 , 总共获利0.04LINK 。
取消合约/删除资金//允许卖家取消合约或从没有成功达成交易的期权中退回资金 。
function cancelOption(string memory token, uint ID) public payable {
bytes32 tokenHash = keccak256(abi.encodePacked(token));
require(tokenHash == ethHash || tokenHash == linkHash, "Only ETH and LINK tokens are supported");
if (tokenHash == ethHash) {
require(msg.sender == ethOpts[ID].writer, "You did not write this option");
//必须还没有被取消或购买
require(!ethOpts[ID].canceled
ethOpts[ID].writer.transfer(ethOpts[ID].amount);
ethOpts[ID].canceled = true;
} else {
require(msg.sender == linkOpts[ID].writer, "You did not write this option");
require(!linkOpts[ID].canceled
require(LINK.transferFrom(address(this), linkOpts[ID].writer, linkOpts[ID].amount), "Incorrect amount of LINK sent");
linkOpts[ID].canceled = true;
}
}
//允许卖家从到期、未行使以及未取消的期权中赎回资金 。
function retrieveExpiredFunds(string memory token, uint ID) public payable {
bytes32 tokenHash = keccak256(abi.encodePacked(token));
require(tokenHash == ethHash || tokenHash == linkHash, "Only ETH and LINK tokens are supported");
if (tokenHash == ethHash) {
require(msg.sender == ethOpts[ID].writer, "You did not write this option");
//必须是到期、未行使且未取消的状态 。
require(ethOpts[ID].expiry
ethOpts[ID].writer.transfer(ethOpts[ID].amount);
//将取消标志修改为true , 避免多次赎回
ethOpts[ID].canceled = true;
【接入去中心化预言机Chainlink喂价开发DeFi看涨期权交易平台实例】} else {
require(msg.sender == linkOpts[ID].writer, "You did not write this option");
require(linkOpts[ID].expiry
require(LINK.transferFrom(address(this), linkOpts[ID].writer, linkOpts[ID].amount), "Incorrect amount of LINK sent");
linkOpts[ID].canceled = true;
}
}
随着市场波动 , 如果期权还没卖出去 , 卖家可能会取消期权合约并赎回资金 。 同样地 , 期权如果一直未行使就到期了 , 卖家肯定会想要赎回合约中的资金 。 因此 , 我们添加了cancelOption和retrieveExpiredFunds函数
这两个函数最关键的一点是必须满足赎回条件才能调用成功 。 卖家要赎回资金必须满足特定的条件 , 而且只能赎回一次 。 卖家不能取消已经被卖出的合约 , 因此我们要确认买家地址仍然是初始值0 。 另外 , 我们还要确认期权还未被取消 , 然后再退款 。 如果是期权到期后再赎回资金 , 那情况就会稍有不同 。 这种情况下 , 期权可能已经卖出去但没有行使 , 资金仍应被退还给卖家 。 我们要确认合约已经到期并且还未被行使 。 然后也要将期权的取消标志设置为true , 如果条件满足则进行退款 。
希望本文能帮助各位立刻在主网上开发Chainlink用例 , 并让各位了解了Solidity独特的功能 。 如果你想了解更多的Chainlink功能 , 请查看Chainlink VRF(可验证随机函数) , 或查看Chainlink公允排序服务 , 了解Chainlink如何解决矿工抢跑问题 。
如果你是一名开发者 , 并希望快速将智能合约连接至链下数据和系统 , 请查看 我们的开发者文档并加入我们在Discord上的技术讨论群 。 如果你希望透过电话具体讨论集成细节 , 请联系我们 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2I3H020.html
标题:接入去中心化预言机Chainlink喂价开发DeFi看涨期权交易平台实例( 四 )