FMZ 퀀트 트레이딩 플랫폼에서 Ethereum 체인에 스마트 계약의 메소드 호출을 구현하기 위해 전략 코드를 작성합니다.exchange.IO
기능. 먼저 FMZ 양자 거래 플랫폼에 액세스 노드를 구성합니다. 액세스 노드는 자체 구축 노드 또는 제3자 서비스를 사용할 수 있습니다.infura
.
FMZ 양자 거래 플랫폼에서 액세스 노드를 구성합니다. 액세스 노드는 자체 구축 노드 또는 제3자 서비스를 사용할 수 있습니다.infura
...
이 페이지에서Web3
...
설정Rpc Address
(접속 노드의 서비스 주소) 그리고Private Key
(비밀 키). 그것은 개인 키의 현지 배포를 지원합니다, 참조핵심 안전.
표준인 계약을 호출ERC20
메소드 등록이 필요하지 않으며 직접 호출할 수 있습니다. 표준 계약 이외의 다른 메소드 호출은 ABI 콘텐츠를 등록해야합니다:exchange.IO("abi", tokenAddress, abiContent)
- 네
계약의 ABI 콘텐츠를 얻기 위해, 당신은 다음 URL을 사용할 수 있습니다result
현장만
https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
사용exchange.IO()
이더리움 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)
기능exchange.IO
가결된encode
함수 호출 인코딩을 반환할 수 있는 방법hex
문자열 형식
공개된 플랫폼을 참조할 수 있습니다.unwrapWETH9
이 방법은 예를 들어 다음과 같이 사용됩니다.
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)
}
전화할 때exchange.IO("encode",...)
함수, 만약 두 번째 매개 변수 (string type) 가0x
, 이는 암호화된 (encode
스마트 계약.
시작하지 않으면0x
, 그것은 지정된 타입 순서를 코드화하는 데 사용됩니다.abi.encode
에solidity
다음 예제를 참조하십시오.
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
*/
}
튜플 또는 튜플을 포함하는 타입의 순차적 인코딩을 지원합니다:
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)
}
이 유형의 순서는tuple
그리고bytes
, 그래서 두 개의 매개 변수를 호출할 때 전달해야 합니다exchange.IO
에encode
:
{
a: 30,
b: 20,
c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
}
전달된 매개 변수는 또한 구조와 유형의tuple
, 그 정의에 따라types
파라미터:tuple(a uint256, b uint8, c address)
."0011"
배열 또는 배열을 포함하는 타입의 순차적 인코딩을 지원합니다.
function main() {
var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"] // ETH address, USDT address
var ret = exchange.IO("encode", "address[]", path)
Log("encode: ", ret)
}
예를 들어, DEX 방법을 호출 할 때Uniswap V3
, 당신은 교환 경로와 같은 매개 변수를 전달해야합니다, 그래서 당신은encodePackaged
작업:
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)
}
데이터 처리는 코딩을 지원할 뿐만 아니라 (encode
하지만 또한 디코딩 (decode
) 를 사용exchange.IO("decode", types, rawData)
수행 할 수 있습니다decode
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)
}
이 예제에서는encodePacked
1차 운영 기간path
패러미터 처리,exactOutput
나중에 암호화 해야 하는 방법 호출은path
매개 변수로
그 다음,encode
의 방법exactOutput
라우팅 계약은 하나의 매개 변수만 있고 매개 변수 유형은tuple
...
방법exactOutput
이름은0x09b81346
, 결과를 해독하는decodeRaw
에 의해exchange.IO ("decode",...)
방법, 그리고 변수와 일치dataTuple
.
개인 키를 전환하여 여러 지갑 주소를 작동하는 것을 지원합니다. 예를 들어:
function main() {
exchange.IO("key", "Private Key") // "Private Key" represents the private key string, which needs to be filled in specifically
}
다음 컨텐츠는 일부 스마트 계약 방법 호출의 예입니다.
소수
의decimals
방법은constant
방법ERC20
생성하지 않는gas
소비, 그리고 그것은 정밀 데이터를 검색 할 수 있습니다token
...
의decimals
매개 변수는 없습니다. 반환 값:token
.
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
}
보조금
의allowance
방법은constant
방법ERC20
생성하지 않는gas
소비, 그리고 그것은 특정의 허가된 양을 검색 할 수 있습니다.token
특정 계약 주소로
의allowance
이 방법은 2개의 매개 변수를 통과해야 합니다. 첫 번째는 지갑 주소이고 두 번째는 승인 주소입니다. 반환 값: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
: 지갑 주소는 예제에서 문자열 spender
: 허가 계약 주소는 문자열에 의해 대체됩니다. 실제 사용에서, 당신은 예를 들어 주소를 구체적으로 채워야 합니다.Uniswap V3 router v1
.
승인
의approve
이 방법은constant
방법ERC20
생성하는gas
소비를 허용하는 데 사용됩니다.token
거래 금액은 특정 계약 주소입니다.
의approve
이 방법은 2개의 매개 변수를 통과해야 합니다. 첫번째는 승인될 주소이고 두번째는 승인된 금액입니다.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
: 허가 계약의 주소는, 예를 들어 문자열에 의해 대체됩니다Uniswap V3 router v1
address.
amount
: 여기 hexadecimal 문자열을 사용하여 표시 된 권한의 수는 decimal 값에 해당합니다.1e18
,token
예제에서의 정밀 단위 (즉, 1e18) 는 1을 낸다.token
authorized.
세 번째 매개 변수는exchange.IO
함수가 전달됩니다 방법 이름approve
, 이 또한 형태로 작성 될 수 있습니다methodId
, 예를 들어:
복수 호출
의multicall
이 방법은 일정한 방법이 아닙니다Uniswap V3
, 이것은 생성gas
소비되고 여러 가지 방법으로 토큰을 교환하는 데 사용됩니다.
의multicall
메소드는 매개 변수를 전달하는 여러 메소드를 가질 수 있습니다. 자세한 내용은 메소드를 포함하는 ABI에 문의할 수 있습니다. 메소드를 호출하기 전에 ABI를 등록해야합니다. 반환 값:txid
.
구체적인 예제multicall
방법 호출, 대중을 참조하십시오
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
: Uniswap V3contractV3SwapRouterV2
: Uniswap V3의 라우터 v2 주소, 실제 사용은 특정 주소를 입력해야 합니다...value
: ETH의 양을 전송, 0으로 설정tokenIn
거래 거래에 필요한 토큰은 ETH가 아니라 실제 상황에 따라 채워야 합니다.deadline
: 설정할 수 있습니다(new Date().getTime() / 1000) + 3600
1시간 동안 유효합니다.data
: 수행해야 하는 포장 작업의 데이터는 실제 상황에 따라 채워야 합니다.
또한gasLimit/gasPrice/nonce
메소드 호출 설정:
exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 5000000000, gasLimit: 21000})
매개 변수를 설정할 수 있습니다{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}
당신의 특정 필요에 따라, 매개 변수는exchange.IO
기능.
방치 할 수 있습니다.nonce
그리고 시스템 기본값을 사용하거나 설정하지 않습니다gasLimit/gasPrice/nonce
그리고 모든 시스템 기본값을 사용하세요.
이 예제에서,stateMutability
안쪽multicall(uint256,bytes[])
방법은payable
, 그리고value
매개 변수를 입력해야 합니다.
그 속성stateMutability":"payable"
이 부분의 본문은ABI
.exchange.IO
함수는 요구되는 매개 변수를stateMutability
속성ABI
등록됐습니다.
만약stateMutability
속성은nonpayable
, 매개 변수value
전달할 필요가 없습니다.
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)
}