xrpl 4.4.0 → 4.5.0-smartescrow.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/build/xrpl-latest-min.js +1 -1
  2. package/build/xrpl-latest-min.js.map +1 -1
  3. package/build/xrpl-latest.js +242 -216
  4. package/build/xrpl-latest.js.map +1 -1
  5. package/dist/npm/Wallet/defaultFaucets.d.ts +2 -1
  6. package/dist/npm/Wallet/defaultFaucets.d.ts.map +1 -1
  7. package/dist/npm/Wallet/defaultFaucets.js +3 -0
  8. package/dist/npm/Wallet/defaultFaucets.js.map +1 -1
  9. package/dist/npm/models/ledger/Escrow.d.ts +2 -0
  10. package/dist/npm/models/ledger/Escrow.d.ts.map +1 -1
  11. package/dist/npm/models/ledger/FeeSettings.d.ts +2 -0
  12. package/dist/npm/models/ledger/FeeSettings.d.ts.map +1 -1
  13. package/dist/npm/models/methods/serverInfo.d.ts +6 -0
  14. package/dist/npm/models/methods/serverInfo.d.ts.map +1 -1
  15. package/dist/npm/models/methods/serverState.d.ts +6 -0
  16. package/dist/npm/models/methods/serverState.d.ts.map +1 -1
  17. package/dist/npm/models/transactions/escrowCreate.d.ts +2 -0
  18. package/dist/npm/models/transactions/escrowCreate.d.ts.map +1 -1
  19. package/dist/npm/models/transactions/escrowCreate.js +4 -2
  20. package/dist/npm/models/transactions/escrowCreate.js.map +1 -1
  21. package/dist/npm/models/transactions/escrowFinish.d.ts +6 -0
  22. package/dist/npm/models/transactions/escrowFinish.d.ts.map +1 -1
  23. package/dist/npm/models/transactions/escrowFinish.js.map +1 -1
  24. package/dist/npm/models/transactions/metadata.d.ts +2 -1
  25. package/dist/npm/models/transactions/metadata.d.ts.map +1 -1
  26. package/dist/npm/models/transactions/metadata.js.map +1 -1
  27. package/dist/npm/snippets/tsconfig.tsbuildinfo +1 -1
  28. package/dist/npm/src/Wallet/defaultFaucets.d.ts +2 -1
  29. package/dist/npm/src/Wallet/defaultFaucets.d.ts.map +1 -1
  30. package/dist/npm/src/Wallet/defaultFaucets.js +3 -0
  31. package/dist/npm/src/Wallet/defaultFaucets.js.map +1 -1
  32. package/dist/npm/src/models/ledger/Escrow.d.ts +2 -0
  33. package/dist/npm/src/models/ledger/Escrow.d.ts.map +1 -1
  34. package/dist/npm/src/models/ledger/FeeSettings.d.ts +2 -0
  35. package/dist/npm/src/models/ledger/FeeSettings.d.ts.map +1 -1
  36. package/dist/npm/src/models/methods/serverInfo.d.ts +6 -0
  37. package/dist/npm/src/models/methods/serverInfo.d.ts.map +1 -1
  38. package/dist/npm/src/models/methods/serverState.d.ts +6 -0
  39. package/dist/npm/src/models/methods/serverState.d.ts.map +1 -1
  40. package/dist/npm/src/models/transactions/escrowCreate.d.ts +2 -0
  41. package/dist/npm/src/models/transactions/escrowCreate.d.ts.map +1 -1
  42. package/dist/npm/src/models/transactions/escrowCreate.js +4 -2
  43. package/dist/npm/src/models/transactions/escrowCreate.js.map +1 -1
  44. package/dist/npm/src/models/transactions/escrowFinish.d.ts +6 -0
  45. package/dist/npm/src/models/transactions/escrowFinish.d.ts.map +1 -1
  46. package/dist/npm/src/models/transactions/escrowFinish.js.map +1 -1
  47. package/dist/npm/src/models/transactions/metadata.d.ts +2 -1
  48. package/dist/npm/src/models/transactions/metadata.d.ts.map +1 -1
  49. package/dist/npm/src/models/transactions/metadata.js.map +1 -1
  50. package/dist/npm/src/sugar/autofill.d.ts.map +1 -1
  51. package/dist/npm/src/sugar/autofill.js +32 -11
  52. package/dist/npm/src/sugar/autofill.js.map +1 -1
  53. package/dist/npm/sugar/autofill.d.ts.map +1 -1
  54. package/dist/npm/sugar/autofill.js +32 -11
  55. package/dist/npm/sugar/autofill.js.map +1 -1
  56. package/package.json +3 -3
  57. package/src/Wallet/defaultFaucets.ts +5 -0
  58. package/src/models/ledger/Escrow.ts +4 -1
  59. package/src/models/ledger/FeeSettings.ts +4 -0
  60. package/src/models/methods/serverInfo.ts +9 -0
  61. package/src/models/methods/serverState.ts +10 -0
  62. package/src/models/transactions/escrowCreate.ts +10 -2
  63. package/src/models/transactions/escrowFinish.ts +9 -0
  64. package/src/models/transactions/metadata.ts +3 -0
  65. package/src/sugar/autofill.ts +39 -25
