按关键词阅读:
合约ABI接口当你在Etherscan上查看合约时 , 会出现两个tab , 即:Read Contract和Write Contract 。 你可以用这两个tab与合约进行交互 。 比如:LINK通证主网合约 。 Etherscan知道这些函数是什么以及如何通过合约的ABI调用函数 。 使用JSON格式调用ABI , 规定函数调用参数 。 在主网上可以直接调用 , 但是在Kovan上的LINK合约需要导入这个模块 。 各位可以在LinkToken的Github上查看ABI 。 所幸 , 在生产系统中 , 这些都可以用web3js的界面来处理 , 用户可以用一个简单的MetaMask请求来进行批准 。 但在我们这个开发实例中 , 暂时需要手动操作 。
文章插图
用导入的ABI通过MEW与Kovan上的LINK合约交互 。
文章插图
批准Kovan上的LINK合约转入/转出100个LINK通证 。
购买看涨期权//购买看涨期权 , 需要通证 , 期权ID和付款
function buyOption(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");
updatePrices;
if (tokenHash == ethHash) {
require(!ethOpts[ID].canceled
//买家支付期权费
require(msg.value =http://kandian.youth.cn/index/= ethOpts[ID].premium,"Incorrect amount of ETH sent for premium");
//卖家收到期权费
ethOpts[ID].writer.transfer(ethOpts[ID].premium);
ethOpts[ID].buyer = msg.sender;
} else {
require(!linkOpts[ID].canceled
//将期权费从买家转给卖家
require(LINK.transferFrom(msg.sender, linkOpts[ID].writer, linkOpts[ID].premium), "Incorrect amount of LINK sent for premium");
linkOpts[ID].buyer = msg.sender;
}
}
现在期权合约创建完成且资金充足 。 接下来就等人来买了!买家只需表明购买以太币或LINK期权的意愿以及期权ID即可 。 由于期权数组被定义成公开的 , 因此可以直接查看 , 无需支付gas费 , 买家可以查看所有期权合约及其ID字段 。 选择完期权合约后 , 我们再次调用require函数验证期权费用的支付金额是否正确 。 这次 , 我们不仅需要确认msg.value(仅针对以太币) , 还需要将期权费用转给卖家 。 Solidity中的所有以太币地址都有一个address.transfer函数 , 我们调用这个函数将期权费用从合约转账给卖家 。 然后设置期权合约的买家地址字段 , 就完成购买了!如果是LINK的话 , 操作就稍微简单一些 。 可以用transferFrom函数直接将买家的期权费转账给卖家(注:需要先批准) 。 如果是以太币的话 , 期权费则需要先经过合约再到卖家地址 。
行使期权//行使看涨期权 , 需要通证 , 期权ID和付款
function exercise(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(ethOpts[ID].buyer == msg.sender, "You do not own this option");
require(!ethOpts[ID].exercised, "Option has already been exercised");
require(ethOpts[ID].expiry > now, "Option is expired");
//符合条件 , 进行付款
updatePrices;
//行权费用
uint exerciseVal = ethOpts[ID].strike*ethOpts[ID].amount;
//接入Chainlink喂价换算成以太币
uint equivEth = exerciseVal.div(ethPrice.mul(10**10)); //将喂价的8位小数转换成18位
//买家支付与行权价格*数量等值的以太币 , 行使期权 。
require(msg.value =http://kandian.youth.cn/index/= equivEth,"Incorrect LINK amount sent to exercise");
//向卖家支付行权费
ethOpts[ID].writer.transfer(equivEth);
//向买家支付合约数量的以太币
msg.sender.transfer(ethOpts[ID].amount);
ethOpts[ID].exercised = true;
} else {
require(linkOpts[ID].buyer == msg.sender, "You do not own this option");
require(!linkOpts[ID].exercised, "Option has already been exercised");
require(linkOpts[ID].expiry > now, "Option is expired");
updatePrices;
uint exerciseVal = linkOpts[ID].strike*linkOpts[ID].amount;
uint equivLink = exerciseVal.div(linkPrice.mul(10**10));
//买家行权 , 向卖家支付行权费
require(LINK.transferFrom(msg.sender, linkOpts[ID].writer, equivLink), "Incorrect LINK amount sent to exercise");
//向卖家支付合约数量的LINK通证
require(LINK.transfer(msg.sender, linkOpts[ID].amount), "Error: buyer was not paid");
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2I3H020.html
标题:接入去中心化预言机Chainlink喂价开发DeFi看涨期权交易平台实例( 三 )