ERC-2266: 基于原子互换的美式看涨期权合约标准
Authors | Runchao Han <runchao.han@monash.edu>, Haoyu Lin <chris.haoyul@gmail.com>, Jiangshan Yu <jiangshan.yu@monash.edu> |
---|---|
Created | 2019-08-17 |
Last Call Deadline | 2020-12-31 |
简单总结
一种为代币合约提供基于原子互换的美式看涨期权功能的标准。
摘要
该标准提供了进行基于原子互换的美式看涨期权支付的功能。基于哈希时间锁定合约 (HTLC) 的原子互换协议 1 具有选择性 2,这种选择性可以用来构建美式看涨期权而无需信任第三方。该标准定义了实现此协议的通用方法。特别是,此 EIP 定义了技术术语,提供了接口,并提供了此协议的参考实现。
动机
原子互换允许用户在没有可信第三方的情况下原子地交换他们的代币,而 HTLC 通常用于实现。然而,基于 HTLC 的原子互换具有选择性。更具体地说,互换发起者可以选择进行或中止互换几个小时,这使他有时间根据汇率进行投机。一项讨论 2 表明,基于 HTLC 的原子互换相当于金融中的美式看涨期权。另一方面,由于这种选择性,基于 HTLC 的原子互换可以用来构建美式看涨期权而无需信任第三方。一篇论文 3 提出了一种基于智能合约的安全的基于原子互换的美式看涨期权协议。该协议不仅消除了套利机会,而且防止任何一方恶意锁定另一方的资金。本 EIP 旨在提供在现有代币标准中实现此协议的标准。
规范
基于原子互换的美式看涨期权智能合约应遵循以太坊智能合约的语法和语义。
定义
initiator
:发布互换广告的一方。participant
:同意该广告并与initiator
参与互换的一方。asset
:要交换的代币数量。premium
:initiator
作为溢价支付给participant
的代币数量。redeem
:从另一方索取代币的行为。refund
:由于时间锁到期,从自己索取代币的行为。secrect
:由initiator
选择的随机字符串,作为哈希的原像。secrectHash
:一个等于secrect
哈希值的字符串,用于构建 HTLC。timelock
:表示时间限制的时间戳,在此之前可以兑换资产,否则只能退款。
存储变量
swap
此映射存储交换合约的元数据,包括所涉及的双方和代币。每个合约使用不同的 secretHash
,并通过 secretHash
区分。
mapping(bytes32 => Swap) public swap;
initiatorAsset
此映射存储发起者想要出售的资产的详细信息,包括数量、时间锁和状态。它与具有相同 secretHash
的交换合约相关联。
mapping(bytes32 => InitiatorAsset) public initiatorAsset;
participantAsset
此映射存储参与者想要出售的资产的详细信息,包括数量、时间锁和状态。它与具有相同 secretHash
的交换合约相关联。
mapping(bytes32 => ParticipantAsset) public participantAsset;
premiumAsset
此映射存储发起者在交换合约中附加的溢价的详细信息,包括数量、时间锁和状态。它与具有相同 secretHash
的交换合约相关联。
mapping(bytes32 => Premium) public premium;
方法
setup
此函数设置交换合约,包括所涉及的双方、要交换的代币等等。
function setup(bytes32 secretHash, address payable initiator, address tokenA, address tokenB, uint256 initiatorAssetAmount, address payable participant, uint256 participantAssetAmount, uint256 premiumAmount) public payable
initiate
发起者调用此函数来填充和锁定她/他想要出售并加入合约的代币。
function initiate(bytes32 secretHash, uint256 assetRefundTime) public payable
fillPremium
发起者调用此函数来填充和锁定溢价。
function fillPremium(bytes32 secretHash, uint256 premiumRefundTime) public payable
participate
参与者调用此函数来填充和锁定她/他想要出售并加入合约的代币。
function participate(bytes32 secretHash, uint256 assetRefundTime) public payable
redeemAsset
其中一方通过提供哈希锁 secret
的原像来调用此函数以从另一方获取代币。
function redeemAsset(bytes32 secret, bytes32 secretHash) public
refundAsset
其中一方在时间锁过期后调用此函数以取回代币。
function refundAsset(bytes32 secretHash) public
redeemPremium
参与者调用此函数以获得溢价。只有在参与者已经调用 participate
并且参与者的代币被赎回或退还后才能调用此函数。
function redeemPremium(bytes32 secretHash) public
refundPremium
发起者在时间锁过期后调用此函数以取回溢价。
function refundPremium(bytes32 secretHash) public
事件
SetUp
此事件表明一方已使用函数 setup()
设置了合约。
event SetUp(bytes32 secretHash, address initiator, address participant, address tokenA, address tokenB, uint256 initiatorAssetAmount, uint256 participantAssetAmount, uint256 premiumAmount);
Initiated
此事件表明 initiator
已使用函数 initiate()
填充并锁定了要交换的代币。
event Initiated(uint256 initiateTimestamp, bytes32 secretHash, address initiator, address participant, address initiatorAssetToken, uint256 initiatorAssetAmount, uint256 initiatorAssetRefundTimestamp);
Participated
此事件表明 participant
已使用函数 participate()
填充并锁定了要交换的代币。
event Participated(uint256 participateTimestamp, bytes32 secretHash, address initiator, address participant, address participantAssetToken, uint256 participantAssetAmount, uint256 participantAssetRefundTimestamp);
PremiumFilled
此事件表明 initiator
已使用函数 fillPremium()
填充并锁定了 premium
。
event PremiumFilled(uint256 fillPremiumTimestamp, bytes32 secretHash, address initiator, address participant, address premiumToken, uint256 premiumAmount, uint256 premiumRefundTimestamp);
InitiatorAssetRedeemed/ParticipantAssetRedeemed
这两个事件表明 asset
已在时间锁之前通过提供 secret
被另一方赎回。
event InitiatorAssetRedeemed(uint256 redeemTimestamp, bytes32 secretHash, bytes32 secret, address redeemer, address assetToken, uint256 amount);
event ParticipantAssetRedeemed(uint256 redeemTimestamp, bytes32 secretHash, bytes32 secret, address redeemer, address assetToken, uint256 amount);
InitiatorAssetRefunded/ParticipantAssetRefunded
这两个事件表明 asset
已在时间锁过期后被原始所有者退还。
event InitiatorAssetRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address assetToken, uint256 amount);
event ParticipantAssetRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address assetToken, uint256 amount);
PremiumRedeemed
此事件表明 premium
已被 participant
赎回。这意味着如果 initiator
可以在 asset
时间锁过期之前提供 secrectHash
的原像,则 asset
要么被 initiator
赎回;要么如果 asset
时间锁过期,则由 participant
退还。
event PremiumRedeemed(uint256 redeemTimestamp,bytes32 secretHash,address redeemer,address token,uint256 amount);
PremiumRefunded
此事件表明由于 participant
在 premium
时间锁到期时根本没有参与,因此 premium
已退还给 initiator
。
event PremiumRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address token, uint256 amount);
理由
- 为了实现原子性,使用了 HTLC。
- 参与者应在发起者锁定代币并设置时间锁后决定是否参与。
- 在参与者锁定代币并设置时间锁后,发起者应决定是否继续兑换(从参与者那里赎回代币并显示哈希锁的原像)。
- 仅当参与者参与交换并且在溢价时间锁过期之前赎回发起者的代币时,参与者才能赎回溢价。
- 仅当发起者启动但参与者根本没有参与交换时,溢价才能退还给发起者。
安全注意事项
initiateTimestamp
应涵盖整个交换过程。- 参与者绝不应在溢价存入之前参与。
向后兼容性
此提案完全向后兼容。现有标准的功能不会受到此提案的影响,因为它仅向它们提供附加功能。
实施
请访问 here 以找到我们的示例实现。
版权
通过 CC0 放弃版权及相关权利。
参考文献
Citation
Please cite this document as:
Runchao Han <runchao.han@monash.edu>, Haoyu Lin <chris.haoyul@gmail.com>, Jiangshan Yu <jiangshan.yu@monash.edu>, "ERC-2266: 基于原子互换的美式看涨期权合约标准 [DRAFT]," Ethereum Improvement Proposals, no. 2266, August 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2266.