Tài nguyên đang được tải lên... tải...

Ethereum

Trên nền tảng giao dịch FMZ Quant, viết mã chiến lược để thực hiện phương thức gọi hợp đồng thông minh trên chuỗi Ethereum thông quaexchange.IOđầu tiên, cấu hình nút truy cập trên nền tảng giao dịch FMZ Quant. Các nút truy cập có thể là các nút tự xây dựng hoặc sử dụng các dịch vụ của bên thứ ba, chẳng hạn nhưinfura.

Cấu hình đối tượng Exchange Web3

cấu hình nút truy cập trên nền tảng giao dịch FMZ Quant. Các nút truy cập có thể là các nút tự xây dựng hoặc sử dụng các dịch vụ của bên thứ ba, chẳng hạn nhưinfura. Trên trang của Chuyển đổiFMZ Quant Trading Platform, chọn giao thức:Tiền điện tử, và sau đó chọn trao đổiWeb3. Thiết lậpRpc Address(địa chỉ dịch vụ của nút truy cập) vàPrivate KeyNó hỗ trợ triển khai địa phương các khóa riêng, xemChăm sóc an toàn.

Đăng ký ABI

Gọi một hợp đồng là một tiêu chuẩnERC20Các phương thức gọi khác ngoài hợp đồng tiêu chuẩn đòi hỏi phải đăng ký nội dung ABI:exchange.IO("abi", tokenAddress, abiContent). Để có được nội dung ABI của một hợp đồng, bạn có thể sử dụng URL sau đây để có được nó, lấyresultchỉ có trong lĩnh vực.

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

Phương pháp gọi Ethereum RPC

Sử dụngexchange.IO()chức năng để gọi phương thức Ethereum RPC.

  • Tìm kiếm số dư ETH trong ví
    exchange.IO("api", "eth", "eth_getBalance", owner, "latest")   // owner is the specific wallet address
    
  • Chuyển ETH
    exchange.IO("api", "eth", "send", toAddress, toAmount)   // toAddress is the address of the wallet receiving ETH when transferring, toAmount is the quantity
    
  • Query gasPrice
    exchange.IO("api", "eth", "eth_gasPrice")
    
  • truy vấn eth_estimateGas
    exchange.IO("api", "eth", "eth_estimateGas", data)
    

Mã hỗ trợ

Chức năngexchange.IObao gồm cácencodephương pháp, mà có thể trả lại các chức năng gọi mã hóa đểhexđịnh dạng chuỗi. Bạn có thể tham khảo các nền tảng có sẵn cho công chúngUniswap V3 Trading Class Library mẫucho mục đích sử dụng cụ thể. Việc gọi mã hóaunwrapWETH9phương pháp được sử dụng ở đây như một ví dụ:

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

Khi gọi choexchange.IO("encode",...)hàm, nếu tham số thứ hai (loại chuỗi) bắt đầu với0x, nghĩa là gọi phương thức trên mã hóa (encode) hợp đồng thông minh. Nếu nó không bắt đầu với0x, nó được sử dụng để mã hóa thứ tự loại được chỉ định.abi.encodetrongsolidityHãy tham khảo ví dụ sau đây.

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

Hỗ trợ mã hóa trình tự của các tuples hoặc các loại chứa 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)
}

Lệnh kiểu này bao gồm:tuplebytes, vì vậy hai tham số cần được truyền vào khi gọiexchange.IOđếnencode:

  • Các biến tương ứng với loại tuple:
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    
    Các thông số được truyền phải phù hợp với cấu trúc và loạituple, như được định nghĩa trongtypestham số:tuple(a uint256, b uint8, c address).
  • Các biến tương ứng với kiểu byte:
    "0011"
    

Hỗ trợ mã hóa thứ tự của mảng hoặc các loại chứa mảng:

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

Hỗ trợ cho encodePacked

Ví dụ, khi gọi phương pháp DEX củaUniswap V3, bạn cần phải truyền vào các tham số, chẳng hạn như con đường trao đổi, vì vậy bạn cần phải sử dụngencodePackagedhoạt động:

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

Hỗ trợ giải mã

Xử lý dữ liệu không chỉ hỗ trợ mã hóa (encode), nhưng cũng giải mã (decode) Sử dụngexchange.IO("decode", types, rawData)chức năng để thực hiệndecode 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)
}

Ví dụ thực hiệnencodePackedhoạt động đầu tiênpathxử lý tham số, bởi vìexactOutputgọi phương thức mà cần được mã hóa sau đó cầnpathnhư một tham số. Sau đó,encodephương phápexactOutputhợp đồng định tuyến chỉ có một tham số, và loại tham số làtuple. Phương phápexactOutputtên được mã hóa là0x09b81346, được giải mã kết quảdecodeRawbởiexchange.IO ("decode",...)phương pháp, và nó phù hợp với biếndataTuple.

Hỗ trợ chuyển đổi khóa riêng

Nó hỗ trợ chuyển đổi khóa riêng để vận hành nhiều địa chỉ ví, ví dụ:

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

Phương pháp gọi hợp đồng thông minh

