near-kit 0.0.0 → 0.1.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 (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -2
  3. package/dist/contracts/contract.d.ts +63 -0
  4. package/dist/contracts/contract.d.ts.map +1 -0
  5. package/dist/contracts/contract.js +42 -0
  6. package/dist/contracts/contract.js.map +1 -0
  7. package/dist/contracts/index.d.ts +5 -0
  8. package/dist/contracts/index.d.ts.map +1 -0
  9. package/dist/contracts/index.js +5 -0
  10. package/dist/contracts/index.js.map +1 -0
  11. package/dist/core/actions.d.ts +193 -0
  12. package/dist/core/actions.d.ts.map +1 -0
  13. package/dist/core/actions.js +195 -0
  14. package/dist/core/actions.js.map +1 -0
  15. package/dist/core/config-schemas.d.ts +179 -0
  16. package/dist/core/config-schemas.d.ts.map +1 -0
  17. package/dist/core/config-schemas.js +169 -0
  18. package/dist/core/config-schemas.js.map +1 -0
  19. package/dist/core/constants.d.ts +43 -0
  20. package/dist/core/constants.d.ts.map +1 -0
  21. package/dist/core/constants.js +49 -0
  22. package/dist/core/constants.js.map +1 -0
  23. package/dist/core/near.d.ts +301 -0
  24. package/dist/core/near.d.ts.map +1 -0
  25. package/dist/core/near.js +504 -0
  26. package/dist/core/near.js.map +1 -0
  27. package/dist/core/nonce-manager.d.ts +39 -0
  28. package/dist/core/nonce-manager.d.ts.map +1 -0
  29. package/dist/core/nonce-manager.js +73 -0
  30. package/dist/core/nonce-manager.js.map +1 -0
  31. package/dist/core/rpc/rpc-error-handler.d.ts +60 -0
  32. package/dist/core/rpc/rpc-error-handler.d.ts.map +1 -0
  33. package/dist/core/rpc/rpc-error-handler.js +324 -0
  34. package/dist/core/rpc/rpc-error-handler.js.map +1 -0
  35. package/dist/core/rpc/rpc-schemas.d.ts +1812 -0
  36. package/dist/core/rpc/rpc-schemas.d.ts.map +1 -0
  37. package/dist/core/rpc/rpc-schemas.js +424 -0
  38. package/dist/core/rpc/rpc-schemas.js.map +1 -0
  39. package/dist/core/rpc/rpc.d.ts +117 -0
  40. package/dist/core/rpc/rpc.d.ts.map +1 -0
  41. package/dist/core/rpc/rpc.js +325 -0
  42. package/dist/core/rpc/rpc.js.map +1 -0
  43. package/dist/core/schema.d.ts +1188 -0
  44. package/dist/core/schema.d.ts.map +1 -0
  45. package/dist/core/schema.js +396 -0
  46. package/dist/core/schema.js.map +1 -0
  47. package/dist/core/transaction.d.ts +390 -0
  48. package/dist/core/transaction.d.ts.map +1 -0
  49. package/dist/core/transaction.js +649 -0
  50. package/dist/core/transaction.js.map +1 -0
  51. package/dist/core/types.d.ts +271 -0
  52. package/dist/core/types.d.ts.map +1 -0
  53. package/dist/core/types.js +9 -0
  54. package/dist/core/types.js.map +1 -0
  55. package/dist/errors/index.d.ts +226 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +366 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/index.d.ts +16 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +23 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/keys/credential-schemas.d.ts +98 -0
  64. package/dist/keys/credential-schemas.d.ts.map +1 -0
  65. package/dist/keys/credential-schemas.js +128 -0
  66. package/dist/keys/credential-schemas.js.map +1 -0
  67. package/dist/keys/file-keystore.d.ts +130 -0
  68. package/dist/keys/file-keystore.d.ts.map +1 -0
  69. package/dist/keys/file-keystore.js +266 -0
  70. package/dist/keys/file-keystore.js.map +1 -0
  71. package/dist/keys/in-memory-keystore.d.ts +71 -0
  72. package/dist/keys/in-memory-keystore.d.ts.map +1 -0
  73. package/dist/keys/in-memory-keystore.js +85 -0
  74. package/dist/keys/in-memory-keystore.js.map +1 -0
  75. package/dist/keys/index.d.ts +12 -0
  76. package/dist/keys/index.d.ts.map +1 -0
  77. package/dist/keys/index.js +18 -0
  78. package/dist/keys/index.js.map +1 -0
  79. package/dist/keys/native-keystore.d.ts +111 -0
  80. package/dist/keys/native-keystore.d.ts.map +1 -0
  81. package/dist/keys/native-keystore.js +167 -0
  82. package/dist/keys/native-keystore.js.map +1 -0
  83. package/dist/sandbox/index.d.ts +6 -0
  84. package/dist/sandbox/index.d.ts.map +1 -0
  85. package/dist/sandbox/index.js +5 -0
  86. package/dist/sandbox/index.js.map +1 -0
  87. package/dist/sandbox/sandbox.d.ts +55 -0
  88. package/dist/sandbox/sandbox.d.ts.map +1 -0
  89. package/dist/sandbox/sandbox.js +341 -0
  90. package/dist/sandbox/sandbox.js.map +1 -0
  91. package/dist/utils/amount.d.ts +76 -0
  92. package/dist/utils/amount.d.ts.map +1 -0
  93. package/dist/utils/amount.js +137 -0
  94. package/dist/utils/amount.js.map +1 -0
  95. package/dist/utils/gas.d.ts +69 -0
  96. package/dist/utils/gas.d.ts.map +1 -0
  97. package/dist/utils/gas.js +92 -0
  98. package/dist/utils/gas.js.map +1 -0
  99. package/dist/utils/index.d.ts +14 -0
  100. package/dist/utils/index.d.ts.map +1 -0
  101. package/dist/utils/index.js +14 -0
  102. package/dist/utils/index.js.map +1 -0
  103. package/dist/utils/key.d.ts +117 -0
  104. package/dist/utils/key.d.ts.map +1 -0
  105. package/dist/utils/key.js +270 -0
  106. package/dist/utils/key.js.map +1 -0
  107. package/dist/utils/nep413.d.ts +97 -0
  108. package/dist/utils/nep413.d.ts.map +1 -0
  109. package/dist/utils/nep413.js +154 -0
  110. package/dist/utils/nep413.js.map +1 -0
  111. package/dist/utils/validation.d.ts +114 -0
  112. package/dist/utils/validation.d.ts.map +1 -0
  113. package/dist/utils/validation.js +150 -0
  114. package/dist/utils/validation.js.map +1 -0
  115. package/dist/wallets/adapters.d.ts +119 -0
  116. package/dist/wallets/adapters.d.ts.map +1 -0
  117. package/dist/wallets/adapters.js +267 -0
  118. package/dist/wallets/adapters.js.map +1 -0
  119. package/dist/wallets/index.d.ts +11 -0
  120. package/dist/wallets/index.d.ts.map +1 -0
  121. package/dist/wallets/index.js +2 -0
  122. package/dist/wallets/index.js.map +1 -0
  123. package/dist/wallets/types.d.ts +99 -0
  124. package/dist/wallets/types.d.ts.map +1 -0
  125. package/dist/wallets/types.js +10 -0
  126. package/dist/wallets/types.js.map +1 -0
  127. package/package.json +78 -7
  128. package/index.js +0 -1
@@ -0,0 +1,649 @@
1
+ /**
2
+ * Fluent API for building and sending NEAR transactions.
3
+ *
4
+ * Allows chaining multiple actions (transfers, function calls, account creation, etc.)
5
+ * into a single atomic transaction. All actions either succeed together or fail together.
6
+ *
7
+ * The builder is created via {@link Near.transaction} with a signer account ID. This
8
+ * account must have signing credentials available (via keyStore, privateKey, custom
9
+ * signer, or wallet connection).
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Single action
14
+ * await near.transaction('alice.near')
15
+ * .transfer('bob.near', '10 NEAR')
16
+ * .send()
17
+ *
18
+ * // Multiple actions (atomic)
19
+ * await near.transaction('alice.near')
20
+ * .createAccount('sub.alice.near')
21
+ * .transfer('sub.alice.near', '5 NEAR')
22
+ * .addKey(newKey, { type: 'fullAccess' })
23
+ * .send()
24
+ * ```
25
+ *
26
+ * @remarks
27
+ * - The `signerId` (set via `Near.transaction()`) is the account that signs and pays for gas
28
+ * - All actions execute in the order they are added
29
+ * - Transaction is only sent when `.send()` is called
30
+ * - Use `.build()` to get unsigned transaction
31
+ */
32
+ import { sha256 } from "@noble/hashes/sha2.js";
33
+ import { base58 } from "@scure/base";
34
+ import { InvalidKeyError, InvalidNonceError, NearError, } from "../errors/index.js";
35
+ import { parseKey, parsePublicKey } from "../utils/key.js";
36
+ import { normalizeAmount, normalizeGas, } from "../utils/validation.js";
37
+ import * as actions from "./actions.js";
38
+ import { DEFAULT_FUNCTION_CALL_GAS } from "./constants.js";
39
+ import { NonceManager } from "./nonce-manager.js";
40
+ import { serializeDelegateAction, serializeSignedTransaction, serializeTransaction, } from "./schema.js";
41
+ /**
42
+ * Compare two public keys for byte-level equality.
43
+ * @internal
44
+ */
45
+ function publicKeysEqual(a, b) {
46
+ if (a.keyType !== b.keyType || a.data.length !== b.data.length) {
47
+ return false;
48
+ }
49
+ for (let i = 0; i < a.data.length; i += 1) {
50
+ if (a.data[i] !== b.data[i]) {
51
+ return false;
52
+ }
53
+ }
54
+ return true;
55
+ }
56
+ /**
57
+ * Convert user-friendly permission format to Borsh format.
58
+ * @internal
59
+ */
60
+ function toAccessKeyPermissionBorsh(permission) {
61
+ if (permission.type === "fullAccess") {
62
+ return { fullAccess: {} };
63
+ }
64
+ else {
65
+ return {
66
+ functionCall: {
67
+ receiverId: permission.receiverId,
68
+ methodNames: permission.methodNames || [],
69
+ allowance: permission.allowance
70
+ ? BigInt(normalizeAmount(permission.allowance))
71
+ : null,
72
+ },
73
+ };
74
+ }
75
+ }
76
+ /**
77
+ * Fluent builder for constructing and sending NEAR transactions.
78
+ *
79
+ * Created via {@link Near.transaction}. Supports chaining multiple actions
80
+ * (transfers, function calls, key management, staking, delegate actions) into
81
+ * a single atomic transaction.
82
+ */
83
+ export class TransactionBuilder {
84
+ constructor(signerId, rpc, keyStore, signer, defaultWaitUntil = "EXECUTED_OPTIMISTIC", wallet, ensureKeyStoreReady) {
85
+ this.signerId = signerId;
86
+ this.actions = [];
87
+ this.rpc = rpc;
88
+ this.keyStore = keyStore;
89
+ if (ensureKeyStoreReady !== undefined) {
90
+ this.ensureKeyStoreReady = ensureKeyStoreReady;
91
+ }
92
+ if (signer !== undefined) {
93
+ this.signer = signer;
94
+ }
95
+ this.defaultWaitUntil = defaultWaitUntil;
96
+ if (wallet !== undefined) {
97
+ this.wallet = wallet;
98
+ }
99
+ }
100
+ /**
101
+ * Invalidate cached signed transaction when builder state changes
102
+ */
103
+ invalidateCache() {
104
+ delete this.cachedSignedTx;
105
+ return this;
106
+ }
107
+ /**
108
+ * Resolve the key pair for the current signer from either `signWith()` or keyStore.
109
+ */
110
+ async resolveKeyPair() {
111
+ if (this.keyPair) {
112
+ return this.keyPair;
113
+ }
114
+ if (this.ensureKeyStoreReady) {
115
+ await this.ensureKeyStoreReady();
116
+ }
117
+ const keyPair = await this.keyStore.get(this.signerId);
118
+ if (!keyPair) {
119
+ throw new InvalidKeyError(`No key found for account: ${this.signerId}`);
120
+ }
121
+ return keyPair;
122
+ }
123
+ /**
124
+ * Add a token transfer action.
125
+ *
126
+ * @param receiverId - Account ID that will receive the tokens.
127
+ * @param amount - Amount to transfer, expressed as {@link Amount} (e.g. `"10 NEAR"`).
128
+ *
129
+ * @returns This builder instance for chaining.
130
+ *
131
+ * @remarks
132
+ * If no receiver has been set yet, this also sets the transaction `receiverId`
133
+ * to `receiverId`.
134
+ */
135
+ transfer(receiverId, amount) {
136
+ const amountYocto = normalizeAmount(amount);
137
+ this.actions.push(actions.transfer(BigInt(amountYocto)));
138
+ if (!this.receiverId) {
139
+ this.receiverId = receiverId;
140
+ }
141
+ return this.invalidateCache();
142
+ }
143
+ /**
144
+ * Add a function call action.
145
+ *
146
+ * @param contractId - Account ID of the target contract.
147
+ * @param methodName - Name of the change method to call.
148
+ * @param args - Arguments object or raw bytes; defaults to `{}`.
149
+ * @param options - Optional gas and attached deposit settings.
150
+ *
151
+ * @returns This builder instance for chaining.
152
+ *
153
+ * @remarks
154
+ * - `options.gas` accepts human-readable values such as `"30 Tgas"` or {@link Gas.Tgas}.
155
+ * - `options.attachedDeposit` uses {@link Amount} semantics (e.g. `"1 yocto"`).
156
+ * - If no receiver has been set yet, this also sets the transaction `receiverId`
157
+ * to `contractId`.
158
+ */
159
+ functionCall(contractId, methodName, args = {}, options = {}) {
160
+ const argsBytes = args instanceof Uint8Array
161
+ ? args
162
+ : new TextEncoder().encode(JSON.stringify(args));
163
+ const gas = options.gas
164
+ ? normalizeGas(options.gas)
165
+ : DEFAULT_FUNCTION_CALL_GAS;
166
+ const deposit = options.attachedDeposit
167
+ ? normalizeAmount(options.attachedDeposit)
168
+ : "0";
169
+ this.actions.push(actions.functionCall(methodName, argsBytes, BigInt(gas), BigInt(deposit)));
170
+ if (!this.receiverId) {
171
+ this.receiverId = contractId;
172
+ }
173
+ return this.invalidateCache();
174
+ }
175
+ /**
176
+ * Add a create account action
177
+ */
178
+ createAccount(accountId) {
179
+ this.actions.push(actions.createAccount());
180
+ if (!this.receiverId) {
181
+ this.receiverId = accountId;
182
+ }
183
+ return this.invalidateCache();
184
+ }
185
+ /**
186
+ * Add a delete account action
187
+ */
188
+ deleteAccount(beneficiaryId) {
189
+ this.actions.push(actions.deleteAccount(beneficiaryId));
190
+ // The account being deleted is the receiver of the transaction
191
+ if (!this.receiverId) {
192
+ this.receiverId = this.signerId;
193
+ }
194
+ return this.invalidateCache();
195
+ }
196
+ /**
197
+ * Add a deploy contract action
198
+ */
199
+ deployContract(accountId, code) {
200
+ this.actions.push(actions.deployContract(code));
201
+ if (!this.receiverId) {
202
+ this.receiverId = accountId;
203
+ }
204
+ return this.invalidateCache();
205
+ }
206
+ /**
207
+ * Publish a global contract that can be reused by multiple accounts
208
+ *
209
+ * @param code - The compiled contract code bytes
210
+ * @param publisherId - Optional account ID. If provided, creates a mutable contract (can be updated).
211
+ * If omitted, creates an immutable contract (identified by code hash).
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * // Publish immutable contract (identified by code hash)
216
+ * await near.transaction(accountId)
217
+ * .publishContract(contractCode)
218
+ * .send()
219
+ *
220
+ * // Publish mutable contract (identified by account, can be updated)
221
+ * await near.transaction(accountId)
222
+ * .publishContract(contractCode, "my-publisher.near")
223
+ * .send()
224
+ * ```
225
+ */
226
+ publishContract(code, publisherId) {
227
+ this.actions.push(actions.publishContract(code, publisherId));
228
+ if (!this.receiverId) {
229
+ this.receiverId = this.signerId;
230
+ }
231
+ return this.invalidateCache();
232
+ }
233
+ /**
234
+ * Deploy a contract to this account from previously published code in the global registry
235
+ *
236
+ * @param reference - Reference to the published contract, either:
237
+ * - { codeHash: Uint8Array | string } - Reference by code hash (Uint8Array or base58 string)
238
+ * - { accountId: string } - Reference by the account that published it
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * // Deploy from code hash (Uint8Array)
243
+ * await near.transaction(accountId)
244
+ * .deployFromPublished({ codeHash: hashBytes })
245
+ * .send()
246
+ *
247
+ * // Deploy from code hash (base58 string)
248
+ * await near.transaction(accountId)
249
+ * .deployFromPublished({ codeHash: "5FzD8..." })
250
+ * .send()
251
+ *
252
+ * // Deploy from account ID
253
+ * await near.transaction(accountId)
254
+ * .deployFromPublished({ accountId: "contract-publisher.near" })
255
+ * .send()
256
+ * ```
257
+ */
258
+ deployFromPublished(reference) {
259
+ this.actions.push(actions.deployFromPublished(reference));
260
+ if (!this.receiverId) {
261
+ this.receiverId = this.signerId;
262
+ }
263
+ return this.invalidateCache();
264
+ }
265
+ /**
266
+ * Add a stake action
267
+ */
268
+ stake(publicKey, amount) {
269
+ const amountYocto = normalizeAmount(amount);
270
+ const pk = parsePublicKey(publicKey);
271
+ this.actions.push(actions.stake(BigInt(amountYocto), pk));
272
+ // The account being staked is the receiver of the transaction
273
+ if (!this.receiverId) {
274
+ this.receiverId = this.signerId;
275
+ }
276
+ return this.invalidateCache();
277
+ }
278
+ /**
279
+ * Add an add key action
280
+ *
281
+ * The key is added to the receiverId of the transaction.
282
+ * If receiverId is not set, it defaults to signerId.
283
+ */
284
+ addKey(publicKey, permission) {
285
+ const pk = parsePublicKey(publicKey);
286
+ const borshPermission = toAccessKeyPermissionBorsh(permission);
287
+ this.actions.push(actions.addKey(pk, borshPermission));
288
+ // Set receiverId if not already set
289
+ if (!this.receiverId) {
290
+ this.receiverId = this.signerId;
291
+ }
292
+ return this.invalidateCache();
293
+ }
294
+ /**
295
+ * Add a delete key action
296
+ */
297
+ deleteKey(accountId, publicKey) {
298
+ const pk = parsePublicKey(publicKey);
299
+ this.actions.push(actions.deleteKey(pk));
300
+ if (!this.receiverId) {
301
+ this.receiverId = accountId;
302
+ }
303
+ return this.invalidateCache();
304
+ }
305
+ /**
306
+ * Build and sign a delegate action from the queued actions.
307
+ *
308
+ * @param options - Optional overrides for receiver, nonce, and expiration
309
+ */
310
+ /**
311
+ * Add a signed delegate action to this transaction (for relayers).
312
+ */
313
+ signedDelegateAction(signedDelegate) {
314
+ this.actions.push(signedDelegate);
315
+ this.receiverId = signedDelegate.signedDelegate.delegateAction.senderId;
316
+ return this.invalidateCache();
317
+ }
318
+ /**
319
+ * Build and sign a delegate action from the queued actions.
320
+ *
321
+ * @returns Signed delegate action ready to be added to a relayer transaction
322
+ */
323
+ async delegate(options = {}) {
324
+ if (this.actions.length === 0) {
325
+ throw new NearError("Delegate action requires at least one action to perform", "INVALID_TRANSACTION");
326
+ }
327
+ if (this.actions.some((action) => "signedDelegate" in action)) {
328
+ throw new NearError("Delegate actions cannot contain nested signed delegate actions", "INVALID_TRANSACTION");
329
+ }
330
+ const receiverId = options.receiverId ?? this.receiverId;
331
+ if (!receiverId) {
332
+ throw new NearError("Delegate action requires a receiver. Set receiverId via the first action or provide it explicitly.", "INVALID_TRANSACTION");
333
+ }
334
+ const keyPair = await this.resolveKeyPair();
335
+ let delegatePublicKey;
336
+ if (options.publicKey === undefined) {
337
+ delegatePublicKey = keyPair.publicKey;
338
+ }
339
+ else if (typeof options.publicKey === "string") {
340
+ delegatePublicKey = parsePublicKey(options.publicKey);
341
+ }
342
+ else {
343
+ delegatePublicKey = options.publicKey;
344
+ }
345
+ if (!publicKeysEqual(delegatePublicKey, keyPair.publicKey)) {
346
+ throw new InvalidKeyError("Delegate action public key must match the signer key. Use signWith() when you need a different key.");
347
+ }
348
+ let nonce;
349
+ if (options.nonce !== undefined) {
350
+ nonce = options.nonce;
351
+ }
352
+ else {
353
+ const accessKey = await this.rpc.getAccessKey(this.signerId, delegatePublicKey.toString());
354
+ nonce = BigInt(accessKey.nonce) + 1n;
355
+ }
356
+ let maxBlockHeight;
357
+ if (options.maxBlockHeight !== undefined) {
358
+ maxBlockHeight = options.maxBlockHeight;
359
+ }
360
+ else {
361
+ const status = await this.rpc.getStatus();
362
+ const offset = BigInt(options.blockHeightOffset ?? 200);
363
+ maxBlockHeight = BigInt(status.sync_info.latest_block_height) + offset;
364
+ }
365
+ const delegateActions = this.actions.map((action) => action);
366
+ const delegateAction = new actions.DelegateAction(this.signerId, receiverId, delegateActions, nonce, maxBlockHeight, delegatePublicKey);
367
+ const hash = sha256(serializeDelegateAction(delegateAction));
368
+ const signature = keyPair.sign(hash);
369
+ return actions.signedDelegate(delegateAction, signature);
370
+ }
371
+ /**
372
+ * Override the signing function for this specific transaction.
373
+ *
374
+ * Use this to sign with a different signer than the one configured in the
375
+ * Near client, while keeping the same signerId. Useful for:
376
+ *
377
+ * - Using a hardware wallet for a specific transaction
378
+ * - Testing with mock signers
379
+ * - Signing with a specific private key for the same account
380
+ * - One-off custom signing logic
381
+ *
382
+ * **Important:** This overrides HOW the transaction is signed, not WHO signs it.
383
+ * The signerId (set via `.transaction()`) remains the same. To sign as a different
384
+ * account, use `.transaction(otherAccountId)` instead.
385
+ *
386
+ * @param key - Either a custom signer function or a private key string
387
+ * (e.g., 'ed25519:...' or 'secp256k1:...')
388
+ * Type-safe: TypeScript will enforce the correct format at compile time
389
+ * @returns This builder instance for chaining
390
+ *
391
+ * @example
392
+ * ```typescript
393
+ * // Override with different hardware wallet
394
+ * await near.transaction('alice.near')
395
+ * .signWith(aliceHardwareWallet)
396
+ * .transfer('bob.near', '5 NEAR')
397
+ * .send()
398
+ *
399
+ * // Sign with specific ed25519 private key (type-safe)
400
+ * await near.transaction('alice.near')
401
+ * .signWith('ed25519:...') // ✅ TypeScript ensures correct format
402
+ * .transfer('bob.near', '1 NEAR')
403
+ * .send()
404
+ *
405
+ * // Sign with specific secp256k1 private key
406
+ * await near.transaction('alice.near')
407
+ * .signWith('secp256k1:...') // ✅ TypeScript ensures correct format
408
+ * .transfer('bob.near', '1 NEAR')
409
+ * .send()
410
+ *
411
+ * // TypeScript will catch mistakes at compile time:
412
+ * await near.transaction('alice.near')
413
+ * .signWith('alice.near') // ❌ Type error: not a PrivateKey
414
+ *
415
+ * // Mock signer for testing
416
+ * const mockSigner: Signer = async (msg) => ({
417
+ * keyType: KeyType.ED25519,
418
+ * data: new Uint8Array(64)
419
+ * })
420
+ *
421
+ * await near.transaction('test.near')
422
+ * .signWith(mockSigner)
423
+ * .transfer('receiver.near', '1')
424
+ * .send()
425
+ * ```
426
+ *
427
+ * @remarks
428
+ * Supports both ed25519 and secp256k1 keys.
429
+ */
430
+ signWith(key) {
431
+ if (typeof key === "string") {
432
+ // Parse key and create signer
433
+ // TypeScript ensures key is PrivateKey format, but we still validate at runtime
434
+ const keyPair = parseKey(key);
435
+ this.keyPair = keyPair; // Store for build() to use
436
+ this.signer = async (message) => keyPair.sign(message);
437
+ }
438
+ else {
439
+ // Clear cached keyPair when using custom signer to prevent stale public key
440
+ delete this.keyPair;
441
+ this.signer = key;
442
+ }
443
+ return this.invalidateCache();
444
+ }
445
+ /**
446
+ * Build the unsigned transaction
447
+ */
448
+ async build() {
449
+ if (!this.receiverId) {
450
+ throw new NearError("No receiver ID set for transaction", "INVALID_TRANSACTION");
451
+ }
452
+ // Resolve signer key pair (used for public key + nonce lookup)
453
+ const keyPair = await this.resolveKeyPair();
454
+ const publicKey = keyPair.publicKey;
455
+ // Use NonceManager to get next nonce (handles concurrent transactions)
456
+ const nonce = await TransactionBuilder.nonceManager.getNextNonce(this.signerId, publicKey.toString(), async () => {
457
+ const accessKey = await this.rpc.getAccessKey(this.signerId, publicKey.toString());
458
+ return BigInt(accessKey.nonce);
459
+ });
460
+ const status = await this.rpc.getStatus();
461
+ const blockHash = base58.decode(status.sync_info.latest_block_hash);
462
+ const transaction = {
463
+ signerId: this.signerId,
464
+ publicKey,
465
+ nonce,
466
+ receiverId: this.receiverId,
467
+ actions: this.actions,
468
+ blockHash,
469
+ };
470
+ return transaction;
471
+ }
472
+ /**
473
+ * Sign the transaction without sending it.
474
+ *
475
+ * This creates a signed transaction that can be:
476
+ * - Inspected via `getHash()`
477
+ * - Serialized via `serialize()`
478
+ * - Sent later via `send()`
479
+ *
480
+ * The signed transaction is cached internally. If you modify the transaction
481
+ * (add actions, change signer, etc.), the cache is automatically invalidated.
482
+ *
483
+ * @returns This builder instance (now in a signed state)
484
+ *
485
+ * @example
486
+ * ```typescript
487
+ * // Sign and inspect hash
488
+ * const tx = await near.transaction('alice.near')
489
+ * .transfer('bob.near', '1 NEAR')
490
+ * .sign()
491
+ *
492
+ * console.log('Transaction hash:', tx.getHash())
493
+ *
494
+ * // Serialize for offline use
495
+ * const bytes = tx.serialize()
496
+ *
497
+ * // Send when ready
498
+ * const result = await tx.send({ waitUntil: 'FINAL' })
499
+ * ```
500
+ */
501
+ async sign() {
502
+ if (this.cachedSignedTx) {
503
+ // Already signed, return this
504
+ return this;
505
+ }
506
+ if (!this.receiverId) {
507
+ throw new NearError("No receiver ID set for transaction", "INVALID_TRANSACTION");
508
+ }
509
+ // Build the transaction
510
+ const transaction = await this.build();
511
+ // Serialize transaction using Borsh
512
+ const serialized = serializeTransaction(transaction);
513
+ // NEAR protocol requires signing the SHA256 hash of the serialized transaction
514
+ const messageHash = (await crypto.subtle.digest("SHA-256", serialized));
515
+ const messageHashArray = new Uint8Array(messageHash);
516
+ // Compute transaction hash (base58 of SHA256)
517
+ const txHash = base58.encode(messageHashArray);
518
+ // Use custom signer if provided, otherwise fall back to keyStore
519
+ const signature = this.signer
520
+ ? await this.signer(messageHashArray)
521
+ : (await this.resolveKeyPair()).sign(messageHashArray);
522
+ // Cache the signed transaction
523
+ this.cachedSignedTx = {
524
+ signedTx: {
525
+ transaction,
526
+ signature,
527
+ },
528
+ hash: txHash,
529
+ };
530
+ return this;
531
+ }
532
+ /**
533
+ * Get the transaction hash (only available after signing).
534
+ *
535
+ * @returns The base58-encoded transaction hash, or null if not yet signed
536
+ *
537
+ * @example
538
+ * ```typescript
539
+ * const tx = await near.transaction('alice.near')
540
+ * .transfer('bob.near', '1 NEAR')
541
+ * .sign()
542
+ *
543
+ * console.log(tx.getHash()) // "8ZQ7..."
544
+ * ```
545
+ */
546
+ getHash() {
547
+ return this.cachedSignedTx?.hash ?? null;
548
+ }
549
+ /**
550
+ * Serialize the signed transaction to bytes.
551
+ *
552
+ * This is useful for:
553
+ * - Storing signed transactions for later broadcast
554
+ * - Sending transactions through external tools
555
+ * - Multi-sig workflows
556
+ *
557
+ * @returns Borsh-serialized signed transaction bytes
558
+ * @throws {NearError} If transaction has not been signed yet
559
+ *
560
+ * @example
561
+ * ```typescript
562
+ * const tx = await near.transaction('alice.near')
563
+ * .transfer('bob.near', '1 NEAR')
564
+ * .sign()
565
+ *
566
+ * const bytes = tx.serialize()
567
+ * fs.writeFileSync('transaction.bin', bytes)
568
+ * ```
569
+ */
570
+ serialize() {
571
+ if (!this.cachedSignedTx) {
572
+ throw new NearError("Transaction must be signed before serializing. Call .sign() first.", "INVALID_STATE");
573
+ }
574
+ return serializeSignedTransaction(this.cachedSignedTx.signedTx);
575
+ }
576
+ async send(options) {
577
+ if (!this.receiverId) {
578
+ throw new NearError("No receiver ID set for transaction", "INVALID_TRANSACTION");
579
+ }
580
+ // Use wallet if available
581
+ if (this.wallet) {
582
+ const result = await this.wallet.signAndSendTransaction({
583
+ signerId: this.signerId,
584
+ receiverId: this.receiverId,
585
+ actions: this.actions,
586
+ });
587
+ // Wallet doesn't support waitUntil parameter, always returns executed result
588
+ // Cast to the expected type (this is safe because wallet always waits for execution)
589
+ return result;
590
+ }
591
+ // Determine waitUntil - use option if provided, otherwise use default
592
+ const waitUntil = (options?.waitUntil ?? this.defaultWaitUntil);
593
+ // Retry loop for InvalidNonceError
594
+ const MAX_NONCE_RETRIES = 3;
595
+ let lastError = null;
596
+ for (let attempt = 0; attempt < MAX_NONCE_RETRIES; attempt++) {
597
+ try {
598
+ // Sign if not already signed (or re-sign on retry for fresh nonce)
599
+ if (!this.cachedSignedTx || attempt > 0) {
600
+ // Clear cache on retry to get fresh nonce
601
+ delete this.cachedSignedTx;
602
+ await this.sign();
603
+ }
604
+ if (!this.cachedSignedTx) {
605
+ throw new NearError("Failed to sign transaction", "TRANSACTION_SIGNING_FAILED");
606
+ }
607
+ const { signedTx, hash } = this.cachedSignedTx;
608
+ // Serialize signed transaction using Borsh
609
+ const signedSerialized = serializeSignedTransaction(signedTx);
610
+ // Send to network
611
+ const result = await this.rpc.sendTransaction(signedSerialized, waitUntil);
612
+ // Inject minimal transaction fields if not present (for NONE/INCLUDED/INCLUDED_FINAL)
613
+ // This ensures transaction.hash is always available
614
+ if (!("transaction" in result) || !result.transaction) {
615
+ ;
616
+ result["transaction"] = {
617
+ hash,
618
+ signer_id: signedTx.transaction.signerId,
619
+ receiver_id: this.receiverId,
620
+ nonce: Number(signedTx.transaction.nonce),
621
+ };
622
+ }
623
+ return result;
624
+ }
625
+ catch (error) {
626
+ lastError = error;
627
+ // Check if it's an InvalidNonceError
628
+ if (error instanceof InvalidNonceError) {
629
+ // Invalidate cached nonce to force fresh fetch on retry
630
+ if (this.cachedSignedTx) {
631
+ TransactionBuilder.nonceManager.invalidate(this.signerId, this.cachedSignedTx.signedTx.transaction.publicKey.toString());
632
+ }
633
+ // If we have retries left, continue the loop to rebuild with fresh nonce
634
+ if (attempt < MAX_NONCE_RETRIES - 1) {
635
+ continue;
636
+ }
637
+ }
638
+ // Not an InvalidNonceError or out of retries - throw the error
639
+ throw error;
640
+ }
641
+ }
642
+ // This should never be reached, but TypeScript needs it
643
+ throw (lastError ||
644
+ new NearError("Unknown error during transaction send", "UNKNOWN_TRANSACTION_ERROR"));
645
+ }
646
+ }
647
+ // Shared nonce manager across all TransactionBuilder instances
648
+ TransactionBuilder.nonceManager = new NonceManager();
649
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":"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"}