From a99c2dda55e0e496290ab80a49751dc9bd1a5839 Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Sun, 14 Apr 2024 17:34:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0event=20to=20scription?= =?UTF-8?q?=E7=9A=84=E8=BD=AC=E6=8D=A2=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/event_list.json | 53 ++++----------------------- src/chain/chain.api.ts | 12 +++++-- src/models/TreasureHunt.ts | 58 ++++++++++++++++++++++++++++++ src/service/event.batch.service.ts | 6 +++- 4 files changed, 80 insertions(+), 49 deletions(-) create mode 100644 src/models/TreasureHunt.ts diff --git a/config/event_list.json b/config/event_list.json index b432937..d8e752b 100644 --- a/config/event_list.json +++ b/config/event_list.json @@ -1,50 +1,11 @@ [ + { - "chain": 421614, - "address": "0xCD4bb3402f1a444a1AF10F31946Ed37DaC0eaC4d", - "event": "Transfer", - "abi": "ERC721_Transfer", - "fromBlock": 3549077, - "eventProcesser": "NftHolder" - }, - { - "chain": 421614, - "address": "0x6a673D946a976776fd5F163d9d831b2fEB600015", - "event": "Transfer", - "abi": "ERC721_Transfer", - "fromBlock": 5814045, - "eventProcesser": "NftHolder" - }, - { - "chain": 421614, - "address": "0x7b6399DFbed8Bc46F6A498C6B1040E80c2B5C4bc", - "event": "Transfer", - "abi": "ERC721_Transfer", - "fromBlock": 5814491, - "eventProcesser": "NftHolder" - }, - { - "chain": 421614, - "address": "0xe2E4D5a4045fBFcbCBECAf5b8A94303712d2FA97", - "event": "Transfer", - "abi": "ERC721_Transfer", - "fromBlock": 3549613, - "eventProcesser": "NftHolder" - }, - { - "chain": 421614, - "address": "0xd46fA2E72BA0F54092D0eF6a6e0D1d5660259C7a", - "event": "Staked", - "abi": "NFT_Stake", - "fromBlock": 3549891, - "eventProcesser": "NftStake" - }, - { - "chain": 421614, - "address": "0xd46fA2E72BA0F54092D0eF6a6e0D1d5660259C7a", - "event": "Redeem", - "abi": "NFT_Redeem", - "fromBlock": 3549891, - "eventProcesser": "NftStake" + "chain": 5611, + "address": "0x0Fd13D2CD0B6c679B6f92590E0b91C18DDe7BD3A", + "event": "ActionEvent", + "abi": "TreasureHunt", + "fromBlock": 26202217, + "eventProcesser": "GeneralEvent" } ] \ No newline at end of file diff --git a/src/chain/chain.api.ts b/src/chain/chain.api.ts index c0e5784..d85f53e 100644 --- a/src/chain/chain.api.ts +++ b/src/chain/chain.api.ts @@ -36,8 +36,16 @@ export const retryEthBlockNumber = async (rpc: string) => { return res } -export const ethGetBlockByNumber = async (rpc: string, blockNumber: string) => { - return requestChain(rpc, 'eth_getBlockByNumber', [blockNumber, true]) +export const retryEthGetBlockByNumber = async (rpc: string, blockNumber: string, all = true) => { + const res = await retry(() => ethGetBlockByNumber(rpc, blockNumber, all), { maxRetries: 3, whitelistErrors: [] }) + if (res.error) { + throw new Error(res.error.message) + } + return res +} + +export const ethGetBlockByNumber = async (rpc: string, blockNumber: string, all = true) => { + return requestChain(rpc, 'eth_getBlockByNumber', [blockNumber, all]) } export const ethGetLogs = async (rpc: string, params: any) => { diff --git a/src/models/TreasureHunt.ts b/src/models/TreasureHunt.ts new file mode 100644 index 0000000..3509625 --- /dev/null +++ b/src/models/TreasureHunt.ts @@ -0,0 +1,58 @@ +import { CheckIn } from "./CheckIn" +import { ChestRecord } from "./ChestRecord" +import { GeneralScription } from "./GeneralScription" +import Web3 from 'web3' + +const ops = { + '1': 'check', + '2': 'explore', + '3': 'chest_enhance', + '4': 'chest_open', + '5': 'task_claim' +} + +const nexts = { + '1': CheckIn, + '2': GeneralScription, + '3': GeneralScription, + '4': ChestRecord, + '5': GeneralScription +} + +const inputs = { + '1': 'data:,{"p":"cf-20","op":"check"}', + '2': 'data:,{"p":"cf-20","op":"explore","val":"${val}"}', + '3': 'data:,{"p":"cf-20","op":"chest_enhance","val":"${val}"}', + '4': 'data:,{"p":"cf-20","op":"chest_open","id":"${val}', + '5': 'data:,{"p":"cf-20","op":"task_claim","val":"${val}"}' +} +export class TreasureHunt { + public static async saveEvent(event: any) { + const hash = event.hash || event.transactionHash + let {user, action, value} = event.decodedData + + let eventScription = { + hash, + "blockHash" : event.blockHash, + "blockNumber" : event.blockNumber, + "blockTime" : event.blockTime, + "from" : user, + "input" : "", + "op" : ops[action], + "to" : event.address, + "value" : "0x0" + } + if (action === '2' || action === '5') { + let val = Web3.utils.numberToHex(value).replace('0x', '') + // convert value from hex to base64 + value = Buffer.from(value.slice(2), 'hex').toString('base64') + eventScription.input = inputs[action].replace('${val}', val) + } else if (action === '3' || action === '4') { + let val = Web3.utils.numberToHex(value).replace('0x', '') + eventScription.input = inputs[action].replace('${val}', val) + } else { + eventScription.input = inputs[action] + } + await nexts[action].saveEvent(eventScription) + } +} \ No newline at end of file diff --git a/src/service/event.batch.service.ts b/src/service/event.batch.service.ts index d87ad40..644d120 100644 --- a/src/service/event.batch.service.ts +++ b/src/service/event.batch.service.ts @@ -1,5 +1,5 @@ import { IChain } from 'chain/allchain' -import { batchEthLogs, ethGetLogs, retryEthBlockNumber } from 'chain/chain.api' +import { batchEthLogs, ethGetBlockByNumber, ethGetLogs, retryEthBlockNumber, retryEthGetBlockByNumber } from 'chain/chain.api' import logger from 'logger/logger' import { GeneralEvent } from 'models/GeneralEvent' @@ -10,6 +10,7 @@ import { TokenHolder } from 'models/TokenHolder' import { NftStake } from 'models/NftStake' import { IEventCfg } from 'interface/IEventCfg' import { ZRedisClient } from 'zutils' +import { formatDate } from 'utils/utcdate.util' let eventProcessers = { NftHolder: NftHolder, @@ -184,6 +185,9 @@ export class EventBatchSvr { let result = decodeEvent(cfg.abi, event) // cfg.fromBlock = Math.max (parseInt(event.blockNumber, 16) + 1, cfg.fromBlock) event.decodedData = result + let res = await retryEthGetBlockByNumber(this.rpc, event.blockNumber, false) + event.blockTime = parseInt(res.result.timestamp, 16) + event.dateTag = formatDate(new Date(event.blockTime * 1000)) const record = await GeneralEvent.saveEvent(event) blockNumber = Math.max(parseInt(event.blockNumber, 16), cfg.fromBlock) if (cfg.eventProcesser && eventProcessers[cfg.eventProcesser]) {