FMZ Quant Trading Platform mendukungWeb3
Fungsi terkait dan dapat dengan mudah mengakses pasar cryptocurrencydefi
exchanges.
Pada Platform Perdagangan Kuantum FMZ, tulis kode strategi untuk menerapkan panggilan metode kontrak pintar pada rantai Ethereum melaluiexchange.IO
fungsi. Pertama, konfigurasi node akses di FMZ Quant Trading Platform. Node akses dapat menjadi node yang dibangun sendiri atau menggunakan layanan pihak ketiga, sepertiinfura
.
mengkonfigurasi node akses di Platform Perdagangan Quant FMZ. Node akses dapat menjadi node yang dibangun sendiri atau menggunakan layanan pihak ketiga, sepertiinfura
Aku tidak tahu.
Di halamanWeb3
Aku tidak tahu.
MengkonfigurasiRpc Address
(alamat layanan node akses) danPrivate Key
(kunci pribadi). Ini mendukung penyebaran lokal kunci pribadi, lihatKunci Keamanan.
Menelpon kontrak yang merupakan standarERC20
metode 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, mengambilresult
hanya lapangan.
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
Gunakanexchange.IO()
fungsi untuk memanggil metode Ethereum RPC.
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)
Fungsiexchange.IO
mengkapsulkanencode
metode, yang dapat mengembalikan fungsi panggilan pengkodean untukhex
format string.
Anda dapat merujuk ke platform yang tersedia untuk umumunwrapWETH9
metode 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.encode
dalamsolidity
. 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:tuple
danbytes
, jadi dua parameter harus diteruskan saat memanggilexchange.IO
untukencode
:
{
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}
Parameter yang diberikan juga harus konsisten dengan struktur dan jenistuple
, sebagaimana didefinisikan dalamtypes
Parameter:tuple(a uint256, b uint8, c address)
."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)
}
Misalnya, ketika memanggil metode DEX dariUniswap V3
, Anda perlu untuk lulus dalam parameter, seperti jalur pertukaran, sehingga Anda perlu menggunakanencodePackaged
Operasi:
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)
}
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 melakukanencodePacked
operasi pertama selamapath
proses parameter, karenaexactOutput
panggilan metode yang perlu dikodekan kemudian membutuhkanpath
sebagai parameter.
Kemudian,encode
metode dariexactOutput
kontrak routing hanya memiliki satu parameter, dan jenis parameter adalahtuple
Aku tidak tahu.
MetodeexactOutput
nama dikodekan sebagai0x09b81346
, yang didekode hasildecodeRaw
olehexchange.IO ("decode",...)
metode, dan konsisten dengan variabeldataTuple
.
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
}
Konten berikut adalah contoh beberapa panggilan metode kontrak pintar.
angka desimal
Peraturandecimals
metode adalahconstant
metodeERC20
yang tidak menghasilkangas
konsumsi, dan dapat menanyakan data presisi daritoken
Aku tidak tahu.
Peraturandecimals
Nilai 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
Peraturanallowance
metode adalahconstant
metodeERC20
yang tidak menghasilkangas
Konsumsi, dan dapat menanyakan jumlah yang diizinkan daritoken
untuk alamat kontrak tertentu.
Peraturanallowance
metode 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 spender
: Alamat kontrak yang sah diganti dengan string Uniswap V3 router v1
.
menyetujui
Peraturanapprove
metode ini adalah non-constant
metodeERC20
yang menghasilkangas
konsumsi, yang digunakan untuk mengizinkantoken
jumlah operasi ke alamat kontrak tertentu.
Peraturanapprove
metode 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 Uniswap V3 router v1
address.
amount
: Jumlah otorisasi, yang diwakili di sini dengan menggunakan string hexadecimal, sesuai dengan nilai desimal1e18
, dibagi dengantoken
satuan presisi dalam contoh (yaitu, 1e18), menghasilkan 1token
authorized.
Parameter ketiga dariexchange.IO
fungsi dilewatkan nama metodeapprove
, yang juga dapat ditulis dalam bentukmethodId
, misalnya:
multi-panggilan
Peraturanmulticall
metode adalah metode nonkonstan dariUniswap V3
, yang akan menghasilkangas
konsumsi dan digunakan untuk bertukar token dalam berbagai cara.
Peraturanmulticall
metode 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 darimulticall
metode panggilan, silakan merujuk pada publik
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 V3contractV3SwapRouterV2
: alamat router v2 dari Uniswap V3, penggunaan sebenarnya membutuhkan alamat tertentu untuk diisi...value
: Jumlah ETH yang ditransfer, atur ke 0 jikatokenIn
token 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/nonce
pengaturan 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.IO
fungsi.
Anda bisa melewatkannonce
dan menggunakan sistem default, atau tidak mengaturgasLimit/gasPrice/nonce
dan gunakan semua nilai default sistem.
Perlu dicatat bahwa dalam contoh, atribut daristateMutability
dalammulticall(uint256,bytes[])
metode adalahpayable
, danvalue
Parameter harus diteruskan.
Atribut daristateMutability":"payable"
dapat dilihat dariABI
.exchange.IO
fungsi akan menentukan parameter yang diperlukan sesuai denganstateMutability
atribut dalamABI
yang telah terdaftar.
JikastateMutability
atribut adalahnonpayable
, parametervalue
tidak perlu diserahkan.
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)
}