diff --git a/packages/sdk-js/src/DidHelpers/checkResult.ts b/packages/sdk-js/src/DidHelpers/checkResult.ts index c71e8d5fd..cb8e545bc 100644 --- a/packages/sdk-js/src/DidHelpers/checkResult.ts +++ b/packages/sdk-js/src/DidHelpers/checkResult.ts @@ -112,21 +112,23 @@ function checkStatus(result: SubmittableResultValue): { } async function resolveBlockAndEvents( - result: { blockHash: HexString; txHash: HexString }, + blockInfo: { blockHash: HexString; txHash: HexString }, api: ApiPromise ): Promise<{ blockNumber: BigInt blockHash: HexString txEvents: EventRecord[] }> { - const txHashHash = api.createType('Hash', result.blockHash) + const txHashHash = api.createType('Hash', blockInfo.blockHash) const { block: { block }, events, } = await api.derive.tx.events(txHashHash) const blockNumber = block.header.number.toBigInt() - const { blockHash } = result - const txIndex = block.extrinsics.findIndex((tx) => tx.hash.eq(result.txHash)) + const { blockHash } = blockInfo + const txIndex = block.extrinsics.findIndex((tx) => + tx.hash.eq(blockInfo.txHash) + ) const txEvents = events.filter( ({ phase }) => phase.isApplyExtrinsic && phase.asApplyExtrinsic.eqn(txIndex) ) @@ -223,6 +225,15 @@ export async function checkResultImpl( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion block: { hash: blockHash!, number: blockNumber! }, events: txEvents.map(({ event }) => event), + toJSON() { + const clone = { ...this } as any + clone.block = { + ...clone.block, + number: clone.block.number.toString(), + } + delete clone.toJSON + return clone + }, } }, get asUnknown(): TransactionResult['asUnknown'] { @@ -251,6 +262,46 @@ export async function checkResultImpl( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion block: { hash: blockHash!, number: blockNumber! }, events: txEvents.map(({ event }) => event), + toJSON() { + const clone = { ...this } as any + clone.block = { + ...clone.block, + number: clone.block.number.toString(), + } + delete clone.toJSON + return clone + }, + } + }, + toJSON() { + switch (status) { + case 'confirmed': { + return { + status, + value: (this as TransactionResult).asConfirmed.toJSON(), + } + } + case 'failed': { + return { + status, + value: (this as TransactionResult).asFailed.toJSON(), + } + } + case 'rejected': { + return { + status, + value: (this as TransactionResult).asRejected, + } + } + case 'unknown': { + return { + status, + value: (this as TransactionResult).asUnknown, + } + } + default: { + throw new Error('invalid status') + } } }, } diff --git a/packages/sdk-js/src/DidHelpers/interfaces.ts b/packages/sdk-js/src/DidHelpers/interfaces.ts index 4c91ad866..72db1a80b 100644 --- a/packages/sdk-js/src/DidHelpers/interfaces.ts +++ b/packages/sdk-js/src/DidHelpers/interfaces.ts @@ -26,6 +26,7 @@ export interface TransactionResult { didDocument: DidDocument block: { hash: HexString; number: BigInt } events: GenericEvent[] + toJSON: () => any } asFailed: { error: Error @@ -34,6 +35,7 @@ export interface TransactionResult { didDocument?: DidDocument block: { hash: HexString; number: BigInt } events: GenericEvent[] + toJSON: () => any } asRejected: { error: Error @@ -45,6 +47,7 @@ export interface TransactionResult { error: Error txHash: HexString } + toJSON: () => any } export interface TransactionHandlers { diff --git a/packages/sdk-js/src/DidHelpers/transact.spec.ts b/packages/sdk-js/src/DidHelpers/transact.spec.ts index 378eb1f27..3101a6fcc 100644 --- a/packages/sdk-js/src/DidHelpers/transact.spec.ts +++ b/packages/sdk-js/src/DidHelpers/transact.spec.ts @@ -80,18 +80,17 @@ describe('transact', () => { expect(parsed.method).toHaveProperty('section', 'did') expect(parsed.method).toHaveProperty('method', 'submitDidCall') - await expect( - checkResult( - new SubmittableResult({ - blockNumber: mockedApi.createType('BlockNumber', 1000), - status: mockedApi.createType('ExtrinsicStatus', { - inBlock: new Uint8Array(32).fill(2), - }), - txHash: parsed.hash, - events: makeAttestationCreatedEvents([[]]), - }) - ) - ).resolves.toMatchObject>({ + const result = await checkResult( + new SubmittableResult({ + blockNumber: mockedApi.createType('BlockNumber', 1000), + status: mockedApi.createType('ExtrinsicStatus', { + inBlock: new Uint8Array(32).fill(2), + }), + txHash: parsed.hash, + events: makeAttestationCreatedEvents([[]]), + }) + ) + expect(result).toMatchObject>({ status: 'confirmed', asConfirmed: expect.objectContaining({ txHash: parsed.hash.toHex(), @@ -103,5 +102,17 @@ describe('transact', () => { }, }), }) + // TODO move serialzation test to `checkResult.spec.ts` once created and + // test the `asFailed` case. + const confirmed = result.asConfirmed + expect(typeof confirmed.block.number).toBe('bigint') + const resultStringified = JSON.stringify(confirmed) + const resultRebuiltObj = JSON.parse(resultStringified) + expect(BigInt(resultRebuiltObj.block.number)).toBe(BigInt(1000)) + expect(typeof confirmed.block.number).toBe('bigint') + expect(result.toJSON()).toStrictEqual({ + status: 'confirmed', + value: confirmed.toJSON(), + }) }) })