diff --git a/packages/xrpl/HISTORY.md b/packages/xrpl/HISTORY.md index 2ef3dc68a4..abc9c351d6 100644 --- a/packages/xrpl/HISTORY.md +++ b/packages/xrpl/HISTORY.md @@ -33,6 +33,7 @@ Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xr * Remove `lodash` as a dependency * Remove many polyfills that were only used for testing in the browser * Remove `util` from bundle by switching `inspect` to `JSON.stringify` +* Add type for metadata for specific transactions(`Payment`, `NFTokenMint`, `NFTokenCreateOffer`, `NFTokenAcceptOffer`, `NFTokenCancelOffer`) ### Fixed * Fixed Wallet.generate() ignoring the `algorithm` parameter (Only a problem once binary-codec fix for `derive_keypair` is added) diff --git a/packages/xrpl/src/models/methods/tx.ts b/packages/xrpl/src/models/methods/tx.ts index 3eeffa63b0..c34505db60 100644 --- a/packages/xrpl/src/models/methods/tx.ts +++ b/packages/xrpl/src/models/methods/tx.ts @@ -51,7 +51,7 @@ export interface TxResponse< ledger_index?: number /** Transaction metadata, which describes the results of the transaction. * Can be undefined if a transaction has not been validated yet. */ - meta?: TransactionMetadata | string + meta?: TransactionMetadata | string /** * If true, this data comes from a validated ledger version; if omitted or. * Set to false, this data is not final. diff --git a/packages/xrpl/src/models/transactions/NFTokenAcceptOffer.ts b/packages/xrpl/src/models/transactions/NFTokenAcceptOffer.ts index 1d4de2a9e3..1a33f46e5f 100644 --- a/packages/xrpl/src/models/transactions/NFTokenAcceptOffer.ts +++ b/packages/xrpl/src/models/transactions/NFTokenAcceptOffer.ts @@ -6,6 +6,7 @@ import { parseAmountValue, validateBaseTransaction, } from './common' +import type { TransactionMetadataBase } from './metadata' /** * The NFTokenOfferAccept transaction is used to accept offers @@ -64,6 +65,11 @@ export interface NFTokenAcceptOffer extends BaseTransaction { NFTokenBrokerFee?: Amount } +export interface NFTokenAcceptOfferMetadata extends TransactionMetadataBase { + // rippled 1.11.0 or later + nftoken_id?: string +} + function validateNFTokenBrokerFee(tx: Record): void { const value = parseAmountValue(tx.NFTokenBrokerFee) if (Number.isNaN(value)) { diff --git a/packages/xrpl/src/models/transactions/NFTokenCancelOffer.ts b/packages/xrpl/src/models/transactions/NFTokenCancelOffer.ts index 367cc2957b..b0b8bcd228 100644 --- a/packages/xrpl/src/models/transactions/NFTokenCancelOffer.ts +++ b/packages/xrpl/src/models/transactions/NFTokenCancelOffer.ts @@ -1,6 +1,7 @@ import { ValidationError } from '../../errors' import { BaseTransaction, validateBaseTransaction } from './common' +import type { TransactionMetadataBase } from './metadata' /** * The NFTokenCancelOffer transaction deletes existing NFTokenOffer objects. @@ -26,6 +27,11 @@ export interface NFTokenCancelOffer extends BaseTransaction { NFTokenOffers: string[] } +export interface NFTokenCancelOfferMetadata extends TransactionMetadataBase { + // rippled 1.11.0 or later + nftoken_ids?: string[] +} + /** * Verify the form and type of an NFTokenCancelOffer at runtime. * diff --git a/packages/xrpl/src/models/transactions/NFTokenCreateOffer.ts b/packages/xrpl/src/models/transactions/NFTokenCreateOffer.ts index 2af7f542c7..9575d1b6be 100644 --- a/packages/xrpl/src/models/transactions/NFTokenCreateOffer.ts +++ b/packages/xrpl/src/models/transactions/NFTokenCreateOffer.ts @@ -12,6 +12,7 @@ import { validateOptionalField, Account, } from './common' +import type { TransactionMetadataBase } from './metadata' /** * Transaction Flags for an NFTokenCreateOffer Transaction. @@ -86,6 +87,11 @@ export interface NFTokenCreateOffer extends BaseTransaction { Flags?: number | NFTokenCreateOfferFlagsInterface } +export interface NFTokenCreateOfferMetadata extends TransactionMetadataBase { + // rippled 1.11.0 or later + offer_id?: string +} + function validateNFTokenSellOfferCases(tx: Record): void { if (tx.Owner != null) { throw new ValidationError( diff --git a/packages/xrpl/src/models/transactions/NFTokenMint.ts b/packages/xrpl/src/models/transactions/NFTokenMint.ts index c83d92c35c..2630a6b9c6 100644 --- a/packages/xrpl/src/models/transactions/NFTokenMint.ts +++ b/packages/xrpl/src/models/transactions/NFTokenMint.ts @@ -9,6 +9,7 @@ import { validateBaseTransaction, validateOptionalField, } from './common' +import type { TransactionMetadataBase } from './metadata' /** * Transaction Flags for an NFTokenMint Transaction. @@ -101,6 +102,11 @@ export interface NFTokenMint extends BaseTransaction { Flags?: number | NFTokenMintFlagsInterface } +export interface NFTokenMintMetadata extends TransactionMetadataBase { + // rippled 1.11.0 or later + nftoken_id?: string +} + /** * Verify the form and type of an NFTokenMint at runtime. * diff --git a/packages/xrpl/src/models/transactions/metadata.ts b/packages/xrpl/src/models/transactions/metadata.ts index cc25c85cc3..78aa32616e 100644 --- a/packages/xrpl/src/models/transactions/metadata.ts +++ b/packages/xrpl/src/models/transactions/metadata.ts @@ -1,5 +1,22 @@ import { Amount } from '../common' +import { BaseTransaction } from './common' +import { + NFTokenAcceptOffer, + NFTokenAcceptOfferMetadata, +} from './NFTokenAcceptOffer' +import { + NFTokenCancelOffer, + NFTokenCancelOfferMetadata, +} from './NFTokenCancelOffer' +import { + NFTokenCreateOffer, + NFTokenCreateOfferMetadata, +} from './NFTokenCreateOffer' +import { NFTokenMint, NFTokenMintMetadata } from './NFTokenMint' +import { Payment, PaymentMetadata } from './payment' +import type { Transaction } from './transaction' + export interface CreatedNode { CreatedNode: { LedgerEntryType: string @@ -59,7 +76,7 @@ export function isDeletedNode(node: Node): node is DeletedNode { return Object.prototype.hasOwnProperty.call(node, `DeletedNode`) } -export interface TransactionMetadata { +export interface TransactionMetadataBase { AffectedNodes: Node[] DeliveredAmount?: Amount // "unavailable" possible for transactions before 2014-01-20 @@ -67,3 +84,16 @@ export interface TransactionMetadata { TransactionIndex: number TransactionResult: string } + +export type TransactionMetadata = + T extends Payment + ? PaymentMetadata + : T extends NFTokenMint + ? NFTokenMintMetadata + : T extends NFTokenCreateOffer + ? NFTokenCreateOfferMetadata + : T extends NFTokenAcceptOffer + ? NFTokenAcceptOfferMetadata + : T extends NFTokenCancelOffer + ? NFTokenCancelOfferMetadata + : TransactionMetadataBase diff --git a/packages/xrpl/src/models/transactions/payment.ts b/packages/xrpl/src/models/transactions/payment.ts index 8b36fa0d81..4c1d66b379 100644 --- a/packages/xrpl/src/models/transactions/payment.ts +++ b/packages/xrpl/src/models/transactions/payment.ts @@ -13,6 +13,7 @@ import { isNumber, Account, } from './common' +import type { TransactionMetadataBase } from './metadata' /** * Enum representing values for Payment Transaction Flags. @@ -151,6 +152,11 @@ export interface Payment extends BaseTransaction { Flags?: number | PaymentFlagsInterface } +export interface PaymentMetadata extends TransactionMetadataBase { + DeliveredAmount?: Amount + delivered_amount?: Amount | 'unavailable' +} + /** * Verify the form and type of a Payment at runtime. * diff --git a/packages/xrpl/src/models/transactions/transaction.ts b/packages/xrpl/src/models/transactions/transaction.ts index 575d58c003..06aa36987c 100644 --- a/packages/xrpl/src/models/transactions/transaction.ts +++ b/packages/xrpl/src/models/transactions/transaction.ts @@ -18,7 +18,7 @@ import { CheckCancel, validateCheckCancel } from './checkCancel' import { CheckCash, validateCheckCash } from './checkCash' import { CheckCreate, validateCheckCreate } from './checkCreate' import { Clawback, validateClawback } from './clawback' -import { isIssuedCurrency } from './common' +import { BaseTransaction, isIssuedCurrency } from './common' import { DepositPreauth, validateDepositPreauth } from './depositPreauth' import { EnableAmendment } from './enableAmendment' import { EscrowCancel, validateEscrowCancel } from './escrowCancel' @@ -136,9 +136,11 @@ export type PseudoTransaction = EnableAmendment | SetFee | UNLModify /** * @category Transaction Models */ -export interface TransactionAndMetadata { - transaction: Transaction - metadata: TransactionMetadata +export interface TransactionAndMetadata< + T extends BaseTransaction = Transaction, +> { + transaction: T + metadata: TransactionMetadata } /** diff --git a/packages/xrpl/test/integration/requests/accountTx.test.ts b/packages/xrpl/test/integration/requests/accountTx.test.ts index bedc083c76..64c340c2b6 100644 --- a/packages/xrpl/test/integration/requests/accountTx.test.ts +++ b/packages/xrpl/test/integration/requests/accountTx.test.ts @@ -63,7 +63,7 @@ describe('account_tx', function () { assert.equal(response.type, expected.type) assert.equal(response.result.account, expected.result.account) assert.equal( - (response.result.transactions[0].meta as TransactionMetadata) + (response.result.transactions[0].meta as TransactionMetadata) .TransactionResult, 'tesSUCCESS', ) diff --git a/packages/xrpl/test/integration/transactions/nftokenMint.test.ts b/packages/xrpl/test/integration/transactions/nftokenMint.test.ts index d141f41b41..e033369b29 100644 --- a/packages/xrpl/test/integration/transactions/nftokenMint.test.ts +++ b/packages/xrpl/test/integration/transactions/nftokenMint.test.ts @@ -1,7 +1,12 @@ import { assert } from 'chai' -import { TransactionMetadata, TxRequest } from 'xrpl' -import { convertStringToHex, getNFTokenID, NFTokenMint } from '../../../src' +import { + convertStringToHex, + getNFTokenID, + NFTokenMint, + TransactionMetadata, + TxRequest, +} from '../../../src' import { hashSignedTx } from '../../../src/utils/hashes' import serverUrl from '../serverUrl' import { @@ -55,8 +60,9 @@ describe('NFTokenMint', function () { }) const nftokenID = - getNFTokenID(txResponse.result.meta as TransactionMetadata) ?? - 'undefined' + getNFTokenID( + txResponse.result.meta as TransactionMetadata, + ) ?? 'undefined' const accountHasNFT = accountNFTs.result.account_nfts.some( (value) => value.NFTokenID === nftokenID,