xrpl 4.2.0-batch.0 → 4.2.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 (205) 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 +35 -294
  4. package/build/xrpl-latest.js.map +1 -1
  5. package/dist/npm/Wallet/defaultFaucets.d.ts +1 -2
  6. package/dist/npm/Wallet/defaultFaucets.d.ts.map +1 -1
  7. package/dist/npm/Wallet/defaultFaucets.js +0 -5
  8. package/dist/npm/Wallet/defaultFaucets.js.map +1 -1
  9. package/dist/npm/Wallet/index.d.ts.map +1 -1
  10. package/dist/npm/Wallet/index.js +2 -8
  11. package/dist/npm/Wallet/index.js.map +1 -1
  12. package/dist/npm/client/RequestManager.d.ts.map +1 -1
  13. package/dist/npm/client/RequestManager.js +3 -3
  14. package/dist/npm/client/RequestManager.js.map +1 -1
  15. package/dist/npm/client/connection.d.ts.map +1 -1
  16. package/dist/npm/client/connection.js.map +1 -1
  17. package/dist/npm/client/index.d.ts.map +1 -1
  18. package/dist/npm/client/index.js +8 -5
  19. package/dist/npm/client/index.js.map +1 -1
  20. package/dist/npm/models/ledger/Credential.d.ts +2 -2
  21. package/dist/npm/models/ledger/Credential.d.ts.map +1 -1
  22. package/dist/npm/models/methods/baseMethod.d.ts +0 -1
  23. package/dist/npm/models/methods/baseMethod.d.ts.map +1 -1
  24. package/dist/npm/models/transactions/AMMClawback.d.ts +2 -2
  25. package/dist/npm/models/transactions/AMMClawback.d.ts.map +1 -1
  26. package/dist/npm/models/transactions/AMMDeposit.d.ts +2 -2
  27. package/dist/npm/models/transactions/AMMDeposit.d.ts.map +1 -1
  28. package/dist/npm/models/transactions/AMMWithdraw.d.ts +2 -2
  29. package/dist/npm/models/transactions/AMMWithdraw.d.ts.map +1 -1
  30. package/dist/npm/models/transactions/MPTokenAuthorize.d.ts +2 -2
  31. package/dist/npm/models/transactions/MPTokenAuthorize.d.ts.map +1 -1
  32. package/dist/npm/models/transactions/MPTokenIssuanceCreate.d.ts +2 -2
  33. package/dist/npm/models/transactions/MPTokenIssuanceCreate.d.ts.map +1 -1
  34. package/dist/npm/models/transactions/MPTokenIssuanceCreate.js.map +1 -1
  35. package/dist/npm/models/transactions/MPTokenIssuanceSet.d.ts +2 -2
  36. package/dist/npm/models/transactions/MPTokenIssuanceSet.d.ts.map +1 -1
  37. package/dist/npm/models/transactions/NFTokenCreateOffer.d.ts +2 -2
  38. package/dist/npm/models/transactions/NFTokenCreateOffer.d.ts.map +1 -1
  39. package/dist/npm/models/transactions/NFTokenMint.d.ts +2 -2
  40. package/dist/npm/models/transactions/NFTokenMint.d.ts.map +1 -1
  41. package/dist/npm/models/transactions/XChainModifyBridge.d.ts +2 -2
  42. package/dist/npm/models/transactions/XChainModifyBridge.d.ts.map +1 -1
  43. package/dist/npm/models/transactions/accountSet.d.ts +2 -2
  44. package/dist/npm/models/transactions/accountSet.d.ts.map +1 -1
  45. package/dist/npm/models/transactions/accountSet.js.map +1 -1
  46. package/dist/npm/models/transactions/common.d.ts +4 -16
  47. package/dist/npm/models/transactions/common.d.ts.map +1 -1
  48. package/dist/npm/models/transactions/common.js +10 -28
  49. package/dist/npm/models/transactions/common.js.map +1 -1
  50. package/dist/npm/models/transactions/index.d.ts +2 -3
  51. package/dist/npm/models/transactions/index.d.ts.map +1 -1
  52. package/dist/npm/models/transactions/index.js.map +1 -1
  53. package/dist/npm/models/transactions/metadata.d.ts +0 -1
  54. package/dist/npm/models/transactions/metadata.d.ts.map +1 -1
  55. package/dist/npm/models/transactions/offerCreate.d.ts +2 -2
  56. package/dist/npm/models/transactions/offerCreate.d.ts.map +1 -1
  57. package/dist/npm/models/transactions/payment.d.ts +2 -2
  58. package/dist/npm/models/transactions/payment.d.ts.map +1 -1
  59. package/dist/npm/models/transactions/paymentChannelClaim.d.ts +2 -2
  60. package/dist/npm/models/transactions/paymentChannelClaim.d.ts.map +1 -1
  61. package/dist/npm/models/transactions/paymentChannelClaim.js.map +1 -1
  62. package/dist/npm/models/transactions/transaction.d.ts +1 -2
  63. package/dist/npm/models/transactions/transaction.d.ts.map +1 -1
  64. package/dist/npm/models/transactions/transaction.js +0 -7
  65. package/dist/npm/models/transactions/transaction.js.map +1 -1
  66. package/dist/npm/models/transactions/trustSet.d.ts +2 -2
  67. package/dist/npm/models/transactions/trustSet.d.ts.map +1 -1
  68. package/dist/npm/models/utils/flags.d.ts +0 -1
  69. package/dist/npm/models/utils/flags.d.ts.map +1 -1
  70. package/dist/npm/models/utils/flags.js +2 -22
  71. package/dist/npm/models/utils/flags.js.map +1 -1
  72. package/dist/npm/snippets/tsconfig.tsbuildinfo +1 -1
  73. package/dist/npm/src/Wallet/defaultFaucets.d.ts +1 -2
  74. package/dist/npm/src/Wallet/defaultFaucets.d.ts.map +1 -1
  75. package/dist/npm/src/Wallet/defaultFaucets.js +0 -5
  76. package/dist/npm/src/Wallet/defaultFaucets.js.map +1 -1
  77. package/dist/npm/src/Wallet/index.d.ts.map +1 -1
  78. package/dist/npm/src/Wallet/index.js +2 -8
  79. package/dist/npm/src/Wallet/index.js.map +1 -1
  80. package/dist/npm/src/client/RequestManager.d.ts.map +1 -1
  81. package/dist/npm/src/client/RequestManager.js +3 -3
  82. package/dist/npm/src/client/RequestManager.js.map +1 -1
  83. package/dist/npm/src/client/connection.d.ts.map +1 -1
  84. package/dist/npm/src/client/connection.js.map +1 -1
  85. package/dist/npm/src/client/index.d.ts.map +1 -1
  86. package/dist/npm/src/client/index.js +8 -5
  87. package/dist/npm/src/client/index.js.map +1 -1
  88. package/dist/npm/src/models/ledger/Credential.d.ts +2 -2
  89. package/dist/npm/src/models/ledger/Credential.d.ts.map +1 -1
  90. package/dist/npm/src/models/methods/baseMethod.d.ts +0 -1
  91. package/dist/npm/src/models/methods/baseMethod.d.ts.map +1 -1
  92. package/dist/npm/src/models/transactions/AMMClawback.d.ts +2 -2
  93. package/dist/npm/src/models/transactions/AMMClawback.d.ts.map +1 -1
  94. package/dist/npm/src/models/transactions/AMMDeposit.d.ts +2 -2
  95. package/dist/npm/src/models/transactions/AMMDeposit.d.ts.map +1 -1
  96. package/dist/npm/src/models/transactions/AMMWithdraw.d.ts +2 -2
  97. package/dist/npm/src/models/transactions/AMMWithdraw.d.ts.map +1 -1
  98. package/dist/npm/src/models/transactions/MPTokenAuthorize.d.ts +2 -2
  99. package/dist/npm/src/models/transactions/MPTokenAuthorize.d.ts.map +1 -1
  100. package/dist/npm/src/models/transactions/MPTokenIssuanceCreate.d.ts +2 -2
  101. package/dist/npm/src/models/transactions/MPTokenIssuanceCreate.d.ts.map +1 -1
  102. package/dist/npm/src/models/transactions/MPTokenIssuanceCreate.js.map +1 -1
  103. package/dist/npm/src/models/transactions/MPTokenIssuanceSet.d.ts +2 -2
  104. package/dist/npm/src/models/transactions/MPTokenIssuanceSet.d.ts.map +1 -1
  105. package/dist/npm/src/models/transactions/NFTokenCreateOffer.d.ts +2 -2
  106. package/dist/npm/src/models/transactions/NFTokenCreateOffer.d.ts.map +1 -1
  107. package/dist/npm/src/models/transactions/NFTokenMint.d.ts +2 -2
  108. package/dist/npm/src/models/transactions/NFTokenMint.d.ts.map +1 -1
  109. package/dist/npm/src/models/transactions/XChainModifyBridge.d.ts +2 -2
  110. package/dist/npm/src/models/transactions/XChainModifyBridge.d.ts.map +1 -1
  111. package/dist/npm/src/models/transactions/accountSet.d.ts +2 -2
  112. package/dist/npm/src/models/transactions/accountSet.d.ts.map +1 -1
  113. package/dist/npm/src/models/transactions/accountSet.js.map +1 -1
  114. package/dist/npm/src/models/transactions/common.d.ts +4 -16
  115. package/dist/npm/src/models/transactions/common.d.ts.map +1 -1
  116. package/dist/npm/src/models/transactions/common.js +10 -28
  117. package/dist/npm/src/models/transactions/common.js.map +1 -1
  118. package/dist/npm/src/models/transactions/index.d.ts +2 -3
  119. package/dist/npm/src/models/transactions/index.d.ts.map +1 -1
  120. package/dist/npm/src/models/transactions/index.js.map +1 -1
  121. package/dist/npm/src/models/transactions/metadata.d.ts +0 -1
  122. package/dist/npm/src/models/transactions/metadata.d.ts.map +1 -1
  123. package/dist/npm/src/models/transactions/offerCreate.d.ts +2 -2
  124. package/dist/npm/src/models/transactions/offerCreate.d.ts.map +1 -1
  125. package/dist/npm/src/models/transactions/payment.d.ts +2 -2
  126. package/dist/npm/src/models/transactions/payment.d.ts.map +1 -1
  127. package/dist/npm/src/models/transactions/paymentChannelClaim.d.ts +2 -2
  128. package/dist/npm/src/models/transactions/paymentChannelClaim.d.ts.map +1 -1
  129. package/dist/npm/src/models/transactions/paymentChannelClaim.js.map +1 -1
  130. package/dist/npm/src/models/transactions/transaction.d.ts +1 -2
  131. package/dist/npm/src/models/transactions/transaction.d.ts.map +1 -1
  132. package/dist/npm/src/models/transactions/transaction.js +0 -7
  133. package/dist/npm/src/models/transactions/transaction.js.map +1 -1
  134. package/dist/npm/src/models/transactions/trustSet.d.ts +2 -2
  135. package/dist/npm/src/models/transactions/trustSet.d.ts.map +1 -1
  136. package/dist/npm/src/models/utils/flags.d.ts +0 -1
  137. package/dist/npm/src/models/utils/flags.d.ts.map +1 -1
  138. package/dist/npm/src/models/utils/flags.js +2 -22
  139. package/dist/npm/src/models/utils/flags.js.map +1 -1
  140. package/dist/npm/src/sugar/autofill.d.ts +1 -3
  141. package/dist/npm/src/sugar/autofill.d.ts.map +1 -1
  142. package/dist/npm/src/sugar/autofill.js +5 -100
  143. package/dist/npm/src/sugar/autofill.js.map +1 -1
  144. package/dist/npm/src/sugar/submit.d.ts.map +1 -1
  145. package/dist/npm/src/sugar/submit.js.map +1 -1
  146. package/dist/npm/src/utils/hashes/hashLedger.d.ts.map +1 -1
  147. package/dist/npm/src/utils/hashes/hashLedger.js +1 -4
  148. package/dist/npm/src/utils/hashes/hashLedger.js.map +1 -1
  149. package/dist/npm/sugar/autofill.d.ts +1 -3
  150. package/dist/npm/sugar/autofill.d.ts.map +1 -1
  151. package/dist/npm/sugar/autofill.js +5 -100
  152. package/dist/npm/sugar/autofill.js.map +1 -1
  153. package/dist/npm/sugar/submit.d.ts.map +1 -1
  154. package/dist/npm/sugar/submit.js.map +1 -1
  155. package/dist/npm/utils/hashes/hashLedger.d.ts.map +1 -1
  156. package/dist/npm/utils/hashes/hashLedger.js +1 -4
  157. package/dist/npm/utils/hashes/hashLedger.js.map +1 -1
  158. package/package.json +4 -4
  159. package/src/Wallet/defaultFaucets.ts +0 -6
  160. package/src/Wallet/index.ts +3 -9
  161. package/src/client/RequestManager.ts +1 -4
  162. package/src/client/connection.ts +1 -0
  163. package/src/client/index.ts +28 -7
  164. package/src/models/ledger/Credential.ts +2 -2
  165. package/src/models/methods/baseMethod.ts +0 -1
  166. package/src/models/transactions/AMMClawback.ts +2 -2
  167. package/src/models/transactions/AMMDeposit.ts +2 -2
  168. package/src/models/transactions/AMMWithdraw.ts +2 -2
  169. package/src/models/transactions/MPTokenAuthorize.ts +2 -2
  170. package/src/models/transactions/MPTokenIssuanceCreate.ts +2 -3
  171. package/src/models/transactions/MPTokenIssuanceSet.ts +2 -2
  172. package/src/models/transactions/NFTokenCreateOffer.ts +2 -2
  173. package/src/models/transactions/NFTokenMint.ts +2 -2
  174. package/src/models/transactions/XChainModifyBridge.ts +2 -2
  175. package/src/models/transactions/accountSet.ts +1 -2
  176. package/src/models/transactions/common.ts +22 -62
  177. package/src/models/transactions/index.ts +3 -3
  178. package/src/models/transactions/metadata.ts +0 -2
  179. package/src/models/transactions/offerCreate.ts +2 -2
  180. package/src/models/transactions/payment.ts +2 -2
  181. package/src/models/transactions/paymentChannelClaim.ts +2 -3
  182. package/src/models/transactions/transaction.ts +0 -15
  183. package/src/models/transactions/trustSet.ts +2 -2
  184. package/src/models/utils/flags.ts +1 -30
  185. package/src/sugar/autofill.ts +11 -140
  186. package/src/sugar/submit.ts +2 -1
  187. package/src/utils/hashes/hashLedger.ts +2 -5
  188. package/dist/npm/Wallet/batchSigner.d.ts +0 -8
  189. package/dist/npm/Wallet/batchSigner.d.ts.map +0 -1
  190. package/dist/npm/Wallet/batchSigner.js +0 -124
  191. package/dist/npm/Wallet/batchSigner.js.map +0 -1
  192. package/dist/npm/models/transactions/batch.d.ts +0 -39
  193. package/dist/npm/models/transactions/batch.d.ts.map +0 -1
  194. package/dist/npm/models/transactions/batch.js +0 -62
  195. package/dist/npm/models/transactions/batch.js.map +0 -1
  196. package/dist/npm/src/Wallet/batchSigner.d.ts +0 -8
  197. package/dist/npm/src/Wallet/batchSigner.d.ts.map +0 -1
  198. package/dist/npm/src/Wallet/batchSigner.js +0 -124
  199. package/dist/npm/src/Wallet/batchSigner.js.map +0 -1
  200. package/dist/npm/src/models/transactions/batch.d.ts +0 -39
  201. package/dist/npm/src/models/transactions/batch.d.ts.map +0 -1
  202. package/dist/npm/src/models/transactions/batch.js +0 -62
  203. package/dist/npm/src/models/transactions/batch.js.map +0 -1
  204. package/src/Wallet/batchSigner.ts +0 -222
  205. package/src/models/transactions/batch.ts +0 -147
