리소스 로딩... 로딩...

이더리움

FMZ 퀀트 트레이딩 플랫폼에서 Ethereum 체인에 스마트 계약의 메소드 호출을 구현하기 위해 전략 코드를 작성합니다.exchange.IO기능. 먼저 FMZ 양자 거래 플랫폼에 액세스 노드를 구성합니다. 액세스 노드는 자체 구축 노드 또는 제3자 서비스를 사용할 수 있습니다.infura.

Web3 교환 객체 구성

FMZ 양자 거래 플랫폼에서 액세스 노드를 구성합니다. 액세스 노드는 자체 구축 노드 또는 제3자 서비스를 사용할 수 있습니다.infura... 이 페이지에서 교환FMZ 양자 거래 플랫폼, 프로토콜을 선택:암호화폐, 그리고 교환을 선택Web3... 설정Rpc Address(접속 노드의 서비스 주소) 그리고Private Key(비밀 키). 그것은 개인 키의 현지 배포를 지원합니다, 참조핵심 안전.

ABI 등록

표준인 계약을 호출ERC20메소드 등록이 필요하지 않으며 직접 호출할 수 있습니다. 표준 계약 이외의 다른 메소드 호출은 ABI 콘텐츠를 등록해야합니다:exchange.IO("abi", tokenAddress, abiContent)- 네 계약의 ABI 콘텐츠를 얻기 위해, 당신은 다음 URL을 사용할 수 있습니다result현장만

https://api.etherscan.io/api?module=contract&action=getabi&address=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

이더리움 RPC 호출 방법

사용exchange.IO()이더리움 RPC 메소드를 호출하는 함수

  • 지갑에 있는 ETH 잔액을 검색합니다
    exchange.IO("api", "eth", "eth_getBalance", owner, "latest")   // owner is the specific wallet address
    
  • ETH 송금
    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")
    
  • 질의 eth_estimate가스
    exchange.IO("api", "eth", "eth_estimateGas", data)
    

지원 코드

기능exchange.IO가결된encode함수 호출 인코딩을 반환할 수 있는 방법hex문자열 형식 공개된 플랫폼을 참조할 수 있습니다.Uniswap V3 트레이딩 클래스 라이브러리 템플릿특정 용도로 코딩의 호출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.encodesolidity다음 예제를 참조하십시오.

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.IOencode:

  • 타입 튜플에 대응하는 변수:
    {
        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)
}

EncodePacked를 지원합니다.

예를 들어, 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)
}

이 예제에서는encodePacked1차 운영 기간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: 지갑 주소는 예제에서 문자열 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, 예를 들어: 0x571ac8b0. 또한 approve(address,uint256) 과 같은 전체 표준 메소드 이름을 쓸 수 있습니다.

  • 복수 호출 의multicall이 방법은 일정한 방법이 아닙니다Uniswap V3, 이것은 생성gas소비되고 여러 가지 방법으로 토큰을 교환하는 데 사용됩니다. 의multicall메소드는 매개 변수를 전달하는 여러 메소드를 가질 수 있습니다. 자세한 내용은 메소드를 포함하는 ABI에 문의할 수 있습니다. 메소드를 호출하기 전에 ABI를 등록해야합니다. 반환 값:txid.

    구체적인 예제multicall방법 호출, 대중을 참조하십시오Uniswap V3 트레이딩 클래스 라이브러리 템플릿우리 플랫폼의

    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 V3의 라우터 v2 계약의 ABI는 실제 상황에 따라 채워져야 합니다.contractV3SwapRouterV2: Uniswap V3의 라우터 v2 주소, 실제 사용은 특정 주소를 입력해야 합니다...value: ETH의 양을 전송, 0으로 설정tokenIn거래 거래에 필요한 토큰은 ETH가 아니라 실제 상황에 따라 채워야 합니다.deadline: 설정할 수 있습니다(new Date().getTime() / 1000) + 36001시간 동안 유효합니다.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
    }
    
  • 블록체인 RPC 노드 전환
    function main() {
        var chainRpc = "https://bsc-dataseed.binance.org"
        
        // Switch to BSC chain
        e.IO("base", chainRpc)
    }
    
자바스크립트 전략 작성 지침 내장 라이브러리