@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.
- package/.claude/settings.local.json +7 -1
- package/dist/IChainWallet.d.ts +3 -3
- package/dist/constant.js +60 -16
- package/dist/constant.js.map +1 -1
- package/dist/evm/aa-service/index.d.ts +2 -2
- package/dist/evm/aa-service/index.js +1 -3
- package/dist/evm/aa-service/index.js.map +1 -1
- package/dist/evm/aa-service/lib/kernel-account.d.ts +2 -44
- package/dist/evm/aa-service/lib/kernel-account.js +42 -93
- package/dist/evm/aa-service/lib/kernel-account.js.map +1 -1
- package/dist/evm/aa-service/lib/session-keys.d.ts +14 -17
- package/dist/evm/aa-service/lib/session-keys.js +40 -58
- package/dist/evm/aa-service/lib/session-keys.js.map +1 -1
- package/dist/evm/aa-service/lib/type.d.ts +18 -1
- package/dist/evm/aa-service/lib/type.js.map +1 -1
- package/dist/evm/aa-service/services/account-abstraction.d.ts +7 -29
- package/dist/evm/aa-service/services/account-abstraction.js +12 -68
- package/dist/evm/aa-service/services/account-abstraction.js.map +1 -1
- package/dist/evm/aa-service/services/bundler.d.ts +4 -1
- package/dist/evm/aa-service/services/bundler.js +41 -7
- package/dist/evm/aa-service/services/bundler.js.map +1 -1
- package/dist/evm/evm.d.ts +164 -14
- package/dist/evm/evm.js +259 -80
- package/dist/evm/evm.js.map +1 -1
- package/dist/evm/smartWallet.d.ts +12 -61
- package/dist/evm/smartWallet.js +143 -184
- package/dist/evm/smartWallet.js.map +1 -1
- package/dist/evm/utils.js +1 -1
- package/dist/evm/utils.js.map +1 -1
- package/dist/helpers/index.d.ts +6 -1
- package/dist/helpers/index.js +116 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/privacy/artifact-manager.d.ts +117 -0
- package/dist/privacy/artifact-manager.js +251 -0
- package/dist/privacy/artifact-manager.js.map +1 -0
- package/dist/privacy/broadcaster-client.d.ts +166 -0
- package/dist/privacy/broadcaster-client.js +261 -0
- package/dist/privacy/broadcaster-client.js.map +1 -0
- package/dist/privacy/index.d.ts +34 -0
- package/dist/privacy/index.js +56 -0
- package/dist/privacy/index.js.map +1 -0
- package/dist/privacy/network-config.d.ts +57 -0
- package/dist/privacy/network-config.js +118 -0
- package/dist/privacy/network-config.js.map +1 -0
- package/dist/privacy/poi-helper.d.ts +161 -0
- package/dist/privacy/poi-helper.js +249 -0
- package/dist/privacy/poi-helper.js.map +1 -0
- package/dist/privacy/railgun-engine.d.ts +135 -0
- package/dist/privacy/railgun-engine.js +205 -0
- package/dist/privacy/railgun-engine.js.map +1 -0
- package/dist/privacy/railgun-privacy-wallet.d.ts +288 -0
- package/dist/privacy/railgun-privacy-wallet.js +539 -0
- package/dist/privacy/railgun-privacy-wallet.js.map +1 -0
- package/dist/privacy/types.d.ts +229 -0
- package/dist/privacy/types.js +26 -0
- package/dist/privacy/types.js.map +1 -0
- package/dist/savings/savings-manager.d.ts +126 -0
- package/dist/savings/savings-manager.js +234 -0
- package/dist/savings/savings-manager.js.map +1 -0
- package/dist/savings/smart-savings.d.ts +74 -0
- package/dist/savings/smart-savings.js +152 -0
- package/dist/savings/smart-savings.js.map +1 -0
- package/dist/savings/types.d.ts +125 -0
- package/dist/savings/types.js +9 -0
- package/dist/savings/types.js.map +1 -0
- package/dist/svm/svm.d.ts +19 -3
- package/dist/svm/svm.js +29 -17
- package/dist/svm/svm.js.map +1 -1
- package/dist/svm/utils.d.ts +2 -2
- package/dist/svm/utils.js +4 -4
- package/dist/svm/utils.js.map +1 -1
- package/dist/test.js +81 -22
- package/dist/test.js.map +1 -1
- package/dist/types.d.ts +14 -16
- package/dist/types.js.map +1 -1
- package/dist/vm.d.ts +14 -0
- package/dist/vm.js.map +1 -1
- package/package.json +6 -1
- package/utils/IChainWallet.ts +3 -3
- package/utils/constant.ts +63 -16
- package/utils/evm/aa-service/index.ts +1 -3
- package/utils/evm/aa-service/lib/kernel-account.ts +45 -136
- package/utils/evm/aa-service/lib/session-keys.ts +58 -60
- package/utils/evm/aa-service/lib/type.ts +19 -1
- package/utils/evm/aa-service/services/account-abstraction.ts +24 -76
- package/utils/evm/aa-service/services/bundler.ts +54 -11
- package/utils/evm/evm.ts +313 -110
- package/utils/evm/smartWallet.ts +124 -214
- package/utils/evm/utils.ts +2 -1
- package/utils/helpers/index.ts +138 -1
- package/utils/savings/savings-manager.ts +271 -0
- package/utils/savings/smart-savings.ts +184 -0
- package/utils/savings/types.ts +135 -0
- package/utils/svm/svm.ts +34 -25
- package/utils/svm/utils.ts +4 -10
- package/utils/test.ts +112 -24
- package/utils/types.ts +15 -17
- 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
|
+
}
|