রিসোর্স লোড হচ্ছে... লোডিং...

ইথেরিয়াম

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মে, ইথেরিয়াম চেইনে স্মার্ট কন্ট্রাক্টের পদ্ধতি কল বাস্তবায়নের জন্য কৌশল কোড লিখুনexchange.IOপ্রথমত, এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মে অ্যাক্সেস নোডটি কনফিগার করুন। অ্যাক্সেস নোডগুলি স্ব-নির্মিত নোড হতে পারে বা তৃতীয় পক্ষের পরিষেবাগুলি ব্যবহার করতে পারে, যেমনinfura.

Web3 এক্সচেঞ্জ অবজেক্ট কনফিগারেশন

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মে অ্যাক্সেস নোডটি কনফিগার করুন। অ্যাক্সেস নোডগুলি স্ব-নির্মিত নোড হতে পারে বা তৃতীয় পক্ষের পরিষেবাগুলি ব্যবহার করতে পারে, যেমনinfura. এর পাতায় বিনিময়FMZ কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম, প্রোটোকল নির্বাচন করুনঃক্রিপ্টোকারেন্সি, এবং তারপর বিনিময় নির্বাচন করুন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 পদ্ধতি কল করার ফাংশন।

  • ওয়ালেটে 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",...)ফাংশন, যদি দ্বিতীয় প্যারামিটার (স্ট্রিং টাইপ) দিয়ে শুরু হয়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অপারেশন প্রথম সময়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: অনুমোদিত চুক্তি ঠিকানা স্ট্রিং দ্বারা প্রতিস্থাপিত হয় 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: অনুমোদিত চুক্তির ঠিকানা, উদাহরণ স্ট্রিং দ্বারা প্রতিস্থাপিত হয় spender, প্রকৃত ব্যবহার নির্দিষ্ট ঠিকানা পূরণ করতে হবে, উদাহরণস্বরূপ, এটি হতে পারেUniswap V3 router v1 address. amount: অনুমোদন সংখ্যা, এখানে একটি hexadecimal স্ট্রিং ব্যবহার করে প্রতিনিধিত্ব করা হয়, একটি দশমিক মান অনুরূপ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) + 3600, যার মানে এটি এক ঘন্টার জন্য বৈধ।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)
    }
    
জাভাস্ক্রিপ্ট কৌশল লেখার নির্দেশাবলী অন্তর্নির্মিত গ্রন্থাগার