Die Ressourcen sind geladen. Beförderung...

Ethereum

Auf der FMZ Quant Trading Platform schreiben Sie Strategiecode, um den Methodenanruf des Smart Contracts auf der Ethereum-Kette durch dieexchange.IOFunktion. Zuerst konfigurieren Sie den Zugangsknoten auf der FMZ Quant Trading Platform. Die Zugangsknoten können selbst erstellte Knoten sein oder Dienste von Drittanbietern verwenden, wieinfura.

Web3-Austauschobjektkonfiguration

Die Zugangsknoten können selbst erstellte Knoten sein oder Dienste von Drittanbietern verwenden, wie z. B.infura- Ich weiß. Auf der Seite vonAustauschFMZ Quant Trading Platform, wählen Sie das Protokoll aus:Kryptowährung, und wählt dann den AustauschWeb3- Ich weiß. KonfigurierenRpc Address(Dienstadresse des Zugangsknotenpunkts) undPrivate KeyEs unterstützt die lokalisierte Bereitstellung privater Schlüssel, sieheSchlüssel zur Sicherheit.

Registrieren Sie ABI

Ein Vertrag, der ein Standard istERC20Für die Anrufung anderer Methoden als des Standardvertrags ist die Registrierung des ABI-Inhalts erforderlich:exchange.IO("abi", tokenAddress, abiContent)- Ich weiß. Um den ABI-Inhalt eines Vertrages zu erhalten, können Sie die folgende URL verwenden, um ihn zu erhalten, wobei dieresultNur auf dem Feld.

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

Methode zum Aufrufen von Ethereum RPC

Verwendenexchange.IO()Funktion zum Aufrufen der Ethereum RPC-Methode.

  • Abfrage des ETH-Guthabenes in der Brieftasche
    exchange.IO("api", "eth", "eth_getBalance", owner, "latest")   // owner is the specific wallet address
    
  • ETH-Überweisung
    exchange.IO("api", "eth", "send", toAddress, toAmount)   // toAddress is the address of the wallet receiving ETH when transferring, toAmount is the quantity
    
  • Gaspreis abfragen
    exchange.IO("api", "eth", "eth_gasPrice")
    
  • Abfrage eth_estimateGas
    exchange.IO("api", "eth", "eth_estimateGas", data)
    

Unterstützungskode

Die Funktionexchange.IOdieencodeMethode, die die Funktionsanruf-Codierung zurückgeben kannhexStringformat. Sie können auf die öffentlich zugänglichen Plattformen verweisenUniswap V3 Trading Class Library Vorlagefür spezielle Zwecke. Der Anruf der CodierungunwrapWETH9Die Methode wird hier als Beispiel verwendet:

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

Bei Anrufen derexchange.IO("encode",...)Funktion, wenn der zweite Parameter (String-Typ) mit0x, bedeutet der Anruf der Methode auf dem codierten (encode) ein intelligenter Vertrag. Wenn es nicht mit0xDie Funktion ist die gleiche wie bei derabi.encodein dersolidity. Verweisen Sie auf das folgende Beispiel.

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

Unterstützung der sequentiellen Kodierung von Tupeln oder Typen mit Tupeln:

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

Diese Typordnung besteht austupleundbytes, also müssen zwei Parameter eingegeben werden, wenn sie aufgerufen werdenexchange.IOzuencode:

  • Variablen, die dem Typ Tupel entsprechen:
    {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }
    
    Die eingegebenen Parameter müssen auch mit der Struktur und dem Typ dertuple, wie sie in dertypesParameter:tuple(a uint256, b uint8, c address).
  • Variablen, die dem Typ Bytes entsprechen:
    "0011"
    

Unterstützung der sequentiellen Kodierung von Arrays oder Arraytypen, die Arrays enthalten:

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

Unterstützung für encodePacked

Zum Beispiel, wenn die DEX-Methode vonUniswap V3, müssen Sie in den Parametern, wie den Austausch Pfad, so müssen Sie dieencodePackagedBetrieb:

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

Unterstützung der Entschlüsselung

Die Datenverarbeitung unterstützt nicht nur die Codierung (encode), aber auch die Entschlüsselung (decode) Verwendenexchange.IO("decode", types, rawData)Funktion zur Durchführung derdecode 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)
}

Das Beispiel führt dieencodePackedErstmals während derpathParameterverarbeitung, weil dieexactOutputMethodenanruf, der später codiert werden muss, benötigt diepathals Parameter. Dann wird dieencodeVerfahren derexactOutputRouting-Vertrag hat nur einen Parameter und der Parametertyp isttuple- Ich weiß. Die MethodeexactOutputName ist als0x09b81346, das das Ergebnis entschlüsseltdecodeRawvonexchange.IO ("decode",...)Methode, und es stimmt mit der VariablendataTuple.

Unterstützung für den Wechsel privater Schlüssel

Es unterstützt das Wechseln von privaten Schlüsseln, um mehrere Wallet-Adressen zu betreiben, zum Beispiel:

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

Methode zum Aufrufen des Smart Contracts

