BUMO DEX 10合同概述BUMO DEX 10 (中断的交换)是基于bumo智能合约制定的中心化资产交换合同。 该协议提供了对基于BUMO发行的各种资产进行中心化和自由交换的能力。
基于该标准接口实现的非中心化资产交换协议,发布到BUMO的各类资产可以安全快捷地在链上自由交换,无需依赖中心化交易所,并且可以与其他APP应用程序和第三方快速对接使用
规则BUMO智能约定用JavaScript语言实现,包括初始化函数init和两个条目函数main、query。 init函数用于创建合同时的初始化。 main函数主要负责数据的写入,query函数负责数据查询。
DEX 1.0协议支持ATP token和BU之间的自由兑换,兑换后的服务费由BU收取。 资产兑换时,支付BU的一方需要在预定兑换额之外按照服务费的比率另外支付服务费。 就像计税方式中的价外税一样,服务费不包括在兑换金额中。 支付atp或ctp token的一方从成交后收到的BU中,按照服务费的比例支付服务费。 就像计税方式中的价内税,服务费包含在兑换金额中。 服务费与交易额的比率可以在DEX合同中自行设定。
DEX属性DEX属性可以在合同的dexInfo功能函数中查询,并存储在智能合同的帐户中。 包括以下内容
变量包括ownerDEX合同所有者feeRate服务费率versionDecentralized exchange版本注意
owner :默认dex合同的创建者(如果在创建dex合同时未指定默认值)。 feeRate:的单位为1/(10^8)。例如,如果feeRate的值为50000,则服务速率为50000 ) 10^8)=5/10000。 版本: dex的版本。 例如,1.0功能函数makeOrder发表ATP token或CTP token和BU的兑换订单,对应ATP的兑换BU、CTP的兑换BU、BU的兑换ATP、BU的兑换CTP。
兑换ATP token时,使用issuer (发行者地址)、code (资产代码)、value )的表述;
在兑换CTP token时,使用issuer(CTP合同地址)和值;
BU是内置BUMO的原生token,不需要显示,兑换时只需输出value (数量)
如果订单token是CTP资产,则在发出订单之前,订单用户需要在对应的CTP协议中信用DEX协议,信用额度是对token的额度;
如果订购的token为ATP资产,则下达订单时需要通过payAsset (转移资产)操作触发,转移资产的内容和金额为转移资产的内容和金额;
如果订单的token为BU,则提交订单时必须通过“payCoin (转账)”操作触发。 汇款金额是BU的金额加上兑换服务费后的金额。
入口函数main。
参数json结构:
{ 'method':'makeOrder ',' params ' : { ' own ' : {/at ptoken ' issuer ' 3360 buqxxx ',' code ' : ' 包括以下内容
target :有订单的Token,例如“发行方”、“代码”、“资产代码”、“值”等。 CTPToken没有代码,“BU”没有issuer和代码。
fee )挂在账户上支付给DEX合同的服务费按兑换的资产计算。 如果兑换的token不是BU,结算时DEX合同会从兑换后的BU中按兑换比扣除。
expiration :订单的截止日期、过期后的订单无效。
函数: functionmakeorder(own,target,fee,expiration ); 返回值: true或慢速异常。 用cancelOrder的单一账户取消订单。
入口函数main。
参数json结构:
{ 'method':'cancelOrder ',' params ' : { ' order ' : ' order _1' } } order :已取消的订单编号;
函数: function cancelOrder(order )
回来
回值:true 或者抛异常 takeOrder对订单填单或者局部填单,如果该订单已完成或者已过期,该函数应该被 throw。
如果填单的兑出 token 为 CTP 资产,填单之前,填单用户需先在对应的 CTP 合约内授信 DEX 合约,授信额度为兑出 token 的额度;
如果填单的兑出 token 为 ATP 资产,填单时,需用 payAsset(转移资产) 操作触发,转移的资产内容和数额为兑出资产的内容和数额;
如果填单的兑出 token 为 BU,填单时,需用 payCoin(转账) 操作触发,转账的数额为兑出 BU 的数额加兑换服务费;
入口函数 main。
参数json结构:
{ 'method':'takeOrder', 'params':{ 'order':'order_1', 'fee':5, }}order: 填单或局部填单的订单号;
fee: 填单账户支付给 DEX 合约的服务费,以兑出资产计数,如果兑出的 token 非 BU,结算时 DEX 合约会按照兑换比从兑换后的 BU 中扣除;
函数:function takeOrder(order)
返回值:true或者抛异常
updateFeeRate更改 DEX 合约的服务费比率,如果非合约拥有者调用,该函数应该被 throw。
入口函数 main。
参数json结构:
{ 'method' : 'updateFeeRate', 'params' : { 'rate' : '50000' //单位为 1/(10^8) }}rate: 服务费与 token 兑换额的比率。
函数:function updateFeeRate(rate)
返回值:true或者抛异常
updateOwner更改 DEX 合约的拥有者,更改后,原合约拥有者将失去 DEX 合约的控制权,如果非合约拥有者调用,该函数应该被 throw。
入口函数 main。
参数json结构:
{ 'method' : 'updateOwner', 'params' : { 'address' : 'buQnTmK9iBFHyG2oLce7vcejPQ1g5xLVycsj' }}address: DEX 合约新拥有者的地址。
函数:function updateOwner(address)
返回值:true或者抛异常
clearExpiredOrder清除 DEX 合约中未完成但已过期的订单,如果非合约拥有者调用,该函数应该被 throw。
入口函数 main。
参数json结构:
{ 'method' : 'clearExpiredOrder',}函数:function clearExpiredOrder()
返回值:true或者抛异常
withdrawFee从 DEX 合约中提现服务费,如果非合约拥有者调用,该函数应该被 throw。
入口函数 main。
参数json结构:
{ 'method' : 'withdrawFee', 'params' : { 'value': 10000 }}参数:value 提现的数额;
函数:function withdrawFee(value)
返回值:true或者抛异常
dexInfo返回 DEX 合约的基本信息。
入口函数 query。
参数json结构:
{ 'method':'dexInfo'}函数:function dexInfo()
返回值:
{ 'result':{ 'type': 'string', 'value': { 'dexInfo': { 'owner': 'buQnTmK9iBFHyG2oLce7vcejPQ1g5xLVycsj', 'feeRate': 50000, //单位为 1/(10^8) 'version': '1.0' } } }} getOrder根据订单号获取订单详细信息。
入口函数 query。
参数json结构:
{ 'method':'getOrder', 'params' : { 'order': 'order_1' }}order: 订单号;
函数:function getOrder(order)
返回值:
{ 'order_1':{ 'own':{ //ATP token 'issuer':buQxxx', 'code':'EUR', 'value':10000, }, 'target':{ //BU 'value':1000, }, 'fee':5, 'expiration':'2018...' }} getOrderInterval获取订单号的有效区间。
入口函数 query。
参数json结构:
{ 'method':'getOrderInterval',}函数:function getOrderInterval()
返回值:
{ 'orderInterval':[9, 1000]} 合约入口 init创建合约时候,触发合约 init 入口函数,负责合约创建时的初始化。
函数
function init(input_str){}参数Json结构
{ 'params':{ 'owner':'buQnTmK9iBFHyG2oLce7vcejPQ1g5xLVycsj', 'feeRate':'50000', 'version': '1.0' }}owner:如果创建 DEX 合约时,没有给出默认值,那么默认 DEX 合约的创建者。
feeRate: 单位为 1/(10^8),例如 feeRate 的值为 50000,那么服务费率是 50000/(10^8) = 5/10000。
version:DEX 的版本。如 1.0
返回值:
成功:无
失败:抛出异常
main负责数据写入,其中包含了 makeOrder、cancelOrder、takeOrder、updateFeeRate、updateOwner、clearExpiredOrder、withdrawFee等接口。
函数体
function main(input_str){ let input = JSON.parse(input_str); if(input.method === 'makeOrder'){ makeOrder(input.params.own, input.params.target, input.params.fee, input.params.expiration); } else if(input.method === 'cancelOrder'){ cancelOrder(input.params.order); } else if(input.method === 'takeOrder'){ takeOrder(input.params.order); } else if(input.method === 'updateFeeRate'){ updateFeeRate(input.params.rate); } else if(input.method === 'updateOwner'){ updateOwner(input.params.owner); } else if(input.method === 'clearExpiredOrder'){ clearExpiredOrder(); } else if(input.method === 'withdrawFee'){ withdrawFee(input.params.value); } else{ throw '<Main interface passes an invalid operation type>'; }} query负责数据查询,其中包含了dexInfo、getOrder、getOrderInterval等接口。
函数体
function query(input_str){ let result = {}; let input = JSON.parse(input_str); if(input.method === 'dexInfo'){ result.dexInfo = dexInfo(); } else if(input.method === 'getOrder'){ result.order = getOrder(input.params.order); } else if(input.method === 'getOrderInterval'){ result.interval = getOrderInterval(); } else{ throw '<Query interface passes an invalid operation type>'; } return JSON.stringify(result);}