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 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ủaWeb3
.
Thiết lậpRpc Address
(địa chỉ dịch vụ của nút truy cập) vàPrivate Key
Nó hỗ trợ triển khai địa phương các khóa riêng, xemChăm sóc an toàn.
Gọi một hợp đồng là một tiêu chuẩnERC20
Cá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ấyresult
chỉ có trong lĩnh vực.
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
Sử dụngexchange.IO()
chức năng để gọi phương thức 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)
Chức năngexchange.IO
bao gồm cácencode
phươ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úngunwrapWETH9
phươ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.encode
trongsolidity
Hã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:tuple
vàbytes
, vì vậy hai tham số cần được truyền vào khi gọiexchange.IO
đếnencode
:
{
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 trongtypes
tham số:tuple(a uint256, b uint8, c address)
."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)
}
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ụngencodePackaged
hoạ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)
}
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ệnencodePacked
hoạt động đầu tiênpath
xử lý tham số, bởi vìexactOutput
gọi phương thức mà cần được mã hóa sau đó cầnpath
như một tham số.
Sau đó,encode
phương phápexactOutput
hợp đồng định tuyến chỉ có một tham số, và loại tham số làtuple
.
Phương phápexactOutput
tên được mã hóa là0x09b81346
, được giải mã kết quảdecodeRaw
bởiexchange.IO ("decode",...)
phương pháp, và nó phù hợp với biếndataTuple
.
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
}
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ácdecimals
phương pháp là mộtconstant
phương phápERC20
mà không tạo ragas
tiêu thụ, và nó có thể truy vấn dữ liệu chính xác của mộttoken
.
Cácdecimals
Phả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ácallowance
phương pháp là mộtconstant
phương phápERC20
mà không tạo ragas
tiêu thụ, và nó có thể truy vấn số lượng được phép của một sốtoken
cho một địa chỉ hợp đồng nhất định.
Cácallowance
Phươ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 spender
: Địa chỉ hợp đồng được ủy quyền được thay thế bằng chuỗi Uniswap V3 router v1
.
chấp thuận
Cácapprove
Phương pháp này không phải là...constant
phương phápERC20
tạo ragas
tiêu thụ, được sử dụng để cho phép mộttoken
số tiền giao dịch đến một địa chỉ hợp đồng nhất định.
Cácapprove
phươ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 Uniswap 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.IO
hàm được truyền tên phương thứcapprove
, cũng có thể được viết dưới dạngmethodId
, ví dụ:
nhiều cuộc gọi
Cácmulticall
phương pháp là một phương pháp không liên tục củaUniswap V3
, sẽ tạo ragas
tiêu thụ và được sử dụng để trao đổi token theo nhiều cách.
Cácmulticall
method 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ềmulticall
phương pháp gọi, xin vui lòng tham khảo công chúng
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 V3contractV3SwapRouterV2
: đị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ếutokenIn
token 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/nonce
thiế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.IO
chức năng.
Bạn có thể bỏ quanonce
và sử dụng hệ thống mặc định, hoặc không đặtgasLimit/gasPrice/nonce
và 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ủastateMutability
trongmulticall(uint256,bytes[])
phương pháp làpayable
, vàvalue
Parameter cần được truyền vào.
Thuộc tính củastateMutability":"payable"
có thể được xem từABI
.exchange.IO
chức năng sẽ xác định các thông số cần thiết theostateMutability
thuộc tính trongABI
đã được đăng ký.
NếustateMutability
thuộc tính lànonpayable
, tham sốvalue
không cần phải được chuyển vào.
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)
}