Nội dung sau đây là một ví dụ về một số cuộc gọi phương thức hợp đồng thông minh.

  • số thập phân Cácdecimalsphương pháp là mộtconstantphương phápERC20mà không tạo ragastiêu thụ, và nó có thể truy vấn dữ liệu chính xác của mộttoken. CácdecimalsPhản hồi giá trị: dữ liệu chính xác củatoken.

    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
    }
    
  • trợ cấp Cácallowancephương pháp là mộtconstantphương phápERC20mà không tạo ragastiêu thụ, và nó có thể truy vấn số lượng được phép của một sốtokencho một địa chỉ hợp đồng nhất định. CácallowancePhương pháp cần phải đi qua trong 2 tham số, một là địa chỉ ví, và một thứ hai là địa chỉ được ủy quyền.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: Địa chỉ ví được thay thế bằng chuỗi owner trong ví dụ.spender: Địa chỉ hợp đồng được ủy quyền được thay thế bằng chuỗi spender trong ví dụ.Uniswap V3 router v1.

  • chấp thuận CácapprovePhương pháp này không phải là...constantphương phápERC20tạo ragastiêu thụ, được sử dụng để cho phép mộttokensố tiền giao dịch đến một địa chỉ hợp đồng nhất định. Cácapprovephương pháp cần phải vượt qua trong 2 tham số, một là địa chỉ được ủy quyền và thứ hai là số tiền được ủy quyền.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: Địa chỉ của hợp đồng được ủy quyền, ví dụ được thay thế bằng chuỗi spender, việc sử dụng thực tế cần phải điền vào địa chỉ cụ thể, ví dụ, nó có thể đượcUniswap V3 router v1 address. amount: Số lượng ủy quyền, được thể hiện ở đây bằng một chuỗi hexadecimal, tương ứng với một giá trị thập phân của1e18, chia chotokenđơn vị chính xác trong ví dụ (tức là 1e18), tạo ra 1token authorized.

    Các tham số thứ ba củaexchange.IOhàm được truyền tên phương thứcapprove, cũng có thể được viết dưới dạngmethodId, ví dụ: 0x571ac8b0. Nó cũng có thể viết tên phương thức tiêu chuẩn đầy đủ, chẳng hạn như approve(address,uint256) .

  • nhiều cuộc gọi Cácmulticallphương pháp là một phương pháp không liên tục củaUniswap V3, sẽ tạo ragastiêu thụ và được sử dụng để trao đổi token theo nhiều cách. Cácmulticallmethod có thể có nhiều phương thức truyền tham số. Bạn có thể truy vấn ABI chứa phương thức để biết chi tiết. Bạn cần đăng ký ABI trước khi gọi phương thức. Trả về giá trị:txid.

    Đối với các ví dụ cụ thể vềmulticallphương pháp gọi, xin vui lòng tham khảo công chúngUniswap V3 Trading Class Library mẫucủa nền tảng của chúng tôi.

    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 của Uniswap V3s router v2 hợp đồng, nó cần phải được điền vào theo tình hình thực tế.contractV3SwapRouterV2: địa chỉ router v2 của Uniswap V3, việc sử dụng thực tế đòi hỏi một địa chỉ cụ thể phải được điền vào...value: Số tiền ETH được chuyển giao, đặt nó thành 0 nếutokenIntoken cho giao dịch trao đổi không phải là ETH, nó cần phải được điền vào theo tình hình thực tế.deadline: Nó có thể được thiết lập thành(new Date().getTime() / 1000) + 3600, có nghĩa là nó có hiệu lực trong một giờ.data: Dữ liệu về hoạt động đóng gói cần thực hiện, nó cần phải được điền theo tình hình thực tế.

    Nó cũng có thể xác địnhgasLimit/gasPrice/noncethiết lập cho các cuộc gọi phương thức:

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

    Bạn có thể đặt tham số{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}theo nhu cầu cụ thể của bạn, các tham số được thiết lập cho các tham số cuối cùng củaexchange.IOchức năng. Bạn có thể bỏ quanoncevà sử dụng hệ thống mặc định, hoặc không đặtgasLimit/gasPrice/noncevà sử dụng tất cả các giá trị mặc định của hệ thống.

    Cần lưu ý rằng trong ví dụ, thuộc tính củastateMutabilitytrongmulticall(uint256,bytes[])phương pháp làpayable, vàvalueParameter cần được truyền vào. Thuộc tính củastateMutability":"payable"có thể được xem từABI.exchange.IOchức năng sẽ xác định các thông số cần thiết theostateMutabilitythuộc tính trongABIđã được đăng ký. NếustateMutabilitythuộc tính lànonpayable, tham sốvaluekhông cần phải được chuyển vào.

Các cuộc gọi chức năng khác

  • Nhận địa chỉ của ví được cấu hình bởi đối tượng trao đổi
    function main() {
        Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object
    }
    
  • Chuyển các nút RPC blockchain
    function main() {
        var chainRpc = "https://bsc-dataseed.binance.org"
        
        // Switch to BSC chain
        e.IO("base", chainRpc)
    }
    
Các hướng dẫn viết chiến lược JavaScript Thư viện tích hợp