@@ -1,124 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.combineBatchSigners = exports.signMultiBatch = void 0;
7
- const utils_1 = require("@xrplf/isomorphic/utils");
8
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- const ripple_address_codec_1 = require("ripple-address-codec");
10
- const ripple_binary_codec_1 = require("ripple-binary-codec");
11
- const ripple_keypairs_1 = require("ripple-keypairs");
12
- const errors_1 = require("../errors");
13
- const models_1 = require("../models");
14
- const batch_1 = require("../models/transactions/batch");
15
- const hashes_1 = require("../utils/hashes");
16
- function signMultiBatch(wallet, transaction, opts = {}) {
17
- var _a;
18
- const batchAccount = (_a = opts.batchAccount) !== null && _a !== void 0 ? _a : wallet.classicAddress;
19
- let multisignAddress = false;
20
- if (typeof opts.multisign === 'string') {
21
- multisignAddress = opts.multisign;
22
- }
23
- else if (opts.multisign) {
24
- multisignAddress = wallet.classicAddress;
25
- }
26
- if (transaction.TransactionType !== 'Batch') {
27
- throw new errors_1.ValidationError('Must be a Batch transaction.');
28
- }
29
- const involvedAccounts = transaction.RawTransactions.map((raw) => raw.RawTransaction.Account);
30
- if (!involvedAccounts.includes(batchAccount)) {
31
- throw new errors_1.ValidationError('Must be signing for an address included in the Batch.');
32
- }
33
- (0, models_1.validate)(transaction);
34
- const fieldsToSign = {
35
- flags: transaction.Flags,
36
- txIDs: transaction.RawTransactions.map((rawTx) => (0, hashes_1.hashSignedTx)(rawTx.RawTransaction)),
37
- };
38
- let batchSigner;
39
- if (multisignAddress) {
40
- batchSigner = {
41
- BatchSigner: {
42
- Account: batchAccount,
43
- Signers: [
44
- {
45
- Signer: {
46
- Account: multisignAddress,
47
- SigningPubKey: wallet.publicKey,
48
- TxnSignature: (0, ripple_keypairs_1.sign)((0, ripple_binary_codec_1.encodeForSigningBatch)(fieldsToSign), wallet.privateKey),
49
- },
50
- },
51
- ],
52
- },
53
- };
54
- }
55
- else {
56
- batchSigner = {
57
- BatchSigner: {
58
- Account: batchAccount,
59
- SigningPubKey: wallet.publicKey,
60
- TxnSignature: (0, ripple_keypairs_1.sign)((0, ripple_binary_codec_1.encodeForSigningBatch)(fieldsToSign), wallet.privateKey),
61
- },
62
- };
63
- }
64
- transaction.BatchSigners = [batchSigner];
65
- }
66
- exports.signMultiBatch = signMultiBatch;
67
- function combineBatchSigners(transactions) {
68
- if (transactions.length === 0) {
69
- throw new errors_1.ValidationError('There are 0 transactions to combine.');
70
- }
71
- const decodedTransactions = transactions.map((txOrBlob) => {
72
- return getDecodedTransaction(txOrBlob);
73
- });
74
- decodedTransactions.forEach((tx) => {
75
- if (tx.TransactionType !== 'Batch') {
76
- throw new errors_1.ValidationError('TransactionType must be `Batch`.');
77
- }
78
- (0, batch_1.validateBatch)(tx);
79
- if (tx.BatchSigners == null || tx.BatchSigners.length === 0) {
80
- throw new errors_1.ValidationError('For combining Batch transaction signatures, all transactions must include a BatchSigners field containing an array of signatures.');
81
- }
82
- if (tx.TxnSignature != null || tx.Signers != null) {
83
- throw new errors_1.ValidationError('Batch transaction must be unsigned.');
84
- }
85
- });
86
- const batchTransactions = decodedTransactions;
87
- validateBatchTransactionEquivalence(batchTransactions);
88
- return (0, ripple_binary_codec_1.encode)(getTransactionWithAllBatchSigners(batchTransactions));
89
- }
90
- exports.combineBatchSigners = combineBatchSigners;
91
- function validateBatchTransactionEquivalence(transactions) {
92
- const exampleTransaction = JSON.stringify({
93
- flags: transactions[0].Flags,
94
- transactionIDs: transactions[0].RawTransactions.map((rawTx) => (0, hashes_1.hashSignedTx)(rawTx.RawTransaction)),
95
- });
96
- if (transactions.slice(1).some((tx) => JSON.stringify({
97
- flags: tx.Flags,
98
- transactionIDs: tx.RawTransactions.map((rawTx) => (0, hashes_1.hashSignedTx)(rawTx.RawTransaction)),
99
- }) !== exampleTransaction)) {
100
- throw new errors_1.ValidationError('Flags and transaction hashes are not the same for all provided transactions.');
101
- }
102
- }
103
- function getTransactionWithAllBatchSigners(transactions) {
104
- const sortedSigners = transactions
105
- .flatMap((tx) => { var _a; return (_a = tx.BatchSigners) !== null && _a !== void 0 ? _a : []; })
106
- .filter((signer) => signer.BatchSigner.Account !== transactions[0].Account)
107
- .sort(compareBatchSigners);
108
- return Object.assign(Object.assign({}, transactions[0]), { BatchSigners: sortedSigners });
109
- }
110
- function compareBatchSigners(left, right) {
111
- return addressToBigNumber(left.BatchSigner.Account).comparedTo(addressToBigNumber(right.BatchSigner.Account));
112
- }
113
- const NUM_BITS_IN_HEX = 16;
114
- function addressToBigNumber(address) {
115
- const hex = (0, utils_1.bytesToHex)((0, ripple_address_codec_1.decodeAccountID)(address));
116
- return new bignumber_js_1.default(hex, NUM_BITS_IN_HEX);
117
- }
118
- function getDecodedTransaction(txOrBlob) {
119
- if (typeof txOrBlob === 'object') {
120
- return (0, ripple_binary_codec_1.decode)((0, ripple_binary_codec_1.encode)(txOrBlob));
121
- }
122
- return (0, ripple_binary_codec_1.decode)(txOrBlob);
123
- }
124
- //# sourceMappingURL=batchSigner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batchSigner.js","sourceRoot":"","sources":["../../../../src/Wallet/batchSigner.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import { Signer } from '../common';
2
- import { BaseTransaction, GlobalFlagsInterface } from './common';
3
- import type { SubmittableTransaction } from './transaction';
4
- export declare enum BatchFlags {
5
- tfAllOrNothing = 65536,
6
- tfOnlyOne = 131072,
7
- tfUntilFailure = 262144,
8
- tfIndependent = 524288
9
- }
10
- export interface BatchFlagsInterface extends GlobalFlagsInterface {
11
- tfAllOrNothing?: boolean;
12
- tfOnlyOne?: boolean;
13
- tfUntilFailure?: boolean;
14
- tfIndependent?: boolean;
15
- }
16
- export type BatchInnerTransaction = SubmittableTransaction & {
17
- Fee?: '0';
18
- SigningPubKey?: '';
19
- TxnSignature?: never;
20
- Signers?: never;
21
- LastLedgerSequence?: never;
22
- };
23
- export interface BatchSigner {
24
- BatchSigner: {
25
- Account: string;
26
- SigningPubKey?: string;
27
- TxnSignature?: string;
28
- Signers?: Signer[];
29
- };
30
- }
31
- export interface Batch extends BaseTransaction {
32
- TransactionType: 'Batch';
33
- BatchSigners?: BatchSigner[];
34
- RawTransactions: Array<{
35
- RawTransaction: BatchInnerTransaction;
36
- }>;
37
- }
38
- export declare function validateBatch(tx: Record<string, unknown>): void;
39
- //# sourceMappingURL=batch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../../../src/models/transactions/batch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,OAAO,EACL,eAAe,EACf,oBAAoB,EAOrB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAO3D,oBAAY,UAAU;IACpB,cAAc,QAAa;IAC3B,SAAS,SAAa;IACtB,cAAc,SAAa;IAC3B,aAAa,SAAa;CAC3B;AAQD,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG;IAC3D,GAAG,CAAC,EAAE,GAAG,CAAA;IAET,aAAa,CAAC,EAAE,EAAE,CAAA;IAElB,YAAY,CAAC,EAAE,KAAK,CAAA;IAEpB,OAAO,CAAC,EAAE,KAAK,CAAA;IAEf,kBAAkB,CAAC,EAAE,KAAK,CAAA;CAC3B,CAAA;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,CAAA;QAEf,aAAa,CAAC,EAAE,MAAM,CAAA;QAEtB,YAAY,CAAC,EAAE,MAAM,CAAA;QAErB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KACnB,CAAA;CACF;AAKD,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,eAAe,EAAE,OAAO,CAAA;IAExB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAE5B,eAAe,EAAE,KAAK,CAAC;QACrB,cAAc,EAAE,qBAAqB,CAAA;KACtC,CAAC,CAAA;CACH;AASD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA8D/D"}
@@ -1,62 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateBatch = exports.BatchFlags = void 0;
4
- const errors_1 = require("../../errors");
5
- const common_1 = require("./common");
6
- var BatchFlags;
7
- (function (BatchFlags) {
8
- BatchFlags[BatchFlags["tfAllOrNothing"] = 65536] = "tfAllOrNothing";
9
- BatchFlags[BatchFlags["tfOnlyOne"] = 131072] = "tfOnlyOne";
10
- BatchFlags[BatchFlags["tfUntilFailure"] = 262144] = "tfUntilFailure";
11
- BatchFlags[BatchFlags["tfIndependent"] = 524288] = "tfIndependent";
12
- })(BatchFlags || (exports.BatchFlags = BatchFlags = {}));
13
- function validateBatch(tx) {
14
- (0, common_1.validateBaseTransaction)(tx);
15
- (0, common_1.validateRequiredField)(tx, 'RawTransactions', common_1.isArray);
16
- const rawTransactions = tx.RawTransactions;
17
- rawTransactions.forEach((rawTxObj, index) => {
18
- if (!(0, common_1.isObject)(rawTxObj)) {
19
- throw new errors_1.ValidationError(`Batch: RawTransactions[${index}] is not object.`);
20
- }
21
- const rawTxRecord = rawTxObj;
22
- (0, common_1.validateRequiredField)(rawTxRecord, 'RawTransaction', common_1.isObject, {
23
- paramName: `RawTransactions[${index}].RawTransaction`,
24
- txType: 'Batch',
25
- });
26
- const rawTx = rawTxRecord.RawTransaction;
27
- if (rawTx.TransactionType === 'Batch') {
28
- throw new errors_1.ValidationError(`Batch: RawTransactions[${index}] is a Batch transaction. Cannot nest Batch transactions.`);
29
- }
30
- });
31
- (0, common_1.validateOptionalField)(tx, 'BatchSigners', common_1.isArray);
32
- const batchSigners = tx.BatchSigners;
33
- batchSigners === null || batchSigners === void 0 ? void 0 : batchSigners.forEach((signerObj, index) => {
34
- if (!(0, common_1.isObject)(signerObj)) {
35
- throw new errors_1.ValidationError(`Batch: BatchSigners[${index}] is not object.`);
36
- }
37
- const signerRecord = signerObj;
38
- (0, common_1.validateRequiredField)(signerRecord, 'BatchSigner', common_1.isObject, {
39
- paramName: `BatchSigners[${index}].BatchSigner`,
40
- txType: 'Batch',
41
- });
42
- const signer = signerRecord.BatchSigner;
43
- (0, common_1.validateRequiredField)(signer, 'Account', common_1.isString, {
44
- paramName: `BatchSigners[${index}].Account`,
45
- txType: 'Batch',
46
- });
47
- (0, common_1.validateOptionalField)(signer, 'SigningPubKey', common_1.isString, {
48
- paramName: `BatchSigners[${index}].SigningPubKey`,
49
- txType: 'Batch',
50
- });
51
- (0, common_1.validateOptionalField)(signer, 'TxnSignature', common_1.isString, {
52
- paramName: `BatchSigners[${index}].TxnSignature`,
53
- txType: 'Batch',
54
- });
55
- (0, common_1.validateOptionalField)(signer, 'Signers', common_1.isArray, {
56
- paramName: `BatchSigners[${index}].Signers`,
57
- txType: 'Batch',
58
- });
59
- });
60
- }
61
- exports.validateBatch = validateBatch;
62
- //# sourceMappingURL=batch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../../../src/models/transactions/batch.ts"],"names":[],"mappings":";;;AAAA,yCAA8C;AAG9C,qCASiB;AAQjB,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,mEAA2B,CAAA;IAC3B,0DAAsB,CAAA;IACtB,oEAA2B,CAAA;IAC3B,kEAA0B,CAAA;AAC5B,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AA2DD,SAAgB,aAAa,CAAC,EAA2B;IACvD,IAAA,gCAAuB,EAAC,EAAE,CAAC,CAAA;IAE3B,IAAA,8BAAqB,EAAC,EAAE,EAAE,iBAAiB,EAAE,gBAAO,CAAC,CAAA;IAErD,MAAM,eAAe,GAAG,EAAE,CAAC,eAA4B,CAAA;IACvD,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC1C,IAAI,CAAC,IAAA,iBAAQ,EAAC,QAAQ,CAAC,EAAE;YACvB,MAAM,IAAI,wBAAe,CACvB,0BAA0B,KAAK,kBAAkB,CAClD,CAAA;SACF;QAED,MAAM,WAAW,GAAG,QAAmC,CAAA;QACvD,IAAA,8BAAqB,EAAC,WAAW,EAAE,gBAAgB,EAAE,iBAAQ,EAAE;YAC7D,SAAS,EAAE,mBAAmB,KAAK,kBAAkB;YACrD,MAAM,EAAE,OAAO;SAChB,CAAC,CAAA;QAGF,MAAM,KAAK,GAAG,WAAW,CAAC,cAAyC,CAAA;QACnE,IAAI,KAAK,CAAC,eAAe,KAAK,OAAO,EAAE;YACrC,MAAM,IAAI,wBAAe,CACvB,0BAA0B,KAAK,2DAA2D,CAC3F,CAAA;SACF;IACH,CAAC,CAAC,CAAA;IAGF,IAAA,8BAAqB,EAAC,EAAE,EAAE,cAAc,EAAE,gBAAO,CAAC,CAAA;IAGlD,MAAM,YAAY,GAAG,EAAE,CAAC,YAAqC,CAAA;IAC7D,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzC,IAAI,CAAC,IAAA,iBAAQ,EAAC,SAAS,CAAC,EAAE;YACxB,MAAM,IAAI,wBAAe,CAAC,uBAAuB,KAAK,kBAAkB,CAAC,CAAA;SAC1E;QAED,MAAM,YAAY,GAAG,SAAoC,CAAA;QACzD,IAAA,8BAAqB,EAAC,YAAY,EAAE,aAAa,EAAE,iBAAQ,EAAE;YAC3D,SAAS,EAAE,gBAAgB,KAAK,eAAe;YAC/C,MAAM,EAAE,OAAO;SAChB,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,WAAsC,CAAA;QAClE,IAAA,8BAAqB,EAAC,MAAM,EAAE,SAAS,EAAE,iBAAQ,EAAE;YACjD,SAAS,EAAE,gBAAgB,KAAK,WAAW;YAC3C,MAAM,EAAE,OAAO;SAChB,CAAC,CAAA;QACF,IAAA,8BAAqB,EAAC,MAAM,EAAE,eAAe,EAAE,iBAAQ,EAAE;YACvD,SAAS,EAAE,gBAAgB,KAAK,iBAAiB;YACjD,MAAM,EAAE,OAAO;SAChB,CAAC,CAAA;QACF,IAAA,8BAAqB,EAAC,MAAM,EAAE,cAAc,EAAE,iBAAQ,EAAE;YACtD,SAAS,EAAE,gBAAgB,KAAK,gBAAgB;YAChD,MAAM,EAAE,OAAO;SAChB,CAAC,CAAA;QACF,IAAA,8BAAqB,EAAC,MAAM,EAAE,SAAS,EAAE,gBAAO,EAAE;YAChD,SAAS,EAAE,gBAAgB,KAAK,WAAW;YAC3C,MAAM,EAAE,OAAO;SAChB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AA9DD,sCA8DC"}
@@ -1,222 +0,0 @@
1
- import { bytesToHex } from '@xrplf/isomorphic/utils'
2
- import BigNumber from 'bignumber.js'
3
- import { decodeAccountID } from 'ripple-address-codec'
4
- import { decode, encode, encodeForSigningBatch } from 'ripple-binary-codec'
5
- import { sign } from 'ripple-keypairs'
6
-
7
- import { ValidationError } from '../errors'
8
- import { Batch, Transaction, validate } from '../models'
9
- import { BatchSigner, validateBatch } from '../models/transactions/batch'
10
- import { hashSignedTx } from '../utils/hashes'
11
-
12
- import { Wallet } from '.'
13
-
14
- /**
15
- * Sign a multi-account Batch transaction.
16
- *
17
- * @param wallet - Wallet instance.
18
- * @param transaction - The Batch transaction to sign.
19
- * @param opts - Additional options for regular key and multi-signing complexity.
20
- * @param opts.batchAccount - The account submitting the inner Batch transaction, on behalf of which is this signature.
21
- * @param opts.multisign - Specify true/false to use multisign or actual address (classic/x-address) to make multisign tx request.
22
- * The actual address is only needed in the case of regular key usage.
23
- * @throws ValidationError if the transaction is malformed.
24
- */
25
- // eslint-disable-next-line max-lines-per-function -- TODO: refactor
26
- export function signMultiBatch(
27
- wallet: Wallet,
28
- transaction: Batch,
29
- opts: { batchAccount?: string; multisign?: boolean | string } = {},
30
- ): void {
31
- const batchAccount = opts.batchAccount ?? wallet.classicAddress
32
- let multisignAddress: boolean | string = false
33
- if (typeof opts.multisign === 'string') {
34
- multisignAddress = opts.multisign
35
- } else if (opts.multisign) {
36
- multisignAddress = wallet.classicAddress
37
- }
38
-
39
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- needed for JS
40
- if (transaction.TransactionType !== 'Batch') {
41
- throw new ValidationError('Must be a Batch transaction.')
42
- }
43
-
44
- const involvedAccounts = transaction.RawTransactions.map(
45
- (raw) => raw.RawTransaction.Account,
46
- )
47
- if (!involvedAccounts.includes(batchAccount)) {
48
- throw new ValidationError(
49
- 'Must be signing for an address included in the Batch.',
50
- )
51
- }
52
- /*
53
- * This will throw a more clear error for JS users if the supplied transaction has incorrect formatting
54
- */
55
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- validate does not accept Transaction type
56
- validate(transaction as unknown as Record<string, unknown>)
57
- const fieldsToSign = {
58
- flags: transaction.Flags,
59
- txIDs: transaction.RawTransactions.map((rawTx) =>
60
- hashSignedTx(rawTx.RawTransaction),
61
- ),
62
- }
63
- let batchSigner: BatchSigner
64
- if (multisignAddress) {
65
- batchSigner = {
66
- BatchSigner: {
67
- Account: batchAccount,
68
- Signers: [
69
- {
70
- Signer: {
71
- Account: multisignAddress,
72
- SigningPubKey: wallet.publicKey,
73
- TxnSignature: sign(
74
- encodeForSigningBatch(fieldsToSign),
75
- wallet.privateKey,
76
- ),
77
- },
78
- },
79
- ],
80
- },
81
- }
82
- } else {
83
- batchSigner = {
84
- BatchSigner: {
85
- Account: batchAccount,
86
- SigningPubKey: wallet.publicKey,
87
- TxnSignature: sign(
88
- encodeForSigningBatch(fieldsToSign),
89
- wallet.privateKey,
90
- ),
91
- },
92
- }
93
- }
94
-
95
- // eslint-disable-next-line no-param-reassign -- okay for signing
96
- transaction.BatchSigners = [batchSigner]
97
- }
98
-
99
- /**
100
- * Takes several transactions with BatchSigners fields (in object or blob form) and creates a
101
- * single transaction with all BatchSigners that then gets signed and returned.
102
- *
103
- * @param transactions The transactions to combine `BatchSigners` values on.
104
- * @returns A single signed Transaction which has all BatchSigners from transactions within it.
105
- * @throws ValidationError if:
106
- * - There were no transactions given to sign
107
- * @category Signing
108
- */
109
- export function combineBatchSigners(
110
- transactions: Array<Batch | string>,
111
- ): string {
112
- if (transactions.length === 0) {
113
- throw new ValidationError('There are 0 transactions to combine.')
114
- }
115
-
116
- const decodedTransactions: Transaction[] = transactions.map((txOrBlob) => {
117
- return getDecodedTransaction(txOrBlob)
118
- })
119
-
120
- decodedTransactions.forEach((tx) => {
121
- if (tx.TransactionType !== 'Batch') {
122
- throw new ValidationError('TransactionType must be `Batch`.')
123
- }
124
- /*
125
- * This will throw a more clear error for JS users if any of the supplied transactions has incorrect formatting
126
- */
127
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- validate does not accept Transaction type
128
- validateBatch(tx as unknown as Record<string, unknown>)
129
- if (tx.BatchSigners == null || tx.BatchSigners.length === 0) {
130
- throw new ValidationError(
131
- 'For combining Batch transaction signatures, all transactions must include a BatchSigners field containing an array of signatures.',
132
- )
133
- }
134
-
135
- if (tx.TxnSignature != null || tx.Signers != null) {
136
- throw new ValidationError('Batch transaction must be unsigned.')
137
- }
138
- })
139
-
140
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
141
- const batchTransactions = decodedTransactions as Batch[]
142
-
143
- validateBatchTransactionEquivalence(batchTransactions)
144
-
145
- return encode(getTransactionWithAllBatchSigners(batchTransactions))
146
- }
147
-
148
- /**
149
- * The transactions should all be equal except for the 'Signers' field.
150
- *
151
- * @param transactions - An array of Transactions which are expected to be equal other than 'Signers'.
152
- * @throws ValidationError if the transactions are not equal in any field other than 'Signers'.
153
- */
154
- function validateBatchTransactionEquivalence(transactions: Batch[]): void {
155
- const exampleTransaction = JSON.stringify({
156
- flags: transactions[0].Flags,
157
- transactionIDs: transactions[0].RawTransactions.map((rawTx) =>
158
- hashSignedTx(rawTx.RawTransaction),
159
- ),
160
- })
161
- if (
162
- transactions.slice(1).some(
163
- (tx) =>
164
- JSON.stringify({
165
- flags: tx.Flags,
166
- transactionIDs: tx.RawTransactions.map((rawTx) =>
167
- hashSignedTx(rawTx.RawTransaction),
168
- ),
169
- }) !== exampleTransaction,
170
- )
171
- ) {
172
- throw new ValidationError(
173
- 'Flags and transaction hashes are not the same for all provided transactions.',
174
- )
175
- }
176
- }
177
-
178
- function getTransactionWithAllBatchSigners(transactions: Batch[]): Batch {
179
- // Signers must be sorted in the combined transaction - See compareSigners' documentation for more details
180
- const sortedSigners: BatchSigner[] = transactions
181
- .flatMap((tx) => tx.BatchSigners ?? [])
182
- .filter((signer) => signer.BatchSigner.Account !== transactions[0].Account)
183
- .sort(compareBatchSigners)
184
-
185
- return { ...transactions[0], BatchSigners: sortedSigners }
186
- }
187
-
188
- /**
189
- * If presented in binary form, the BatchSigners array must be sorted based on
190
- * the numeric value of the signer addresses, with the lowest value first.
191
- * (If submitted as JSON, the submit_multisigned method handles this automatically.)
192
- * https://xrpl.org/multi-signing.html.
193
- *
194
- * @param left - A BatchSigner to compare with.
195
- * @param right - A second BatchSigner to compare with.
196
- * @returns 1 if left \> right, 0 if left = right, -1 if left \< right, and null if left or right are NaN.
197
- */
198
- function compareBatchSigners(left: BatchSigner, right: BatchSigner): number {
199
- return addressToBigNumber(left.BatchSigner.Account).comparedTo(
200
- addressToBigNumber(right.BatchSigner.Account),
201
- )
202
- }
203
-
204
- // copied from signer.ts
205
- // TODO: refactor
206
- const NUM_BITS_IN_HEX = 16
207
-
208
- function addressToBigNumber(address: string): BigNumber {
209
- const hex = bytesToHex(decodeAccountID(address))
210
- return new BigNumber(hex, NUM_BITS_IN_HEX)
211
- }
212
-
213
- function getDecodedTransaction(txOrBlob: Transaction | string): Transaction {
214
- if (typeof txOrBlob === 'object') {
215
- // We need this to handle X-addresses in multisigning
216
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- We are casting here to get strong typing
217
- return decode(encode(txOrBlob)) as unknown as Transaction
218
- }
219
-
220
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- We are casting here to get strong typing
221
- return decode(txOrBlob) as unknown as Transaction
222
- }
@@ -1,147 +0,0 @@
1
- import { ValidationError } from '../../errors'
2
- import { Signer } from '../common'
3
-
4
- import {
5
- BaseTransaction,
6
- GlobalFlagsInterface,
7
- isArray,
8
- isObject,
9
- isString,
10
- validateBaseTransaction,
11
- validateOptionalField,
12
- validateRequiredField,
13
- } from './common'
14
- import type { SubmittableTransaction } from './transaction'
15
-
16
- /**
17
- * Enum representing values of {@link Batch} transaction flags.
18
- *
19
- * @category Transaction Flags
20
- */
21
- export enum BatchFlags {
22
- tfAllOrNothing = 0x00010000,
23
- tfOnlyOne = 0x00020000,
24
- tfUntilFailure = 0x00040000,
25
- tfIndependent = 0x00080000,
26
- }
27
-
28
- /**
29
- * Map of flags to boolean values representing {@link Batch} transaction
30
- * flags.
31
- *
32
- * @category Transaction Flags
33
- */
34
- export interface BatchFlagsInterface extends GlobalFlagsInterface {
35
- tfAllOrNothing?: boolean
36
- tfOnlyOne?: boolean
37
- tfUntilFailure?: boolean
38
- tfIndependent?: boolean
39
- }
40
-
41
- export type BatchInnerTransaction = SubmittableTransaction & {
42
- Fee?: '0'
43
-
44
- SigningPubKey?: ''
45
-
46
- TxnSignature?: never
47
-
48
- Signers?: never
49
-
50
- LastLedgerSequence?: never
51
- }
52
-
53
- export interface BatchSigner {
54
- BatchSigner: {
55
- Account: string
56
-
57
- SigningPubKey?: string
58
-
59
- TxnSignature?: string
60
-
61
- Signers?: Signer[]
62
- }
63
- }
64
-
65
- /**
66
- * @category Transaction Models
67
- */
68
- export interface Batch extends BaseTransaction {
69
- TransactionType: 'Batch'
70
-
71
- BatchSigners?: BatchSigner[]
72
-
73
- RawTransactions: Array<{
74
- RawTransaction: BatchInnerTransaction
75
- }>
76
- }
77
-
78
- /**
79
- * Verify the form and type of a Batch at runtime.
80
- *
81
- * @param tx - A Batch Transaction.
82
- * @throws When the Batch is malformed.
83
- */
84
- // eslint-disable-next-line max-lines-per-function -- needed here due to the complexity
85
- export function validateBatch(tx: Record<string, unknown>): void {
86
- validateBaseTransaction(tx)
87
-
88
- validateRequiredField(tx, 'RawTransactions', isArray)
89
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
90
- const rawTransactions = tx.RawTransactions as unknown[]
91
- rawTransactions.forEach((rawTxObj, index) => {
92
- if (!isObject(rawTxObj)) {
93
- throw new ValidationError(
94
- `Batch: RawTransactions[${index}] is not object.`,
95
- )
96
- }
97
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
98
- const rawTxRecord = rawTxObj as Record<string, unknown>
99
- validateRequiredField(rawTxRecord, 'RawTransaction', isObject, {
100
- paramName: `RawTransactions[${index}].RawTransaction`,
101
- txType: 'Batch',
102
- })
103
-
104
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
105
- const rawTx = rawTxRecord.RawTransaction as Record<string, unknown>
106
- if (rawTx.TransactionType === 'Batch') {
107
- throw new ValidationError(
108
- `Batch: RawTransactions[${index}] is a Batch transaction. Cannot nest Batch transactions.`,
109
- )
110
- }
111
- })
112
- // Full validation of each `RawTransaction` object is done in `validate` to avoid dependency cycles
113
-
114
- validateOptionalField(tx, 'BatchSigners', isArray)
115
-
116
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
117
- const batchSigners = tx.BatchSigners as unknown[] | undefined
118
- batchSigners?.forEach((signerObj, index) => {
119
- if (!isObject(signerObj)) {
120
- throw new ValidationError(`Batch: BatchSigners[${index}] is not object.`)
121
- }
122
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
123
- const signerRecord = signerObj as Record<string, unknown>
124
- validateRequiredField(signerRecord, 'BatchSigner', isObject, {
125
- paramName: `BatchSigners[${index}].BatchSigner`,
126
- txType: 'Batch',
127
- })
128
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- checked above
129
- const signer = signerRecord.BatchSigner as Record<string, unknown>
130
- validateRequiredField(signer, 'Account', isString, {
131
- paramName: `BatchSigners[${index}].Account`,
132
- txType: 'Batch',
133
- })
134
- validateOptionalField(signer, 'SigningPubKey', isString, {
135
- paramName: `BatchSigners[${index}].SigningPubKey`,
136
- txType: 'Batch',
137
- })
138
- validateOptionalField(signer, 'TxnSignature', isString, {
139
- paramName: `BatchSigners[${index}].TxnSignature`,
140
- txType: 'Batch',
141
- })
142
- validateOptionalField(signer, 'Signers', isArray, {
143
- paramName: `BatchSigners[${index}].Signers`,
144
- txType: 'Batch',
145
- })
146
- })
147
- }