name:
var contractV3FactoryAddress =
ফাংশন 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
টেমপ্লেটএই টেমপ্লেটটি ব্যবহার করে আপনি ওয়েব 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'))
এই অধ্যায়ে আমরা শিখব কিভাবে ইনভেন্টর কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্ম ব্যবহার করে স্মার্ট কন্ট্রাক্ট রিলিজের ইভেন্টগুলি পড়তে হয়, যা ইথেরিয়ামের ভার্চুয়াল মেশিনের লগগুলিতে সংরক্ষণ করা হয়।
ইথেরিয়ামের RPC পদ্ধতি ব্যবহার করে স্মার্ট কন্ট্রাক্ট রিলিজ ইভেন্টগুলি অনুসন্ধান করুনeth_getLogs
আমরা ইথেরিয়ামের RPC নোডগুলিকে কীভাবে কল করব সে সম্পর্কে আমাদের পূর্ববর্তী পাঠগুলিতে ব্যাখ্যা করা হয়েছে।
উদাহরণস্বরূপ আমরাWETH
এফএমজেড ব্যবহার করে চুক্তির ইভেন্টগুলির জন্য কোড লিখতে পারেন।ডিবাগিং সরঞ্জামপরীক্ষা, এক্সচেঞ্জ বস্তু কনফিগার করা হয় 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
ঘটনাটি ফিল্টার করা হয়েছে।
ইথেরিয়ামের লগ দুটি অংশে বিভক্ত, ১, বিষয়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/
প্রশ্নঃ
এফএমজেড ডিবাগিং সরঞ্জামটিতে পরীক্ষার কোড চালানোর ফলাফলঃ
আপনি আপনার প্রয়োজন অনুযায়ী অনুসন্ধান করতে পারেন।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 = {