وسائل لوڈ ہو رہے ہیں... لوڈنگ...

ایف ایم زیڈ کا استعمال کرتے ہوئے ایتھرون پر مبنی ویب 3 کی ترقی میں آسان تعارف

مصنف:ایجاد کاروں کی مقدار - خواب, تخلیق: 2023-03-28 13:32:48, تازہ کاری: 2024-11-11 22:28:24

name:token,type:addressname:approveZeroThenMax,outputs:[],stateMutability:payable,type:bytefunction,{inputs:[],stateMutability:payable,type:function}،{inputs:[internalType:payable,type:functioninputs:[internalType:address,name:token,type:addressname:approveZeroThenMaxMinusOne,outputs:[],stateMutability:payable,type:bytefunction,{inputs:[],stateMutability:payable,type:type:type:,type:type,type,type,add-add var abiPool = [inputs:[],stateMutability:nonpayable,type:constructor},{anonymous:true,internalType:int24,inputs:[indexed:true,internalType:address,name:owner,type:address},{indexed:true,internalType:inputs:[],stateMutability:nonpayable,type:int24},{anonymous:true,internalType:int24,inputs:[inputs:true,addaddaddaddadd:true,internalType:address:address,name:owner,type:type:add:add:add:add:true, var abiFactory = [{inputs:[],stateMutability:nonpayable,type:int24},{anonymous:false,inputs:[{indexed:true,internalType:uint24,name:fee,type:uint24},{indexed:true,internalType:int24,name:tickSpacing,type:int24},{anonymous:FeeAuntmobled,type:false,inputs:[addaddaddaddaddaddaddaddaddadd:true,internalType:uint24,name:inputs,name:fee,type:uint24},{indexed:true,internalType:type:uint24,

var contractV3FactoryAddress = 0x1F98431c8aD98523631AE4a59f267346ea31F984 var contractV3SwapRouterV2Address = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45

فنکشن toAmount ((s، اعشاریہ) { واپسی نمبر (((BigDecimal(BigInt(s)) / BigDecimal ((Math.pow(10, اعشاریہ))).toString()) }

فنکشن toInnerAmount ((n، اعشاریہ) { واپسی (بگ ڈیسیمل ((ن) * بگ ڈیسیمل ((ریاضی.پو ((10, اعشاریہ))).toFixed(0) }

function main (() { // یونیسواپ فیکٹری کے معاہدے میں رجسٹرڈ ABIexchange.IO("اے بی آئی، معاہدہ وی 3 فیکٹری ایڈریس، اے بی آئی فیکٹری")

// 注册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(ایک انچ کے بدلے 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)
              }
          }
    

    ایتھرین کو کال کرنے کا آر پی سی طریقہeth_chainIdتلاش جاری ہےchainIdاور پھرchainIdاس کے علاوہ، ہم نے اپنے صارفین کے لئے ایک نیا ورژن بھی بنایا ہے.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 ٹرانزیکشن کلاس لائبریری" کا حوالہ دیتی ہے (فیمز پلیٹ فارم دستاویزات کا حوالہ دیتے ہوئے ٹیمپلیٹ کلاس لائبریری کا حوالہ کیسے دیا جائے) ، تو اس ٹیمپلیٹ کلاس لائبریری میں لپیٹے ہوئے فنکشن کو بلایا جاسکتا ہے۔

    ایک ویب سائٹ بنانا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

ایتھرین کے آر پی سی کے طریقوں کا استعمال کرتے ہوئے ہوشیار معاہدے کی رہائی کے واقعات کی تلاشeth_getLogsایتھرینم آر پی سی نوڈس کو کال کرنے کے بارے میں ہم نے پچھلے سبق میں بتایا ہے۔ مثال کے طور پر، ہم حاصل کرتے ہیںWETHمعاہدے کے واقعات کوڈ میں لکھا جا سکتا ہے، FMZ کا استعمال کرتے ہوئےڈیبگ ٹولزٹیسٹ، ایکسچینج اشیاء کی ترتیب 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اس واقعے کو فلٹر کیا گیا ہے۔

تلاش کریں

ایتھرین لاگ ان دو حصوں میں تقسیم کیا گیا ہے: 1، موضوعtopics2، اعداد و شمارdata

  • موضوعtopicseth_getLogsاس کے علاوہ ، یہ بھی ممکن ہے کہ آپ کو اپنے آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے۔topicsاس فیلڈ میں درج ذیل اعداد و شمار ہیں:

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

    یہtopics(موضوع) فیلڈ کی قدر ایک صفاتی ڈھانچہ ہے جو واقعات کو بیان کرنے کے لئے استعمال ہوتا ہے۔ اس کی وضاحت کی گئی ہے کہ اس کی ((صفات) لمبائی 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ہیش ویلیو (ہیکس کوڈ)0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

    topicsفیلڈ کی قدر ایک صفاتی ڈھانچہ ہے ، دوسرا عنصر ، تیسرا عنصر:

    • ایڈریس بھیجیںfrom
    • وصولی کا پتہto
  • اعداد و شمارdata

    dataاس فیلڈ میں درج ذیل اعداد و شمار ہیں:

    "data": "0x0000000000000000000000000000000000000000000000000164f2434262e1cc",
    

    اس واقعے میں کچھ پیرامیٹرز (جو کہ سمارٹ معاہدے کے Solidity کوڈ میں بغیر انڈیکس کردہ بیانات کے ہیں) کو محفوظ کیا جاتا ہے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 = {

مزید