Der folgende Inhalt ist ein Beispiel für einige Aufrufe von Smart Contract-Methoden.

  • Dezimalstellen DiedecimalsMethode ist eineconstantVerfahren derERC20die nicht erzeugtgasDie Daten werden von einemtoken- Ich weiß. DiedecimalsRückgabewert: die Präzisionsdaten vontoken.

    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
    }
    
  • Zulage DieallowanceMethode ist eineconstantVerfahren derERC20die nicht erzeugtgasDie Verbraucher können sich über die Anzahl dertokenfür eine bestimmte Vertragsadresse. DieallowanceDie Methode muss in 2 Parametern übergeben werden, die erste ist die Wallet-Adresse und die zweite ist die autorisierte Adresse.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: Die Wallet-Adresse wird in dem Beispiel durch die Zeichenfolge owner ersetzt.spender: Die autorisierte Vertragsadresse wird im Beispiel durch die Zeichenfolge spender ersetzt.Uniswap V3 router v1.

  • genehmigen DieapproveDie Methode ist nichtconstantVerfahren derERC20Das erzeugtgasVerbrauch, der verwendet wird, um einetokendie Transaktion auf eine bestimmte Vertragsadresse erstreckt. DieapproveDie Methode muss in 2 Parametern übergeben werden, die erste ist die Adresse, die autorisiert werden soll, und die zweite ist der autorisierte Betrag.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: Die Adresse des genehmigten Auftrags, das Beispiel wird durch die Zeichenfolge spender ersetzt, die tatsächliche Verwendung muss die spezifische Adresse ausfüllen, zum Beispiel kann es seinUniswap V3 router v1 address. amount: Die Zahl der Genehmigungen, hier mit einer hexadezimalen Zeichenfolge dargestellt, entspricht einem Dezimalwert von1e18, geteilt durch dietokenPräzisionseinheit im Beispiel (d. h. 1e18), die 1 ergibttoken authorized.

    Der dritte Parameter derexchange.IOFunktion wird übergeben, Methodenameapprove, die auch in Form vonmethodId, z. B.: 0x571ac8b0. Es ist auch möglich, den vollständigen Standardmethodenamen zu schreiben, z. B. approve(address,uint256) .

  • mehrfachgerufen DiemulticallMethode ist eine nicht konstante Methode derUniswap V3, diegasVerbrauch und werden verwendet, um Token auf verschiedene Arten auszutauschen. DiemulticallMethode kann mehrere Methoden zur Übermittlung von Parametern haben. Sie können die ABI abfragen, die die Methode enthält, um Details zu erhalten. Sie müssen die ABI registrieren, bevor Sie die Methode aufrufen.txid.

    Für konkrete BeispielemulticallMethodenanrufe, bitte beziehen Sie sich auf die ÖffentlichkeitUniswap V3 Trading Class Library Vorlagevon unserer Plattform.

    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: Der ABI des Router-V2-Vertrags von Uniswap V3 muss entsprechend der tatsächlichen Situation ausgefüllt werden.contractV3SwapRouterV2: Router v2 Adresse von Uniswap V3, die tatsächliche Verwendung erfordert eine spezifische Adresse ausgefüllt werden...value: Der übertragene ETH-Betrag wird auf 0 gesetzt, wenn dietokenInDas Token für den Austausch ist nicht ETH, es muss entsprechend der tatsächlichen Situation ausgefüllt werden.deadline: Es kann auf(new Date().getTime() / 1000) + 3600, was bedeutet, dass es eine Stunde gültig ist.data: Die Daten des zu durchführenden Verpackungsvorgangs müssen entsprechend der tatsächlichen Situation ausgefüllt werden.

    Es ist auch möglich, diegasLimit/gasPrice/nonceEinstellung für Methodenanrufe:

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

    Sie können Parameter festlegen{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}Nach Ihren spezifischen Bedürfnissen wird der Parameter auf den letzten Parameter desexchange.IOFunktion. Sie können dienonceund verwenden Sie die Systemeinstellungen, oder nicht setzengasLimit/gasPrice/nonceund verwenden Sie alle System-Standardwerte.

    Es ist zu beachten, daß im Beispiel das AttributstateMutabilityinmulticall(uint256,bytes[])Methode istpayable, und dievalueParameter muss eingegeben werden. Das Attribut derstateMutability":"payable"Sie können von derABI. Dieexchange.IODiese Funktion wird die erforderlichen Parameter entsprechend derstateMutabilityAttribut in derABIdie registriert wurde. Wenn diestateMutabilityAttribut istnonpayable, der Parametervaluenicht eingereicht werden muss.

Andere Funktionsanrufe

  • Erhält die Adresse der von dem Austauschobjekt konfigurierten Brieftasche
    function main() {
        Log(exchange.IO("address"))         // Print the wallet address of the private key configured on the exchange object
    }
    
  • Wechseln von RPC-Knoten auf der Blockchain
    function main() {
        var chainRpc = "https://bsc-dataseed.binance.org"
        
        // Switch to BSC chain
        e.IO("base", chainRpc)
    }
    
JavaScript-Strategie-Schreibanweisungen Eingebettete Bibliothek