name:
var contractV3FactoryAddress =
فنکشن 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
ٹیمپلیٹاس ٹیمپلیٹ کے ذریعہ ویب 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
ایتھرینم آر پی سی نوڈس کو کال کرنے کے بارے میں ہم نے پچھلے سبق میں بتایا ہے۔
مثال کے طور پر، ہم حاصل کرتے ہیںWETH
معاہدے کے واقعات کوڈ میں لکھا جا سکتا ہے، FMZ کا استعمال کرتے ہوئےڈیبگ ٹولزٹیسٹ، ایکسچینج اشیاء کی ترتیب RPC نوڈس ایتھروئن نیٹ ورک کے نوڈس کے طور پر، کال کر رہے ہیںeth_getLogs
ہم نے تین پیرامیٹرز کو اس طریقہ کار میں دیا ہے.fromBlock
、toBlock
、address
ہم نے 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، موضوعtopics
2، اعداد و شمارdata
。
موضوعtopics
eth_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/
سوال:
ایف ایم زیڈ ڈیبگنگ ٹول میں ٹیسٹ کوڈ کے نتائج:
آپ کو اپنی مرضی کے مطابق تلاش کر سکتے ہیں.from
,to
اعداد و شمار کے شعبوں کے لئے، مثال کے طور پر:
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 = {