使用契约的链上期权合约

我们很高兴地宣布利用比特币契约的力量在链上实施期权合约。 只要该链支持比特币式契约(例如 Bitcoin SV 和 MVC),就可以直接在区块链上执行复杂的金融合约,例如看涨期权和看跌期权。 与通常需要多个中介机构的传统金融平台不同,链上期权合约可以减少结算时间和运营成本,使其更加安全、高效和透明。

出于说明目的,我们实现了看涨期权和看跌期权合约,授予持有人以设定价格购买或出售一定数量的 BSV-20 Ordinals 代币的权利。

期权合约

图片源自: Investopedia

期权合约为交易者提供在特定时间范围内以预定价格买入(看涨期权)或卖出(看跌期权)资产的权利,但没有义务。 买方为获得此权利向卖方支付溢价。 期权合约在金融市场中通常用于对冲、投机和风险管理。

看涨期权示例

在这种情况下:

标的资产:XYZ Corp 股票
当前股价:每股 50 美元
看涨期权的执行价格:每股 55 美元
有效期:即日起三个月

您为看涨期权支付溢价,假设每股 3 美元(溢价是购买期权的成本)。 通过购买此看涨期权:

如果三个月后 XYZ Corp 的股价高于每股 55 美元,您可以行使期权并以 50 美元的较低执行价格购买股票。 这可以让您通过立即以较高的市场价格出售股票来获利。
如果三个月后股价低于每股 55 美元,您没有义务行使该期权。 您可以让期权到期,您的损失仅限于您支付的权利金。

实现

与链上限价订单类似,我们使用契约来实现期权。 在期权合约的背景下,授予人可以将资产锁定在契约合约中,如果在规定的时间内满足期权的条件,则受让人可以索取这些资产。

看涨期权

例如,在看涨期权中,授予人可以在智能合约中锁定 100 个 BSV-20 代币,允许受让人在到期日之前以设定价格(例如每个代币 5000 聪)购买这些代币。

如果市场价格超过执行价格,持有者可以行使选择权,以约定的价格购买 BSV-20 代币,从价差中受益。 如果在到期日之前未行使该期权,合约允许授予者收回锁定的 BSV-20 代币。

描绘期权行使的交易图

智能合约有以下公共(public)方法:

  • exercise:此方法允许受让人行使选择权。 它需要受让人签名并执行检查以确保交易的有效性,包括受让人与授予人之间的代币交换和付款。
  • transfer:允许当前期权持有者将其转让给新的受让人。
  • expire:授予者在合同到期时使用它来处理合同。 它需要授予人的签名并检查该选项是否已过期。
class Bsv20CallOption extends BSV20V2 {@prop()grantor: PubKey@prop(true)grantee: PubKey@prop()tokenAmt: bigint@prop()strikePrice: bigint@prop()expirationTime: bigint...@method()public exercise(sigGrantee: Sig) {// Check grantee sig.assert(this.checkSig(sigGrantee, this.grantee), 'invalid sig grantee')// Ensure grantee gets payed tokens.let outputs = BSV20V2.buildTransferOutput(pubKey2Addr(this.grantee),this.id,this.tokenAmt)// Ensure grantor gets payed satoshis.const satAmt = this.strikePrice * this.tokenAmtoutputs += Utils.buildAddressOutput(pubKey2Addr(this.grantor), satAmt)outputs += this.buildChangeOutput()// Enforce outputs in call tx.assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')}@method()public transfer(sigGrantee: Sig, newGrantee: PubKey) {// Check grantee sig.assert(this.checkSig(sigGrantee, this.grantee), 'invalid sig grantee')// Set new grantee.this.grantee = newGrantee// Propagate contract.let outputs = this.buildStateOutputFT(this.tokenAmt)outputs += this.buildChangeOutput()assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')}@method()public expire(sigGrantor: Sig) {// Check grantor sig.assert(this.checkSig(sigGrantor, this.grantor), 'invalid sig grantor')// Check if expired.assert(this.timeLock(this.expirationTime), 'option has not yet expired')}
}

看跌期权

看跌期权合约的结构与看涨期权合约的结构非常相似。 主要区别在于授予者将聪支付锁定在智能合约中,而不是 BSV-20 代币。 然后,受让人可以通过以预定的执行价格将代币转让给卖方来行使该期权。

然而,由于智能合约本身无法直接验证受让人在行使期权时提供的持有代币的 UTXO 的有效性,因此我们使用预言机。 该预言机负责通过签名来验证和验证 UTXO 的合法性。

@method()
public exercise(sigGrantee: Sig, oracleSig: RabinSig, oracleMsg: ByteString) {// Check oracle signature.assert(RabinVerifier.verifySig(oracleMsg, oracleSig, this.oraclePubKey),'oracle sig verify failed')// Check that we're unlocking the UTXO specified in the oracles message.assert(slice(this.prevouts, 0n, 36n) == slice(oracleMsg, 0n, 36n),'first input is not spending specified ordinal UTXO')// Get token amount held by the UTXO from oracle message.const utxoTokenAmt = byteString2Int(slice(oracleMsg, 36n, 44n))// Check token amount is correct.assert(utxoTokenAmt == this.tokenAmt, 'invalid token amount')// Check grantee sig.assert(this.checkSig(sigGrantee, this.grantee), 'invalid sig grantee')// Ensure grantor gets payed tokens.let outputs = BSV20V2.buildTransferOutput(pubKey2Addr(this.grantor),this.id,this.tokenAmt)// Ensure grantee gets payed satoshis.const satAmt = this.strikePrice * this.tokenAmtoutputs += Utils.buildAddressOutput(pubKey2Addr(this.grantee), satAmt)outputs += this.buildChangeOutput()// Enforce outputs in call tx.assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')
}

无需信任的交易期权

上述智能合约只有一个简单的转让方法,允许当前持有人将期权分配给新的持有人,从而在二级市场上有效地交易期权。

但由于期权的转让通常需要支付权利金,因此我们可以直接在上面的智能合约中添加出售机制。

我们添加两个 public 方法:

