資源の読み込みに... 荷物...

ウェブ3

FMZ 量子取引プラットフォームはWeb3関連機能があり,簡単に暗号通貨市場にアクセスできますdefi exchanges.

エサリアム

戦略コードを書いて,Ethereumチェーン上でスマートコントラクトのメソッドコールを実装します.exchange.IOFMZ Quant トレーディング プラットフォームのアクセスノードを設定します. アクセスノードは自己構築のノードまたは第三者のサービスを使用することができます.infura.

Web3 エクスチェンジ オブジェクトの構成

FMZ 量子取引プラットフォームのアクセスノードを構成する. アクセスノードは自己構築のノードまたは第三者のサービスを使用することができます.infura- わかった このページでは交換FMZ量子取引プラットフォーム プロトコルを選択します仮想通貨そして,交換を選択します.Web3- わかった 設定するRpc Address(アクセスノードのサービスアドレス)Private Key(プライベートキー) プライベートキーの局所的な展開をサポートします.鍵 の 安全.

ABI を登録する

標準的な契約を呼び出すERC20標準契約以外の方法を呼び出すには,ABI コンテンツを登録する必要があります:exchange.IO("abi", tokenAddress, abiContent)- わかった 契約のABIコンテンツを取得するには,次のURLを使用して取得することができます.resultフィールドのみです

https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

Ethereum RPC を呼び出す方法

試しにexchange.IO()この関数は,Ethereum RPC メソッドを呼び出すための関数です

  • 財布内のETHの残高をクエリする
    exchange.IO("api", "eth", "eth_getBalance", owner, "latest")   // owner is the specific wallet address
    
  • ETH 送金
    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")
    
  • 問い合わせ eth_estimateガス
    exchange.IO("api", "eth", "eth_estimateGas", data)
    

サポートコード

機能についてexchange.IO概要をまとめていますencode函数呼び出しのエンコーディングをhex文字列形式 公開されているプラットフォームを参照してください.Uniswap V3 トレーディングクラスライブラリ テンプレート特定の用途のために 暗号化の呼び出し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.IOencode:

  • タイプタプルに対応する変数:
    {
        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)
}

EncodePacked のサポート

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: ウォレットアドレスは例の文字列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: 許可された契約の住所,例は文字列で置き換えられます 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方法の呼び出しは,一般の参照してくださいUniswap V3 トレーディングクラスライブラリ テンプレート私たちのプラットフォームの

    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 V3のルーター v2契約の ABIは,実際の状況に応じて記入する必要があります.contractV3SwapRouterV2Uniswap V3のルーターv2アドレスで,実際の使用には特定のアドレスが記入される必要があります...valueETHの金額を 0 に設定します.tokenIn取引のトークンはETHではありません 実際の状況に応じて記入する必要がありますdeadline: 設定できます(new Date().getTime() / 1000) + 36001時間有効です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システムデフォルトの値をすべて使います

    この例では,stateMutabilitymulticall(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
    }
    
  • ブロックチェーン RPC ノードを切り替える
    function main() {
        var chainRpc = "https://bsc-dataseed.binance.org"
        
        // Switch to BSC chain
        e.IO("base", chainRpc)
    }
    
JavaScript 戦略 書き込み 指示 内蔵ライブラリ