bitcore-node
Version:
A blockchain indexing node with extended capabilities using bitcore
36 lines (32 loc) • 1.37 kB
text/typescript
import Web3 from 'web3';
import { MongoBound } from '../../../../models/base';
import { TransformWithEventPipe } from '../../../../utils/streamWithEventPipe';
import { IEVMTransactionInProcess, IEVMTransactionTransformed } from '../types';
export class Erc20RelatedFilterTransform extends TransformWithEventPipe {
constructor(private tokenAddress: string) {
super({ objectMode: true });
}
async _transform(tx: MongoBound<IEVMTransactionInProcess>, _, done) {
this.tokenAddress = Web3.utils.toChecksumAddress(this.tokenAddress)
if (tx.effects && tx.effects.length) {
// Get all effects where contractAddress is tokenAddress
const tokenRelatedInternalTxs = tx.effects.filter(
(effect: any) => effect.contractAddress === this.tokenAddress
);
// Create a tx object for each erc20 transfer
for (let internalTx of tokenRelatedInternalTxs) {
const _tx: IEVMTransactionTransformed = Object.assign({}, tx);
_tx.value = Number(internalTx.amount);
_tx.to = internalTx.to;
_tx.from = internalTx.from;
if (internalTx.from != tx.from) {
_tx.initialFrom = tx.from
}
// This is how a requester can verify uniqueness in light of duplicated txids
_tx.callStack = internalTx.callStack;
this.push(_tx);
}
}
return done();
}
}