xrpl
Version:
A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser
132 lines (111 loc) • 3.67 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 AMMDeposit Transaction Flags.
*
* @category Transaction Flags
*/
export enum AMMDepositFlags {
tfLPToken = 0x00010000,
tfSingleAsset = 0x00080000,
tfTwoAsset = 0x00100000,
tfOneAssetLPToken = 0x00200000,
tfLimitLPToken = 0x00400000,
tfTwoAssetIfEmpty = 0x00800000,
}
export interface AMMDepositFlagsInterface extends GlobalFlagsInterface {
tfLPToken?: boolean
tfSingleAsset?: boolean
tfTwoAsset?: boolean
tfOneAssetLPToken?: boolean
tfLimitLPToken?: boolean
tfTwoAssetIfEmpty?: boolean
}
/**
* Deposit funds into an Automated Market Maker (AMM) instance
* and receive the AMM's liquidity provider tokens (LP Tokens) in exchange.
*
* You can deposit one or both of the assets in the AMM's pool.
* If successful, this transaction creates a trust line to the AMM Account (limit 0) to hold the LP Tokens.
*/
export interface AMMDeposit extends BaseTransaction {
TransactionType: 'AMMDeposit'
/**
* 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 deposit to the AMM.
* If present, 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 add to the AMM.
* If present, this must match the type of the other asset in the AMM's pool and cannot be the same asset as Amount.
*/
Amount2?: Amount
/**
* The maximum effective price, in the deposit asset, to pay for each LP Token received.
*/
EPrice?: Amount
/**
* How many of the AMM's LP Tokens to buy.
*/
LPTokenOut?: IssuedCurrencyAmount
}
/**
* Verify the form and type of an AMMDeposit at runtime.
*
* @param tx - An AMMDeposit Transaction.
* @throws When the AMMDeposit is Malformed.
*/
export function validateAMMDeposit(tx: Record<string, unknown>): void {
validateBaseTransaction(tx)
if (tx.Asset == null) {
throw new ValidationError('AMMDeposit: missing field Asset')
}
if (!isIssuedCurrency(tx.Asset)) {
throw new ValidationError('AMMDeposit: Asset must be a Currency')
}
if (tx.Asset2 == null) {
throw new ValidationError('AMMDeposit: missing field Asset2')
}
if (!isIssuedCurrency(tx.Asset2)) {
throw new ValidationError('AMMDeposit: Asset2 must be a Currency')
}
if (tx.Amount2 != null && tx.Amount == null) {
throw new ValidationError('AMMDeposit: must set Amount with Amount2')
} else if (tx.EPrice != null && tx.Amount == null) {
throw new ValidationError('AMMDeposit: must set Amount with EPrice')
} else if (tx.LPTokenOut == null && tx.Amount == null) {
throw new ValidationError(
'AMMDeposit: must set at least LPTokenOut or Amount',
)
}
if (tx.LPTokenOut != null && !isIssuedCurrencyAmount(tx.LPTokenOut)) {
throw new ValidationError(
'AMMDeposit: LPTokenOut must be an IssuedCurrencyAmount',
)
}
if (tx.Amount != null && !isAmount(tx.Amount)) {
throw new ValidationError('AMMDeposit: Amount must be an Amount')
}
if (tx.Amount2 != null && !isAmount(tx.Amount2)) {
throw new ValidationError('AMMDeposit: Amount2 must be an Amount')
}
if (tx.EPrice != null && !isAmount(tx.EPrice)) {
throw new ValidationError('AMMDeposit: EPrice must be an Amount')
}
}