Skip to content

Commit

Permalink
Add nftoken_id, nftoken_ids, offer_id to meta fields (#2450)
Browse files Browse the repository at this point in the history
Add type for metadata for specific transactions(`Payment`, `NFTokenMint`, `NFTokenCreateOffer`, `NFTokenAcceptOffer`, `NFTokenCancelOffer`)

Closes #2316
  • Loading branch information
tequdev authored and ckniffen committed Oct 25, 2023
1 parent 091cc8f commit b5aa70b
Show file tree
Hide file tree
Showing 11 changed files with 80 additions and 11 deletions.
1 change: 1 addition & 0 deletions packages/xrpl/HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion packages/xrpl/src/models/methods/tx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<T> | string
/**
* If true, this data comes from a validated ledger version; if omitted or.
* Set to false, this data is not final.
Expand Down
6 changes: 6 additions & 0 deletions packages/xrpl/src/models/transactions/NFTokenAcceptOffer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
parseAmountValue,
validateBaseTransaction,
} from './common'
import type { TransactionMetadataBase } from './metadata'

/**
* The NFTokenOfferAccept transaction is used to accept offers
Expand Down Expand Up @@ -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<string, unknown>): void {
const value = parseAmountValue(tx.NFTokenBrokerFee)
if (Number.isNaN(value)) {
Expand Down
6 changes: 6 additions & 0 deletions packages/xrpl/src/models/transactions/NFTokenCancelOffer.ts
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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.
*
Expand Down
6 changes: 6 additions & 0 deletions packages/xrpl/src/models/transactions/NFTokenCreateOffer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
validateOptionalField,
Account,
} from './common'
import type { TransactionMetadataBase } from './metadata'

/**
* Transaction Flags for an NFTokenCreateOffer Transaction.
Expand Down Expand Up @@ -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<string, unknown>): void {
if (tx.Owner != null) {
throw new ValidationError(
Expand Down
6 changes: 6 additions & 0 deletions packages/xrpl/src/models/transactions/NFTokenMint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
validateBaseTransaction,
validateOptionalField,
} from './common'
import type { TransactionMetadataBase } from './metadata'

/**
* Transaction Flags for an NFTokenMint Transaction.
Expand Down Expand Up @@ -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.
*
Expand Down
32 changes: 31 additions & 1 deletion packages/xrpl/src/models/transactions/metadata.ts
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -59,11 +76,24 @@ 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
delivered_amount?: Amount | 'unavailable'
TransactionIndex: number
TransactionResult: string
}

export type TransactionMetadata<T extends BaseTransaction = Transaction> =
T extends Payment
? PaymentMetadata
: T extends NFTokenMint
? NFTokenMintMetadata
: T extends NFTokenCreateOffer
? NFTokenCreateOfferMetadata
: T extends NFTokenAcceptOffer
? NFTokenAcceptOfferMetadata
: T extends NFTokenCancelOffer
? NFTokenCancelOfferMetadata
: TransactionMetadataBase
6 changes: 6 additions & 0 deletions packages/xrpl/src/models/transactions/payment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
isNumber,
Account,
} from './common'
import type { TransactionMetadataBase } from './metadata'

/**
* Enum representing values for Payment Transaction Flags.
Expand Down Expand Up @@ -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.
*
Expand Down
10 changes: 6 additions & 4 deletions packages/xrpl/src/models/transactions/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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<T>
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/xrpl/test/integration/requests/accountTx.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Payment>)
.TransactionResult,
'tesSUCCESS',
)
Expand Down
14 changes: 10 additions & 4 deletions packages/xrpl/test/integration/transactions/nftokenMint.test.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -55,8 +60,9 @@ describe('NFTokenMint', function () {
})

const nftokenID =
getNFTokenID(txResponse.result.meta as TransactionMetadata) ??
'undefined'
getNFTokenID(
txResponse.result.meta as TransactionMetadata<NFTokenMint>,
) ?? 'undefined'

const accountHasNFT = accountNFTs.result.account_nfts.some(
(value) => value.NFTokenID === nftokenID,
Expand Down

0 comments on commit b5aa70b

Please sign in to comment.