  • listForSale:允许当前受让人以指定的溢价列出出售期权。 此方法需要受让人签名并更新合同的销售状态和保费金额。
  • buy:允许新的受让人购买正在出售的期权。 它更新合同的受让人并处理向前一个受让人的溢价支付。
@method()
public listForSale(sigGrantee: Sig, premium: bigint) {// Check grantee sig.assert(this.checkSig(sigGrantee, this.grantee), 'invalid sig grantee')// Store premium value in property.this.premium = premium// Toggle for sale flag.this.forSale = true// Propagate contract.let outputs = this.buildStateOutputFT(this.tokenAmt)outputs += this.buildChangeOutput()assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')
}@method()
public buy(newGrantee: PubKey) {// Check if option is up for sale.assert(this.forSale, 'option is not up for sale')// Set new grantee.const prevGrantee = this.granteethis.grantee = newGrantee// Toggle for sale flag.this.forSale = false// Propagate contract.let outputs = this.buildStateOutputFT(this.tokenAmt)// Make sure premium is payed to previous grantee / holder.outputs += Utils.buildAddressOutput(pubKey2Addr(prevGrantee),this.premium)outputs += this.buildChangeOutput()assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')
}

看涨期权和看跌期权智能合约的完整代码可在 GitHub 上获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/224782.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 磁盘管理、分区管理常用命令

文章目录 基础命令挂载新硬盘/分区添加内存交换分区swaplvm分区管理模式 基础命令 查看目录文件大小 du -sh /backup du -sh /backup/* du -sh *查看磁盘挂载信息 df -lhT查看某个目录挂载在哪个分区,以及分区的磁盘使用情况 df [目录] #例如:df /ho…

第三节HarmonyOS DevEco Studio了解基本工程目录

一、工程级目录 工程的目录结构如下。 目录详情如下: AppScope:存放应用全局所需要的资源文件。Entry:应用的主模块,存放HarmonyOS应用的代码、资源等。oh_modules:工程的依赖包,存放工程依赖的源文件。b…

docker-compose部署zabbix+grafana

1.引言 1.1目的 zabbixgrafana实现图形化监控 2.部署环境 服务器ip服务版本192.168.5.137zabbix-server6.0.21192.168.5.137grafana10.2.2192.168.5.152zabbix-client6.0.21 3.部署zabbix-server 3.1 创建zabbix目录 mkdir zabbix3.2 编写docker-compose文件 cd zabbix…

用CHAT总结费曼学习法的关键

问CHAT:费曼学习法的关键 CHAT回复:费曼学习法是由著名物理学家理查德费曼所发明的一种学习方法,旨在以深入理解为目标,帮助自己学习新的知识和技能。 费曼学习法有四个关键步骤: 1. 学习:首先&#xff0…

如何迁移数据到水经微图64位版?

我们在《为什么要升级水经微图到64位?》一文中,为大家分享了升级水经微图到64位的原因。 这里,我们再为大家分享一下在哪些情况下升级需要迁移已标注的数据,以及如何迁移已标注绘制的数据到水经微图64位中。 哪些情况需要迁移数…

vue3中的动态component组件

is属性来指定要渲染的组件(填写组件名&#xff09; 多个子组件通过component标签挂载在同一个父组件中&#xff0c; 可以修改is属性进行动态切换组件。 可以搭配<keep-alive></keep-alive>使用。 父组件代码&#xff1a; <template><div style"fon…

四川开启智能巡河形式,无人机水利行业应用再创新

在四川省某区域&#xff0c;复亚智能无人机系统以其独特的机场网格化部署得到成功应用&#xff0c;覆盖了该区域内多条市级、省级河流&#xff0c;成为水利行业的新亮点。这一先进系统以无人机水利行业应用为核心&#xff0c;通过网格化和信息化手段&#xff0c;实现了对水域环…

使用Pytorch从零开始构建Energy-based Model

知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 在本教程中…

Java第二十章多线程

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…

一起学docker系列之十二什么是dockerfile

目录 1 基本概念2 语法规则3 Dockerfile构建步骤4 Dockerfile、Docker镜像和Docker容器的关系5 保留字介绍5.1 FROM5.2 MAINTAINER5.3 RUN5.4 EXPOSE5.5 WORKDIR5.6 USER5.7 ENV5.8 ADD5.9 COPY5.10 VOLUME5.11 CMD5.12 ENTRYPOINT 6 总结7 参考地址 1 基本概念 Dockerfile是一…

答题小程序挑战专题1V1PK答题模式感受竞技乐趣

作为答题小程序的重要部分&#xff0c;专题赛是一种吸引用户参与、增加用户互动性和提高用户参与度的有效方式。下面&#xff0c;我将为大家详细介绍答题小程序的专题赛怎么玩。 首先&#xff0c;每个专题可以设置单独的开放时间。例如&#xff0c;在2024年1月1日&#xff0c;…

Couchdb 命令执行漏洞复现 (CVE-2017-12636)

Couchdb 命令执行漏洞复现 &#xff08;CVE-2017-12636&#xff09; 1、下载couchdb.py 2、修改目标和反弹地址 3、Python3调用执行即可 couchdb.py文件下载地址: https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py ‍ 在VULFocus上开启环境 …