@deserialize/multi-vm-wallet 1.3.1 → 1.3.3

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 (98) hide show
  1. package/.claude/settings.local.json +7 -1
  2. package/dist/IChainWallet.d.ts +3 -3
  3. package/dist/constant.js +60 -16
  4. package/dist/constant.js.map +1 -1
  5. package/dist/evm/aa-service/index.d.ts +2 -2
  6. package/dist/evm/aa-service/index.js +1 -3
  7. package/dist/evm/aa-service/index.js.map +1 -1
  8. package/dist/evm/aa-service/lib/kernel-account.d.ts +2 -44
  9. package/dist/evm/aa-service/lib/kernel-account.js +42 -93
  10. package/dist/evm/aa-service/lib/kernel-account.js.map +1 -1
  11. package/dist/evm/aa-service/lib/session-keys.d.ts +14 -17
  12. package/dist/evm/aa-service/lib/session-keys.js +40 -58
  13. package/dist/evm/aa-service/lib/session-keys.js.map +1 -1
  14. package/dist/evm/aa-service/lib/type.d.ts +18 -1
  15. package/dist/evm/aa-service/lib/type.js.map +1 -1
  16. package/dist/evm/aa-service/services/account-abstraction.d.ts +7 -29
  17. package/dist/evm/aa-service/services/account-abstraction.js +12 -68
  18. package/dist/evm/aa-service/services/account-abstraction.js.map +1 -1
  19. package/dist/evm/aa-service/services/bundler.d.ts +4 -1
  20. package/dist/evm/aa-service/services/bundler.js +41 -7
  21. package/dist/evm/aa-service/services/bundler.js.map +1 -1
  22. package/dist/evm/evm.d.ts +164 -14
  23. package/dist/evm/evm.js +259 -80
  24. package/dist/evm/evm.js.map +1 -1
  25. package/dist/evm/smartWallet.d.ts +12 -61
  26. package/dist/evm/smartWallet.js +143 -184
  27. package/dist/evm/smartWallet.js.map +1 -1
  28. package/dist/evm/utils.js +1 -1
  29. package/dist/evm/utils.js.map +1 -1
  30. package/dist/helpers/index.d.ts +6 -1
  31. package/dist/helpers/index.js +116 -0
  32. package/dist/helpers/index.js.map +1 -1
  33. package/dist/privacy/artifact-manager.d.ts +117 -0
  34. package/dist/privacy/artifact-manager.js +251 -0
  35. package/dist/privacy/artifact-manager.js.map +1 -0
  36. package/dist/privacy/broadcaster-client.d.ts +166 -0
  37. package/dist/privacy/broadcaster-client.js +261 -0
  38. package/dist/privacy/broadcaster-client.js.map +1 -0
  39. package/dist/privacy/index.d.ts +34 -0
  40. package/dist/privacy/index.js +56 -0
  41. package/dist/privacy/index.js.map +1 -0
  42. package/dist/privacy/network-config.d.ts +57 -0
  43. package/dist/privacy/network-config.js +118 -0
  44. package/dist/privacy/network-config.js.map +1 -0
  45. package/dist/privacy/poi-helper.d.ts +161 -0
  46. package/dist/privacy/poi-helper.js +249 -0
  47. package/dist/privacy/poi-helper.js.map +1 -0
  48. package/dist/privacy/railgun-engine.d.ts +135 -0
  49. package/dist/privacy/railgun-engine.js +205 -0
  50. package/dist/privacy/railgun-engine.js.map +1 -0
  51. package/dist/privacy/railgun-privacy-wallet.d.ts +288 -0
  52. package/dist/privacy/railgun-privacy-wallet.js +539 -0
  53. package/dist/privacy/railgun-privacy-wallet.js.map +1 -0
  54. package/dist/privacy/types.d.ts +229 -0
  55. package/dist/privacy/types.js +26 -0
  56. package/dist/privacy/types.js.map +1 -0
  57. package/dist/savings/savings-manager.d.ts +126 -0
  58. package/dist/savings/savings-manager.js +234 -0
  59. package/dist/savings/savings-manager.js.map +1 -0
  60. package/dist/savings/smart-savings.d.ts +74 -0
  61. package/dist/savings/smart-savings.js +152 -0
  62. package/dist/savings/smart-savings.js.map +1 -0
  63. package/dist/savings/types.d.ts +125 -0
  64. package/dist/savings/types.js +9 -0
  65. package/dist/savings/types.js.map +1 -0
  66. package/dist/svm/svm.d.ts +19 -3
  67. package/dist/svm/svm.js +29 -17
  68. package/dist/svm/svm.js.map +1 -1
  69. package/dist/svm/utils.d.ts +2 -2
  70. package/dist/svm/utils.js +4 -4
  71. package/dist/svm/utils.js.map +1 -1
  72. package/dist/test.js +81 -22
  73. package/dist/test.js.map +1 -1
  74. package/dist/types.d.ts +14 -16
  75. package/dist/types.js.map +1 -1
  76. package/dist/vm.d.ts +14 -0
  77. package/dist/vm.js.map +1 -1
  78. package/package.json +6 -1
  79. package/utils/IChainWallet.ts +3 -3
  80. package/utils/constant.ts +63 -16
  81. package/utils/evm/aa-service/index.ts +1 -3
  82. package/utils/evm/aa-service/lib/kernel-account.ts +45 -136
  83. package/utils/evm/aa-service/lib/session-keys.ts +58 -60
  84. package/utils/evm/aa-service/lib/type.ts +19 -1
  85. package/utils/evm/aa-service/services/account-abstraction.ts +24 -76
  86. package/utils/evm/aa-service/services/bundler.ts +54 -11
  87. package/utils/evm/evm.ts +313 -110
  88. package/utils/evm/smartWallet.ts +124 -214
  89. package/utils/evm/utils.ts +2 -1
  90. package/utils/helpers/index.ts +138 -1
  91. package/utils/savings/savings-manager.ts +271 -0
  92. package/utils/savings/smart-savings.ts +184 -0
  93. package/utils/savings/types.ts +135 -0
  94. package/utils/svm/svm.ts +34 -25
  95. package/utils/svm/utils.ts +4 -10
  96. package/utils/test.ts +112 -24
  97. package/utils/types.ts +15 -17
  98. package/utils/vm.ts +10 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * RAILGUN Network Configurations