@@ -85,6 +85,11 @@ export interface ServerInfoResponse extends BaseResponse {
85
85
  hash: string
86
86
  reserve_base_xrp: number
87
87
  reserve_inc_xrp: number
88
+
89
+ extension_compute: number
90
+ extension_size: number
91
+ gas_price: number
92
+
88
93
  seq: number
89
94
  }
90
95
  /**
@@ -252,6 +257,10 @@ export interface ServerInfoResponse extends BaseResponse {
252
257
  * object an account owns in the ledger.
253
258
  */
254
259
  reserve_inc_xrp: number
260
+
261
+ extension_compute: number
262
+ extension_size: number
263
+ gas_price: number
255
264
  /** The ledger index of the latest validated ledger. */
256
265
  seq: number
257
266
  }
@@ -30,6 +30,11 @@ export interface ServerStateResponse extends BaseResponse {
30
30
  hash: string
31
31
  reserve_base: number
32
32
  reserve_inc: number
33
+
34
+ extension_compute: number
35
+ extension_size: number
36
+ gas_price: number
37
+
33
38
  seq: number
34
39
  }
35
40
  io_latency_ms: number
@@ -69,6 +74,11 @@ export interface ServerStateResponse extends BaseResponse {
69
74
  hash: string
70
75
  reserve_base: number
71
76
  reserve_inc: number
77
+
78
+ extension_compute: number
79
+ extension_size: number
80
+ gas_price: number
81
+
72
82
  seq: number
73
83
  }
74
84
  validation_quorum: number
@@ -50,6 +50,10 @@ export interface EscrowCreate extends BaseTransaction {
50
50
  * payment, such as a hosted recipient at the destination address.
51
51
  */
52
52
  DestinationTag?: number
53
+
54
+ FinishFunction?: string
55
+
56
+ Data?: string
53
57
  }
54
58
 
55
59
  /**
@@ -71,9 +75,13 @@ export function validateEscrowCreate(tx: Record<string, unknown>): void {
71
75
  )
72
76
  }
73
77
 
74
- if (tx.FinishAfter === undefined && tx.Condition === undefined) {
78
+ if (
79
+ tx.FinishAfter === undefined &&
80
+ tx.Condition === undefined &&
81
+ tx.FinishFunction === undefined
82
+ ) {
75
83
  throw new ValidationError(
76
- 'EscrowCreate: Either Condition or FinishAfter must be specified',
84
+ 'EscrowCreate: Either FinishAfter, Condition, or FinishFunction must be specified',
77
85
  )
78
86
  }
79
87
 
@@ -9,6 +9,7 @@ import {
9
9
  validateRequiredField,
10
10
  MAX_AUTHORIZED_CREDENTIALS,
11
11
  } from './common'
12
+ import { TransactionMetadataBase } from './metadata'
12
13
 
13
14
  /**
14
15
  * Deliver XRP from a held payment to the recipient.
@@ -38,6 +39,14 @@ export interface EscrowFinish extends BaseTransaction {
38
39
  * The credentials included must not be expired.
39
40
  */
