@nextrope/xrpl
Version:
A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser
126 lines (105 loc) • 3.42 kB
text/typescript
import { ValidationError } from '../../errors'
import { Amount, Currency, IssuedCurrencyAmount } from '../common'
import {
BaseTransaction,
GlobalFlagsInterface,
isAmount,
isIssuedCurrency,
isIssuedCurrencyAmount,
validateBaseTransaction,
} from './common'
/**
* Enum representing values for AMMWithdrawFlags Transaction Flags.
*
* @category Transaction Flags
*/
export enum AMMWithdrawFlags {
tfLPToken = 0x00010000,
tfWithdrawAll = 0x00020000,
tfOneAssetWithdrawAll = 0x00040000,
tfSingleAsset = 0x00080000,
tfTwoAsset = 0x00100000,
tfOneAssetLPToken = 0x00200000,
tfLimitLPToken = 0x00400000,
}
export interface AMMWithdrawFlagsInterface extends GlobalFlagsInterface {
tfLPToken?: boolean
tfWithdrawAll?: boolean
tfOneAssetWithdrawAll?: boolean
tfSingleAsset?: boolean
tfTwoAsset?: boolean
tfOneAssetLPToken?: boolean
tfLimitLPToken?: boolean
}
/**
* Withdraw assets from an Automated Market Maker (AMM) instance by returning the AMM's liquidity provider tokens (LP Tokens).
*/
export interface AMMWithdraw extends BaseTransaction {
TransactionType: 'AMMWithdraw'
/**
* The definition for one of the assets in the AMM's pool.
*/
Asset: Currency
/**
* The definition for the other asset in the AMM's pool.
*/
Asset2: Currency
/**
* The amount of one asset to withdraw from the AMM.
* This must match the type of one of the assets (tokens or XRP) in the AMM's pool.
*/
Amount?: Amount
/**
* The amount of another asset to withdraw from the AMM.
* If present, this must match the type of the other asset in the AMM's pool and cannot be the same type as Amount.
*/
Amount2?: Amount
/**
* The minimum effective price, in LP Token returned, to pay per unit of the asset to withdraw.
*/
EPrice?: Amount
/**
* How many of the AMM's LP Tokens to redeem.
*/
LPTokenIn?: IssuedCurrencyAmount
}
/**
* Verify the form and type of an AMMWithdraw at runtime.
*
* @param tx - An AMMWithdraw Transaction.
* @throws When the AMMWithdraw is Malformed.
*/
export function validateAMMWithdraw(tx: Record<string, unknown>): void {
validateBaseTransaction(tx)
if (tx.Asset == null) {
throw new ValidationError('AMMWithdraw: missing field Asset')
}
if (!isIssuedCurrency(tx.Asset)) {
throw new ValidationError('AMMWithdraw: Asset must be a Currency')
}
if (tx.Asset2 == null) {
throw new ValidationError('AMMWithdraw: missing field Asset2')
}
if (!isIssuedCurrency(tx.Asset2)) {
throw new ValidationError('AMMWithdraw: Asset2 must be a Currency')
}
if (tx.Amount2 != null && tx.Amount == null) {
throw new ValidationError('AMMWithdraw: must set Amount with Amount2')
} else if (tx.EPrice != null && tx.Amount == null) {
throw new ValidationError('AMMWithdraw: must set Amount with EPrice')
}
if (tx.LPTokenIn != null && !isIssuedCurrencyAmount(tx.LPTokenIn)) {
throw new ValidationError(
'AMMWithdraw: LPTokenIn must be an IssuedCurrencyAmount',
)
}
if (tx.Amount != null && !isAmount(tx.Amount)) {
throw new ValidationError('AMMWithdraw: Amount must be an Amount')
}
if (tx.Amount2 != null && !isAmount(tx.Amount2)) {
throw new ValidationError('AMMWithdraw: Amount2 must be an Amount')
}
if (tx.EPrice != null && !isAmount(tx.EPrice)) {
throw new ValidationError('AMMWithdraw: EPrice must be an Amount')
}
}