48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
|
import { HandleEvmLogsConfig } from "./HandleEvmLogs";
|
||
|
import { EvmTransaction, TransactionFound } from "../../entities";
|
||
|
|
||
|
/**
|
||
|
* Handling means mapping and forward to a given target.
|
||
|
* As of today, we have mapped this event evmFailedRedeemed, evmStandardRelayDelivered and evmTransferRedeemed.
|
||
|
*/
|
||
|
export class HandleEvmTransactions<T> {
|
||
|
cfg: HandleEvmLogsConfig;
|
||
|
mapper: (log: EvmTransaction) => T;
|
||
|
target: (parsed: T[]) => Promise<void>;
|
||
|
|
||
|
constructor(
|
||
|
cfg: HandleEvmLogsConfig,
|
||
|
mapper: (log: EvmTransaction) => T,
|
||
|
target: (parsed: T[]) => Promise<void>
|
||
|
) {
|
||
|
this.cfg = this.normalizeCfg(cfg);
|
||
|
this.mapper = mapper;
|
||
|
this.target = target;
|
||
|
}
|
||
|
|
||
|
public async handle(transactions: EvmTransaction[]): Promise<T[]> {
|
||
|
const mappedItems = transactions.map((transaction) => {
|
||
|
return this.mapper(transaction);
|
||
|
}) as TransactionFound[];
|
||
|
|
||
|
const filterItems = mappedItems.filter(
|
||
|
(transaction) => transaction.methodsByAddress || transaction.name
|
||
|
) as T[];
|
||
|
|
||
|
await this.target(filterItems);
|
||
|
|
||
|
// TODO: return a result specifying failures if any
|
||
|
return filterItems;
|
||
|
}
|
||
|
|
||
|
private normalizeCfg(cfg: HandleEvmLogsConfig): HandleEvmLogsConfig {
|
||
|
return {
|
||
|
filter: {
|
||
|
addresses: cfg.filter.addresses.map((addr) => addr.toLowerCase()),
|
||
|
topics: cfg.filter.topics.map((topic) => topic.toLowerCase()),
|
||
|
},
|
||
|
abi: cfg.abi,
|
||
|
};
|
||
|
}
|
||
|
}
|