@nextrope/xrpl
Version:
A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser
77 lines (65 loc) • 2.21 kB
text/typescript
import { Amount, XChainBridge } from '../common'
import {
Account,
BaseTransaction,
isAccount,
isAmount,
isNumber,
isString,
isXChainBridge,
validateBaseTransaction,
validateOptionalField,
validateRequiredField,
} from './common'
/**
* The XChainCommit is the second step in a cross-chain transfer. It puts assets
* into trust on the locking chain so that they can be wrapped on the issuing
* chain, or burns wrapped assets on the issuing chain so that they can be returned
* on the locking chain.
*
* @category Transaction Models
*/
export interface XChainCommit extends BaseTransaction {
TransactionType: 'XChainCommit'
/**
* The bridge to use to transfer funds.
*/
XChainBridge: XChainBridge
/**
* The unique integer ID for a cross-chain transfer. This must be acquired on
* the destination chain (via a {@link XChainCreateClaimID} transaction) and
* checked from a validated ledger before submitting this transaction. If an
* incorrect sequence number is specified, the funds will be lost.
*/
XChainClaimID: number | string
/**
* The destination account on the destination chain. If this is not specified,
* the account that submitted the {@link XChainCreateClaimID} transaction on the
* destination chain will need to submit a {@link XChainClaim} transaction to
* claim the funds.
*/
OtherChainDestination?: Account
/**
* The asset to commit, and the quantity. This must match the door account's
* LockingChainIssue (if on the locking chain) or the door account's
* IssuingChainIssue (if on the issuing chain).
*/
Amount: Amount
}
/**
* Verify the form and type of an XChainCommit at runtime.
*
* @param tx - An XChainCommit Transaction.
* @throws When the XChainCommit is malformed.
*/
export function validateXChainCommit(tx: Record<string, unknown>): void {
validateBaseTransaction(tx)
validateRequiredField(tx, 'XChainBridge', isXChainBridge)
validateRequiredField(
tx,
'XChainClaimID',
(inp: unknown): inp is number | string => isNumber(inp) || isString(inp),
)
validateOptionalField(tx, 'OtherChainDestination', isAccount)
validateRequiredField(tx, 'Amount', isAmount)
}