40
41
  CredentialIDs?: string[]
42
+
43
+ ComputationAllowance?: number
44
+ }
45
+
46
+ export interface EscrowFinishMetadata extends TransactionMetadataBase {
47
+ // if ComputationAllowance is present and the Smart Escrow runs
48
+ GasUsed?: number
49
+ WasmReturnCode?: number
41
50
  }
42
51
 
43
52
  /**
@@ -1,6 +1,7 @@
1
1
  import { Amount, MPTAmount } from '../common'
2
2
 
3
3
  import { BaseTransaction } from './common'
4
+ import { EscrowFinish, EscrowFinishMetadata } from './escrowFinish'
4
5
  import {
5
6
  MPTokenIssuanceCreate,
6
7
  MPTokenIssuanceCreateMetadata,
@@ -105,4 +106,6 @@ export type TransactionMetadata<T extends BaseTransaction = Transaction> =
105
106
  ? NFTokenCancelOfferMetadata
106
107
  : T extends MPTokenIssuanceCreate
107
108
  ? MPTokenIssuanceCreateMetadata
109
+ : T extends EscrowFinish
110
+ ? EscrowFinishMetadata
108
111
  : TransactionMetadataBase
@@ -19,6 +19,8 @@ const LEDGER_OFFSET = 20
19
19
  const RESTRICTED_NETWORKS = 1024
20
20
  const REQUIRED_NETWORKID_VERSION = '1.11.0'
21
21
 
22
+ const MICRO_DROPS_PER_DROP = 1_000_000
23
+
22
24
  /**
23
25
  * Determines whether the source rippled version is not later than the target rippled version.
24
26
  * Example usage: isNotLaterRippledVersion('1.10.0', '1.11.0') returns true.
@@ -258,6 +260,17 @@ async function fetchOwnerReserveFee(client: Client): Promise<BigNumber> {
258
260
  return new BigNumber(fee)
259
261
  }
260
262
 
263
+ async function fetchGasPrice(client: Client): Promise<BigNumber> {
264
+ const response = await client.request({ command: 'server_state' })
265
+ const gasPrice = response.result.state.validated_ledger?.gas_price
266
+
267
+ if (gasPrice == null) {
268
+ return Promise.reject(new Error('Could not fetch Owner Reserve.'))
269
+ }
270
+
271
+ return new BigNumber(gasPrice)
272
+ }
273
+
261
274
  /**
262
275
  * Calculates the fee per transaction type.
263
276
  *
@@ -266,30 +279,40 @@ async function fetchOwnerReserveFee(client: Client): Promise<BigNumber> {
266
279
  * @param [signersCount=0] - The number of signers (default is 0). Only used for multisigning.
267
280
  * @returns A promise that returns the fee.
268
281
  */
