diff --git a/yarn-project/foundation/src/log/bigint-utils.ts b/yarn-project/foundation/src/log/bigint-utils.ts index 6cc94101ac2f..c9083ec1bfd0 100644 --- a/yarn-project/foundation/src/log/bigint-utils.ts +++ b/yarn-project/foundation/src/log/bigint-utils.ts @@ -11,6 +11,9 @@ export function convertBigintsToStrings(obj: unknown): unknown { } if (obj !== null && typeof obj === 'object') { + if (typeof (obj as any).toJSON === 'function') { + return convertBigintsToStrings((obj as any).toJSON()); + } const result: Record = {}; for (const key in obj) { result[key] = convertBigintsToStrings((obj as Record)[key]); diff --git a/yarn-project/foundation/src/log/pino-logger.test.ts b/yarn-project/foundation/src/log/pino-logger.test.ts index 9881535d4f58..22afc9e6a293 100644 --- a/yarn-project/foundation/src/log/pino-logger.test.ts +++ b/yarn-project/foundation/src/log/pino-logger.test.ts @@ -273,6 +273,35 @@ describe('pino-logger', () => { }); }); + it('serializes objects with toJSON() instead of dumping raw properties', () => { + const testLogger = createLogger('tojson-test'); + capturingStream.clear(); + + // Simulate an EthAddress-like object with an internal buffer and a toJSON method + const addressLike = { + buffer: Buffer.from('1234567890abcdef1234567890abcdef12345678', 'hex'), + toJSON() { + return '0x1234567890abcdef1234567890abcdef12345678'; + }, + }; + + testLogger.info('address logging test', { + validator: addressLike, + nested: { addr: addressLike }, + array: [addressLike], + plainString: 'hello', + }); + + const entries = capturingStream.getJsonLines(); + expect(entries).toHaveLength(1); + expect(entries[0]).toMatchObject({ + validator: '0x1234567890abcdef1234567890abcdef12345678', + nested: { addr: '0x1234567890abcdef1234567890abcdef12345678' }, + array: ['0x1234567890abcdef1234567890abcdef12345678'], + plainString: 'hello', + }); + }); + it('returns bindings via getBindings', () => { const testLogger = createLogger('bindings-test', { actor: 'main', instanceId: 'id-123' }); const bindings = testLogger.getBindings(); diff --git a/yarn-project/slasher/src/tally_slasher_client.ts b/yarn-project/slasher/src/tally_slasher_client.ts index 70ef6fdfeeb6..d95d565746a8 100644 --- a/yarn-project/slasher/src/tally_slasher_client.ts +++ b/yarn-project/slasher/src/tally_slasher_client.ts @@ -349,15 +349,11 @@ export class TallySlasherClient implements ProposerSlashActionProvider, SlasherC return undefined; } - const offensesToSlashLog = offensesToSlash.map(offense => ({ - ...offense, - amount: offense.amount.toString(), - })); this.log.info(`Voting to slash ${offensesToSlash.length} offenses`, { slotNumber, currentRound, slashedRound, - offensesToSlash: offensesToSlashLog, + offensesToSlash, }); const committees = await this.collectCommitteesActiveDuringRound(slashedRound);