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 }