Sumber dimuat naik... memuat...

Ethereum

Pada Platform Perdagangan Kuantum FMZ, tulis kod strategi untuk melaksanakan panggilan kaedah kontrak pintar pada rantaian Ethereum melaluiexchange.IOfungsi. Pertama, sesuaikan nod akses di Platform Dagangan Kuantum FMZ. Nod akses boleh menjadi nod yang dibina sendiri atau menggunakan perkhidmatan pihak ketiga, sepertiinfura.

Konfigurasi Objek Pertukaran Web3

mengkonfigurasi nod akses di Platform Dagangan Kuantum FMZ. Nod akses boleh menjadi nod yang dibina sendiri atau menggunakan perkhidmatan pihak ketiga, sepertiinfura. Pada halaman Pertukaran FMZ Quant Trading Platform, pilih protokol:Cryptocurrency, dan kemudian memilih pertukaranWeb3. MengaturRpc Address(alamat perkhidmatan nod akses) danPrivate Key(kunci peribadi). Ia menyokong penyebaran tempatan kunci peribadi, lihatKeselamatan Utama.

Daftar ABI

Memanggil kontrak yang merupakan standardERC20kaedah tidak memerlukan pendaftaran dan ia boleh dipanggil secara langsung. Memanggil kaedah selain kontrak standard memerlukan pendaftaran kandungan ABI:exchange.IO("abi", tokenAddress, abiContent). Untuk mendapatkan kandungan ABI kontrak, anda boleh menggunakan URL berikut untuk mendapatkannya, mengambilresultHanya lapangan.

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

Kaedah Panggilan Ethereum RPC

Gunakanexchange.IO()fungsi untuk memanggil kaedah Ethereum RPC.

  • Bertanya baki ETH dalam dompet
    exchange.IO("api", "eth", "eth_getBalance", owner, "latest")   // owner is the specific wallet address
    
  • Pemindahan ETH
    exchange.IO("api", "eth", "send", toAddress, toAmount)   // toAddress is the address of the wallet receiving ETH when transferring, toAmount is the quantity
    
  • Permintaan gasPrice
    exchange.IO("api", "eth", "eth_gasPrice")
    
  • Soalan eth_estimateGas
    exchange.IO("api", "eth", "eth_estimateGas", data)
    

Kod sokongan

Fungsiexchange.IOmerangkumiencodekaedah, yang boleh mengembalikan fungsi panggilan pengekodan untukhexformat rentetan. Anda boleh merujuk kepada platform yang tersedia untuk umumUniswap V3 Perpustakaan Kelas Perdagangan templatuntuk kegunaan khusus. Panggilan penyulitanunwrapWETH9kaedah digunakan di sini sebagai contoh:

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)
}

Apabila memanggilexchange.IO("encode",...)fungsi, jika parameter kedua (jenis rentetan) bermula dengan0x, ia bermaksud panggilan kaedah pada kod (encode) kontrak pintar. Jika ia tidak bermula dengan0x, ia digunakan untuk mengkod perintah jenis yang ditentukan.abi.encodedalamsolidity. merujuk kepada contoh berikut.

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
    */
}

Sokong pengekodan berurutan tuples atau jenis yang mengandungi tuples:

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)
}

Perintah jenis ini terdiri daripada:tupledanbytes, jadi dua parameter perlu dihantar dalam apabila memanggilexchange.IOkepadaencode:

  • Peralihan yang sepadan dengan jenis tuple:
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    
    Parameter yang dihantar juga harus konsisten dengan struktur dan jenistuple, seperti yang ditakrifkan dalamtypesParameter:tuple(a uint256, b uint8, c address).
  • Peralihan yang sepadan dengan byte jenis:
    "0011"
    

Sokongan untuk pengekodan berurutan array atau jenis yang mengandungi array:

function main() {
    var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"]   // ETH address, USDT address
    var ret = exchange.IO("encode", "address[]", path)
    Log("encode: ", ret)
}

Sokongan untuk encodePacked

Sebagai contoh, apabila memanggil kaedah DEXUniswap V3, anda perlu lulus dalam parameter, seperti laluan pertukaran, jadi anda perlu menggunakanencodePackagedoperasi:

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)
}

Sokongan untuk mendekod

Pemprosesan data bukan sahaja menyokong pengekodan (encode), tetapi juga mendekod (decode) Gunakanexchange.IO("decode", types, rawData)fungsi untuk melaksanakandecode 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)
}

Contoh ini melakukanencodePackedoperasi pertama semasapathpemprosesan parameter, keranaexactOutputpanggilan kaedah yang perlu dikodkan kemudian memerlukanpathsebagai parameter. Kemudian,encodekaedahexactOutputkontrak laluan hanya mempunyai satu parameter, dan jenis parameter adalahtuple. KaedahexactOutputnama dikodkan sebagai0x09b81346, yang telah didekodkan hasildecodeRawolehexchange.IO ("decode",...)kaedah, dan ia adalah konsisten dengan pembolehubahdataTuple.

Sokongan untuk menukar kunci peribadi

Ia menyokong menukar kunci peribadi untuk mengendalikan pelbagai alamat dompet, contohnya:

function main() {
    exchange.IO("key", "Private Key")   // "Private Key" represents the private key string, which needs to be filled in specifically
}

