输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入

连接EVM链或TRON链的节点(配置项「ChainType」选一条EVM链或TRON),通过exchange.IO()的各个指令读写链上数据:注册ABI后调用合约、编码解码、签名、批量查询、事件日志、发送交易和管理nonce等。EVM侧使用节点的JSON-RPC,节点所在的链由节点决定(Ethereum、BNB Smart Chain、Base、Arbitrum等任意EVM链);TRON侧使用全节点的HTTP接口(/wallet/*)。

标准交易函数中只支持exchange.GetAssets()、exchange.GetAccount()(钱包的原生币余额)。在去中心化交易所兑换代币请使用Uniswap交易所对象:它可以直接使用exchange.GetTicker()、exchange.CreateOrder()等标准函数。

名称与配置

exchange.GetName():Web3(自定义接入);别名:以太坊、Ethereum、波场、TRON。

配置项必填默认值说明
链是ETHEVM链选Ethereum、BNB Chain、Base、Arbitrum、OP Mainnet、Polygon、Avalanche C-Chain、Unichain之一时自动填入该链的公共节点;其它EVM链选「Other EVM」并自己填节点地址;TRON为波场。(详见表下)
钱包私钥是—钱包私钥(十六进制,0x前缀可选)。只读用法可以不填,运行中可用exchange.IO("key", ...)切换。
节点地址否https://ethereum-rpc.publicnode.com,https://eth.drpc.orgEVM为JSON-RPC节点地址,多个节点用逗号分隔互为备用;不填时用所选链的公共节点(「Other EVM」必须填)。(详见表下)
节点认证否—EVM:Header-Name: value形式的请求头,或Basic认证值;TRON:作为TRON-PRO-API-KEY请求头发送。

表中长说明的其余部分:

  • 链:EVM上具体连的是哪条链仍以节点的chainId为准(选项只决定缺省节点),所以存量配置「ETH + 自填节点」照旧可连任意EVM链。可选:Ethereum、BNB Chain、Base、Arbitrum、OP Mainnet、Polygon、Avalanche C-Chain、Unichain、Other EVM (custom RPC)、TRON
  • 节点地址:公共节点限流较严,频繁调用或要查历史日志时请换成自己的节点。TRON为全节点HTTP地址(只能一个,不填为https://api.trongrid.io,旧的gRPC地址会换成对应的HTTP地址)。

交易对与合约代码

交易对示例:ETH_USDT

交易对不参与链上操作,任意BASE_QUOTE形式都可以设置。合约、代币用地址指定:EVM为0x开头的地址,TRON为T开头的地址。

专属IO指令
指令参数说明返回值
abiaddress, abiContent为合约地址注册ABI(JSON字符串,或内置模板名weth、uniswapV3Pool、uniswapV3Factory、uniswapV3QuoterV2、uniswapV3SwapRouter02、uniswapV3PositionManager、permit2,PancakeSwap V3有对应的pancakeV3*别名)。见子页exchange.IO("abi", ...)。—
apiaddress | "eth" | "tron", method, ...args[, options]第一个参数为合约地址时调用合约方法:只读方法(view、pure)返回解码后的值,写方法签名并广播后返回交易哈希(options可设gasLimit、gasPrice、nonce、dryRun)。见子页exchange.IO("api", ...)。—
calladdress, method | calldata, ...args[, options]以eth_call模拟执行合约的任意方法(包括写方法),不签名、不广播、不消耗gas,用于询价、交易预演;options为{from, value, block, gasLimit}。仅EVM。见子页exchange.IO("call", ...)。方法名调用返回解码后的值(没有返回值时为true);calldata调用返回原始返回数据(十六进制字符串)。
multicallcalls[, options]通过Multicall3合约在同一区块状态上一次读取多个合约调用,calls每项为[合约地址, 方法, ...参数];options为{allowFailure, block, multicall}。见子页exchange.IO("multicall", ...)。与calls顺序一致的结果数组。默认任何一项失败都整体报错(带序号与原因);allowFailure为true时失败项为空值。
logsquery查询合约的事件日志(eth_getLogs)并按ABI解码;query为{address, event, filter, fromBlock, toBlock, topics, blockHash}。仅EVM。见子页exchange.IO("logs", ...)。日志数组,能解码时每项另有event、args。
waitReceipttxHash[, options]等待交易上链并达到确认数,options为{timeout, confirmations, interval}:timeout、interval单位为毫秒,默认120000(范围1000到600000)、1500,confirmations默认1。见子页exchange.IO("waitReceipt", ...)。交易回执(status为数字,events为解码后的事件);超时报错并返回空值。
nonce["sync" | number]查看发送交易使用的nonce计数;传sync按节点的pending计数重新同步,传数字设置本地下一个nonce。仅EVM。见子页exchange.IO("nonce", ...)。{address, latest, pending, local}(数值均为字符串;还没有发送过交易时local为空值)。
speedUptxHash[, options]给还未上链的交易加价重发(同nonce,接收地址、金额、调用数据和gas上限不变);options为{multiplier, dryRun},multiplier范围1.1到10,默认1.125。仅EVM。见子页exchange.IO("speedUp", ...)。替换交易的哈希;dryRun时返回替换交易的内容。
cancelTxtxHash[, options]取消还未上链的交易:用同一个nonce发送一笔转给自己的0金额交易,手续费更高;options同speedUp。不保证成功。仅EVM。见子页exchange.IO("cancelTx", ...)。取消交易的哈希;dryRun时返回取消交易的内容。
encode[address, ]dataFormat, ...args按类型表做标准ABI编码(同Solidity的abi.encode);第一个参数为合约地址时编码该合约的方法调用(calldata)。见子页exchange.IO("encode", ...)。不带0x的十六进制字符串。
encodePackeddataFormat, ...args按类型表做紧凑编码(同Solidity的abi.encodePacked)。见子页exchange.IO("encodePacked", ...)。不带0x的十六进制字符串。
decodedataFormat, data按类型表解码十六进制数据。见子页exchange.IO("decode", ...)。只有一个类型时直接返回值,多个类型时返回数组。
hashalgo, inputFormat, outputFormat, data[, keyFormat, key]计算哈希摘要、HMAC,或用配置的私钥签名等,参数与Encode函数相同;常用于计算keccak256。见子页exchange.IO("hash", ...)。—
keyprivateKey切换交易所对象使用的私钥(十六进制,0x前缀可选);私钥无效时报错,不切换。不能并发切换。见子页exchange.IO("key", ...)。—
signhash[, key]用secp256k1私钥对32字节哈希签名(不再做哈希),用于EIP-712等链下签名;不传key时用配置的私钥。见子页exchange.IO("sign", ...)。{r, s, v, signature, vs}(v为27或28,vs为EIP-2098紧凑签名)。
signTypedDatatypedData[, key] | domain, types, message[, key]按EIP-712对结构化数据签名,一步完成类型哈希、域分隔符、结构体哈希和摘要计算。见子页exchange.IO("signTypedData", ...)。同sign,另有digest(EIP-712摘要)。
signMessagemessage[, key]按EIP-191(personal_sign)对消息签名;字符串按UTF-8签名,原始字节传{hex: "0x..."}。见子页exchange.IO("signMessage", ...)。同sign,另有digest(EIP-191消息哈希)。
toUnitsamount, decimals把可读数量换算为链上整数,按字符串精确计算;decimals可以是数字或代币合约地址(自动读取decimals())。小数位多于精度时报错。见子页exchange.IO("toUnits", ...)。十进制字符串。
fromUnitsamount, decimals把链上整数换算为可读数量,按字符串精确计算;decimals同toUnits。见子页exchange.IO("fromUnits", ...)。十进制字符串(去掉末尾的0)。
uniswapV3fn, ...args集中流动性计算:tickToPrice、priceToTick、sqrtPriceToPrice、tickToSqrtPrice、sqrtPriceToTick、nearestUsableTick、amountsForLiquidity、liquidityForAmounts;精度参数可以是数字或代币地址。见子页exchange.IO("uniswapV3", ...)。—
contracts[chainId]当前链(或指定链)的常用合约地址:主流代币、Multicall3、Permit2,以及Uniswap V3、PancakeSwap V3的Factory、路由、QuoterV2、头寸管理合约。见子页exchange.IO("contracts", ...)。{chainId, name, wrappedNative, tokens, multicall3, permit2, uniswapV3, pancakeV3}
address[key]配置的钱包地址(EVM为0x开头的小写地址,TRON为T开头的地址);传入私钥时返回该私钥的地址,不切换私钥。见子页exchange.IO("address")。—
base[address]查询或设置RPC节点地址。EVM支持多个节点互为备用(数组或逗号分隔),每个节点第一次使用时核对chainId;TRON只支持一个全节点HTTP地址,旧的gRPC地址grpc.trongrid.io:50051等换成对应的HTTP地址。见子页exchange.IO("base", ...)。设置前的节点地址;不传参数时返回当前地址。
sendBase[url]设置只用来广播交易的节点(Flashbots Protect、MEV Blocker等私有交易通道),读取、查nonce、估算gas仍用配置的节点;传空字符串清除。仅EVM。见子页exchange.IO("sendBase", ...)。设置前的发送节点地址,未设置时为空字符串。

通用指令currency见exchange.IO。

函数支持差异

不支持(调用时报错并返回空值):exchange.GetTicker、exchange.GetTickers、exchange.GetDepth、exchange.GetTrades、exchange.GetRecords、exchange.GetMarkets、exchange.CreateOrder、exchange.Buy、exchange.Sell、exchange.CancelOrder、exchange.ModifyOrder、exchange.GetOrder、exchange.GetOrders、exchange.GetHistoryOrders、exchange.CreateConditionOrder、exchange.ModifyConditionOrder、exchange.CancelConditionOrder、exchange.GetConditionOrder、exchange.GetConditionOrders、exchange.GetHistoryConditionOrders。

注意事项
  • exchange.GetAssets()返回钱包的原生币余额:EVM按节点的chainId确定币名(ETH、BNB、POL、AVAX等,认不出的链报错),TRON为TRX;exchange.GetAccount()按当前交易对从中取值(例如交易对为ETH_USDT时Stocks为ETH余额)。代币余额用exchange.IO("api", 代币地址, "balanceOf", 地址)查询。

本章内容整章阅读

名称描述
exchange.IO("abi", ...)在发明者量化交易平台主要通过exchange.IO()函数实现区块链相关的各种功能、调用。
exchange.IO("api", blockChain, ...)调用以太坊RPC方法(需要Web3交易所对象配置时选择eth)。
exchange.IO("encode", ...)对数据进行ABI编码。
exchange.IO("encodePacked", ...)encodePacked编码。
exchange.IO("decode", ...)解码。
exchange.IO("hash", ...)计算哈希摘要、HMAC,以及使用交易所对象配置的私钥签名等,参数与Encode函数相同。
exchange.IO("key", ...)切换私钥。
exchange.IO("sign", ...)使用secp256k1私钥对32字节哈希进行签名,返回r、s、v等签名数据,适用于EIP-712结构化数据签名(如ERC-20 Permit授权、1inch限价单)等需要链下签名的场景。
exchange.IO("signTypedData", ...)按照EIP-712标准对结构化数据进行签名,一次调用即可完成类型哈希、域分隔符、结构体哈希和摘要的计算并签名,适用于ERC-20 Permit、Permit2、UniswapX、CoW、1inch限价单…
exchange.IO("signMessage", ...)按照EIP-191标准(personal_sign)对消息进行签名,签名结果与ethers的signMessage、钱包的personal_sign一致,常用于DApp登录、链下鉴权等场景。
exchange.IO("api", ...)在Web3交易所对象上调用智能合约方法:只读方法返回解码后的值,写方法则签名并广播交易。
exchange.IO("call", ...)通过eth_call模拟执行智能合约的任意方法(包括会修改链上状态的写入方法),该过程不签名、不广播交易、不消耗gas,适用于链上询价、交易预演以及检查交易能否成功执行。
exchange.IO("multicall", ...)通过Multicall3合约在一次请求中批量读取多个合约调用的结果,适用于批量查询余额、流动池状态、报价等数据,可有效减少RPC请求次数。
exchange.IO("logs", ...)查询合约的事件日志(eth_getLogs),并按ABI进行解码。
exchange.IO("waitReceipt", ...)等待交易上链并达到指定的确认数,返回交易回执及解码后的事件日志。
exchange.IO("nonce", ...)查看、同步或设置发送交易时使用的nonce计数。
exchange.IO("speedUp", ...)对卡住(长时间未上链)的交易进行加价重发:保持接收地址、金额、调用数据和gas上限不变,仅提高手续费。
exchange.IO("cancelTx", ...)取消尚未上链的交易:使用与原交易相同的nonce,以更高的手续费发送一笔转给自己的0金额交易;该交易先上链后,原交易即失效。
exchange.IO("toUnits", ...)将可读数量换算为链上整数。
exchange.IO("fromUnits", ...)将链上整数值换算为可读数量,整个换算过程基于字符串进行精确计算,不经过浮点数运算,避免精度损失。
exchange.IO("uniswapV3", ...)集中流动性(Uniswap V3)相关的计算:tick、价格、sqrtPriceX96之间的换算,以及流动性与代币数量之间的换算。
exchange.IO("contracts", ...)获取当前链(或指定链)的常用合约地址,包括主流代币、Multicall3、Permit2,以及Uniswap V3、PancakeSwap V3的Factory、路由、QuoterV2和头寸管理合约。
exchange.IO("address")获取exchange交易所对象配置的钱包的地址。
exchange.IO("base", ...)设置Web3交易所对象的RPC节点地址,EVM链可以设置多个节点互为备用。
exchange.IO("sendBase", ...)设置仅用于广播交易的节点。