Die FMZ Quant Trading Platform unterstütztWeb3
die damit verbundenen Funktionen und leicht auf den Kryptowährungsmarkt zugreifen könnendefi
exchanges.
Auf der FMZ Quant Trading Platform schreiben Sie Strategiecode, um den Methodenanruf des Smart Contracts auf der Ethereum-Kette durch dieexchange.IO
Funktion. 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
.
Die Zugangsknoten können selbst erstellte Knoten sein oder Dienste von Drittanbietern verwenden, wie z. B.infura
- Ich weiß.
Auf der Seite vonWeb3
- Ich weiß.
KonfigurierenRpc Address
(Dienstadresse des Zugangsknotenpunkts) undPrivate Key
Es unterstützt die lokalisierte Bereitstellung privater Schlüssel, sieheSchlüssel zur Sicherheit.
Ein Vertrag, der ein Standard istERC20
Fü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 dieresult
Nur auf dem Feld.
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
Verwendenexchange.IO()
Funktion zum Aufrufen der Ethereum RPC-Methode.
exchange.IO("api", "eth", "eth_getBalance", owner, "latest") // owner is the specific wallet address
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")
exchange.IO("api", "eth", "eth_estimateGas", data)
Die Funktionexchange.IO
dieencode
Methode, die die Funktionsanruf-Codierung zurückgeben kannhex
Stringformat.
Sie können auf die öffentlich zugänglichen Plattformen verweisenunwrapWETH9
Die 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 mit0x
Die Funktion ist die gleiche wie bei derabi.encode
in 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 austuple
undbytes
, also müssen zwei Parameter eingegeben werden, wenn sie aufgerufen werdenexchange.IO
zuencode
:
{
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}
Die eingegebenen Parameter müssen auch mit der Struktur und dem Typ dertuple
, wie sie in dertypes
Parameter:tuple(a uint256, b uint8, c address)
."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)
}
Zum Beispiel, wenn die DEX-Methode vonUniswap V3
, müssen Sie in den Parametern, wie den Austausch Pfad, so müssen Sie dieencodePackaged
Betrieb:
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)
}
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 dieencodePacked
Erstmals während derpath
Parameterverarbeitung, weil dieexactOutput
Methodenanruf, der später codiert werden muss, benötigt diepath
als Parameter.
Dann wird dieencode
Verfahren derexactOutput
Routing-Vertrag hat nur einen Parameter und der Parametertyp isttuple
- Ich weiß.
Die MethodeexactOutput
Name ist als0x09b81346
, das das Ergebnis entschlüsseltdecodeRaw
vonexchange.IO ("decode",...)
Methode, und es stimmt mit der VariablendataTuple
.
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
}
Der folgende Inhalt ist ein Beispiel für einige Aufrufe von Smart Contract-Methoden.
Dezimalstellen
Diedecimals
Methode ist eineconstant
Verfahren derERC20
die nicht erzeugtgas
Die Daten werden von einemtoken
- Ich weiß.
Diedecimals
Rü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
Dieallowance
Methode ist eineconstant
Verfahren derERC20
die nicht erzeugtgas
Die Verbraucher können sich über die Anzahl dertoken
für eine bestimmte Vertragsadresse.
Dieallowance
Die 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 spender
: Die autorisierte Vertragsadresse wird im Beispiel durch die Zeichenfolge Uniswap V3 router v1
.
genehmigen
Dieapprove
Die Methode ist nichtconstant
Verfahren derERC20
Das erzeugtgas
Verbrauch, der verwendet wird, um einetoken
die Transaktion auf eine bestimmte Vertragsadresse erstreckt.
Dieapprove
Die 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 Uniswap V3 router v1
address.
amount
: Die Zahl der Genehmigungen, hier mit einer hexadezimalen Zeichenfolge dargestellt, entspricht einem Dezimalwert von1e18
, geteilt durch dietoken
Präzisionseinheit im Beispiel (d. h. 1e18), die 1 ergibttoken
authorized.
Der dritte Parameter derexchange.IO
Funktion wird übergeben, Methodenameapprove
, die auch in Form vonmethodId
, z. B.:
mehrfachgerufen
Diemulticall
Methode ist eine nicht konstante Methode derUniswap V3
, diegas
Verbrauch und werden verwendet, um Token auf verschiedene Arten auszutauschen.
Diemulticall
Methode 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 Beispielemulticall
Methodenanrufe, bitte beziehen Sie sich auf die Öffentlichkeit
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 V3contractV3SwapRouterV2
: 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 dietokenIn
Das 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/nonce
Einstellung 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.IO
Funktion.
Sie können dienonce
und verwenden Sie die Systemeinstellungen, oder nicht setzengasLimit/gasPrice/nonce
und verwenden Sie alle System-Standardwerte.
Es ist zu beachten, daß im Beispiel das AttributstateMutability
inmulticall(uint256,bytes[])
Methode istpayable
, und dievalue
Parameter muss eingegeben werden.
Das Attribut derstateMutability":"payable"
Sie können von derABI
. Dieexchange.IO
Diese Funktion wird die erforderlichen Parameter entsprechend derstateMutability
Attribut in derABI
die registriert wurde.
Wenn diestateMutability
Attribut istnonpayable
, der Parametervalue
nicht eingereicht werden muss.
function main() {
Log(exchange.IO("address")) // Print the wallet address of the private key configured on the exchange object
}
function main() {
var chainRpc = "https://bsc-dataseed.binance.org"
// Switch to BSC chain
e.IO("base", chainRpc)
}