En la plataforma de comercio de FMZ Quant, escribir código de estrategia para implementar la llamada de método de contrato inteligente en la cadena Ethereum a través de laexchange.IO
En primer lugar, configure el nodo de acceso en la plataforma de comercio de FMZ Quant. Los nodos de acceso pueden ser nodos auto-construidos o utilizar servicios de terceros, tales comoinfura
.
Configurar el nodo de acceso en la plataforma de comercio de FMZ Quant. Los nodos de acceso pueden ser nodos construidos por uno mismo o utilizar servicios de terceros, tales comoinfura
- ¿ Por qué?
En la página deWeb3
- ¿ Por qué?
ConfiguraciónRpc Address
(dirección de servicio del nodo de acceso) yPrivate Key
Apoya el despliegue localizado de claves privadas, verSeguridad clave.
Llamando a un contrato que es un estándarERC20
El método no requiere registro y puede ser llamado directamente.exchange.IO("abi", tokenAddress, abiContent)
¿ Qué pasa?
Para obtener el contenido ABI de un contrato, puede utilizar la siguiente URL para obtenerlo, tomando elresult
sólo en el campo.
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
Utilice elexchange.IO()
función para llamar al método 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)
La funciónexchange.IO
Encapsula elencode
método, que puede devolver la codificación de llamada de función ahex
formato de cadena.
Puede consultar las plataformas accesibles al públicounwrapWETH9
El método se utiliza aquí como ejemplo:
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)
}
Cuando se llama a laexchange.IO("encode",...)
función, si el segundo parámetro (tipo de cadena) comienza con0x
, significa la llamada al método en el código (encode
) contrato inteligente.
Si no comienza con0x
, se utiliza para codificar el orden de tipo especificado.abi.encode
En elsolidity
Consulte el siguiente ejemplo.
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
*/
}
Apoya la codificación secuencial de tuples o tipos que contienen 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)
}
Este tipo de orden está compuesto por:tuple
ybytes
, por lo que hay que pasar dos parámetros al llamarexchange.IO
En elencode
:
{
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}
Los parámetros transmitidos deben ser también coherentes con la estructura y el tipo detuple
, tal como se define en eltypes
Parámetro:tuple(a uint256, b uint8, c address)
."0011"
Soporte para la codificación secuencial de matrices o tipos que contengan matrices:
function main() {
var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"] // ETH address, USDT address
var ret = exchange.IO("encode", "address[]", path)
Log("encode: ", ret)
}
Por ejemplo, al llamar el método DEX deUniswap V3
, usted necesita pasar en los parámetros, tales como la ruta de intercambio, por lo que necesita utilizar elencodePackaged
operación:
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)
}
El procesamiento de datos no sólo admite la codificación (encode
), pero también de decodificación (decode
) Utilizar elexchange.IO("decode", types, rawData)
La función para realizar eldecode
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)
}
El ejemplo realiza laencodePacked
la primera operación durante elpath
El procesamiento de parámetros, porque elexactOutput
Llamada de método que necesita ser codificado más tarde necesita elpath
como el parámetro.
Entonces, elencode
el método deexactOutput
el contrato de enrutamiento tiene un solo parámetro, y el tipo de parámetro estuple
- ¿ Por qué?
El métodoexactOutput
nombre está codificado como0x09b81346
, que se decodifica el resultadodecodeRaw
Por elexchange.IO ("decode",...)
método, y es consistente con la variabledataTuple
.
Apoya el cambio de claves privadas para operar múltiples direcciones de billetera, por ejemplo:
function main() {
exchange.IO("key", "Private Key") // "Private Key" represents the private key string, which needs to be filled in specifically
}
El siguiente contenido es un ejemplo de algunas llamadas de métodos de contratos inteligentes.
números decimales
Eldecimals
el método es unconstant
método deERC20
que no generagas
En el caso de los datos de precisión de untoken
- ¿ Por qué?
Eldecimals
El valor de retorno: los datos de precisión detoken
.
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
}
el pago de una indemnización
Elallowance
el método es unconstant
método deERC20
que no generagas
En la actualidad, el consumo de energía está en aumento, y puede consultar la cantidad autorizada de un determinadotoken
para una dirección de contrato determinada.
Elallowance
El valor de retorno: el importe de la autorización de la cartera.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
: La dirección de la billetera se reemplaza por la cadena spender
: La dirección autorizada del contrato se sustituye por la cadena Uniswap V3 router v1
.
Aprobar el proyecto
Elapprove
El método es un no-constant
método deERC20
que generagas
Consumo, que se utiliza para autorizar unatoken
el importe de la operación a una determinada dirección del contrato.
Elapprove
El método debe pasar en 2 parámetros, el primero es la dirección a autorizar y el segundo es la cantidad autorizada.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
: La dirección del contrato autorizado, el ejemplo se sustituye por la cadena Uniswap V3 router v1
address.
amount
: El número de autorizaciones, representado aquí mediante una cadena hexadecimal, corresponde a un valor decimal de1e18
, dividido por eltoken
Unidad de precisión en el ejemplo (es decir, 1e18), que da 1token
authorized.
El tercer parámetro delexchange.IO
La función se pasa el nombre del métodoapprove
, que también se puede escribir en forma demethodId
, por ejemplo:
de llamadas múltiples
Elmulticall
El método es un método no constante deUniswap V3
, que generarágas
Consumo y ser utilizado para intercambiar fichas de múltiples maneras.
Elmulticall
El método puede tener múltiples métodos de transmisión de parámetros. Puede consultar el ABI que contiene el método para obtener detalles. Debe registrar el ABI antes de llamar al método.txid
.
Para ejemplos concretos demulticall
Las llamadas de método, por favor, consulte el público
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
: El ABI del contrato de router v2 de Uniswap V3contractV3SwapRouterV2
: dirección de router v2 de Uniswap V3, el uso real requiere una dirección específica para ser rellenada...value
: La cantidad de ETH transferida, fijarla en 0 si eltokenIn
El token para la operación de intercambio no es ETH, debe llenarse de acuerdo con la situación real.deadline
Se puede configurar en:(new Date().getTime() / 1000) + 3600
, lo que significa que es válido durante una hora.data
: Los datos de la operación de embalaje que se realizará, deben rellenarse de acuerdo con la situación real.
También es posible especificar lagasLimit/gasPrice/nonce
Configuración de las llamadas de métodos:
exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 5000000000, gasLimit: 21000})
Puede establecer parámetros{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}
De acuerdo con sus necesidades específicas, el parámetro se establece en el último parámetro delexchange.IO
la función.
Puede omitir elnonce
y utilizar los valores predeterminados del sistema, o no establecergasLimit/gasPrice/nonce
y utilizar todos los valores predeterminados del sistema.
Debe tenerse en cuenta que en el ejemplo, el atributo destateMutability
En elmulticall(uint256,bytes[])
el método espayable
, y elvalue
Parámetro tiene que ser pasado en.
El atributo destateMutability":"payable"
se puede ver desde elABI
El.exchange.IO
La función determinará los parámetros requeridos de acuerdostateMutability
atributo en elABI
que ha sido registrado.
Si elstateMutability
el atributo esnonpayable
, el parámetrovalue
No es necesario que se entregue.
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)
}