使用契约的链上期权合约

news2024/9/30 3:30:49

我们很高兴地宣布利用比特币契约的力量在链上实施期权合约。 只要该链支持比特币式契约(例如 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.tokenAmt
        outputs += 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.tokenAmt
    outputs += 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.grantee
    this.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.coloradmin.cn/o/1261793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骨传导耳机对人有伤害吗?佩戴骨传导耳机有什么副作用?

使用骨传导耳机并不会对人体造成伤害,也没有副作用,相反,使用骨传导耳机还可以在一定程度上起到保护听力的作用。 一、什么是骨传导耳机? 首先让我们先了解下骨传导耳机是什么: 骨传导耳机是指通过人体骨骼来传递声…

机器学习(1)机器学习类型和机器学习的主要概念

0.前提 深度学习(Deep Learing)是机器学习(Machine Learning)领域中的一个新的研究方向,在如今的时代研究深度学习的大模型是十分热门的。我不知道有多少人有关注到最近openai的事件啊,说个比较让我惊讶的…

【数字化转型方法论读书笔记】选型数据中台的几大建议

企业数字化转型离不开企业数字化技术的配备。但企业在选择数字化技术时也面临着一个问题,就是如何在大胆采用先进的数字化技术和对技术进行投资之间找到平衡,将投资风险降到最低,毕竟错误的技术选型会给企业带来不可估量的损失。 熟悉先进数…

抖音团购小程序怎么开通?怎么做抖音团购?

餐饮同行们已经纷纷上架了抖音团购服务,还没入局的商家还在等待什么呢?如果你还没有抓住这个流量的红利期,那就真的OUT了!为了在这个竞争激烈的市场中脱颖而出,建议你尽快行动起来,打造一个属于自己的抖音团…

MES系统中的工厂计时计件工资

在制造业中,为了提高工资核算的准确性和效率,实时的数据跟踪和数据处理成为了关键。本文将从多个方面详细介绍MES系统在工厂计时计件工资系统方面的解决方案,以及MES系统与ERP系统如何实现联动集成。 一、MES系统在工厂计时计件工资系统中的解…

关于微信小程序中如何实现数据可视化-echarts动态渲染

移动端设备中,难免会涉及到数据的可视化展示、数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能。 基础使用 首先在GitHub上下载echarts包 地址:https://github.com/ecomfe/echarts-for…

【Redis缓存】RedisTemplate如何获取符合要求的key,批量获取key

RedisTemplate如何获取符合要求的key,批量获取key 一、方法/命令二、数据使用 一、方法/命令 如果使用命令的形式,输入以下命令即可 keys *如果使用RedisTemplate,则方法为 redisTemplate.keys()获取所有符合条件的key。 二、数据使用 redis中缓存了…

leetcode:645. 错误的集合(python3解法)

难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结…

RK3568 android11 实现GT9xx双路I2C触摸

一,GT911 触摸屏简介 它的接口类型为 I2C ,供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻,这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。关于线序,同样是 GT911 ,不同批次的器件都有…

设置MATLAB启动时弹到上次退出时的工作文件夹

前言 每次关机前退出matlab后,下次打开matlab想完成剩余的工作,还需要回忆工作文件夹,或者依据上次打开的m文件之类的点击跳转,一次两次觉得没什么,多了就觉得很麻烦反感,参考官方知乎博主的解答&#xff…

SimpleCG小游戏开发系列(1)--扫雷

一、前言 前面我们学习了SimpleCG的游戏开发框架,从本篇开始,我们用一系列小游戏的开发来加深对框架的了解.我们先以windows的经典游戏--扫雷,作为首个例子。游戏预览如下 二、框架搭建 因为游戏程序的大体框架差不多,所以我们可以搭建一个通用的主程序。如下所示&a…

救助儿童会携手联劝公益在世界儿童日举办系列活动

2023年11月17日,为了呼吁家长关注对儿童情绪的关注与表达,救助儿童会携手联劝公益,以“走出情绪迷宫”为主题,于南丰城举办线下公益展,呼吁关注儿童心理健康。 本次展览由情绪迷宫、儿童艺术疗育活动、芝麻街互动三部分…

动静分离+多实例实验(nginx+tomcat)

Nginx服务器:192.168.188.14:80 Tomcat服务器1:192.168.188.11:80 Tomcat服务器2:192.168.188.12:8080 192.168.188.12:8081 部署Nginx负载均衡器 关闭防火墙 systemctl stop firewalld setenforce 0 安装依赖 yum -y install pcre-dev…

视频嵌套合并:视频剪辑高手分享,如何巧妙合并视频

随着社交媒体的兴起和视频制作技术的不断发展,视频合并已经成为了一项常见的任务。无论是娱乐、教育还是商业,都需要将多个视频片段合并在一起。视频嵌套合并是一种高级的视频编辑技术,它将两个或多个视频片段嵌套在一起,形成一个…

13%收入来自于贴牌代工,波司登如何闯关高端化?

寒潮已至,羽绒服也迎来销售旺季。 11月22日,#波司登13%收入来自于贴牌代工#话题冲上热搜;与此同时,波司登公布了2024财年中期的业绩预告。然而,根据波司登此前公布的2023财年年报显示,其业绩增长背后仍有隐…

Matlab R2022b 安装成功小记

Matlab R2022b 安装成功小记 前言一、 下载链接二、 安装过程小记 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧! 前言 windows 10系统之前安装过Matlab R2010b做基础研究,最…

【影刀RPA_写入日期到飞书表格】

飞书将日期写入多维表格,日期格式需要时毫秒级的时间戳才行。

倾斜摄影三维模型的根节点合并的轻量化技术方法分析

倾斜摄影三维模型的根节点合并的轻量化技术方法分析 倾斜摄影三维模型的根节点合并是一种轻量化技术,旨在减小模型数据的大小,提高渲染效率和加载速度。在本文中,我们将探讨关于倾斜摄影三维模型根节点合并的轻量化技术方法。 1、LOD&#x…

企业业务场景如何实现自动化连接?

为什么要实现企业业务场景的自动化连接? 可提高效率,自动化连接可以减少人工操作和手动干预的需求,从而提高业务处理的速度和效率。通过自动化连接,不同的系统、应用程序和流程可以自动协同工作,减少了人工处理的时间和…

QT基础实践之简易计算器

文章目录 简易计算器源码分享演示图第一步 界面设计第二步 设置槽第三步 计算功能实现 简易计算器 源码分享 链接:https://pan.baidu.com/s/1Jn5fJLYOZUq77eNJ916Kig 提取码:qwer 演示图 第一步 界面设计 这里直接用了ui界面,如果想要自己…