Kaedah Panggilan Kontrak Pintar

Kandungan berikut adalah contoh beberapa panggilan kaedah kontrak pintar.

  • angka perpuluhan Peraturandecimalskaedah adalahconstantkaedahERC20yang tidak menghasilkangaspenggunaan, dan ia boleh menyoal data ketepatantoken. PeraturandecimalsNilai pulangan: data ketepatantoken.

    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
    }
    
  • Ganjaran Peraturanallowancekaedah adalahconstantkaedahERC20yang tidak menghasilkangasPenggunaan, dan ia boleh menyoal jumlah yang dibenarkantokenuntuk alamat kontrak tertentu. Peraturanallowancekaedah perlu lulus dalam 2 parameter, yang pertama adalah alamat dompet, dan yang kedua adalah alamat yang dibenarkan.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: Alamat dompet digantikan dengan rentetan owner dalam contoh. Dalam penggunaan sebenar, anda perlu mengisi alamat.spender: Alamat kontrak yang dibenarkan digantikan oleh rentetan spender dalam contoh. dalam penggunaan sebenar, anda perlu mengisi alamat secara khusus, contohnya alamat bolehUniswap V3 router v1.

  • meluluskan Peraturanapprovekaedah adalah bukan-constantkaedahERC20yang menghasilkangaspenggunaan, yang digunakan untuk membenarkantokenjumlah operasi kepada alamat kontrak tertentu. Peraturanapprovekaedah perlu lulus dalam 2 parameter, yang pertama adalah alamat yang akan diberi kuasa dan yang kedua adalah jumlah yang dibenarkan.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: Alamat kontrak yang dibenarkan, contohnya digantikan oleh rentetan spender, penggunaan sebenar perlu mengisi alamat tertentu, contohnya, ia bolehUniswap V3 router v1 address. amount: Bilangan kebenaran, diwakili di sini menggunakan rentetan hexadecimal, sepadan dengan nilai desimal1e18, dibahagikan dengantokenunit ketepatan dalam contoh (iaitu, 1e18), menghasilkan 1token authorized.

    Parameter ketigaexchange.IOfungsi dilewatkan nama kaedahapprove, yang juga boleh ditulis dalam bentukmethodId, contohnya: 0x571ac8b0. Ia juga mungkin untuk menulis nama kaedah standard penuh, seperti approve(address,uint256) .

  • pelbagai panggilan Peraturanmulticallkaedah adalah kaedah yang tidak tetapUniswap V3, yang akan menghasilkangaspenggunaan dan digunakan untuk menukar token dalam pelbagai cara. Peraturanmulticallmethod mungkin mempunyai pelbagai kaedah untuk menyampaikan parameter. anda boleh menanyakan ABI yang mengandungi kaedah untuk butiran. anda perlu mendaftarkan ABI sebelum memanggil kaedah. nilai pulangan:txid.

    Untuk contoh khususmulticallpanggilan kaedah, sila rujuk kepada orang ramaiUniswap V3 Perpustakaan Kelas Perdagangan templatdari platform kami.

    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: ABI kontrak router v2 Uniswap V3, ia perlu diisi mengikut keadaan sebenar.contractV3SwapRouterV2: alamat penghala v2 dari Uniswap V3, penggunaan sebenar memerlukan alamat tertentu untuk diisi...value: Jumlah ETH yang dipindahkan, tetapkannya kepada 0 jikatokenInToken untuk operasi pertukaran bukan ETH, ia perlu diisi mengikut keadaan sebenar.deadline: Ia boleh ditetapkan untuk(new Date().getTime() / 1000) + 3600, yang bermaksud ia sah selama satu jam.data: Data operasi pembungkusan yang perlu dilakukan, ia perlu diisi mengikut keadaan sebenar.

    Ia juga mungkin untuk menentukangasLimit/gasPrice/noncetetapan untuk panggilan kaedah:

    exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 5000000000, gasLimit: 21000})
    

    Anda boleh menetapkan parameter{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}mengikut keperluan khusus anda, parameter ditetapkan kepada parameter terakhirexchange.IOfungsi. Anda boleh terlepasnoncedan menggunakan sistem lalai, atau tidak menetapkangasLimit/gasPrice/noncedan gunakan semua nilai lalai sistem.

    Perlu diperhatikan bahawa dalam contoh, atributstateMutabilitydalammulticall(uint256,bytes[])kaedah adalahpayable, danvalueParameter perlu dihantar. AtributstateMutability":"payable"boleh dilihat dariABI.exchange.IOfungsi akan menentukan parameter yang diperlukan mengikutstateMutabilityatribut dalamABIyang telah didaftarkan. JikastateMutabilityatribut adalahnonpayable, parametervaluetidak perlu diserahkan.

Panggilan Fungsi Lain

  • Dapatkan alamat dompet yang dikonfigurasikan oleh objek pertukaran
    function main() {
        Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object
    }
    
  • Tukar nod RPC blockchain
    function main() {
        var chainRpc = "https://bsc-dataseed.binance.org"
        
        // Switch to BSC chain
        e.IO("base", chainRpc)
    }
    
Arahan Penulisan Strategi JavaScript Perpustakaan terbina dalam