Sumber daya yang dimuat... Pemuatan...

Ethereum

Pada Platform Perdagangan Kuantum FMZ, tulis kode strategi untuk menerapkan panggilan metode kontrak pintar pada rantai Ethereum melaluiexchange.IOfungsi. Pertama, konfigurasi node akses di FMZ Quant Trading Platform. Node akses dapat menjadi node yang dibangun sendiri atau menggunakan layanan pihak ketiga, sepertiinfura.

Konfigurasi Obyek Exchange Web3

mengkonfigurasi node akses di Platform Perdagangan Quant FMZ. Node akses dapat menjadi node yang dibangun sendiri atau menggunakan layanan pihak ketiga, sepertiinfuraAku tidak tahu. Di halaman Bertukar FMZ Quant Trading Platform, pilih protokol:Cryptocurrency, dan kemudian memilih pertukaranWeb3Aku tidak tahu. MengkonfigurasiRpc Address(alamat layanan node akses) danPrivate Key(kunci pribadi). Ini mendukung penyebaran lokal kunci pribadi, lihatKunci Keamanan.

Daftarkan ABI

Menelpon kontrak yang merupakan standarERC20metode tidak memerlukan pendaftaran dan dapat dipanggil secara langsung. Meminta metode selain kontrak standar membutuhkan pendaftaran konten ABI:exchange.IO("abi", tokenAddress, abiContent)Aku tidak tahu. Untuk mendapatkan konten ABI dari kontrak, Anda dapat menggunakan URL berikut untuk mendapatkannya, mengambilresulthanya lapangan.

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

Metode Panggilan Ethereum RPC

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

  • Menanyakan saldo ETH di dompet
    exchange.IO("api", "eth", "eth_getBalance", owner, "latest")   // owner is the specific wallet address
    
  • Transfer ETH
    exchange.IO("api", "eth", "send", toAddress, toAmount)   // toAddress is the address of the wallet receiving ETH when transferring, toAmount is the quantity
    
  • Pertanyaan gasPrice
    exchange.IO("api", "eth", "eth_gasPrice")
    
  • Pertanyaan eth_estimateGas
    exchange.IO("api", "eth", "eth_estimateGas", data)
    

Kode Dukungan

Fungsiexchange.IOmengkapsulkanencodemetode, yang dapat mengembalikan fungsi panggilan pengkodean untukhexformat string. Anda dapat merujuk ke platform yang tersedia untuk umumUniswap V3 Trading Class Library templateuntuk penggunaan khusus. Panggilan dari pengkodeanunwrapWETH9metode 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)
}

Saat meneleponexchange.IO("encode",...)fungsi, jika parameter kedua (tipe string) dimulai dengan0x, berarti panggilan metode pada kode (encode) kontrak pintar. Jika tidak dimulai dengan0x, digunakan untuk mengkode urutan jenis yang ditentukan.abi.encodedalamsolidity. merujuk pada 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
    */
}

Mendukung pengkodean berurutan dari tuples atau tipe yang mengandung 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)
}

Urutan jenis ini terdiri dari:tupledanbytes, jadi dua parameter harus diteruskan saat memanggilexchange.IOuntukencode:

  • Variabel yang sesuai dengan tipe tuple:
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    
    Parameter yang diberikan juga harus konsisten dengan struktur dan jenistuple, sebagaimana didefinisikan dalamtypesParameter:tuple(a uint256, b uint8, c address).
  • Variabel yang sesuai dengan jenis byte:
    "0011"
    

Dukungan untuk pengkodean berurutan array atau tipe yang berisi array:

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

Dukungan untuk encodePacked

Misalnya, ketika memanggil metode DEX dariUniswap V3, Anda perlu untuk lulus dalam parameter, seperti jalur pertukaran, sehingga 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)
}

Dukungan untuk dekode

Pengolahan data tidak hanya mendukung pengkodean (encode), tetapi juga mendekode (decode) Menggunakanexchange.IO("decode", types, rawData)fungsi untuk melakukandecode 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 selamapathproses parameter, karenaexactOutputpanggilan metode yang perlu dikodekan kemudian membutuhkanpathsebagai parameter. Kemudian,encodemetode dariexactOutputkontrak routing hanya memiliki satu parameter, dan jenis parameter adalahtupleAku tidak tahu. MetodeexactOutputnama dikodekan sebagai0x09b81346, yang didekode hasildecodeRawolehexchange.IO ("decode",...)metode, dan konsisten dengan variabeldataTuple.

Dukungan untuk Mengganti Kunci Pribadi

Ini mendukung beralih kunci pribadi untuk mengoperasikan beberapa alamat dompet, misalnya:

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

Metode Panggilan Kontrak Cerdas