4
+ *
5
+ * Defines all supported RAILGUN networks with their deployment information.
6
+ * Based on official RAILGUN deployments as of 2024.
7
+ *
8
+ * Supported Networks:
9
+ * - Ethereum Mainnet
10
+ * - Polygon (Matic)
11
+ * - BNB Chain (BSC)
12
+ * - Arbitrum One
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.POI_STANDBY_PERIODS = exports.DEFAULT_POI_NODES = exports.RAILGUN_NETWORKS = void 0;
16
+ exports.getNetworkConfig = getNetworkConfig;
17
+ exports.getNetworkConfigByChainId = getNetworkConfigByChainId;
18
+ exports.isNetworkSupported = isNetworkSupported;
19
+ exports.isChainIdSupported = isChainIdSupported;
20
+ exports.getSupportedNetworks = getSupportedNetworks;
21
+ exports.getSupportedChainIds = getSupportedChainIds;
22
+ exports.getPOIStandbyPeriod = getPOIStandbyPeriod;
23
+ const shared_models_1 = require("@railgun-community/shared-models");
24
+ /**
25
+ * All RAILGUN supported networks
26
+ */
27
+ exports.RAILGUN_NETWORKS = {
28
+ ethereum: {
29
+ name: shared_models_1.NetworkName.Ethereum,
30
+ chainId: 1,
31
+ publicName: 'Ethereum',
32
+ deploymentBlock: 15725700, // Approximate RAILGUN deployment block
33
+ },
34
+ polygon: {
35
+ name: shared_models_1.NetworkName.Polygon,
36
+ chainId: 137,
37
+ publicName: 'Polygon',
38
+ deploymentBlock: 34715800, // Approximate RAILGUN deployment block
39
+ },
40
+ bsc: {
41
+ name: shared_models_1.NetworkName.BNBChain,
42
+ chainId: 56,
43
+ publicName: 'BNB Chain',
44
+ deploymentBlock: 22550000, // Approximate RAILGUN deployment block
45
+ },
46
+ arbitrum: {
47
+ name: shared_models_1.NetworkName.Arbitrum,
48
+ chainId: 42161,
49
+ publicName: 'Arbitrum One',
50
+ deploymentBlock: 36070000, // Approximate RAILGUN deployment block
51
+ },
52
+ };
53
+ /**
54
+ * Get RAILGUN network config by NetworkName
55
+ */
56
+ function getNetworkConfig(network) {
57
+ return Object.values(exports.RAILGUN_NETWORKS).find(config => config.name === network);
58
+ }
59
+ /**
60
+ * Get RAILGUN network config by chain ID
61
+ */
62
+ function getNetworkConfigByChainId(chainId) {
63
+ return Object.values(exports.RAILGUN_NETWORKS).find(config => config.chainId === chainId);
64
+ }
65
+ /**
66
+ * Check if a network is supported by RAILGUN
67
+ */
68
+ function isNetworkSupported(network) {
69
+ return !!getNetworkConfig(network);
70
+ }
71
+ /**
72
+ * Check if a chain ID is supported by RAILGUN
73
+ */
74
+ function isChainIdSupported(chainId) {
75
+ return !!getNetworkConfigByChainId(chainId);
76
+ }
77
+ /**
78
+ * Get all supported NetworkName values
79
+ */
80
+ function getSupportedNetworks() {
81
+ return Object.values(exports.RAILGUN_NETWORKS).map(config => config.name);
82
+ }
83
+ /**
84
+ * Get all supported chain IDs
85
+ */
86
+ function getSupportedChainIds() {
87
+ return Object.values(exports.RAILGUN_NETWORKS).map(config => config.chainId);
88
+ }
89
+ /**
90
+ * Default POI (Proof of Innocence) aggregator nodes
91
+ */
92
+ exports.DEFAULT_POI_NODES = [
93
+ 'https://ppoi-agg.horsewithsixlegs.xyz', // Test/development node
94
+ // Add production POI nodes here when available
95
+ ];
96
+ /**
97
+ * POI standby periods (in milliseconds)
98
+ */
99
+ exports.POI_STANDBY_PERIODS = {
100
+ mainnet: 60 * 60 * 1000, // 1 hour
101
+ testnet: 5 * 60 * 1000, // 5 minutes
102
+ };
103
+ /**
104
+ * Get POI standby period for a network
105
+ */
106
+ function getPOIStandbyPeriod(network) {
107
+ // Testnets have shorter periods
108
+ const testnets = [
109
+ shared_models_1.NetworkName.EthereumGoerli,
110
+ shared_models_1.NetworkName.EthereumSepolia,
111
+ shared_models_1.NetworkName.PolygonMumbai,
112
+ shared_models_1.NetworkName.ArbitrumGoerli,
113
+ ];
114
+ return testnets.includes(network)
115
+ ? exports.POI_STANDBY_PERIODS.testnet
116
+ : exports.POI_STANDBY_PERIODS.mainnet;
117
+ }
118
+ //# sourceMappingURL=network-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-config.js","sourceRoot":"","sources":["../../utils/privacy/network-config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAyCH,4CAEC;AAKD,8DAEC;AAKD,gDAEC;AAKD,gDAEC;AAKD,oDAEC;AAKD,oDAEC;AAqBD,kDAYC;AA7GD,oEAA+D;AAG/D;;GAEG;AACU,QAAA,gBAAgB,GAAyC;IACpE,QAAQ,EAAE;QACR,IAAI,EAAE,2BAAW,CAAC,QAAQ;QAC1B,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,UAAU;QACtB,eAAe,EAAE,QAAQ,EAAE,uCAAuC;KACnE;IAED,OAAO,EAAE;QACP,IAAI,EAAE,2BAAW,CAAC,OAAO;QACzB,OAAO,EAAE,GAAG;QACZ,UAAU,EAAE,SAAS;QACrB,eAAe,EAAE,QAAQ,EAAE,uCAAuC;KACnE;IAED,GAAG,EAAE;QACH,IAAI,EAAE,2BAAW,CAAC,QAAQ;QAC1B,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,WAAW;QACvB,eAAe,EAAE,QAAQ,EAAE,uCAAuC;KACnE;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,2BAAW,CAAC,QAAQ;QAC1B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,cAAc;QAC1B,eAAe,EAAE,QAAQ,EAAE,uCAAuC;KACnE;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAoB;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,wBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CAAC,OAAe;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,wBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAAoB;IACrD,OAAO,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAAe;IAChD,OAAO,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,wBAAgB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,wBAAgB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACU,QAAA,iBAAiB,GAAG;IAC/B,uCAAuC,EAAE,wBAAwB;IACjE,+CAA+C;CAChD,CAAC;AAEF;;GAEG;AACU,QAAA,mBAAmB,GAAG;IACjC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;IAClC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAG,YAAY;CACtC,CAAC;AAEF;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAoB;IACtD,gCAAgC;IAChC,MAAM,QAAQ,GAAG;QACf,2BAAW,CAAC,cAAc;QAC1B,2BAAW,CAAC,eAAe;QAC3B,2BAAW,CAAC,aAAa;QACzB,2BAAW,CAAC,cAAc;KAC3B,CAAC;IAEF,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,2BAAmB,CAAC,OAAO;QAC7B,CAAC,CAAC,2BAAmB,CAAC,OAAO,CAAC;AAClC,CAAC"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * RAILGUN POI (Proof of Innocence) Helper
3
+ *
4
+ * Provides utilities for checking POI status and fund spendability.
5
+ *
6
+ * Key Concepts:
7
+ * - After shielding, funds enter a 1-hour "standby period" on mainnet (5 min on testnets)
8
+ * - During standby, funds are "ShieldPending" and cannot be spent
9
+ * - After standby, funds become "Spendable" if POI is valid
10
+ * - Funds can also be in other states (ShieldBlocked, MissingPOI, etc.)
11
+ */
12
+ import { NetworkName } from '@railgun-community/shared-models';
13
+ import { BalanceBucket, POISpendabilityResult, PrivateBalance } from './types';
14
+ /**
15
+ * POIHelper
16
+ *
17
+ * Stateless utilities for POI status checking.
18
+ */
19
+ export declare class POIHelper {
20
+ /**
21
+ * Check if funds are spendable
22
+ *
23
+ * A balance is spendable if it's in the "Spendable" bucket.
24
+ *
25
+ * @param balance - Private balance to check
26
+ * @returns true if spendable, false otherwise
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const balances = await wallet.getBalances(NetworkName.Ethereum);
31
+ * const spendable = balances.filter(b => POIHelper.isSpendable(b));
32
+ * ```
33
+ */
34
+ static isSpendable(balance: PrivateBalance): boolean;
35
+ /**
36
+ * Check if funds are in standby period
37
+ *
38
+ * @param balance - Private balance to check
39
+ * @returns true if in ShieldPending state
40
+ */
41
+ static isInStandby(balance: PrivateBalance): boolean;
42
+ /**
43
+ * Check if funds are blocked
44
+ *
45
+ * @param balance - Private balance to check
46
+ * @returns true if in ShieldBlocked state
47
+ */
48
+ static isBlocked(balance: PrivateBalance): boolean;
49
+ /**
50
+ * Check if funds have POI issues
51
+ *
52
+ * @param balance - Private balance to check
53
+ * @returns true if missing internal or external POI
54
+ */
55
+ static hasPOIIssue(balance: PrivateBalance): boolean;
56
+ /**
57
+ * Get detailed spendability status
58
+ *
59
+ * Returns comprehensive information about whether funds can be spent
60
+ * and when they will become available.
61
+ *
62
+ * @param balance - Private balance to check
63
+ * @param network - Network name
64
+ * @param shieldTimestamp - When funds were shielded (milliseconds since epoch)
65
+ * @returns Detailed spendability result
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const result = POIHelper.getSpendabilityStatus(
70
+ * balance,
71
+ * NetworkName.Ethereum,
72
+ * Date.now() - (30 * 60 * 1000) // Shielded 30 minutes ago
73
+ * );
74
+ *
75
+ * if (!result.isSpendable && result.remainingTime) {
76
+ * console.log(`Wait ${result.remainingTime / 1000 / 60} more minutes`);
77
+ * }
78
+ * ```
79
+ */
80
+ static getSpendabilityStatus(balance: PrivateBalance, network: NetworkName, shieldTimestamp?: number): POISpendabilityResult;
81
+ /**
82
+ * Filter balances to only spendable ones
83
+ *
84
+ * @param balances - Array of private balances
85
+ * @returns Only spendable balances
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const allBalances = await wallet.getBalances(NetworkName.Ethereum);
90
+ * const spendable = POIHelper.filterSpendable(allBalances);
91
+ * ```
92
+ */
93
+ static filterSpendable(balances: PrivateBalance[]): PrivateBalance[];
94
+ /**
95
+ * Get total spendable amount for a token
96
+ *
97
+ * Sums up all spendable balances for a specific token address.
98
+ *
99
+ * @param balances - Array of private balances
100
+ * @param tokenAddress - Token contract address
101
+ * @returns Total spendable amount as bigint
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const balances = await wallet.getBalances(NetworkName.Ethereum);
106
+ * const usdcSpendable = POIHelper.getTotalSpendable(balances, USDC_ADDRESS);
107
+ * ```
108
+ */
109
+ static getTotalSpendable(balances: PrivateBalance[], tokenAddress: string): bigint;
110
+ /**
111
+ * Get total amount by bucket
112
+ *
113
+ * Sums balances grouped by bucket category.
114
+ *
115
+ * @param balances - Array of private balances
116
+ * @returns Map of bucket to total amount
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const balances = await wallet.getBalances(NetworkName.Ethereum);
121
+ * const byBucket = POIHelper.getTotalsByBucket(balances);
122
+ *
123
+ * console.log(`Spendable: ${byBucket.get(BalanceBucket.Spendable)}`);
124
+ * console.log(`Pending: ${byBucket.get(BalanceBucket.ShieldPending)}`);
125
+ * ```
126
+ */
127
+ static getTotalsByBucket(balances: PrivateBalance[]): Map<BalanceBucket, bigint>;
128
+ /**
129
+ * Estimate time until all balances are spendable
130
+ *
131
+ * Calculates the maximum remaining standby time across all pending balances.
132
+ *
133
+ * @param balances - Array of private balances
134
+ * @param network - Network name
135
+ * @param shieldTimestamps - Map of balance index to shield timestamp
136
+ * @returns Milliseconds until last balance becomes spendable (0 if all spendable)
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const maxWait = POIHelper.estimateTimeUntilSpendable(
141
+ * balances,
142
+ * NetworkName.Ethereum,
143
+ * shieldTimestamps
144
+ * );
145
+ *
146
+ * if (maxWait > 0) {
147
+ * console.log(`Wait ${maxWait / 1000 / 60} minutes for all funds`);
148
+ * }
149
+ * ```
150
+ */
151
+ static estimateTimeUntilSpendable(balances: PrivateBalance[], network: NetworkName, shieldTimestamps: Map<number, number>): number;
152
+ /**
153
+ * Format bucket name for display
154
+ *
155
+ * Converts BalanceBucket enum to human-readable string.
156
+ *
157
+ * @param bucket - Balance bucket
158
+ * @returns Human-readable description
159
+ */
160
+ static formatBucketName(bucket: BalanceBucket): string;
161
+ }
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ /**
3
+ * RAILGUN POI (Proof of Innocence) Helper
4
+ *
5
+ * Provides utilities for checking POI status and fund spendability.
6
+ *
7
+ * Key Concepts:
8
+ * - After shielding, funds enter a 1-hour "standby period" on mainnet (5 min on testnets)
9
+ * - During standby, funds are "ShieldPending" and cannot be spent
10
+ * - After standby, funds become "Spendable" if POI is valid
11
+ * - Funds can also be in other states (ShieldBlocked, MissingPOI, etc.)
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.POIHelper = void 0;
15
+ const types_1 = require("./types");
16
+ const network_config_1 = require("./network-config");
17
+ /**
18
+ * POIHelper
19
+ *
20
+ * Stateless utilities for POI status checking.
21
+ */
22
+ class POIHelper {
23
+ /**
24
+ * Check if funds are spendable
25
+ *
26
+ * A balance is spendable if it's in the "Spendable" bucket.
27
+ *
28
+ * @param balance - Private balance to check
29
+ * @returns true if spendable, false otherwise
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const balances = await wallet.getBalances(NetworkName.Ethereum);
34
+ * const spendable = balances.filter(b => POIHelper.isSpendable(b));
35
+ * ```
36
+ */
37
+ static isSpendable(balance) {
38
+ return balance.bucket === types_1.BalanceBucket.Spendable;
39
+ }
40
+ /**
41
+ * Check if funds are in standby period
42
+ *
43
+ * @param balance - Private balance to check
44
+ * @returns true if in ShieldPending state
45
+ */
46
+ static isInStandby(balance) {
47
+ return balance.bucket === types_1.BalanceBucket.ShieldPending;
48
+ }
49
+ /**
50
+ * Check if funds are blocked
51
+ *
52
+ * @param balance - Private balance to check
53
+ * @returns true if in ShieldBlocked state
54
+ */
55
+ static isBlocked(balance) {
56
+ return balance.bucket === types_1.BalanceBucket.ShieldBlocked;
57
+ }
58
+ /**
59
+ * Check if funds have POI issues
60
+ *
61
+ * @param balance - Private balance to check
62
+ * @returns true if missing internal or external POI
63
+ */
64
+ static hasPOIIssue(balance) {
65
+ return (balance.bucket === types_1.BalanceBucket.MissingInternalPOI ||
66
+ balance.bucket === types_1.BalanceBucket.MissingExternalPOI);
67
+ }
68
+ /**
69
+ * Get detailed spendability status
70
+ *
71
+ * Returns comprehensive information about whether funds can be spent
72
+ * and when they will become available.
73
+ *
74
+ * @param balance - Private balance to check
75
+ * @param network - Network name
76
+ * @param shieldTimestamp - When funds were shielded (milliseconds since epoch)
77
+ * @returns Detailed spendability result
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const result = POIHelper.getSpendabilityStatus(
82
+ * balance,
83
+ * NetworkName.Ethereum,
84
+ * Date.now() - (30 * 60 * 1000) // Shielded 30 minutes ago
85
+ * );
86
+ *
87
+ * if (!result.isSpendable && result.remainingTime) {
88
+ * console.log(`Wait ${result.remainingTime / 1000 / 60} more minutes`);
89
+ * }
90
+ * ```
91
+ */
92
+ static getSpendabilityStatus(balance, network, shieldTimestamp) {
93
+ const bucket = balance.bucket;
94
+ // Already spendable
95
+ if (bucket === types_1.BalanceBucket.Spendable) {
96
+ return {
97
+ isSpendable: true,
98
+ bucket,
99
+ };
100
+ }
101
+ // In standby period
102
+ if (bucket === types_1.BalanceBucket.ShieldPending && shieldTimestamp) {
103
+ const standbyPeriod = (0, network_config_1.getPOIStandbyPeriod)(network);
104
+ const elapsed = Date.now() - shieldTimestamp;
105
+ const remainingTime = Math.max(0, standbyPeriod - elapsed);
106
+ const estimatedSpendableAt = new Date(shieldTimestamp + standbyPeriod);
107
+ return {
108
+ isSpendable: false,
109
+ bucket,
110
+ remainingTime,
111
+ estimatedSpendableAt,
112
+ };
113
+ }
114
+ // Other states (blocked, missing POI, etc.)
115
+ return {
116
+ isSpendable: false,
117
+ bucket,
118
+ };
119
+ }
120
+ /**
121
+ * Filter balances to only spendable ones
122
+ *
123
+ * @param balances - Array of private balances
124
+ * @returns Only spendable balances
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * const allBalances = await wallet.getBalances(NetworkName.Ethereum);
129
+ * const spendable = POIHelper.filterSpendable(allBalances);
130
+ * ```
131
+ */
132
+ static filterSpendable(balances) {
133
+ return balances.filter(b => this.isSpendable(b));
134
+ }
135
+ /**
136
+ * Get total spendable amount for a token
137
+ *
138
+ * Sums up all spendable balances for a specific token address.
139
+ *
140
+ * @param balances - Array of private balances
141
+ * @param tokenAddress - Token contract address
142
+ * @returns Total spendable amount as bigint
143
+ *
144
+ * @example
145
+ * ```typescript
146
+ * const balances = await wallet.getBalances(NetworkName.Ethereum);
147
+ * const usdcSpendable = POIHelper.getTotalSpendable(balances, USDC_ADDRESS);
148
+ * ```
149
+ */
150
+ static getTotalSpendable(balances, tokenAddress) {
151
+ return balances
152
+ .filter(b => b.tokenAddress.toLowerCase() === tokenAddress.toLowerCase())
153
+ .filter(b => this.isSpendable(b))
154
+ .reduce((sum, b) => sum + b.amount, 0n);
155
+ }
156
+ /**
157
+ * Get total amount by bucket
158
+ *
159
+ * Sums balances grouped by bucket category.
160
+ *
161
+ * @param balances - Array of private balances
162
+ * @returns Map of bucket to total amount
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * const balances = await wallet.getBalances(NetworkName.Ethereum);
167
+ * const byBucket = POIHelper.getTotalsByBucket(balances);
168
+ *
169
+ * console.log(`Spendable: ${byBucket.get(BalanceBucket.Spendable)}`);
170
+ * console.log(`Pending: ${byBucket.get(BalanceBucket.ShieldPending)}`);
171
+ * ```
172
+ */
173
+ static getTotalsByBucket(balances) {
174
+ const totals = new Map();
175
+ for (const balance of balances) {
176
+ const current = totals.get(balance.bucket) || 0n;
177
+ totals.set(balance.bucket, current + balance.amount);
178
+ }
179
+ return totals;
180
+ }
181
+ /**
182
+ * Estimate time until all balances are spendable
183
+ *
184
+ * Calculates the maximum remaining standby time across all pending balances.
185
+ *
186
+ * @param balances - Array of private balances
187
+ * @param network - Network name
188
+ * @param shieldTimestamps - Map of balance index to shield timestamp
189
+ * @returns Milliseconds until last balance becomes spendable (0 if all spendable)
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * const maxWait = POIHelper.estimateTimeUntilSpendable(
194
+ * balances,
195
+ * NetworkName.Ethereum,
196
+ * shieldTimestamps
197
+ * );
198
+ *
199
+ * if (maxWait > 0) {
200
+ * console.log(`Wait ${maxWait / 1000 / 60} minutes for all funds`);
201
+ * }
202
+ * ```
203
+ */
204
+ static estimateTimeUntilSpendable(balances, network, shieldTimestamps) {
205
+ let maxRemaining = 0;
206
+ balances.forEach((balance, index) => {
207
+ if (balance.bucket === types_1.BalanceBucket.ShieldPending) {
208
+ const shieldTime = shieldTimestamps.get(index);
209
+ if (shieldTime) {
210
+ const status = this.getSpendabilityStatus(balance, network, shieldTime);
211
+ if (status.remainingTime) {
212
+ maxRemaining = Math.max(maxRemaining, status.remainingTime);
213
+ }
214
+ }
215
+ }
216
+ });
217
+ return maxRemaining;
218
+ }
219
+ /**
220
+ * Format bucket name for display
221
+ *
222
+ * Converts BalanceBucket enum to human-readable string.
223
+ *
224
+ * @param bucket - Balance bucket
225
+ * @returns Human-readable description
226
+ */
227
+ static formatBucketName(bucket) {
228
+ switch (bucket) {
229
+ case types_1.BalanceBucket.Spendable:
230
+ return 'Ready to spend';
231
+ case types_1.BalanceBucket.ShieldPending:
232
+ return 'Pending (standby period)';
233
+ case types_1.BalanceBucket.ShieldBlocked:
234
+ return 'Blocked';
235
+ case types_1.BalanceBucket.ProofSubmitted:
236
+ return 'Proof submitted';
237
+ case types_1.BalanceBucket.MissingInternalPOI:
238
+ return 'Missing internal POI';
239
+ case types_1.BalanceBucket.MissingExternalPOI:
240
+ return 'Missing external POI';
241
+ case types_1.BalanceBucket.Spent:
242
+ return 'Already spent';
243
+ default:
244
+ return 'Unknown status';
245
+ }
246
+ }
247
+ }
248
+ exports.POIHelper = POIHelper;
249
+ //# sourceMappingURL=poi-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poi-helper.js","sourceRoot":"","sources":["../../utils/privacy/poi-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * RAILGUN Engine Singleton
3
+ *
4
+ * Manages the global RAILGUN privacy engine initialization.
5
+ * Must be initialized once before using any privacy features.
6
+ *
7
+ * STATELESS: Does not store configuration or state beyond initialization flag.
8
+ * Implementer controls when/how to initialize.
9
+ */
10
+ import { NetworkName } from '@railgun-community/shared-models';
11
+ import { RailgunEngineConfig, PreloadedArtifacts, ScanProgressCallback, BalanceUpdateCallback, NetworkFees } from './types';
12
+ /**
13
+ * RAILGUN Engine Singleton
14
+ *
15
+ * Manages the global RAILGUN privacy engine initialization.
16
+ * Must be initialized once before using any privacy features.
17
+ *
18
+ * STATELESS: Does not store any configuration or state.
19
+ * Implementer controls when/how to initialize.
20
+ */
21
+ export declare class RailgunEngine {
22
+ private static initialized;
23
+ private static config;
24
+ /**
25
+ * Initialize RAILGUN privacy engine
26
+ *
27
+ * This is a one-time setup that must be called before any privacy operations.
28
+ * Implementer provides database and artifact storage.
29
+ *
30
+ * @param config - Engine configuration
31
+ * @param preloadedArtifacts - Optional pre-downloaded circuits
32
+ *
33
+ * @throws Error if already initialized or if configuration is invalid
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * import LevelDB from 'level-js';
38
+ * import { ArtifactManager } from './artifact-manager';
39
+ *
40
+ * const db = new LevelDB('./railgun-data');
41
+ * const artifactStore = ArtifactManager.createArtifactStore(
42
+ * './artifacts',
43
+ * { readFile, writeFile, exists, mkdir }
44
+ * );
45
+ *
46
+ * await RailgunEngine.initialize({
47
+ * walletSource: 'mywallet',
48
+ * db,
49
+ * artifactStore,
50
+ * poiNodeURLs: ['https://ppoi-agg.horsewithsixlegs.xyz'],
51
+ * useNativeArtifacts: false,
52
+ * skipMerkletreeScans: false
53
+ * });
54
+ * ```
55
+ */
56
+ static initialize(config: RailgunEngineConfig, preloadedArtifacts?: PreloadedArtifacts): Promise<void>;
57
+ /**
58
+ * Shutdown RAILGUN engine
59
+ *
60
+ * Cleanup resources and stop the engine.
61
+ * After shutdown, initialize() must be called again to use privacy features.
62
+ */
63
+ static shutdown(): Promise<void>;
64
+ /**
65
+ * Check if engine is initialized
66
+ */
67
+ static isInitialized(): boolean;
68
+ /**
69
+ * Get current configuration (read-only)
70
+ * Returns null if not initialized
71
+ */
72
+ static getConfig(): Readonly<RailgunEngineConfig> | null;
73
+ /**
74
+ * Load network provider and RAILGUN contracts
75
+ *
76
+ * Must be called for each network before using it.
77
+ * Returns network fees.
78
+ *
79
+ * @param network - Network to load
80
+ * @param rpcProvider - ethers.js provider for the network
81
+ * @param pollingInterval - RPC polling interval in seconds (default: 10)
82
+ * @returns Network fees (shield, unshield, NFT in basis points)
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * import { JsonRpcProvider } from 'ethers';
87
+ * import { NetworkName } from '@railgun-community/shared-models';
88
+ *
89
+ * const provider = new JsonRpcProvider('https://eth-mainnet.g.alchemy.com/v2/...');
90
+ * const fees = await RailgunEngine.loadNetwork(
91
+ * NetworkName.Ethereum,
92
+ * provider
93
+ * );
94
+ *
95
+ * console.log(`Shield fee: ${fees.shield / 100}%`); // 0.25%
96
+ * ```
97
+ */
98
+ static loadNetwork(network: NetworkName, rpcProvider: any, // ethers.Provider
99
+ pollingInterval?: number): Promise<NetworkFees>;
100
+ /**
101
+ * Set balance update callback
102
+ *
103
+ * Called when private balances change for any wallet.
104
+ *
105
+ * @param callback - Function to call on balance updates
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * RailgunEngine.setOnBalanceUpdate((balances, walletID, network) => {
110
+ * console.log(`Wallet ${walletID} on ${network}:`, balances);
111
+ * updateUI(balances);
112
+ * });
113
+ * ```
114
+ */
115
+ static setOnBalanceUpdate(callback: BalanceUpdateCallback): void;
116
+ /**
117
+ * Set merkletree scan progress callback
118
+ *
119
+ * Called during blockchain scanning for private transactions.
120
+ *
121
+ * @param callback - Function to call with scan progress
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * RailgunEngine.setOnScanProgress((progress, network) => {
126
+ * console.log(`Scanning ${network}: ${progress}%`);
127
+ * updateProgressBar(progress);
128
+ * });
129
+ * ```
130
+ */
131
+ static setOnScanProgress(callback: ScanProgressCallback): void;
132
+ private static ensureInitialized;
133
+ private static validateConfig;
134
+ private static preloadArtifacts;
135
+ }