diff --git a/src/parsers.ts b/src/parsers.ts index 6e68b76..dabca8c 100644 --- a/src/parsers.ts +++ b/src/parsers.ts @@ -23,9 +23,15 @@ export function parseRawEvents( return { latestLedger: r.latestLedger, events: (r.events ?? []).map((evt) => { + const clone: Omit = { ...evt }; + delete (clone as any).contractId; // `as any` hack because contractId field isn't optional + + // the contractId may be empty so we omit the field in that case return { - ...evt, - contractId: new Contract(evt.contractId), + ...clone, + ...(evt.contractId !== '' && { + contractId: new Contract(evt.contractId) + }), topic: evt.topic.map((topic) => xdr.ScVal.fromXDR(topic, 'base64')), value: xdr.ScVal.fromXDR(evt.value.xdr, 'base64') }; diff --git a/src/soroban_rpc.ts b/src/soroban_rpc.ts index 6f90fd4..a0f9dc1 100644 --- a/src/soroban_rpc.ts +++ b/src/soroban_rpc.ts @@ -146,7 +146,7 @@ export namespace SorobanRpc { } interface EventResponse extends BaseEventResponse { - contractId: Contract; + contractId?: Contract; topic: xdr.ScVal[]; value: xdr.ScVal; } diff --git a/test/unit/server/get_events_test.js b/test/unit/server/get_events_test.js index 8beee19..1649b28 100644 --- a/test/unit/server/get_events_test.js +++ b/test/unit/server/get_events_test.js @@ -66,6 +66,7 @@ describe('Server#getEvents', function () { }) .then(function (response) { expect(response).to.be.deep.equal(parseEvents(result)); + expect(response.events[0].contractId).to.be.undefined; done(); }) .catch(done); @@ -238,7 +239,7 @@ let getEventsResponseFixture = [ type: 'system', ledger: '1', ledgerClosedAt: '2022-11-16T16:10:41Z', - contractId, + contractId: '', id: '0164090849041387521-0000000003', pagingToken: '164090849041387521-3', inSuccessfulContractCall: true,