@continuumdao/ctm-mpc-defi 0.2.60 → 0.2.61

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.
@@ -1,5 +1,5 @@
1
1
  import { Address } from 'viem';
2
- import { TXIDVersion, NetworkName, TransactionGasDetails } from '@railgun-community/shared-models';
2
+ import { TXIDVersion, NetworkName, TransactionGasDetails, RailgunBalancesEvent } from '@railgun-community/shared-models';
3
3
 
4
4
  /** Aligns with app NonEvmChainType + 'evm'. Extend as mpc-auth adds chains. */
5
5
  type ChainCategory = 'evm' | 'solana' | 'near' | 'sui' | 'ton' | 'stellar';
@@ -226,8 +226,8 @@ type AllowanceReader = (args: {
226
226
  }) => Promise<bigint>;
227
227
  declare function setRailgunPopulateShieldForTests(fn: PopulateShield | null): void;
228
228
  declare function setRailgunAllowanceReaderForTests(fn: AllowanceReader | null): void;
229
- /** Railgun hashes the 65-byte personal_sign. populateShield rejects the raw signature. */
230
- declare function shieldPrivateKeyFromSignature(signature: string): `0x${string}`;
229
+ /** Railgun hashes the 65-byte personal_sign. The node often returns r||s without the recovery byte. */
230
+ declare function shieldPrivateKeyFromSignature(signature: string, executorAddress?: string): Promise<`0x${string}`>;
231
231
  declare function buildEvmMultisignBodyWethUnwrap(args: {
232
232
  keyGen: KeyGenSubset;
233
233
  executorAddress: Address | string;
@@ -249,8 +249,65 @@ type RailgunPrivateActionArgs = {
249
249
  amountWei: string;
250
250
  recipientAddress: string;
251
251
  memoText?: string;
252
+ onBroadcasterSearch?: () => void;
253
+ onBroadcasterNote?: (note: string) => void;
252
254
  onProofProgress?: (progress: number) => void;
255
+ onProofStatusRefresh?: () => void;
256
+ broadcasterFeesId?: string;
253
257
  };
258
+ /** Railgun replaces the note-check text with a short sentence. Keep the required amount and balance when they are still attached. */
259
+ declare function railgunDetailedError(err: unknown): string;
260
+ /** The broadcaster accepted the proof request and asked for a fresh proof-of-innocence status. */
261
+ declare function broadcasterAskedToRefreshProofStatus(err: unknown): boolean;
262
+ declare function broadcasterRefusedForGas(err: unknown): boolean;
263
+ /** A fee message can take about a minute to arrive after the spending-wallet sync. */
264
+ declare const BROADCASTER_PROOF_WAIT_MS: number;
265
+ /** Same margin the Waku client uses before it treats a fee as expired. */
266
+ declare const BROADCASTER_FEE_MIN_REMAINING_MS = 40000;
267
+ declare function broadcasterFeeStillValid(expiration: number, now?: number): boolean;
268
+ type RailgunBroadcasterChoice = {
269
+ feesId: string;
270
+ railgunAddress: string;
271
+ feeWei: string;
272
+ ratio: string | null;
273
+ coversGas: boolean;
274
+ reliability: number;
275
+ expiration: number;
276
+ tokenDecimals: number;
277
+ };
278
+ declare function listRailgunBroadcasters(args: {
279
+ chainId: number;
280
+ rpcUrl: string;
281
+ chainDetail: EvmChainDetail;
282
+ tokenAddress: string;
283
+ kind: string;
284
+ }): Promise<RailgunBroadcasterChoice[]>;
285
+ declare function quoteRailgunBroadcasterFee(args: {
286
+ kind: 'transfer' | 'unshield';
287
+ chainId: number;
288
+ rpcUrl: string;
289
+ chainDetail: EvmChainDetail;
290
+ tokenAddress: string;
291
+ amountWei: string;
292
+ recipientAddress: string;
293
+ memoText?: string;
294
+ walletId: string;
295
+ encryptionKey: string;
296
+ }): Promise<{
297
+ feeWei: string;
298
+ tokenAddress: string;
299
+ }>;
300
+ /** Broadcaster fee from the live fee rate and chain gas. A view-only wallet cannot run the proof estimate. */
301
+ declare function quoteRailgunBroadcasterFeeRate(args: {
302
+ kind: 'transfer' | 'unshield';
303
+ chainId: number;
304
+ rpcUrl: string;
305
+ chainDetail: EvmChainDetail;
306
+ tokenAddress: string;
307
+ }): Promise<{
308
+ feeWei: string;
309
+ tokenAddress: string;
310
+ }>;
254
311
  declare function railgunPrivateTransfer(args: RailgunPrivateActionArgs): Promise<{
255
312
  txHash: string;
256
313
  }>;
@@ -258,6 +315,36 @@ declare function railgunUnshield(args: RailgunPrivateActionArgs): Promise<{
258
315
  txHash: string;
259
316
  }>;
260
317
 
318
+ type RailgunFeeKind = 'shield' | 'transfer' | 'unshield';
319
+ type RailgunFeeQuote = {
320
+ kind: RailgunFeeKind;
321
+ amountWei: string;
322
+ protocolFeeBasisPoints: string;
323
+ protocolFeeWei: string;
324
+ receivedWei: string;
325
+ broadcasterFeeWei: string;
326
+ broadcasterTokenAddress: string;
327
+ totalDebitWei: string;
328
+ broadcasterError?: string;
329
+ };
330
+ declare function railgunProtocolFee(amount: bigint, basisPoints: bigint): {
331
+ fee: bigint;
332
+ received: bigint;
333
+ };
334
+ declare function clearRailgunFeeCache(): void;
335
+ declare function quoteRailgunFee(args: {
336
+ kind: RailgunFeeKind;
337
+ chainId: number;
338
+ rpcUrl: string;
339
+ chainDetail?: EvmChainDetail;
340
+ tokenAddress: string;
341
+ amountWei: string;
342
+ recipientAddress?: string;
343
+ memoText?: string;
344
+ walletId?: string;
345
+ encryptionKey?: string;
346
+ }): Promise<RailgunFeeQuote>;
347
+
261
348
  declare function createRailgunBrowserWallet(args: {
262
349
  encryptionKey: string;
263
350
  mnemonic: string;
@@ -272,25 +359,72 @@ declare function openRailgunViewOnlyWallet(args: {
272
359
  encryptionKey: string;
273
360
  shareableViewingKey: string;
274
361
  chainId: number;
362
+ keyGenId?: string;
275
363
  }): Promise<{
276
364
  walletId: string;
277
365
  railgunAddress: string;
278
366
  }>;
279
367
  declare function discardRailgunWallet(walletId: string): Promise<void>;
280
368
  declare function railgunAddressIsValid(address: string): Promise<boolean>;
369
+ declare function recordRailgunWalletBalance(event: RailgunBalancesEvent): void;
370
+ declare function railgunWalletBalanceSnapshot(walletId: string, chainId: number): RailgunPrivateBalanceRow[];
371
+ declare function clearRailgunWalletBalances(): void;
281
372
  /** History sync emits Complete on the merkletree callback. It does not emit the wallet event awaitWalletScan waits for. */
282
373
  declare function utxoScanTerminalStatus(scanStatus: string): 'done' | 'failed' | 'pending';
374
+ /** After the note scan reports 100%, wait this long for the spendable-note check, then save the balances already decrypted. */
375
+ declare const RAILGUN_TXID_WAIT_AFTER_NOTES_MS = 45000;
376
+ /** After the history walk, sync blocks that were mined while it was running. A shield in that gap is otherwise left out. */
377
+ declare const RAILGUN_CATCH_UP_MS = 120000;
378
+ /** The first merkletree walk can take much longer than the catch-up window. Give up only when progress itself stops. */
379
+ declare const RAILGUN_MERKLETREE_STALL_MS: number;
380
+ declare const RAILGUN_SCAN_BEHIND_NOTE = "The shielded balance is saved. The newest blocks did not finish syncing, so a shield that just landed may be missing until the next scan.";
381
+ declare const RAILGUN_SCAN_STOPPED_NOTE = "The note scan stopped before it reached the latest block. The shielded balance is unchanged until a scan finishes.";
382
+ /** A catch-up timer that expires while leaves are still arriving has not finished the tree. */
383
+ declare function merkletreeScanStillRunning(args: {
384
+ sawProgress: boolean;
385
+ notesFinished: boolean;
386
+ terminal: 'done' | 'failed' | 'pending';
387
+ }): boolean;
388
+ declare function railgunScanRecord(merkletree: 'done' | 'failed', balanceCount: number, caughtUp: boolean): {
389
+ scanStatus: RailgunScanStatus;
390
+ notes: string;
391
+ };
392
+ declare function balancesToKeepAfterNoteScan(decrypted: RailgunPrivateBalanceRow[], afterRefresh: RailgunPrivateBalanceRow[], previous: RailgunPrivateBalanceRow[]): RailgunPrivateBalanceRow[];
393
+ declare const RAILGUN_SPEND_SCAN_STOPPED = "The spending wallet did not finish scanning private notes.";
394
+ /**
395
+ * History complete is emitted at 100% after this wallet's notes are decrypted.
396
+ * The decrypt-complete wallet event is deferred until after that, so 100% is the
397
+ * signal to build the proof. Give up only when leaves stop arriving before then.
398
+ */
399
+ declare function spendingScanReadyAfterHistory(progress: number, scanStatus: string): boolean;
400
+ declare function spendingNoteScanGaveUp(args: {
401
+ walletReady: boolean;
402
+ sawProgress: boolean;
403
+ notesFinished: boolean;
404
+ msSinceProgress: number;
405
+ msWaitingForDecrypt: number | null;
406
+ }): boolean;
407
+ /** Decrypt this spending wallet's notes before a proof. A view-only scan does not fill this wallet. */
408
+ declare function scanSpendingWalletNotes(args: {
409
+ chainId: number;
410
+ rpcUrl: string;
411
+ walletId: string;
412
+ onProgress?: (progress: number) => void;
413
+ }): Promise<void>;
283
414
  declare function scanRailgunPrivateBalances(args: {
284
415
  chainId: number;
285
416
  rpcUrl: string;
286
417
  walletId: string;
287
418
  onProgress?: (progress: number) => void;
419
+ onBalances?: (balances: RailgunPrivateBalanceRow[]) => void;
288
420
  }): Promise<{
289
421
  scanStatus: RailgunScanStatus;
290
422
  balances: RailgunPrivateBalanceRow[];
423
+ settled: boolean;
424
+ notes: string;
291
425
  }>;
292
426
 
293
427
  declare const RAILGUN_PROTOCOL_ID = "railgun";
294
428
  declare const railgunProtocolModule: ProtocolModule;
295
429
 
296
- export { RAILGUN_CTM_DISABLED_MESSAGE, RAILGUN_CTM_ENABLED, RAILGUN_POPULAR_ASSET_LIMIT, RAILGUN_PROTOCOL_ID, RAILGUN_WALLET_LOCKED_MESSAGE, type RailgunNetworkRow, type RailgunNetworkSource, type RailgunPrivateActionArgs, type RailgunPrivateBalanceRow, type RailgunPrivateBalanceSnapshot, type RailgunScanStatus, type RailgunShieldArgs, type RailgunWalletSession, type ShieldCommitmentLike, assertRailgunCtmAllowed, buildEvmMultisignBodyRailgunShield, buildEvmMultisignBodyWethUnwrap, clearRailgunNetworkCache, clearRailgunPopularAssetCache, clearRailgunPrivateBalanceSnapshots, commitmentsFromShieldIndex, createRailgunBrowserWallet, discardRailgunWallet, getRailgunWalletSession, loadRailgunNetworks, loadRailgunPopularAssets, loadRailgunSupportedChainIds, openRailgunViewOnlyWallet, publishRailgunPrivateBalanceSnapshot, railgunAddressIsValid, railgunFetchPopularAssets, railgunFetchPrivateBalances, railgunFetchPrivateBalancesSummary, railgunNetworkByChainId, railgunPrivateTransfer, railgunProtocolModule, railgunShareableViewingKey, railgunUnshield, rankPopularShieldTokens, readRailgunPrivateBalanceSnapshot, requireRailgunWalletSession, scanRailgunPrivateBalances, selectRailgunNetworks, setRailgunAllowanceReaderForTests, setRailgunPopulateShieldForTests, setRailgunShieldLogReaderForTests, setRailgunWalletSession, shieldIndexEndpoint, shieldPrivateKeyFromSignature, unlockRailgunBrowserWallet, utxoScanTerminalStatus };
430
+ export { BROADCASTER_FEE_MIN_REMAINING_MS, BROADCASTER_PROOF_WAIT_MS, RAILGUN_CATCH_UP_MS, RAILGUN_CTM_DISABLED_MESSAGE, RAILGUN_CTM_ENABLED, RAILGUN_MERKLETREE_STALL_MS, RAILGUN_POPULAR_ASSET_LIMIT, RAILGUN_PROTOCOL_ID, RAILGUN_SCAN_BEHIND_NOTE, RAILGUN_SCAN_STOPPED_NOTE, RAILGUN_SPEND_SCAN_STOPPED, RAILGUN_TXID_WAIT_AFTER_NOTES_MS, RAILGUN_WALLET_LOCKED_MESSAGE, type RailgunBroadcasterChoice, type RailgunFeeKind, type RailgunFeeQuote, type RailgunNetworkRow, type RailgunNetworkSource, type RailgunPrivateActionArgs, type RailgunPrivateBalanceRow, type RailgunPrivateBalanceSnapshot, type RailgunScanStatus, type RailgunShieldArgs, type RailgunWalletSession, type ShieldCommitmentLike, assertRailgunCtmAllowed, balancesToKeepAfterNoteScan, broadcasterAskedToRefreshProofStatus, broadcasterFeeStillValid, broadcasterRefusedForGas, buildEvmMultisignBodyRailgunShield, buildEvmMultisignBodyWethUnwrap, clearRailgunFeeCache, clearRailgunNetworkCache, clearRailgunPopularAssetCache, clearRailgunPrivateBalanceSnapshots, clearRailgunWalletBalances, commitmentsFromShieldIndex, createRailgunBrowserWallet, discardRailgunWallet, getRailgunWalletSession, listRailgunBroadcasters, loadRailgunNetworks, loadRailgunPopularAssets, loadRailgunSupportedChainIds, merkletreeScanStillRunning, openRailgunViewOnlyWallet, publishRailgunPrivateBalanceSnapshot, quoteRailgunBroadcasterFee, quoteRailgunBroadcasterFeeRate, quoteRailgunFee, railgunAddressIsValid, railgunDetailedError, railgunFetchPopularAssets, railgunFetchPrivateBalances, railgunFetchPrivateBalancesSummary, railgunNetworkByChainId, railgunPrivateTransfer, railgunProtocolFee, railgunProtocolModule, railgunScanRecord, railgunShareableViewingKey, railgunUnshield, railgunWalletBalanceSnapshot, rankPopularShieldTokens, readRailgunPrivateBalanceSnapshot, recordRailgunWalletBalance, requireRailgunWalletSession, scanRailgunPrivateBalances, scanSpendingWalletNotes, selectRailgunNetworks, setRailgunAllowanceReaderForTests, setRailgunPopulateShieldForTests, setRailgunShieldLogReaderForTests, setRailgunWalletSession, shieldIndexEndpoint, shieldPrivateKeyFromSignature, spendingNoteScanGaveUp, spendingScanReadyAfterHistory, unlockRailgunBrowserWallet, utxoScanTerminalStatus };