首页 > 编程知识 正文

upper limit,true positive rate

时间:2023-05-04 22:33:09 阅读:62593 作者:2467

关于0 x协议分析的take Limit Order是什么的问题不在此讨论。 基本概念有很多说明的文件,但这里主要介绍limit order的挂牌和吃法流程。

0x协议流程概述

0x中几个问题的解释

0x限价单挂单流程0x的市价单互动官方文件写得比较清楚,操作也比较简单。 这里主要记录限价单的收据和饮食单。

按格式准备订单

OX限价订单的数据结构structlimitorder { ierc 20 tokenv 06 maker token; IERC20TokenV06 takerToken; uint 128标记器amount; uint128 takerAmount; uint128 takerTokenFeeAmount; 地址标记器; 地址标记器; 地址发送器; 地址fee接收; 字节S32池; uint64 expiry; uint256 salt; } const order=new utils.limit order (maker token (: )0xc 778417 e 063141139 FCE 010982780140 aa aa0CD 5a b ), ' taker token ' : '0x f8db 576976096 D5 f19 c21 ab 12115 D7 a2 aa7c 77cc ',' makerAmount': '1', ' taker amount ' : ' 1000 ' ' maker ' : '0xd 993 d 1049 bd38 EDB E12 F8 F6 c9CDB 716970 b 778 D2 ', ' taker ' 3360 ' ' expiry': '1627240945 ',' Saai 'chainId': 3,'验证合约' : '0xdef 1c0ded9be c7f 1a 1670819833240 f 000 ' takertokenfeeamount ' 3366 ' sender ' : '0x 0000000000000000000000000 ', ' fee recipient ' 3360 '0x 00000000000000000000000000 ' 00000000000000000000 ' signature ' : { ' v ' : ' r ' : '0x 921 d 18 a7B4 ea F9 ce 5227031 f 872 DD 54a 73237 e5e b 90 d 81 da 3da 05465 F16 F9 b4f ',' s ' : '0x 524904 CAC 050 c9AE 8f 5999 cc 09 其中,signature字段是订单的签名,创建签名有多种方法

一种是使用@0x/protocol-utils提供的工具签署文档地址

yarn add @0x/protocol-utilsvarweb3=require (web3); const utils=require (' @0x/protocol-utils ' ); constcontractaddresses=require (' @0x/contract-addresses ); var infuranKey=' '; var web3=new web3(' https://ROP sten.in fura.io/v3/' infu rankey ); const privateKey='私钥' const maker='0xcc 2847 ab 347 a 4752 a 233 e 20 b 7e 4410 e 138f 096 f6'; constmaketoken='0xc 778417 e 063141139 FCE 010982780140 aa0cd5a b ' consttaketoken='0x f8db 576976096 D5 f19 c21 ab 12115 D7 aa2aa7aa7c777 cc c const null _ address='0x 0000000000000000000000000000000000000000000000 '; const addresses=contract addresses.getcontractaddressesforchainorthrow (chain _ id ); main ().then ) )=gt

; process.exit(0)) .catch(error => { console.error(error); process.exit(1); }); async function main() { await sign();}async function sign() { console.log(`CHAIN_ID = ${CHAIN_ID}, ETH = ${addresses.etherToken}, exchange = ${addresses.exchangeProxy}`); // 订单组装 const order = new utils.LimitOrder({ // or utils.RfqOrder makerToken : makeToken, takerToken : takeToken, makerAmount: makerAmount, takerAmount: takerAmount, maker: maker, taker: NULL_ADDRESS, pool: "0x0000000000000000000000000000000000000000000000000000000000000000", expiry: "2014956123", salt: "6", chainId: CHAIN_ID, verifyingContract: `${addresses.exchangeProxy}`, takerTokenFeeAmount: "0", sender: NULL_ADDRESS, feeRecipient: NULL_ADDRESS, }); // 签名 const signature = await order.getSignatureWithKey(privateKey, utils.SignatureType.EIP712); console.log(signature) if(await postOrder(order,signature)){ console.log("发布成功") return; } console.log("发布失败")}// 发布订单async function postOrder(order,signature) { const signedOrder = { ...order, signature }; // console.log(signedOrder); const resp = await fetch("https://ropsten.api.0x.org/sra/v4/order", { method: "POST", body: JSON.stringify(signedOrder), headers: { "Content-Type": "application/json" } }); if (resp.status === 200) { console.log("Successfully posted order to SRA"); return true; } else { const body = await resp.json(); console.log( `ERROR(status code ${resp.status}): ${JSON.stringify(body, undefined, 2)}` ); return false; } }

通过另外一种方式,提供的工具做的签名可以完成挂单
sign地址

将生成好的订单 作为body参数 通过api 发布出去,请求为post请求

发布后可以通过api根据某些参数查询出来, 查询api

吃单 maker 要把maketToken approve 给[0x相关的合约] 0xFbB2a5B444aA89a4054883A4D23FBA45BFc6840Ataker也要 takerToken approve 给合约注意take吃单要支付 70k*gasPrice的protocol fee0x 合约中一些方法的解析 orderParam 订单参数["0xf8db576976096d5f19c21ab12115d7a2aa7c77cc","0xc778417e063141139fce010982780140aa0cd5ab",1000,1,0,"0xcc2847ab347a4752a233e20b7e4410e138f096f6","0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000",2014956256,0] signParam 签名参数 [2,28,"0xd447dc3ef38cf18e82e34e2bffb78d2c8e7175881ae6b881a005a956b0f964ba","0x2a2b6dfd811a90d1dd72b830f09f9dcd6db2f9224b343dd4d4d8b33543c24cf8"] getLimitOrderHash(orderParam) 获取限价单的订单hash
return orderHashgetLimitOrderInfo(orderParam) 获取限价的信息
返回的是一个结构体,分别是订单hash,订单状态,已经订单中已经被吃掉的数量return struct OrderInfo { bytes32 orderHash; OrderStatus status; uint128 takerTokenFilledAmount;} 其中订单的状态分别有以下几种enum OrderStatus { INVALID, FILLABLE, FILLED, CANCELLED, EXPIRED}

可以购买的订单的状态是 1 FILLABLE,购买完了的是 2 FILLED

getLimitOrderRelevantState(orderParam,signParam) 这方法是获取限价单的一些状态, 这个会展示出当前的订单还有多少数量可以买的
返回有三个参数 分别是
OrderInfo的结构体,这个上面已经提过
actualFillableTakerTokenAmount 实际可以购买的数量,
isSignatureValid 挂单者的签名是否正确
其中 实际actualFillableTakerTokenAmount>0,isSignatureValid=true才可以购买成功.

fillLimitOrder(orderParam,signParam,takerAmount) 吃单
上述的查询可以说都是为了这个方法的填入正确的参数做准备。
检查完上面的状态都没问题,将订单参数呵呵签名参数填入,再填上一个合适的takerAmount的数量(<=actualFillableTakerTokenAmount)
另外注意发送交易的时候 要支付 70K*gasPrice的protocol费。
正常情况下发送交易,就可以完成吃单操作。

OK,以上就是使用0x 协议完成的挂单吃单的流程。

如果想详细分析token的流转,可以分析下面这个
吃单的一个交易hash

如果有问题,可以留言交流。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。