github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/js/src/contracts/event.ts (about)

     1  import { EventFragment, FormatTypes, Interface, LogDescription } from '@ethersproject/abi';
     2  import { Keccak } from 'sha3';
     3  import { Client } from '../client';
     4  import { postDecodeResult, prefixedHexString } from '../convert';
     5  import { Bounds, EventStream, isEndOfStream } from '../events';
     6  
     7  export type EventCallback = (err?: Error, result?: LogDescription) => void;
     8  
     9  export function listen(
    10    iface: Interface,
    11    frag: EventFragment,
    12    address: string,
    13    burrow: Client,
    14    callback: EventCallback,
    15    start: Bounds = 'latest',
    16    end: Bounds = 'stream',
    17  ): EventStream {
    18    const signature = sha3(frag.format(FormatTypes.sighash));
    19  
    20    return burrow.listen(
    21      [signature],
    22      address,
    23      (err, event) => {
    24        if (err) {
    25          return isEndOfStream(err) ? undefined : callback(err);
    26        }
    27        const log = event?.log;
    28        if (!log) {
    29          return callback(new Error(`no LogEvent or Error provided`));
    30        }
    31        try {
    32          const result = iface.parseLog({
    33            topics: log.topics.map((topic) => prefixedHexString(topic)),
    34            data: prefixedHexString(log.data),
    35          });
    36          return callback(undefined, {
    37            ...result,
    38            args: postDecodeResult(result.args, frag.inputs),
    39          });
    40        } catch (err) {
    41          return callback(err);
    42        }
    43      },
    44      start,
    45      end,
    46    );
    47  }
    48  
    49  function sha3(str: string) {
    50    return new Keccak(256).update(str).digest('hex').toUpperCase();
    51  }