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

এফএমজেড ব্যবহার করে ইথেরিয়াম ভিত্তিক ওয়েব 3 বিকাশের সহজ ভূমিকা

লেখক:উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্ন, তৈরিঃ ২০২৩-০৩-২৮ 13:32:48, আপডেটঃ ২০২৪-১১-১১ 22:28:24

name:token,type:address],name:approveZeroThenMax,outputs:[],stateMutability:payable,type:bytefunction,{inputs:[],stateMutability:payable,type:function},{inputs:[internalType:payable,type:function},{inputs:[internalType:address,name:token,type:address}],name:approveZeroThenMaxMinusOne,outputs:[],stateMutability:payable,type:bytefunction,{inputs:[],stateMutability:[[internalType:payable,type:bytefunction,type:function}],{inputsinputs var abiPool = [inputs:[],stateMutability:nonpayable,type:constructor},{anonymous:true,internalType:int24,inputs:[indexed:true,internalType:address,name:owner,type:address},{indexed:true,internalType:address,name:owner,type:address},{indexed:true,internalType:int24,stateMutability:nonpayable,type:constructor:int24},{anonymous:true,internalType:addalType:int24,inputs:true,addaddaddaddadduppertype:address var abiFactory = [{inputs:[],stateMutability:nonpayable,type:int24},{anonymous:false,inputs:[{indexed:true,internalType:uint24,name:fee,type:uint24},{indexed:true,internalType:int24,stateMutability:nonpayable,type:int24},name:tickSpacing,type:int24},{anonymous:false,inputs:{addaddadded:true,internalType:uint24,name:inputs,name:inputs:{indexed:true,type:fee,type:uint24},{indexed

var contractV3FactoryAddress = 0x1F98431c8aD98523631AE4a59f267346ea31F984 var contractV3SwapRouterV2Address = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

ফাংশন toAmount ((s, দশমিক) { return Number (((BigDecimal(BigInt(s)) / BigDecimal ((Math.pow(10, দশমিক))).toString()) }

ফাংশন toInnerAmount ((n, দশমিক) { return (BigDecimal(n) * BigDecimal(Math.pow(10, দশমিক))).toFixed(0) }

function main (() { // Uniswap কারখানা চুক্তির জন্য নিবন্ধিত ABIexchange.IO("এবি", চুক্তিV3FactoryAddress, abiFactory)

// 注册Uniswap路由合约的ABI
exchange.IO("abi", contractV3SwapRouterV2Address, abiRoute)

// 获取交易对的池地址
var tokenIn = {name : "1INCH", address: "0x111111111117dC0aa78b770fA6A738034120C302", decimals: exchange.IO("api", "0x111111111117dC0aa78b770fA6A738034120C302", "decimals")}
var tokenOut = {name : "WETH", address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", decimals: exchange.IO("api", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "decimals")}
var poolAddress = exchange.IO("api", contractV3FactoryAddress, "getPool", tokenIn.address, tokenOut.address, 10000)

// 注册池合约ABI
exchange.IO("abi", poolAddress, abiPool)

var slot0 = exchange.IO("api", poolAddress, "slot0")
Log("slot0:", slot0)

}


获取到兑换池的价格信息,打印出代码中```slot0```变量:

```javascript
{
    "feeProtocol":0,
    "unlocked":true,
    "sqrtPriceX96":"1128983883551457130720648561",
    "tick":"-85025",
    "observationIndex":5,
    "observationCardinality":6,
    "observationCardinalityNext":6
}

এর মধ্যে মূলত দামের তথ্যের তথ্য রেকর্ড করা হয়sqrtPriceX96ক্ষেত্র, বিনিময় প্যাকেজের টোকেন নির্ভুলতার তথ্যের সাথে বিনিময় পুলের বর্তমান মূল্য গণনা করতে হবে,Uniswapডকুমেন্টেশনে বর্ণনা করা হয়েছে যে আমরা একটি ফাংশন বাস্তবায়ন করি যা গণনা করেঃ

function computePoolPrice(decimals0, decimals1, sqrtPriceX96) {
    // sqrtPriceX96 = sqrt(price) * 2^96
    [decimals0, decimals1, sqrtPriceX96] = [decimals0, decimals1, sqrtPriceX96].map(BigInt);
    const TWO = BigInt(2);
    const TEN = BigInt(10);
    const SIX_TENTH = BigInt(1000000);
    const Q192 = (TWO ** BigInt(96)) ** TWO;
    return (
        Number((sqrtPriceX96 ** TWO * TEN ** decimals0 * SIX_TENTH) / (Q192 * TEN ** decimals1)) /
        Number(SIX_TENTH)
    );
}

এই ফাংশনটি ব্যবহার করে টোকেন সংমিশ্রণ গণনা করা হয়1INCH/WETHএই পুকুরের বর্তমান দাম ১০,০০০ টাকার।

function computePoolPrice(decimals0, decimals1, sqrtPriceX96) {
    // sqrtPriceX96 = sqrt(price) * 2^96
    [decimals0, decimals1, sqrtPriceX96] = [decimals0, decimals1, sqrtPriceX96].map(BigInt);
    const TWO = BigInt(2);
    const TEN = BigInt(10);
    const SIX_TENTH = BigInt(1000000);
    const Q192 = (TWO ** BigInt(96)) ** TWO;
    return (
        Number((sqrtPriceX96 ** TWO * TEN ** decimals0 * SIX_TENTH) / (Q192 * TEN ** decimals1)) /
        Number(SIX_TENTH)
    );
}

function main() {
    var tokenIn = {name : "1INCH", address: "0x111111111117dC0aa78b770fA6A738034120C302", decimals: exchange.IO("api", "0x111111111117dC0aa78b770fA6A738034120C302", "decimals")}
    var tokenOut = {name : "WETH", address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", decimals: exchange.IO("api", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "decimals")}

    // 获取的slot0变量中"sqrtPriceX96":"1128983883551457130720648561",
    var price = computePoolPrice(tokenIn.decimals, tokenOut.decimals, "1128983883551457130720648561")
    Log("price:", price)
}

প্রিন্ট ভেরিয়েবলpriceদেখানো হচ্ছেঃprice: 0.000203(১ ইঞ্চির বিনিময়ে ০.০২০৩ WETH) ।

Uniswap V3 লেনদেনের ক্যাটাগরি

ইনভেন্টররা কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্মের একটি প্যাকেজ প্রকাশ করেছেUniswapটেমপ্লেটএই টেমপ্লেটটি ব্যবহার করে আপনি ওয়েব 3 এর জন্য আরও গভীরভাবে শিখতে এবং অ্যাপ্লিকেশনগুলি বিকাশ করতে পারেন। এই টেমপ্লেট লাইব্রেরিতে ডিজাইনের অনেক তথ্য রয়েছে যা শিখতে হবেঃ

  • স্বয়ংক্রিয়ভাবে টোকেন তথ্য পান এই টেমপ্লেট এর প্যারামিটার যখন একটি টেমপ্লেট এর প্যারামিটারAutoFetchTokensযদি এটি সত্য হয় তবে টেমপ্লেট প্রোগ্রামটি স্বয়ংক্রিয়ভাবে অ্যাক্সেস করবেhttps://tokens.coingecko.com/uniswap/all.jsonলিঙ্ক, প্রাপ্ত এবং স্বয়ংক্রিয়ভাবে সমস্ত টোকেন সম্পর্কিত তথ্য প্রক্রিয়াকরণ। এটি কৌশলগত কোডে ম্যানুয়ালি কোনও টোকেন যুক্ত করার প্রয়োজন ছাড়াই ব্যবহার করা যেতে পারে।addToken(name, address)টোকন যোগ করা হয়েছে) ।

         if (AutoFetchTokens) {
              let res = JSON.parse(HttpQuery("https://tokens.coingecko.com/uniswap/all.json"))
              Log("fetch", res.tokens.length, "tokens from", res.name)
              res.tokens.forEach(function(token) {
                  if (token.chainId == chainId && token.symbol != "WETH") {
                      self.tokenInfo[token.symbol] = {
                          name: token.symbol,
                          decimals: token.decimals,
                          address: token.address
                      }
                  }
              })
          }  
    
  • চেইন সেটিংসের উপর নির্ভর করে বিভিন্ন চুক্তির ঠিকানাগুলির জন্য উপযুক্ত এই টেমপ্লেটটি সেট করা আছেChainTypeপ্যারামিটার, একাধিক চেইন স্যুইচিং সমর্থনঃ

      'https://rpc.ankr.com/eth',
      'https://arb1.arbitrum.io/rpc',
      'https://mainnet.optimism.io/',
      'https://rpc.ankr.com/avalanche',
      'https://polygon-rpc.com',
      'https://rpc.ankr.com/celo',
    

    এখান থেকে একটি ভিডিও দেখুন।

          if (typeof(ChainType) === 'number') {
              let chainRpc = [
                  '',
                  'https://rpc.ankr.com/eth',
                  'https://arb1.arbitrum.io/rpc',
                  'https://mainnet.optimism.io/',
                  'https://rpc.ankr.com/avalanche',
                  'https://polygon-rpc.com',
                  'https://rpc.ankr.com/celo',
                  //'https://mainnet.aurora.dev',
                  //'https://bsc-dataseed.binance.org',
                  //'https://exchainrpc.okex.org'
              ][ChainType]
              if (chainRpc && chainRpc.length > 0) {
                  e.IO("base", chainRpc)
                  Log("change base rpc to", chainRpc)
              }
          }
    

    ইথেরিয়ামের RPC পদ্ধতিeth_chainIdবর্তমান অনুসন্ধানchainIdএবং এর ভিত্তিতেchainIdএই ভিডিওটি WETH এর ঠিকানার সাথে সামঞ্জস্যপূর্ণ।Uniswapএই চুক্তির ঠিকানাঃUSDT(একটি স্মার্ট কন্ট্রাক্টের বিভিন্ন চেইনের ঠিকানা আলাদা হতে পারে) ।

    এখান থেকে একটি ভিডিও দেখুন।

          // https://docs.uniswap.org/contracts/v3/reference/deployments
          let WETHAddress = {
              1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // Ethereum
              3: "0xc778417E063141139Fce010982780140Aa0cD5Ab", // Ropsten
              4: "0xc778417E063141139Fce010982780140Aa0cD5Ab", // Rinkeby
              5: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", // Goerli
              42: "0xd0A1E359811322d97991E03f863a0C30C2cF029C", // Kovan
              10: "0x4200000000000000000000000000000000000006", // Optimism
              69: "0x4200000000000000000000000000000000000006", // Optimistic Kovan
              42161: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", // Arbitrum One
              421611: "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681", // Arbitrum Rinkeby
              137: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", // Polygon
              80001: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", // Polygon Mumbai
          }
    
          let chainId = e.IO("api", "ETH", "eth_chainId")
          if (chainId) {
              chainId = Number(chainId)
              Log("chainId: ", chainId)
              let addr = WETHAddress[chainId]
              if (addr) {
                  Log("Register WETH address", addr)
                  self.addToken("ETH", addr)
              }
              if (chainId == 42220) {
                  // Celo Address
                  ContractV3Factory = '0xAfE208a311B21f13EF87E33A90049fC17A7acDEc'
                  ContractV3SwapRouterV2 = '0x5615CDAb10dc425a742d643d949a7F474C01abc4'
                  self.addToken('CELO', '0x471ece3750da237f93b8e339c536989b8978a438')
              } else if (chainId == 42161) {
                  self.addToken('USDT', '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9')
              }
          } else {
              panic("get chain Id error")
          }
    
  • "Uniswap V3 ট্রেডিং ক্লাস রিপোজিটরি" ব্যবহার করে

    এই টেমপ্লেটে$.testUniswap()ফাংশনটি একটি টেস্ট টেমপ্লেট ফাংশন, যার কোডটি কিভাবে টেমপ্লেটটি ব্যবহার করা যায় তার একটি উদাহরণ দেয়ঃ

    $.testUniswap = function() {
        let ex = $.NewUniswapV3()
        Log("walletAddress: ", ex.walletAddress)
        let tokenAddressMap = {
            "USDT": "0xdac17f958d2ee523a2206206994597c13d831ec7",
            "1INCH": "0x111111111117dC0aa78b770fA6A738034120C302",
            "USDC": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
            "DAI": "0x6b175474e89094c44da98b954eedeac495271d0f",
        }
        for (let name in tokenAddressMap) {
            ex.addToken(name, tokenAddressMap[name])
        }
    
        Log(ex.getPrice('ETH_USDT'))
        Log(ex.getPrice('1INCH_USDT'))
    
        // swap 0.01 ETH to USDT
        Log(ex.swapToken('ETH', 0.01, 'USDT'))
        let usdtBalance = ex.balanceOf('USDT')
        Log("balance of USDT", usdtBalance)
    
        // swap USDT to DAI then DAI to ETH
        Log(ex.swapToken('USDT', usdtBalance, 'DAI,ETH'))
    
        Log("balance of ETH", ex.getETHBalance())
    
        // Log(ex.sendETH('0x11111', 0.02))
        
        // ...
    }
    

    যখন কোনো নীতি "Uniswap V3 লেনদেনের শ্রেণীভান্ডার" ("কিভাবে টেমপ্লেট শ্রেণীভান্ডার উদ্ধৃতি করতে FMZ প্ল্যাটফর্ম ডকুমেন্টেশন দেখুন") উল্লেখ করে, তখন এই টেমপ্লেট শ্রেণীভান্ডারে আবৃত ফাংশনটি কল করা যায়।

    একটি নাম তৈরি করুনex"Uniswap V3 লেনদেনের শ্রেণীভান্ডার" টেমপ্লেটটি কল করে প্যাকেজ করা ইন্টারফেস ফাংশন$.NewUniswapV3()একটি বস্তুর মান নির্ধারণ করুনex

    let ex = $.NewUniswapV3()
    

    ব্যবহারexবস্তুর সদস্য ফাংশনaddToken()টোকন তথ্য যোগ করা হয়েছে।

      let tokenAddressMap = {
          "USDT": "0xdac17f958d2ee523a2206206994597c13d831ec7",
          "1INCH": "0x111111111117dC0aa78b770fA6A738034120C302",
          "USDC": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
          "DAI": "0x6b175474e89094c44da98b954eedeac495271d0f",
      }
      for (let name in tokenAddressMap) {
          ex.addToken(name, tokenAddressMap[name])
      }
    

    আপনি যদি একটি ট্রেড প্যারের বিনিময় পুলের দাম পেতে এবং মুদ্রণ করতে চান তবে এটি ব্যবহার করতে পারেনexবস্তুর সদস্য ফাংশনgetPrice()এই ভিডিওটি একটি ভিডিও।

      Log(ex.getPrice('ETH_USDT'))
      Log(ex.getPrice('1INCH_USDT'))
    

    যদি আপনি একটি রূপান্তর অপারেশন করতে চান, আপনি এটি ব্যবহার করতে পারেনexবস্তুর সদস্য ফাংশনswapToken(), রূপান্তর করুনঃ

      // swap 0.01 ETH to USDT
      Log(ex.swapToken('ETH', 0.01, 'USDT'))
      let usdtBalance = ex.balanceOf('USDT')
      Log("balance of USDT", usdtBalance)
    
      // swap USDT to DAI then DAI to ETH
      Log(ex.swapToken('USDT', usdtBalance, 'DAI,ETH'))
    

উদ্ধার

এই অধ্যায়ে আমরা শিখব কিভাবে ইনভেন্টর কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্ম ব্যবহার করে স্মার্ট কন্ট্রাক্ট রিলিজের ইভেন্টগুলি পড়তে হয়, যা ইথেরিয়ামের ভার্চুয়াল মেশিনের লগগুলিতে সংরক্ষণ করা হয়।

eth_getLogs

ইথেরিয়ামের RPC পদ্ধতি ব্যবহার করে স্মার্ট কন্ট্রাক্ট রিলিজ ইভেন্টগুলি অনুসন্ধান করুনeth_getLogsআমরা ইথেরিয়ামের RPC নোডগুলিকে কীভাবে কল করব সে সম্পর্কে আমাদের পূর্ববর্তী পাঠগুলিতে ব্যাখ্যা করা হয়েছে। উদাহরণস্বরূপ আমরাWETHএফএমজেড ব্যবহার করে চুক্তির ইভেন্টগুলির জন্য কোড লিখতে পারেন।ডিবাগিং সরঞ্জামপরীক্ষা, এক্সচেঞ্জ বস্তু কনফিগার করা হয় RPC নট ইথেরিয়ামের নেটওয়ার্ক নট, কলিংeth_getLogsপদ্ধতিতে আমরা তিনটি প্যারামিটার উল্লেখ করেছি।fromBlocktoBlockaddressআমরা fromBlock এবং toBlock পরামিতি ব্যবহার করে একটি ব্লকের মধ্যে ডেটা অনুসন্ধান করতে পারিঃ

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function toInnerAmount(n, decimals) {
    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}

function main() {
    // getBlockNumber
    var blockNumber = exchange.IO("api", "eth", "eth_blockNumber")
    Log("blockNumber:", blockNumber)

    // get logs
    var fromBlock = "0x" + (toAmount(blockNumber, 0) - 1).toString(16)
    var toBlock = "0x" + toAmount(blockNumber, 0).toString(16)
    var params = {
        "fromBlock" : fromBlock,
        "toBlock" : toBlock,
        "address" : "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"   // WETH合约的地址
    }
    var logs = exchange.IO("api", "eth", "eth_getLogs", params)

    // 由于数据量比较大,如果使用Log函数打印,数据会被截断。使用return将完整数据返回在页面「函数结果」编辑框中
    return logs   
}

লোগের ডেটা পাওয়ার জন্য, আমরা এর একটি অংশ বাদ দিয়েছি কারণ এটিতে প্রচুর ডেটা রয়েছেঃ

[{
	"data": "0x00000000000000000000000000000000000000000000000001c1a55000000000",
	"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80", "0x000000000000000000000000bcb095c1f9c3dc02e834976706c87dee5d0f1fb6"],
	"transactionHash": "0x27f9bf5abe3148169b4b85a83e1de32bd50eb81ecc52e5af006157d93353e4c4",
	"transactionIndex": "0x0",
	"removed": false,
	"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
	"blockHash": "0x847be24a7b159c292bda030a011dfec89487b70e71eed486969b032d6ef04bad",
	"blockNumber": "0x109b1cc",
	"logIndex": "0x0"
}, {
	"data": "0x00000000000000000000000000000000000000000000000008ea20cdea027c00",
	"logIndex": "0x5",
	"topics": ["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c", "0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d"],
	"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
	"blockHash": "0x847be24a7b159c292bda030a011dfec89487b70e71eed486969b032d6ef04bad",
	"blockNumber": "0x109b1cc",
	"removed": false,
	"transactionHash": "0xace3afa02e8af5d1ef6fc1635fbdf7bee37624547937ea5272c23968dd034c09",
	"transactionIndex": "0x1"
},

...

{
	"blockNumber": "0x109b1cd",
	"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
	"data": "0x00000000000000000000000000000000000000000000000002c053531ab8a000",
	"logIndex": "0xd3",
	"removed": false,
	"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582", "0x000000000000000000000000252ba9b5916171dbdadd2cec7f91875a006955d0"],
	"transactionHash": "0x3012b82891f85b077cfe1c12cb9722b93c696ef2c37d67981ccddcc9c3396aca",
	"transactionIndex": "0x8d",
	"blockHash": "0xcd3d567c9bd02a4549b1de0dc638ab5523e847c3c156b096424f56c633000fd9"
}, {
	"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x00000000000000000000000012b791bb27b3a4ee958b5a435fea7d49ec076e9c", "0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],
	"transactionIndex": "0x91",
	"logIndex": "0xdb",
	"removed": false,
	"blockNumber": "0x109b1cd",
	"data": "0x0000000000000000000000000000000000000000000000000164f2434262e1cc",
	"transactionHash": "0x6aa8d80daf42f442591e7530e31323d05e1d6dd9f9f9b9c102e157d89810c048",
	"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
	"blockHash": "0xcd3d567c9bd02a4549b1de0dc638ab5523e847c3c156b096424f56c633000fd9"
}, {
	"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
	"blockHash": "0xcd3d567c9bd02a4549b1de0dc638ab5523e847c3c156b096424f56c633000fd9",
	"blockNumber": "0x109b1cd",
	"logIndex": "0xde",
	"removed": false,
	"topics": ["0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", "0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],
	"data": "0x0000000000000000000000000000000000000000000000000164f2434262e1cc",
	"transactionHash": "0x6aa8d80daf42f442591e7530e31323d05e1d6dd9f9f9b9c102e157d89810c048",
	"transactionIndex": "0x91"
}]

আপনি দেখতে পাচ্ছেন যে লগ ডেটাতে বিভিন্ন ধরণের ঘটনা রয়েছে, যদি আমরা কেবল যত্নবান হইTransferএই তথ্যগুলোকে একটি ঘটনার জন্য ব্যবহার করতে হবে।Transferঘটনাটি ফিল্টার করা হয়েছে।

লগ অনুসন্ধান করুন

ইথেরিয়ামের লগ দুটি অংশে বিভক্ত, ১, বিষয়topics;২, তথ্যdata

  • বিষয়topicsএর সাথেeth_getLogsউদাহরণস্বরূপ, অধ্যায় পরীক্ষার জন্য কোড রানআপ ফলাফল।topicsএই ক্ষেত্রের তথ্য হলঃ

    "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x00000000000000000000000012b791bb27b3a4ee958b5a435fea7d49ec076e9c", "0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],  
    

    এইটাtopics(Subject) ক্ষেত্রের মান একটি অ্যারে কাঠামো যা ঘটনা বর্ণনা করতে ব্যবহৃত হয়। এটি নির্দিষ্ট করে যে এর ((Array) দৈর্ঘ্য 4 এর বেশি হতে পারে না। প্রথম উপাদানটি ইভেন্টের স্বাক্ষর হ্যাশভ্যালু। ইনভেন্টর কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্মে, আমরাEncodeফাংশনটি এই স্বাক্ষরের হ্যাশভ্যালু গণনা করতে পারে নিম্নলিখিত কোডটি ব্যবহার করেঃ

    function main() {
        var eventFunction = "Transfer(address,address,uint256)"
        var eventHash = Encode("keccak256", "string", "hex", eventFunction)
        Log("eventHash:", "0x" + eventHash)
        // eventHash: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
    }
    

    গণনা করাTransfer(address,address,uint256)এরkeccak256হ্যাশ মান (hex কোড) হল0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

    topicsক্ষেত্রের মান একটি অ্যারে গঠন, দ্বিতীয় উপাদান, তৃতীয় উপাদানঃ

    • ঠিকানা পাঠানfrom
    • ঠিকানাto
  • তথ্যdata

    dataএই ক্ষেত্রের তথ্য হলঃ

    "data": "0x0000000000000000000000000000000000000000000000000164f2434262e1cc",
    

    ইভেন্টের কিছু প্যারামিটার (যেগুলো স্মার্ট কন্ট্রাক্টের সলিডিটি কোডের প্যারামিটারগুলির সাথে ইনডেক্সড বিবৃতি নেই)dataএই ভিডিওটি একটি ভিডিও।

    এই তথ্য বিশ্লেষণ0x0000000000000000000000000000000000000000000000000164f2434262e1cc

    function toAmount(s, decimals) {
        return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
    }
    
    function main() {
        var value = "0x0000000000000000000000000000000000000000000000000164f2434262e1cc"
        Log(toAmount(value, 0) / 1e18)  // 0.10047146239950075
    }
    

    এই সংখ্যাটি হলঃ 0.10047146239950075, যা একটি নতুন সংখ্যা।dataএই তথ্যগুলি হল যে পরিমাণ অর্থ স্থানান্তর করা হয়েছে।


এই নিবন্ধে, আমরা আপনার জন্য কিছু টিপস নিয়ে আলোচনা করব, যা আপনার জন্য গুরুত্বপূর্ণ।

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function toInnerAmount(n, decimals) {
    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}

function main() {
    // getBlockNumber
    var blockNumber = exchange.IO("api", "eth", "eth_blockNumber")
    Log("blockNumber:", blockNumber)

    // get logs
    var fromBlock = "0x" + (toAmount(blockNumber, 0) - 1).toString(16)
    var toBlock = "0x" + toAmount(blockNumber, 0).toString(16)
    var params = {
        "fromBlock" : fromBlock,
        "toBlock" : toBlock,
        "address" : "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
    }
    var logs = exchange.IO("api", "eth", "eth_getLogs", params)

    // 遍历logs
    var eventFunction = "Transfer(address,address,uint256)"
    var eventHash = "0x" + Encode("keccak256", "string", "hex", eventFunction)
    Log("eventHash:", eventHash)

    var counter = 0
    for (var i = logs.length - 1; i >= 0 && counter < 10; i--) {
        if (logs[i].topics[0] == eventHash) {
            Log("Event Transfer, data:", toAmount(logs[i].data, 0) / 1e18, ", blockNumber:", toAmount(logs[i].blockNumber, 0), ", transactionHash:", logs[i].transactionHash,
              ", log:", logs[i])
            counter++
        }
    }
}

এদিকেhttps://etherscan.io/প্রশ্নঃ

img

এফএমজেড ডিবাগিং সরঞ্জামটিতে পরীক্ষার কোড চালানোর ফলাফলঃ

img

আপনি আপনার প্রয়োজন অনুযায়ী অনুসন্ধান করতে পারেন।fromtoক্ষেত্রের ডেটা, যেমনঃ

function main() {
    var from = "0x00000000000000000000000012b791bb27b3a4ee958b5a435fea7d49ec076e9c"
    var address = "0x" + exchange.IO("encodePacked", "address", from)
    Log("address:", address)
}

এটি চালানোর ফলাফলঃ

ঠিকানাঃ 0x12b791bb27b3a4ee958b5a435fea7d49ec076e9c

নজরদারি চুক্তির ঘটনা

কারণডিবাগিং সরঞ্জামকোডটি কেবলমাত্র অল্প সময়ের জন্য পরীক্ষা করা যায় এবং কোডটি কার্যকর হওয়ার পরে সামগ্রীটি আউটপুট করা হয়, এটি রিয়েল-টাইমে প্রদর্শিত হয় না, লগ আউটপুট করে।

এখানে আমরা ইথেরিয়ামের ব্যবহার করি, আমরা শোনার জন্য।USDTএই মুদ্রা চুক্তিTransfer(address,address,uint256)ঘটনা, যা আমরা গত ক্লাসে শিখেছি তার উপর ভিত্তি করে, আমরা একটি উদাহরণ তৈরি করেছি যেখানে আমরা একটি স্মার্ট কন্ট্রাক্ট ইভেন্টের উপর ক্রমাগত নজর রাখিঃ

function toAmount(s, decimals) {
    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}

function toInnerAmount(n, decimals) {
    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}

function addEventListener(contractAddress, event, callBack) {
    var self = {}
    self.eventHash = "0x" + Encode("keccak256", "string", "hex", event)
    self.contractAddress = contractAddress
    self.latestBlockNumber = 0
    self.fromBlockNumber = 0
    self.firstBlockNumber = 0
    /* TODO: test
    self.isFirst = true 
    */ 

    self.getBlockNumber = function() {
        var maxTry = 10
        for (var i = 0; i < maxTry; i++) {
            var ret = exchange.IO("api", "eth", "eth_blockNumber")
            if (ret) {
                return toAmount(ret, 0)
            }
            Sleep(5000)
        }
        throw "getBlockNumber failed"
    }

    self.run = function() {
        var currBlockNumber = self.getBlockNumber()
        var fromBlock = "0x" + self.fromBlockNumber.toString(16)
        var toBlock = "0x" + currBlockNumber.toString(16)
        var params = {

আরো