Konten berikut adalah contoh beberapa panggilan metode kontrak pintar.

  • angka desimal Peraturandecimalsmetode adalahconstantmetodeERC20yang tidak menghasilkangaskonsumsi, dan dapat menanyakan data presisi daritokenAku tidak tahu. PeraturandecimalsNilai pengembalian: data presisitoken.

    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
    }
    
  • tunjangan Peraturanallowancemetode adalahconstantmetodeERC20yang tidak menghasilkangasKonsumsi, dan dapat menanyakan jumlah yang diizinkan daritokenuntuk alamat kontrak tertentu. Peraturanallowancemetode perlu lulus dalam 2 parameter, yang pertama adalah alamat dompet, dan yang kedua adalah alamat otorisasi.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 diganti dengan string owner dalam contoh.spender: Alamat kontrak yang sah diganti dengan string spender dalam contoh. dalam penggunaan yang sebenarnya, Anda perlu mengisi alamat secara khusus, misalnya alamat dapatUniswap V3 router v1.

  • menyetujui Peraturanapprovemetode ini adalah non-constantmetodeERC20yang menghasilkangaskonsumsi, yang digunakan untuk mengizinkantokenjumlah operasi ke alamat kontrak tertentu. Peraturanapprovemetode harus lulus dalam 2 parameter, yang pertama adalah alamat yang akan diizinkan dan yang kedua adalah jumlah yang diizinkan.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 sah, contohnya digantikan oleh string spender, penggunaan sebenarnya perlu mengisi alamat tertentu, misalnya dapatUniswap V3 router v1 address. amount: Jumlah otorisasi, yang diwakili di sini dengan menggunakan string hexadecimal, sesuai dengan nilai desimal1e18, dibagi dengantokensatuan presisi dalam contoh (yaitu, 1e18), menghasilkan 1token authorized.

    Parameter ketiga dariexchange.IOfungsi dilewatkan nama metodeapprove, yang juga dapat ditulis dalam bentukmethodId, misalnya: 0x571ac8b0. Hal ini juga mungkin untuk menulis nama metode standar penuh, seperti approve(address,uint256) .

  • multi-panggilan Peraturanmulticallmetode adalah metode nonkonstan dariUniswap V3, yang akan menghasilkangaskonsumsi dan digunakan untuk bertukar token dalam berbagai cara. Peraturanmulticallmetode dapat memiliki beberapa metode untuk menyampaikan parameter. Anda dapat menanyakan ABI yang berisi metode untuk rincian. Anda perlu mendaftarkan ABI sebelum memanggil metode.txid.

    Untuk contoh spesifik darimulticallmetode panggilan, silakan merujuk pada publikUniswap V3 Trading Class Library templatedari 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 dari kontrak router v2 Uniswap V3, harus diisi sesuai dengan situasi aktual.contractV3SwapRouterV2: alamat router v2 dari Uniswap V3, penggunaan sebenarnya membutuhkan alamat tertentu untuk diisi...value: Jumlah ETH yang ditransfer, atur ke 0 jikatokenIntoken untuk operasi pertukaran bukan ETH, itu perlu diisi sesuai dengan situasi yang sebenarnya.deadline: Bisa diatur ke(new Date().getTime() / 1000) + 3600, yang berarti itu berlaku selama satu jam.data: Data dari operasi pengemasan yang akan dilakukan, perlu diisi sesuai dengan situasi yang sebenarnya.

    Hal ini juga mungkin untuk menentukangasLimit/gasPrice/noncepengaturan untuk panggilan metode:

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

    Anda dapat mengatur parameter{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}sesuai dengan kebutuhan spesifik Anda, parameter diatur ke parameter terakhir dariexchange.IOfungsi. Anda bisa melewatkannoncedan menggunakan sistem default, atau tidak mengaturgasLimit/gasPrice/noncedan gunakan semua nilai default sistem.

    Perlu dicatat bahwa dalam contoh, atribut daristateMutabilitydalammulticall(uint256,bytes[])metode adalahpayable, danvalueParameter harus diteruskan. Atribut daristateMutability":"payable"dapat dilihat dariABI.exchange.IOfungsi akan menentukan parameter yang diperlukan sesuai denganstateMutabilityatribut dalamABIyang telah terdaftar. JikastateMutabilityatribut adalahnonpayable, parametervaluetidak perlu diserahkan.

Panggilan fungsi lainnya

  • Dapatkan alamat dompet yang dikonfigurasi oleh objek pertukaran
    function main() {
        Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object
    }
    
  • Ubah node RPC blockchain
    function main() {
        var chainRpc = "https://bsc-dataseed.binance.org"
        
        // Switch to BSC chain
        e.IO("base", chainRpc)
    }
    
JavaScript Strategi Menulis Instruksi Perpustakaan Bawah Tanah