模板合约
模版合约是聪网原生智能合约类型。其执行逻辑由聪网节点源码中内置的Go runtime实现。
模版合约遵循智能合约的通用协议。本文只定义模版合约特有规则。
合约类型
模版合约类型为:
ContractTypeTemplate模版合约不执行EVM bytecode,不使用Solidity ABI,不维护EVM account state。模版合约也不是通道合约,不依赖RSMC通道、多方签名或承诺交易。
模版合约的资产控制边界来自合约VM状态和canonical CONTRACT_RESULT。
地址规则
模版合约使用通用合约地址格式:
ca/tc + version + ContractTypeTemplate + hash模版合约地址hash长度为32字节。hash输入为:
Contract.Encode()得到的合约内容。deployer。
部署随机值。
部署随机值用于让相同deployer和相同合约内容生成不同合约地址。
模版合约runtime中的URL()等于合约地址。
部署规则
CONTRACT_DEPLOY用于部署模版合约。
部署payload包含:
模版名称。
模版版本。
deployer。
部署随机值。
gas limit。
Contract.Encode()得到的合约内容。
节点根据部署payload生成合约地址、初始化runtime状态,并在同一区块内通过CONTRACT_RESULT记录部署结果和state root。
如果合约地址已存在,部署无效。
调用规则
CONTRACT_INVOKE用于调用模版合约。
调用交易必须输出到被调用合约地址。该输出同时作为:
Call TX和Result TX的绑定UTXO。
本次调用转入合约的资产。
本次调用和后续结算的费用来源。
调用者身份由调用交易最后一个输入解析得到。runtime中的用户状态、LP归属、refund权限和历史记录都使用该身份。
模版合约可以定义默认调用。默认调用由没有合约OP_RETURN、但输出到模版合约地址的交易触发。合约根据输出中的资产类型和数量自行解释业务含义;如果该输出不符合合约可执行条件,合约可以将其视为无效业务输入而不改变业务状态。
费用规则
模版合约使用统一gas资产支付费用。
不同模版可以定义自己的调用费和撮合费。限价单和AMM模版沿用原通道合约的费用计算方式,但费用资产使用统一gas资产。
gas/funding输出中用于费用的部分不进入合约资产池。扣除费用后的剩余资产才作为合约可支配资产。
Result TX规则
模版合约不接受外部提交的CONTRACT_RESULT进入mempool。
出块节点根据模版runtime结果构造canonical CONTRACT_RESULT。验证节点必须独立重放runtime,并比较区块中的Result TX。
如果Result TX缺失、输入输出不符合canonical规则,或与本地重放结果不一致,区块无效。
状态规则
模版合约状态属于全局合约VM状态。
模版合约state root、EVM合约state root和Agent合约state root合成统一的contract state root,并写入coinbase。
模版runtime必须满足:
相同链上输入得到相同状态。
不依赖本地时间、外部服务、随机数或其他非确定性数据。
合约资产余额由合约地址UTXO集合和runtime状态共同验证。
第一阶段模版
第一阶段实现三个交易类模版:
限价单交易合约。
AMM交易合约。
资产兑换合约。
限价单和AMM模版从原通道合约业务逻辑迁移,但不保留以下能力:
通道两端签名。
RSMC通道状态。
L1 deposit/withdraw。
L1 commit/reveal和BRC20 transfer inscription流程。
老通道合约状态迁移。
限价单交易合约
限价单交易合约对应原SwapContractRuntime的限价单交易逻辑。
接口名称和订单类型值与通道合约保持一致:
swap:挂买单或卖单。refund:取消挂单或取回可退资产。买单订单类型为
2。卖单订单类型为
1。refund订单类型为
3。
撮合规则:
买单按价格从高到低排序。
卖单按价格从低到高排序。
同价格按区块顺序、交易顺序和item id排序。
只有买价大于或等于卖价时成交。
成交价使用卖单价格。
买单可以吃到更低价格卖单。
每次撮合生成买家资产转移和卖家聪转移,两笔transfer位于同一个Result TX中。
买单完成后,未使用的聪退回买家。
卖单剩余资产不足以按价格成交时,剩余资产退回卖家。
refund规则:
refund参数包含item id列表。item id列表为空时,取消调用者所有未完成挂单。
item id列表非空时,只取消指定item。
调用者只能取消自己的挂单。
已成交并已经通过Result TX发出的资产不再进入refund。
默认调用规则:
向限价单合约输入聪时,合约按当前可成交的卖价解释为买入。
向限价单合约输入该合约资产时,合约按当前可成交的买价解释为卖出。
当前没有可参考成交价时,默认调用不产生新的订单或资产结算。
AMM交易合约
AMM交易合约对应原AMM通道合约的swap和流动性逻辑。
接口名称和订单类型值与通道合约保持一致:
swap:AMM买入或卖出。refund:取回可退资产。addliq:添加流动性。removeliq:移除流动性。买单订单类型为
2。卖单订单类型为
1。添加流动性订单类型为
9。移除流动性订单类型为
10。
部署和ready规则:
AMM合约部署内容包含资产名称、初始资产数量、初始聪数量和常数K。
合约部署后,如果合约地址中的资产池、聪池或
asset*sats没有达到部署参数要求,合约不进入可交易状态。合约可以通过
addliq补充底池。当资产池、聪池和
asset*sats >= K都满足后,合约进入可交易状态。合约ready后,正常交易过程中不再要求实时
asset*sats >= K。如果池子被移空,合约退出可交易状态,必须再次通过
addliq达到初始K后才能重新ready。
AMM swap规则:
AMM采用常数乘积公式。
AMM买入时,用户输入聪,输出资产。
AMM卖出时,用户输入资产,输出聪。
AMM卖出参数中的
Amt表示最小可接受输出聪数量,输入资产数量以Call TX funding output为准。AMM买入参数中的
Amt表示最小可接受输出资产数量,输入聪数量以Call TX funding output为准;UnitPrice只能作为报价或滑点约束,不能作为输入金额的第二来源。滑点保护失败时,本区块直接生成refund result。
同一区块内AMM先处理swap,再处理add/remove liquidity,以对齐原通道合约。
因addliq达到ready的区块不会同时撮合之前等待中的swap,等待中的swap会在后续区块结算。
AMM默认调用规则:
向AMM合约输入聪时,合约解释为买入。
向AMM合约输入该合约资产时,合约解释为卖出。
不符合AMM交易语义的默认调用不改变AMM业务状态。
流动性规则:
addliq调用的入池资产数量和入池聪数量以Call TX funding output为准。addliq参数只应表达最小可接受LPT、比例约束、deadline等不能由funding output推导的约束,不应重复表达入池资产数量或入池聪数量。多余资产或多余聪按池子比例计算后通过Result TX退回。
removeliq参数包含要移除的LPT数量。如果请求移除的LPT超过调用者余额,按调用者实际LPT余额处理。
移除流动性时,LP获得对应池子份额。
产生利润时,LP获得60%利润;原服务端和基金会两部分合并后统一给基金会。
当前实现使用部署者地址作为基金会接收地址。
资产兑换合约
资产兑换合约用于按部署者设定的规则出售库存资产A。invoker输入资产B后获得资产A,deployer在同一个canonical CONTRACT_RESULT中获得成交消耗的资产B。
部署内容包含:
资产A名称。
资产B名称。
价格模式。
价格阶梯表。
价格模式支持:
height:按区块高度选择当前价格阶梯。sold_a:按累计已售出资产A数量选择当前价格阶梯。
价格阶梯表中的bPerA表示兑换1单位资产A需要支付的资产B数量。第一档阈值必须为0,后续阈值必须严格递增。
接口规则:
exchange:输入资产B并兑换资产A,参数可以包含最小可接受输出资产A数量。close:仅deployer可调用,关闭合约并取回剩余资产A。无参数默认调用输入资产A时,视为补充库存。
无参数默认调用输入资产B时,视为按当前价格兑换资产A。
无参数默认调用同时输入资产A和资产B时,资产A先补充库存,资产B再用于兑换。
兑换规则:
成交价由部署时的价格模式和当前区块状态确定。
合约最多输出当前可用库存资产A。
输入资产B数量以Call TX funding output为准;当库存资产A不足以满足输入资产B时,按当前价格部分成交,未使用的资产B退回invoker。
当
exchange参数中的最小输出资产A不满足时,净输入资产B退回invoker。合约关闭后不再接受新的兑换,后续兑换输入按失败处理。
gas同名规则:
资产A或资产B都可以与统一gas资产同名。
当gas资产等于资产A时,先从可用资产A中扣除本次Result费用,剩余资产A才可作为库存或兑换输出。
当gas资产等于资产B时,先从本次输入资产B中扣除本次Result费用,剩余资产B才参与兑换。
当gas资产不同于资产A和资产B时,gas按模版合约通用费用规则处理。
Last updated