-
Notifications
You must be signed in to change notification settings - Fork 512
/
NFTokenCreateOffer.ts
145 lines (132 loc) · 3.95 KB
/
NFTokenCreateOffer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import { ValidationError } from '../../errors'
import { Amount } from '../common'
import { isFlagEnabled } from '../utils'
import {
BaseTransaction,
GlobalFlags,
validateBaseTransaction,
isAmount,
parseAmountValue,
} from './common'
/**
* Transaction Flags for an NFTokenCreateOffer Transaction.
*
* @category Transaction Flags
*/
export enum NFTokenCreateOfferFlags {
/**
* If set, indicates that the offer is a sell offer.
* Otherwise, it is a buy offer.
*/
tfSellNFToken = 0x00000001,
}
/**
* Map of flags to boolean values representing {@link NFTokenCreateOffer} transaction
* flags.
*
* @category Transaction Flags
*/
export interface NFTokenCreateOfferFlagsInterface extends GlobalFlags {
tfSellNFToken?: boolean
}
/**
* The NFTokenCreateOffer transaction creates either an offer to buy an
* NFT the submitting account does not own, or an offer to sell an NFT
* the submitting account does own.
*/
export interface NFTokenCreateOffer extends BaseTransaction {
TransactionType: 'NFTokenCreateOffer'
/**
* Identifies the NFTokenID of the NFToken object that the
* offer references.
*/
NFTokenID: string
/**
* Indicates the amount expected or offered for the Token.
*
* The amount must be non-zero, except when this is a sell
* offer and the asset is XRP. This would indicate that the current
* owner of the token is giving it away free, either to anyone at all,
* or to the account identified by the Destination field.
*/
Amount: Amount
/**
* Indicates the AccountID of the account that owns the
* corresponding NFToken.
*
* If the offer is to buy a token, this field must be present
* and it must be different than Account (since an offer to
* buy a token one already holds is meaningless).
*
* If the offer is to sell a token, this field must not be
* present, as the owner is, implicitly, the same as Account
* (since an offer to sell a token one doesn't already hold
* is meaningless).
*/
Owner?: string
/**
* Indicates the time after which the offer will no longer
* be valid. The value is the number of seconds since the
* Ripple Epoch.
*/
Expiration?: number
/**
* If present, indicates that this offer may only be
* accepted by the specified account. Attempts by other
* accounts to accept this offer MUST fail.
*/
Destination?: string
Flags?: number | NFTokenCreateOfferFlagsInterface
}
function validateNFTokenSellOfferCases(tx: Record<string, unknown>): void {
if (tx.Owner != null) {
throw new ValidationError(
'NFTokenCreateOffer: Owner must not be present for sell offers',
)
}
}
function validateNFTokenBuyOfferCases(tx: Record<string, unknown>): void {
if (tx.Owner == null) {
throw new ValidationError(
'NFTokenCreateOffer: Owner must be present for buy offers',
)
}
if (parseAmountValue(tx.Amount) <= 0) {
throw new ValidationError(
'NFTokenCreateOffer: Amount must be greater than 0 for buy offers',
)
}
}
/**
* Verify the form and type of an NFTokenCreateOffer at runtime.
*
* @param tx - An NFTokenCreateOffer Transaction.
* @throws When the NFTokenCreateOffer is Malformed.
*/
export function validateNFTokenCreateOffer(tx: Record<string, unknown>): void {
validateBaseTransaction(tx)
if (tx.Account === tx.Owner) {
throw new ValidationError(
'NFTokenCreateOffer: Owner and Account must not be equal',
)
}
if (tx.Account === tx.Destination) {
throw new ValidationError(
'NFTokenCreateOffer: Destination and Account must not be equal',
)
}
if (tx.NFTokenID == null) {
throw new ValidationError('NFTokenCreateOffer: missing field NFTokenID')
}
if (!isAmount(tx.Amount)) {
throw new ValidationError('NFTokenCreateOffer: invalid Amount')
}
if (
typeof tx.Flags === 'number' &&
isFlagEnabled(tx.Flags, NFTokenCreateOfferFlags.tfSellNFToken)
) {
validateNFTokenSellOfferCases(tx)
} else {
validateNFTokenBuyOfferCases(tx)
}
}