269
-
282
+ // eslint-disable-next-line max-lines-per-function -- needed here due to the complexity of the fee calculation
270
283
  async function calculateFeePerTransactionType(
271
284
  client: Client,
272
285
  tx: Transaction,
273
286
  signersCount = 0,
274
287
  ): Promise<BigNumber> {
275
288
  const netFeeXRP = await getFeeXrp(client)
276
- const netFeeDrops = xrpToDrops(netFeeXRP)
277
- let baseFee = new BigNumber(netFeeDrops)
289
+ const netFeeDrops = new BigNumber(xrpToDrops(netFeeXRP))
290
+ let baseFee = netFeeDrops
278
291
 
279
292
  const isSpecialTxCost = ['AccountDelete', 'AMMCreate'].includes(
280
293
  tx.TransactionType,
281
294
  )
282
295
 
283
- // EscrowFinish Transaction with Fulfillment
284
- if (tx.TransactionType === 'EscrowFinish' && tx.Fulfillment != null) {
285
- const fulfillmentBytesSize: number = Math.ceil(tx.Fulfillment.length / 2)
286
- // BaseFee × (33 + (Fulfillment size in bytes / 16))
287
- baseFee = new BigNumber(
288
- // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- expected use of magic numbers
289
- scaleValue(netFeeDrops, 33 + fulfillmentBytesSize / 16),
290
- )
291
- } else if (isSpecialTxCost) {
292
- baseFee = await fetchOwnerReserveFee(client)
296
+ // EscrowCreate transaction with FinishFunction
297
+ if (tx.TransactionType === 'EscrowCreate' && tx.FinishFunction != null) {
298
+ baseFee = baseFee.plus(1000)
299
+ } else if (tx.TransactionType === 'EscrowFinish') {
300
+ // EscrowFinish Transaction with Fulfillment/ComputationAllowance
301
+ if (tx.Fulfillment != null) {
302
+ const fulfillmentBytesSize: number = Math.ceil(tx.Fulfillment.length / 2)
303
+ // BaseFee × (33 + (Fulfillment size in bytes / 16))
304
+ baseFee = netFeeDrops.multipliedBy(
305
+ // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- expected use of magic numbers
306
+ 33 + fulfillmentBytesSize / 16,
307
+ )
308
+ }
309
+ if (tx.ComputationAllowance != null) {
310
+ const gasPrice = await fetchGasPrice(client)
311
+ const extraFee: BigNumber = gasPrice
312
+ .multipliedBy(tx.ComputationAllowance)
313
+ .dividedBy(MICRO_DROPS_PER_DROP)
314
+ baseFee = baseFee.plus(extraFee)
315
+ }
293
316
  } else if (tx.TransactionType === 'Batch') {
294
317
  const rawTxFees = await tx.RawTransactions.reduce(async (acc, rawTxn) => {
295
318
  const resolvedAcc = await acc
@@ -300,6 +323,8 @@ async function calculateFeePerTransactionType(
300
323
  return BigNumber.sum(resolvedAcc, fee)
301
324
  }, Promise.resolve(new BigNumber(0)))
302
325
  baseFee = BigNumber.sum(baseFee.times(2), rawTxFees)
326
+ } else if (isSpecialTxCost) {
327
+ baseFee = await fetchOwnerReserveFee(client)
303
328
  }
304
329
 
305
330
  /*
@@ -307,7 +332,7 @@ async function calculateFeePerTransactionType(
307
332
  * BaseFee × (1 + Number of Signatures Provided)
308
333
  */
309
334
  if (signersCount > 0) {
310
- baseFee = BigNumber.sum(baseFee, scaleValue(netFeeDrops, signersCount))
335
+ baseFee = BigNumber.sum(baseFee, netFeeDrops.multipliedBy(signersCount))
311
336
  }
312
337
 
313
338
  const maxFeeDrops = xrpToDrops(client.maxFeeXRP)
@@ -337,17 +362,6 @@ export async function getTransactionFee(
337
362
  tx.Fee = fee.toString(10)
338
363
  }
339
364
 
340
- /**
341
- * Scales the given value by multiplying it with the provided multiplier.
342
- *
343
- * @param value - The value to be scaled.
344
- * @param multiplier - The multiplier to scale the value.
345
- * @returns The scaled value as a string.
346
- */
347
- function scaleValue(value, multiplier): string {
348
- return new BigNumber(value).times(multiplier).toString()
349
- }
350
-
351
365
  /**
352
366
  * Sets the latest validated ledger sequence for the transaction.
353
367
  *