增加event to scription的转换方法

This commit is contained in:
CounterFire2023 2024-04-14 17:34:29 +08:00
parent de85530295
commit a99c2dda55
4 changed files with 80 additions and 49 deletions

View File

@ -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"
}
]

View File

@ -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) => {

View File

@ -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)
}
}

View File

@ -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]) {