戦略コードを書いて,Ethereumチェーン上でスマートコントラクトのメソッドコールを実装します.exchange.IO
FMZ Quant トレーディング プラットフォームのアクセスノードを設定します. アクセスノードは自己構築のノードまたは第三者のサービスを使用することができます.infura
.
FMZ 量子取引プラットフォームのアクセスノードを構成する. アクセスノードは自己構築のノードまたは第三者のサービスを使用することができます.infura
- わかった
このページではWeb3
- わかった
設定するRpc Address
(アクセスノードのサービスアドレス)Private Key
(プライベートキー) プライベートキーの局所的な展開をサポートします.鍵 の 安全.
標準的な契約を呼び出すERC20
標準契約以外の方法を呼び出すには,ABI コンテンツを登録する必要があります:exchange.IO("abi", tokenAddress, abiContent)
- わかった
契約のABIコンテンツを取得するには,次のURLを使用して取得することができます.result
フィールドのみです
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
試しにexchange.IO()
この関数は,Ethereum RPC メソッドを呼び出すための関数です
exchange.IO("api", "eth", "eth_getBalance", owner, "latest") // owner is the specific wallet address
exchange.IO("api", "eth", "send", toAddress, toAmount) // toAddress is the address of the wallet receiving ETH when transferring, toAmount is the quantity
exchange.IO("api", "eth", "eth_gasPrice")
exchange.IO("api", "eth", "eth_estimateGas", data)
機能についてexchange.IO
概要をまとめていますencode
函数呼び出しのエンコーディングをhex
文字列形式
公開されているプラットフォームを参照してください.unwrapWETH9
この方法が例として用いられる.
function main() {
// Main network address of ContractV3SwapRouterV2: 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
// To call the unwrapWETH9 method, you need to register the ABI first, omit the registration here.
// "owner" represents the wallet address, it needs to fill in the specific, 1 represents the number of unwrapping, unwrap a WETH into ETH
var data = exchange.IO("encode", "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", "unwrapWETH9(uint256,address)", 1, "owner")
Log(data)
}
呼び出すときexchange.IO("encode",...)
2番目のパラメータ (文字列型) が0x
暗号化された方法の呼び出し (encode
) スマート契約
始めないなら0x
指定されたタイプ順序をコードするために使用されます.abi.encode
についてsolidity
次の例を参照してください.
function main() {
var x = 10
var address = "0x02a5fBb259d20A3Ad2Fdf9CCADeF86F6C1c1Ccc9"
var str = "Hello World"
var array = [1, 2, 3]
var ret = exchange.IO("encode", "uint256,address,string,uint256[]", x, address, str, array) // uint i.e. uint256 , the type length needs to be specified on FMZ
Log("ret:", ret)
/*
000000000000000000000000000000000000000000000000000000000000000a // x
00000000000000000000000002a5fbb259d20a3ad2fdf9ccadef86f6c1c1ccc9 // address
0000000000000000000000000000000000000000000000000000000000000080 // offset of str
00000000000000000000000000000000000000000000000000000000000000c0 // offset of array
000000000000000000000000000000000000000000000000000000000000000b // the length of str
48656c6c6f20576f726c64000000000000000000000000000000000000000000 // str data
0000000000000000000000000000000000000000000000000000000000000003 // the length of the array
0000000000000000000000000000000000000000000000000000000000000001 // array the first data
0000000000000000000000000000000000000000000000000000000000000002 // array the second data
0000000000000000000000000000000000000000000000000000000000000003 // array the third data
*/
}
トゥップルまたはトゥップルを含むタイプの順序的なエンコーディングをサポートする:
function main() {
var types = "tuple(a uint256,b uint8,c address),bytes"
var ret = exchange.IO("encode", types, {
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}, "0011")
Log("encode: ", ret)
}
このタイプオーダーはtuple
そしてbytes
呼び出すときに2つのパラメータを入力する必要があります.exchange.IO
にencode
:
{
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}
送信されたパラメータは,また,構造とタイプのtuple
定義されているようにtypes
パラメータ:tuple(a uint256, b uint8, c address)
."0011"
配列や配列を含むタイプの配列コードをサポートする:
function main() {
var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"] // ETH address, USDT address
var ret = exchange.IO("encode", "address[]", path)
Log("encode: ", ret)
}
DEX 式を呼び出すときUniswap V3
交換経路のようなパラメータを通す必要があります.encodePackaged
操作:
function main() {
var fee = exchange.IO("encodePacked", "uint24", 3000)
var tokenInAddress = "0x111111111117dC0aa78b770fA6A738034120C302"
var tokenOutAddress = "0x6b175474e89094c44da98b954eedeac495271d0f"
var path = tokenInAddress.slice(2).toLowerCase()
path += fee + tokenOutAddress.slice(2).toLowerCase()
Log("path:", path)
}
データ処理は,暗号化だけでなく (encode
解読する (decode
) を使います.exchange.IO("decode", types, rawData)
実行する機能decode
operation.
function main() {
// register SwapRouter02 abi
var walletAddress = "0x398a93ca23CBdd2642a07445bCD2b8435e0a373f"
var routerAddress = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
var abi = `[{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactOutputParams","name":"params","type":"tuple"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"}]`
exchange.IO("abi", routerAddress, abi) // abi only uses the contents of the local exactOutput method, the full abi can be searched on the Internet
// encode path
var fee = exchange.IO("encodePacked", "uint24", 3000)
var tokenInAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
var tokenOutAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"
var path = tokenInAddress.slice(2).toLowerCase()
path += fee + tokenOutAddress.slice(2).toLowerCase()
Log("path:", path)
var dataTuple = {
"path" : path,
"recipient" : walletAddress,
"amountOut" : 1000,
"amountInMaximum" : 1,
}
// encode SwapRouter02 exactOutput
var rawData = exchange.IO("encode", routerAddress, "exactOutput", dataTuple)
Log("method hash:", rawData.slice(0, 8)) // 09b81346
Log("params hash:", rawData.slice(8))
// decode exactOutput params
var decodeRaw = exchange.IO("decode", "tuple(path bytes,recipient address,amountOut uint256,amountInMaximum uint256)", rawData.slice(8))
Log("decodeRaw:", decodeRaw)
}
この例では,encodePacked
初期操作はpath
パラメータ処理exactOutput
後で暗号化する必要がある方法呼び出しpath
パラメータとして
そして,encode
方法exactOutput
ルーティング契約には"つのパラメータのみがあり,パラメータタイプはtuple
- わかった
方法exactOutput
名称は0x09b81346
解読された結果です.decodeRaw
によるexchange.IO ("decode",...)
変数と一致しています.dataTuple
.
複数のウォレットアドレスを操作するためにプライベートキーを切り替えるのをサポートします.例えば:
function main() {
exchange.IO("key", "Private Key") // "Private Key" represents the private key string, which needs to be filled in specifically
}
次のコンテンツは,いくつかのスマートコントラクト方法の呼び出しの例です.
十進数
についてdecimals
方法としてconstant
方法ERC20
発生しないgas
精度データに問い合わせることができます.token
- わかった
についてdecimals
返信値: 精度データtoken
.
function main(){
var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" // The contract address of the token, in the example the token is 1INCH
Log(exchange.IO("api", tokenAddress, "decimals")) // Query, print 1INCH tokens with precision index of 18
}
給付金
についてallowance
方法としてconstant
方法ERC20
発生しないgas
消費量について質問することができます.token
特定の契約住所についてです
についてallowance
返回値: 許可金額の 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値: 返却値:token
.
function main(){
// The contract address of the token, in the example the token is 1INCH
var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"
var owner = ""
var spender = ""
// For example, the query yields 1000000000000000000, divided by the precision unit of the token 1e18, the current exchange object bound to the wallet to the spender address authorized 1 1INCH.
Log(exchange.IO("api", tokenAddress, "allowance", owner, spender))
}
owner
: ウォレットアドレスは例の文字列spender
: 許可された契約アドレスは,例の文字列"spender"に置き換えられます.実際の使用では,アドレスを具体的に記入する必要があります.例えば,アドレスは,Uniswap V3 router v1
.
承認する
についてapprove
この方法はconstant
方法ERC20
生産するgas
消費を許可するために使用されます.token
取引額が特定の契約アドレスに
についてapprove
方法が2つのパラメータを通過する必要があります.最初のものは許可されるアドレスであり,第二は許可された金額です.txid
.
function main(){
// The contract address of the token, in the example the token is 1INCH
var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"
var spender = ""
var amount = "0xde0b6b3a7640000"
// The hexadecimal string of the authorization amount: 0xde0b6b3a7640000 , the corresponding decimal string: 1e18 , 1e18 divided by the precision unit of the token, i.e. 1 token amount, so this refers to the authorization of one token.
Log(exchange.IO("api", tokenAddress, "approve", spender, amount))
}
spender
: 許可された契約の住所,例は文字列で置き換えられます Uniswap V3 router v1
address.
amount
: 十六進数文字列で表される許可数は,1e18
, で割ったtoken
例の精度単位 (すなわち 1e18) で,1 を得ます.token
authorized.
基準の3番目のパラメータはexchange.IO
方法の名前が渡されるapprove
形式でも書ける.methodId
標準メソッドの名前も書ける.例えば"approve ((address,uint256) "など.
複数通話
についてmulticall
定数でない方法である.Uniswap V3
発生するgas
複数の方法でトークンを交換するために使用されます.
についてmulticall
方法にはパラメータを転送する複数の方法がある可能性があります.詳細については,方法を含む ABI に問い合わせることができます.メソッドを呼び出す前に ABI を登録する必要があります.返回値:txid
.
具体例についてはmulticall
方法の呼び出しは,一般の参照してください
function main() {
var ABI_Route = ""
var contractV3SwapRouterV2 = ""
var value = 0
var deadline = (new Date().getTime() / 1000) + 3600
var data = ""
exchange.IO("abi", contractV3SwapRouterV2, ABI_Route)
exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data)
}
ABI_Route
: Uniswap V3contractV3SwapRouterV2
Uniswap V3のルーターv2アドレスで,実際の使用には特定のアドレスが記入される必要があります...value
ETHの金額を 0 に設定します.tokenIn
取引のトークンはETHではありません 実際の状況に応じて記入する必要がありますdeadline
: 設定できます(new Date().getTime() / 1000) + 3600
1時間有効ですdata
: 実行される梱包操作のデータ,実際の状況に応じて記入する必要があります.
指定することも可能です.gasLimit/gasPrice/nonce
メソッド呼び出しの設定:
exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 5000000000, gasLimit: 21000})
パラメータを設定できます{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}
パラメータは,あなたの特定のニーズに応じて,最後のパラメータに設定されますexchange.IO
機能
省略してもいいnonce
設定しないgasLimit/gasPrice/nonce
システムデフォルトの値をすべて使います
この例では,stateMutability
中multicall(uint256,bytes[])
方法としてpayable
そして,value
パラメータを入力する必要があります.
その属性stateMutability":"payable"
視界から見ることができますABI
.....exchange.IO
要求されるパラメータを決定します.stateMutability
の属性ABI
登録されたものです
もしstateMutability
属性はnonpayable
,パラメータvalue
送信する必要はありません.
function main() {
Log(exchange.IO("address")) // Print the wallet address of the private key configured on the exchange object
}
function main() {
var chainRpc = "https://bsc-dataseed.binance.org"
// Switch to BSC chain
e.IO("base", chainRpc)
}