multisigns-sdk 1.0.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.
@@ -0,0 +1,11 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ export {
9
+ __require
10
+ };
11
+ //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,156 @@
1
+ import {
2
+ toBackendChainType
3
+ } from "./chunk-L45R2ICF.js";
4
+
5
+ // src/api/wallet.api.ts
6
+ var WalletApi = class {
7
+ client;
8
+ constructor(client) {
9
+ this.client = client;
10
+ }
11
+ /**
12
+ * Creates a new wallet
13
+ */
14
+ async createWallet(chain) {
15
+ return this.client.post("/sdk/wallets/create", {
16
+ wallets: [{ chain: toBackendChainType(chain) }]
17
+ });
18
+ }
19
+ /**
20
+ * Imports a wallet with a private key
21
+ */
22
+ async importWallet(chain, privateKey) {
23
+ return this.client.post("/sdk/wallets/create", {
24
+ wallets: [{ chain: toBackendChainType(chain), key: privateKey }]
25
+ });
26
+ }
27
+ /**
28
+ * Gets a single wallet by address
29
+ */
30
+ async getWallet(address) {
31
+ return this.client.get(`/sdk/wallets/${address}`);
32
+ }
33
+ /**
34
+ * Gets all wallets for the user
35
+ */
36
+ async getWallets() {
37
+ return this.client.get("/sdk/wallets/all");
38
+ }
39
+ /**
40
+ * Gets paginated wallets
41
+ */
42
+ async getPaginatedWallets(page = 1, limit = 10) {
43
+ return this.client.get("/sdk/wallets", {
44
+ params: { page, limit }
45
+ });
46
+ }
47
+ /**
48
+ * Deletes a wallet
49
+ */
50
+ async deleteWallet(chain, address) {
51
+ return this.client.delete(`/sdk/wallets/${toBackendChainType(chain)}/${address}`);
52
+ }
53
+ /**
54
+ * Updates wallet name
55
+ */
56
+ async updateWalletName(chain, address, name) {
57
+ return this.client.post("/sdk/wallets/update/name", {
58
+ walletAddress: address,
59
+ name,
60
+ chainType: toBackendChainType(chain)
61
+ });
62
+ }
63
+ /**
64
+ * Fetches server share for key reconstruction
65
+ */
66
+ async fetchServerShare(chain, address) {
67
+ const response = await this.client.get(
68
+ `/sdk/wallets/share/c/${toBackendChainType(chain)}/${address}`
69
+ );
70
+ return response.share;
71
+ }
72
+ /**
73
+ * Fetches recovery share for key reconstruction
74
+ */
75
+ async fetchRecoveryShare(chain, address) {
76
+ const response = await this.client.get(
77
+ `/sdk/wallets/share/s/${toBackendChainType(chain)}/${address}`
78
+ );
79
+ return response.share;
80
+ }
81
+ /**
82
+ * Fetches both shares for key reconstruction
83
+ */
84
+ async fetchShares(chain, address) {
85
+ const [server, recovery] = await Promise.all([
86
+ this.fetchServerShare(chain, address),
87
+ this.fetchRecoveryShare(chain, address)
88
+ ]);
89
+ return { server, recovery };
90
+ }
91
+ /**
92
+ * Fetches public key for share encryption
93
+ */
94
+ async fetchPublicKey() {
95
+ const response = await this.client.get("/sdk/wallets/pubkey");
96
+ return response.pubkey;
97
+ }
98
+ /**
99
+ * Updates shares on server after rotation
100
+ */
101
+ async updateShares(address, serverShare, encryptedRecoveryShare) {
102
+ await this.client.post("/sdk/wallets/update", {
103
+ walletAddress: address,
104
+ serverShare,
105
+ encryptedRecoveryShare
106
+ });
107
+ }
108
+ /**
109
+ * Gets wallet portfolio/balances for multiple wallets (batch request)
110
+ * User constructs the PortfolioRequest array themselves
111
+ */
112
+ async getWalletsPortfolio(requests) {
113
+ if (requests.length === 0) {
114
+ return [];
115
+ }
116
+ const body = { wallets: requests };
117
+ const response = await this.client.post(
118
+ "/sdk/wallets/protfolio",
119
+ body
120
+ );
121
+ return response;
122
+ }
123
+ /**
124
+ * Gets supported tokens for a chain
125
+ */
126
+ async getSupportedTokens(chain, chainId, page = 1, limit = 50, search) {
127
+ return this.client.get(
128
+ `/sdk/wallets/supported-tokens/${toBackendChainType(chain)}/${chainId}`,
129
+ {
130
+ params: { page, limit, search }
131
+ }
132
+ );
133
+ }
134
+ /**
135
+ * Gets total asset value across all wallets
136
+ */
137
+ async getTotalAssetValue() {
138
+ return this.client.get("/sdk/wallets/total-asset-value");
139
+ }
140
+ /**
141
+ * Gets wallet transaction history
142
+ */
143
+ async getHistory(chain, address, page = 1, limit = 20) {
144
+ return this.client.get(
145
+ `/sdk/history/wallet/${toBackendChainType(chain)}/${address}`,
146
+ {
147
+ params: { page, limit }
148
+ }
149
+ );
150
+ }
151
+ };
152
+
153
+ export {
154
+ WalletApi
155
+ };
156
+ //# sourceMappingURL=chunk-DIRO3HK2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/wallet.api.ts"],"sourcesContent":["import type { ApiClient } from './client';\nimport type {\n EChainType,\n ChainIdValue,\n CreateWalletResponse,\n SingleWalletDetailsResponse,\n PaginatedWalletsResponse,\n WalletRenameResponse,\n DeleteResponse,\n WalletPortfolioResponse,\n SupportedTokensResponse,\n TotalAssetValueResponse,\n HistoryResponse,\n} from '../core/types';\nimport { toBackendChainType } from '../core/types';\n\nexport class WalletApi {\n private readonly client: ApiClient;\n\n constructor(client: ApiClient) {\n this.client = client;\n }\n\n /**\n * Creates a new wallet\n */\n public async createWallet(chain: EChainType): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>('/sdk/wallets/create', {\n wallets: [{ chain: toBackendChainType(chain) }],\n });\n }\n\n /**\n * Imports a wallet with a private key\n */\n public async importWallet(\n chain: EChainType,\n privateKey: string\n ): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>('/sdk/wallets/create', {\n wallets: [{ chain: toBackendChainType(chain), key: privateKey }],\n });\n }\n\n /**\n * Gets a single wallet by address\n */\n public async getWallet(address: string): Promise<SingleWalletDetailsResponse> {\n return this.client.get<SingleWalletDetailsResponse>(`/sdk/wallets/${address}`);\n }\n\n /**\n * Gets all wallets for the user\n */\n public async getWallets(): Promise<PaginatedWalletsResponse> {\n return this.client.get<PaginatedWalletsResponse>('/sdk/wallets/all');\n }\n\n /**\n * Gets paginated wallets\n */\n public async getPaginatedWallets(\n page: number = 1,\n limit: number = 10\n ): Promise<PaginatedWalletsResponse> {\n return this.client.get<PaginatedWalletsResponse>('/sdk/wallets', {\n params: { page, limit },\n });\n }\n\n /**\n * Deletes a wallet\n */\n public async deleteWallet(\n chain: EChainType,\n address: string\n ): Promise<DeleteResponse> {\n return this.client.delete<DeleteResponse>(`/sdk/wallets/${toBackendChainType(chain)}/${address}`);\n }\n\n /**\n * Updates wallet name\n */\n public async updateWalletName(\n chain: EChainType,\n address: string,\n name: string\n ): Promise<WalletRenameResponse> {\n return this.client.post<WalletRenameResponse>('/sdk/wallets/update/name', {\n walletAddress: address,\n name,\n chainType: toBackendChainType(chain),\n });\n }\n\n /**\n * Fetches server share for key reconstruction\n */\n public async fetchServerShare(\n chain: EChainType,\n address: string\n ): Promise<string> {\n const response = await this.client.get<{ share: string }>(\n `/sdk/wallets/share/c/${toBackendChainType(chain)}/${address}`\n );\n return response.share;\n }\n\n /**\n * Fetches recovery share for key reconstruction\n */\n public async fetchRecoveryShare(\n chain: EChainType,\n address: string\n ): Promise<string> {\n const response = await this.client.get<{ share: string }>(\n `/sdk/wallets/share/s/${toBackendChainType(chain)}/${address}`\n );\n return response.share;\n }\n\n /**\n * Fetches both shares for key reconstruction\n */\n public async fetchShares(\n chain: EChainType,\n address: string\n ): Promise<{ server: string; recovery: string }> {\n const [server, recovery] = await Promise.all([\n this.fetchServerShare(chain, address),\n this.fetchRecoveryShare(chain, address),\n ]);\n return { server, recovery };\n }\n\n /**\n * Fetches public key for share encryption\n */\n public async fetchPublicKey(): Promise<string> {\n const response = await this.client.get<{ pubkey: string }>('/sdk/wallets/pubkey');\n return response.pubkey;\n }\n\n /**\n * Updates shares on server after rotation\n */\n public async updateShares(\n address: string,\n serverShare: string,\n encryptedRecoveryShare: string\n ): Promise<void> {\n await this.client.post('/sdk/wallets/update', {\n walletAddress: address,\n serverShare,\n encryptedRecoveryShare,\n });\n }\n\n /**\n * Gets wallet portfolio/balances for multiple wallets (batch request)\n * User constructs the PortfolioRequest array themselves\n */\n public async getWalletsPortfolio(\n requests: import('../core/types').PortfolioRequest[]\n ): Promise<import('../core/types').WalletPortfolioResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const body = { wallets: requests };\n\n const response = await this.client.post<import('../core/types').WalletPortfolioResponse[]>(\n '/sdk/wallets/protfolio',\n body\n );\n\n return response;\n }\n\n /**\n * Gets supported tokens for a chain\n */\n public async getSupportedTokens(\n chain: EChainType,\n chainId: ChainIdValue,\n page: number = 1,\n limit: number = 50,\n search?: string\n ): Promise<SupportedTokensResponse> {\n return this.client.get<SupportedTokensResponse>(\n `/sdk/wallets/supported-tokens/${toBackendChainType(chain)}/${chainId}`,\n {\n params: { page, limit, search },\n }\n );\n }\n\n /**\n * Gets total asset value across all wallets\n */\n public async getTotalAssetValue(): Promise<TotalAssetValueResponse> {\n return this.client.get<TotalAssetValueResponse>('/sdk/wallets/total-asset-value');\n }\n\n /**\n * Gets wallet transaction history\n */\n public async getHistory(\n chain: EChainType,\n address: string,\n page: number = 1,\n limit: number = 20\n ): Promise<HistoryResponse> {\n return this.client.get<HistoryResponse>(\n `/sdk/history/wallet/${toBackendChainType(chain)}/${address}`,\n {\n params: { page, limit },\n }\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,177 @@
1
+ // src/core/config.ts
2
+ var DEFAULT_RPC_ENDPOINTS = {
3
+ mainnet: {
4
+ evm: {
5
+ 1: "https://ethereum-rpc.publicnode.com",
6
+ 137: "https://polygon-rpc.com",
7
+ 8453: "https://mainnet.base.org",
8
+ 42161: "https://arb1.arbitrum.io/rpc",
9
+ 10: "https://mainnet.optimism.io",
10
+ 56: "https://bsc-rpc.publicnode.com"
11
+ },
12
+ solana: "https://public.rpc.solanavibestation.com/",
13
+ tron: "https://api.trongrid.io",
14
+ btc: "https://mempool.space/api"
15
+ },
16
+ testnet: {
17
+ evm: {
18
+ 11155111: "https://ethereum-sepolia-rpc.publicnode.com",
19
+ 80002: "https://rpc-amoy.polygon.technology",
20
+ 84532: "https://sepolia.base.org",
21
+ 421614: "https://sepolia-rollup.arbitrum.io/rpc",
22
+ 11155420: "https://optimism-sepolia-rpc.publicnode.com",
23
+ 97: "https://bsc-testnet-rpc.publicnode.com"
24
+ },
25
+ solana: "https://api.devnet.solana.com",
26
+ tron: "https://api.shasta.trongrid.io",
27
+ btc: "https://mempool.space/testnet/api"
28
+ }
29
+ };
30
+ var TRON_FULL_HOST = {
31
+ mainnet: "https://api.trongrid.io",
32
+ testnet: "https://api.shasta.trongrid.io"
33
+ };
34
+ var EVM_CHAIN_NAMES = {
35
+ 1: "Ethereum",
36
+ 137: "Polygon",
37
+ 8453: "Base",
38
+ 42161: "Arbitrum One",
39
+ 10: "Optimism",
40
+ 56: "BNB Smart Chain",
41
+ 11155111: "Ethereum Sepolia",
42
+ 80002: "Polygon Amoy",
43
+ 84532: "Base Sepolia",
44
+ 421614: "Arbitrum Sepolia",
45
+ 11155420: "Optimism Sepolia",
46
+ 97: "BNB Smart Chain Testnet"
47
+ };
48
+ var DEFAULT_CONFIG = {
49
+ network: "mainnet",
50
+ apiBaseUrl: "https://afridax-backend-production.up.railway.app",
51
+ rpcOverrides: {},
52
+ timeout: 3e4
53
+ };
54
+ function resolveConfig(userConfig) {
55
+ if (!userConfig.apiKey && !userConfig.accessToken) {
56
+ throw new Error("Either apiKey or accessToken must be provided");
57
+ }
58
+ return {
59
+ apiKey: userConfig.apiKey ?? "",
60
+ accessToken: userConfig.accessToken,
61
+ network: userConfig.network ?? DEFAULT_CONFIG.network,
62
+ apiBaseUrl: userConfig.apiBaseUrl ?? DEFAULT_CONFIG.apiBaseUrl,
63
+ rpcOverrides: userConfig.rpcOverrides ?? DEFAULT_CONFIG.rpcOverrides,
64
+ timeout: userConfig.timeout ?? DEFAULT_CONFIG.timeout
65
+ };
66
+ }
67
+ function resolveRpcEndpoints(network, overrides = {}) {
68
+ const defaults = DEFAULT_RPC_ENDPOINTS[network];
69
+ return {
70
+ evm: {
71
+ ...defaults.evm,
72
+ ...overrides.evm ?? {}
73
+ },
74
+ solana: overrides.solana ?? defaults.solana,
75
+ tron: overrides.tron ?? defaults.tron,
76
+ btc: overrides.btc ?? defaults.btc
77
+ };
78
+ }
79
+ function getRpcEndpoint(chain, rpcConfig, chainId) {
80
+ switch (chain) {
81
+ case "EVM":
82
+ if (chainId === void 0) {
83
+ throw new Error("Chain ID is required for EVM chains");
84
+ }
85
+ const evmEndpoint = rpcConfig.evm[chainId];
86
+ if (!evmEndpoint) {
87
+ throw new Error(
88
+ `No RPC endpoint configured for EVM chain ID ${chainId}`
89
+ );
90
+ }
91
+ return evmEndpoint;
92
+ case "SOL":
93
+ return rpcConfig.solana;
94
+ case "TRON":
95
+ return rpcConfig.tron;
96
+ case "BTC":
97
+ // <<< FIXED: 'btc' to 'BTC'
98
+ case "BTC_T3":
99
+ return rpcConfig.btc;
100
+ default:
101
+ throw new Error(`Unsupported chain type: ${chain}`);
102
+ }
103
+ }
104
+ var SHAMIR_CONFIG = {
105
+ THRESHOLD: 2,
106
+ TOTAL_SHARES: 3
107
+ };
108
+ var KEY_RECONSTRUCTION_CONFIG = {
109
+ MAX_RETRIES: 1,
110
+ RETRY_ON_MISMATCH: true
111
+ };
112
+ var API_TIMEOUTS = {
113
+ DEFAULT: 3e4,
114
+ TRANSACTION: 6e4,
115
+ KEY_RECONSTRUCTION: 45e3
116
+ };
117
+ var MINIMUM_BALANCE_FOR_TX = {
118
+ EVM: "0.001",
119
+ // <<< FIXED: 'evm' to 'EVM'
120
+ SOL: "0.01",
121
+ // <<< FIXED: 'solana' to 'SOL'
122
+ TRON: "1",
123
+ // <<< FIXED: 'tron' to 'TRON'
124
+ BTC: "0.0001",
125
+ // <<< FIXED: 'btc' to 'BTC'
126
+ // Note: BTC_T3 is not explicitly required here if the backend handles it via BTC
127
+ // but if you need it, add it based on the extended ChainType:
128
+ BTC_T3: "0.0001"
129
+ // <<< ADDED for consistency with ChainType
130
+ };
131
+ var NATIVE_CURRENCY = {
132
+ EVM: { symbol: "ETH", decimals: 18 },
133
+ // <<< FIXED
134
+ SOL: { symbol: "SOL", decimals: 9 },
135
+ // <<< FIXED
136
+ TRON: { symbol: "TRX", decimals: 6 },
137
+ // <<< FIXED
138
+ BTC: { symbol: "BTC", decimals: 8 },
139
+ // <<< FIXED
140
+ BTC_T3: { symbol: "BTC", decimals: 8 }
141
+ // <<< ADDED
142
+ };
143
+ var SUPPORTED_CHAINS = ["EVM", "SOL", "TRON", "BTC"];
144
+ var BTC_NETWORK_CONFIG = {
145
+ mainnet: {
146
+ name: "bitcoin",
147
+ bech32: "bc",
148
+ pubKeyHash: 0,
149
+ scriptHash: 5,
150
+ wif: 128
151
+ },
152
+ testnet: {
153
+ name: "testnet",
154
+ bech32: "tb",
155
+ pubKeyHash: 111,
156
+ scriptHash: 196,
157
+ wif: 239
158
+ }
159
+ };
160
+
161
+ export {
162
+ DEFAULT_RPC_ENDPOINTS,
163
+ TRON_FULL_HOST,
164
+ EVM_CHAIN_NAMES,
165
+ DEFAULT_CONFIG,
166
+ resolveConfig,
167
+ resolveRpcEndpoints,
168
+ getRpcEndpoint,
169
+ SHAMIR_CONFIG,
170
+ KEY_RECONSTRUCTION_CONFIG,
171
+ API_TIMEOUTS,
172
+ MINIMUM_BALANCE_FOR_TX,
173
+ NATIVE_CURRENCY,
174
+ SUPPORTED_CHAINS,
175
+ BTC_NETWORK_CONFIG
176
+ };
177
+ //# sourceMappingURL=chunk-DRU5TCIR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/config.ts"],"sourcesContent":["import type { SDKConfig, RpcOverrides, NetworkMode, ChainType } from \"./types\";\n\n/**\n * Default RPC endpoints for all supported chains across networks\n */\nexport const DEFAULT_RPC_ENDPOINTS: Record<\n NetworkMode,\n {\n evm: Record<number, string>;\n solana: string;\n tron: string;\n btc: string;\n }\n> = {\n mainnet: {\n evm: {\n 1: \"https://ethereum-rpc.publicnode.com\",\n 137: \"https://polygon-rpc.com\",\n 8453: \"https://mainnet.base.org\",\n 42161: \"https://arb1.arbitrum.io/rpc\",\n 10: \"https://mainnet.optimism.io\",\n 56: \"https://bsc-rpc.publicnode.com\",\n },\n solana: \"https://public.rpc.solanavibestation.com/\",\n tron: \"https://api.trongrid.io\",\n btc: \"https://mempool.space/api\",\n },\n testnet: {\n evm: {\n 11155111: \"https://ethereum-sepolia-rpc.publicnode.com\",\n 80002: \"https://rpc-amoy.polygon.technology\",\n 84532: \"https://sepolia.base.org\",\n 421614: \"https://sepolia-rollup.arbitrum.io/rpc\",\n 11155420: \"https://optimism-sepolia-rpc.publicnode.com\",\n 97: \"https://bsc-testnet-rpc.publicnode.com\",\n },\n solana: \"https://api.devnet.solana.com\",\n tron: \"https://api.shasta.trongrid.io\",\n btc: \"https://mempool.space/testnet/api\",\n },\n};\n\n\n/**\n * Default Tron full host URLs\n */\nexport const TRON_FULL_HOST: Record<NetworkMode, string> = {\n mainnet: \"https://api.trongrid.io\",\n testnet: \"https://api.shasta.trongrid.io\",\n};\n\n/**\n * Chain ID to network name mapping for EVM chains\n */\nexport const EVM_CHAIN_NAMES: Record<number, string> = {\n 1: \"Ethereum\",\n 137: \"Polygon\",\n 8453: \"Base\",\n 42161: \"Arbitrum One\",\n 10: \"Optimism\",\n 56: \"BNB Smart Chain\",\n 11155111: \"Ethereum Sepolia\",\n 80002: \"Polygon Amoy\",\n 84532: \"Base Sepolia\",\n 421614: \"Arbitrum Sepolia\",\n 11155420: \"Optimism Sepolia\",\n 97: \"BNB Smart Chain Testnet\",\n};\n\n/**\n * Default SDK configuration values\n */\nexport const DEFAULT_CONFIG: Required<\n Omit<SDKConfig, \"apiKey\" | \"accessToken\">\n> = {\n network: \"mainnet\",\n apiBaseUrl: \"https://afridax-backend-production.up.railway.app\",\n rpcOverrides: {},\n timeout: 30000,\n};\n\n/**\n * Resolved configuration with all values populated\n */\nexport interface ResolvedConfig {\n apiKey: string;\n accessToken?: string;\n network: NetworkMode;\n apiBaseUrl: string;\n rpcOverrides: RpcOverrides;\n timeout: number;\n}\n\n/**\n * Resolved RPC configuration with merged overrides\n */\nexport interface ResolvedRpcConfig {\n evm: Record<number, string>;\n solana: string;\n tron: string;\n btc: string;\n}\n\n/**\n * Merges user configuration with defaults to produce a fully resolved config\n *\n * @param userConfig - User-provided SDK configuration\n * @returns Fully resolved configuration with all defaults applied\n */\nexport function resolveConfig(userConfig: SDKConfig): ResolvedConfig {\n if (!userConfig.apiKey && !userConfig.accessToken) {\n throw new Error(\"Either apiKey or accessToken must be provided\");\n }\n return {\n apiKey: userConfig.apiKey ?? \"\",\n accessToken: userConfig.accessToken,\n network: userConfig.network ?? DEFAULT_CONFIG.network,\n apiBaseUrl: userConfig.apiBaseUrl ?? DEFAULT_CONFIG.apiBaseUrl,\n rpcOverrides: userConfig.rpcOverrides ?? DEFAULT_CONFIG.rpcOverrides,\n timeout: userConfig.timeout ?? DEFAULT_CONFIG.timeout,\n };\n}\n\n/**\n * Resolves RPC endpoints by merging defaults with user overrides\n *\n * @param network - Network mode (mainnet or testnet)\n * @param overrides - User-provided RPC overrides\n * @returns Fully resolved RPC configuration\n */\nexport function resolveRpcEndpoints(\n network: NetworkMode,\n overrides: RpcOverrides = {}\n): ResolvedRpcConfig {\n const defaults = DEFAULT_RPC_ENDPOINTS[network];\n\n return {\n evm: {\n ...defaults.evm,\n ...(overrides.evm ?? {}),\n },\n solana: overrides.solana ?? defaults.solana,\n tron: overrides.tron ?? defaults.tron,\n btc: overrides.btc ?? defaults.btc,\n };\n}\n\n/**\n * Gets the RPC endpoint for a specific chain and chain ID\n *\n * @param chain - Chain type\n * @param rpcConfig - Resolved RPC configuration\n * @param chainId - Chain ID (required for EVM)\n * @returns RPC endpoint URL\n * @throws Error if chain ID not found for EVM\n */\nexport function getRpcEndpoint(\n chain: ChainType,\n rpcConfig: ResolvedRpcConfig,\n chainId?: number\n): string {\n switch (chain) {\n case \"EVM\": // <<< FIXED: 'evm' to 'EVM'\n if (chainId === undefined) {\n throw new Error(\"Chain ID is required for EVM chains\");\n }\n const evmEndpoint = rpcConfig.evm[chainId];\n if (!evmEndpoint) {\n throw new Error(\n `No RPC endpoint configured for EVM chain ID ${chainId}`\n );\n }\n return evmEndpoint;\n\n case \"SOL\": // <<< FIXED: 'solana' to 'SOL'\n return rpcConfig.solana;\n\n case \"TRON\": // <<< FIXED: 'tron' to 'TRON'\n return rpcConfig.tron;\n\n case \"BTC\": // <<< FIXED: 'btc' to 'BTC'\n case \"BTC_T3\": // <<< ADDED: Handle BTC_T3 as a case (for completeness, though logic is the same as 'BTC')\n return rpcConfig.btc;\n\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n}\n\n/**\n * Shamir secret sharing configuration\n */\nexport const SHAMIR_CONFIG = {\n THRESHOLD: 2,\n TOTAL_SHARES: 3,\n} as const;\n\n/**\n * Key reconstruction retry configuration\n */\nexport const KEY_RECONSTRUCTION_CONFIG = {\n MAX_RETRIES: 1,\n RETRY_ON_MISMATCH: true,\n} as const;\n\n/**\n * API timeout defaults (in milliseconds)\n */\nexport const API_TIMEOUTS = {\n DEFAULT: 30000,\n TRANSACTION: 60000,\n KEY_RECONSTRUCTION: 45000,\n} as const;\n\n/**\n * Minimum balance requirements for transaction fees\n */\nexport const MINIMUM_BALANCE_FOR_TX: Record<ChainType, string> = {\n EVM: \"0.001\", // <<< FIXED: 'evm' to 'EVM'\n SOL: \"0.01\", // <<< FIXED: 'solana' to 'SOL'\n TRON: \"1\", // <<< FIXED: 'tron' to 'TRON'\n BTC: \"0.0001\", // <<< FIXED: 'btc' to 'BTC'\n // Note: BTC_T3 is not explicitly required here if the backend handles it via BTC\n // but if you need it, add it based on the extended ChainType:\n BTC_T3: \"0.0001\", // <<< ADDED for consistency with ChainType\n};\n\n/**\n * Native currency symbols per chain\n */\nexport const NATIVE_CURRENCY: Record<\n ChainType,\n { symbol: string; decimals: number }\n> = {\n EVM: { symbol: \"ETH\", decimals: 18 }, // <<< FIXED\n SOL: { symbol: \"SOL\", decimals: 9 }, // <<< FIXED\n TRON: { symbol: \"TRX\", decimals: 6 }, // <<< FIXED\n BTC: { symbol: \"BTC\", decimals: 8 }, // <<< FIXED\n BTC_T3: { symbol: \"BTC\", decimals: 8 }, // <<< ADDED\n};\n\n/**\n * Supported chain types array for validation\n */\nexport const SUPPORTED_CHAINS: ChainType[] = [\"EVM\", \"SOL\", \"TRON\", \"BTC\"]; // <<< FIXED: 'evm', etc., to 'EVM', etc.\n/**\n * BTC network configuration\n */\nexport const BTC_NETWORK_CONFIG = {\n mainnet: {\n name: \"bitcoin\",\n bech32: \"bc\",\n pubKeyHash: 0x00,\n scriptHash: 0x05,\n wif: 0x80,\n },\n testnet: {\n name: \"testnet\",\n bech32: \"tb\",\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n wif: 0xef,\n },\n} as const;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,156 @@
1
+ import {
2
+ __require
3
+ } from "./chunk-DGUM43GV.js";
4
+
5
+ // src/crypto/util.ts
6
+ import { ethers } from "ethers";
7
+ import { Keypair } from "@solana/web3.js";
8
+ import { TronWeb } from "tronweb";
9
+ import * as bitcoin from "bitcoinjs-lib";
10
+ import ECPairFactory from "ecpair";
11
+ import * as ecc from "tiny-secp256k1";
12
+ import { Buffer } from "buffer";
13
+ var ECPair = ECPairFactory(ecc);
14
+ function generateRandomBytes(length) {
15
+ const bytes = new Uint8Array(length);
16
+ if (typeof globalThis.crypto !== "undefined" && globalThis.crypto.getRandomValues) {
17
+ globalThis.crypto.getRandomValues(bytes);
18
+ } else if (typeof __require !== "undefined") {
19
+ const nodeCrypto = __require("crypto");
20
+ const randomBytes = nodeCrypto.randomBytes(length);
21
+ bytes.set(
22
+ new Uint8Array(
23
+ randomBytes.buffer,
24
+ randomBytes.byteOffset,
25
+ randomBytes.byteLength
26
+ )
27
+ );
28
+ } else {
29
+ throw new Error(
30
+ "No cryptographically secure random number generator available"
31
+ );
32
+ }
33
+ return bytes;
34
+ }
35
+ var IV_LENGTH = 12;
36
+ var TAG_LENGTH = 16;
37
+ var ALGORITHM = "AES-GCM";
38
+ async function decryptShare(key, encryptedData) {
39
+ if (key.length !== 32) {
40
+ throw new Error("Decryption key must be 32 bytes (256 bits)");
41
+ }
42
+ if (encryptedData.length < IV_LENGTH + TAG_LENGTH) {
43
+ throw new Error("Encrypted data is too short");
44
+ }
45
+ const iv = encryptedData.slice(0, IV_LENGTH);
46
+ const ciphertext = encryptedData.slice(IV_LENGTH);
47
+ if (typeof globalThis.crypto !== "undefined" && globalThis.crypto.subtle) {
48
+ const keyBuffer = new Uint8Array(key).buffer;
49
+ const ivBuffer = new Uint8Array(iv).buffer;
50
+ const ciphertextBuffer = new Uint8Array(ciphertext).buffer;
51
+ const cryptoKey = await globalThis.crypto.subtle.importKey(
52
+ "raw",
53
+ keyBuffer,
54
+ { name: ALGORITHM },
55
+ false,
56
+ ["decrypt"]
57
+ );
58
+ const decrypted = await globalThis.crypto.subtle.decrypt(
59
+ { name: ALGORITHM, iv: ivBuffer },
60
+ cryptoKey,
61
+ ciphertextBuffer
62
+ );
63
+ return new Uint8Array(decrypted);
64
+ } else if (typeof __require !== "undefined") {
65
+ const nodeCrypto = __require("crypto");
66
+ const authTag = ciphertext.slice(-TAG_LENGTH);
67
+ const encryptedContent = ciphertext.slice(0, -TAG_LENGTH);
68
+ const decipher = nodeCrypto.createDecipheriv("aes-256-gcm", key, iv);
69
+ decipher.setAuthTag(authTag);
70
+ const decrypted = Buffer.concat([
71
+ decipher.update(encryptedContent),
72
+ decipher.final()
73
+ ]);
74
+ return new Uint8Array(decrypted);
75
+ }
76
+ throw new Error("No decryption API available");
77
+ }
78
+ async function encryptRsaOaep(pemKey, data) {
79
+ return encryptWithPublicKey(pemKey, data);
80
+ }
81
+ async function encryptWithPublicKey(pemKey, data) {
82
+ if (typeof globalThis.crypto === "undefined" || !globalThis.crypto || !globalThis.crypto.subtle) {
83
+ console.error(
84
+ "Crypto Error: Web Crypto API (crypto.subtle) is not supported in this environment."
85
+ );
86
+ throw new Error(
87
+ "BROWSER_NOT_SUPPORTED: Encryption failed because Web Crypto API is not available."
88
+ );
89
+ }
90
+ if (typeof TextEncoder === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined") {
91
+ console.error(
92
+ "Crypto Error: Required global functions (TextEncoder, atob, btoa) are missing."
93
+ );
94
+ throw new Error(
95
+ "BROWSER_NOT_SUPPORTED: Encryption failed because required global functions are missing."
96
+ );
97
+ }
98
+ const pemContents = pemKey.replace(/-----BEGIN PUBLIC KEY-----/, "").replace(/-----END PUBLIC KEY-----/, "").replace(/\s+/g, "");
99
+ try {
100
+ const binaryDer = Uint8Array.from(
101
+ atob(pemContents),
102
+ (c) => c.charCodeAt(0)
103
+ );
104
+ const publicKey = await globalThis.crypto.subtle.importKey(
105
+ "spki",
106
+ binaryDer.buffer,
107
+ {
108
+ name: "RSA-OAEP",
109
+ hash: "SHA-256"
110
+ },
111
+ false,
112
+ ["encrypt"]
113
+ );
114
+ const encoded = new TextEncoder().encode(data);
115
+ const encrypted = await globalThis.crypto.subtle.encrypt(
116
+ {
117
+ name: "RSA-OAEP"
118
+ },
119
+ publicKey,
120
+ encoded
121
+ );
122
+ return btoa(String.fromCharCode(...new Uint8Array(encrypted)));
123
+ } catch (e) {
124
+ console.error(
125
+ "Crypto Error: Failed during key import or encryption step.",
126
+ e
127
+ );
128
+ throw new Error(
129
+ "ENCRYPTION_FAILED: Could not securely encrypt data. Check key format or algorithm support."
130
+ );
131
+ }
132
+ }
133
+ function hexToBytes(hex) {
134
+ const cleanHex = hex.startsWith("0x") ? hex.slice(2) : hex;
135
+ if (cleanHex.length % 2 !== 0) {
136
+ throw new Error("Invalid hex string length");
137
+ }
138
+ const bytes = new Uint8Array(cleanHex.length / 2);
139
+ for (let i = 0; i < bytes.length; i++) {
140
+ bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);
141
+ }
142
+ return bytes;
143
+ }
144
+ function bytesToHex(bytes, prefix = true) {
145
+ const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
146
+ return prefix ? `0x${hex}` : hex;
147
+ }
148
+
149
+ export {
150
+ generateRandomBytes,
151
+ decryptShare,
152
+ encryptRsaOaep,
153
+ hexToBytes,
154
+ bytesToHex
155
+ };
156
+ //# sourceMappingURL=chunk-KXIOGAV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crypto/util.ts"],"sourcesContent":["import { ethers } from \"ethers\";\nimport { Keypair } from \"@solana/web3.js\";\nimport { TronWeb } from \"tronweb\";\nimport * as bitcoin from \"bitcoinjs-lib\";\nimport ECPairFactory from \"ecpair\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Buffer } from \"buffer\";\nimport { EChainType, NetworkMode } from \"../core/types\";\n\nconst ECPair = ECPairFactory(ecc);\n\n/**\n * Generates a cryptographically secure random byte array.\n *\n * @param length - Number of random bytes to generate\n * @returns A Uint8Array of random bytes\n */\nexport function generateRandomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n\n if (\n typeof globalThis.crypto !== \"undefined\" &&\n globalThis.crypto.getRandomValues\n ) {\n globalThis.crypto.getRandomValues(bytes);\n } else if (typeof require !== \"undefined\") {\n const nodeCrypto = require(\"crypto\");\n const randomBytes = nodeCrypto.randomBytes(length);\n bytes.set(\n new Uint8Array(\n randomBytes.buffer,\n randomBytes.byteOffset,\n randomBytes.byteLength\n )\n );\n } else {\n throw new Error(\n \"No cryptographically secure random number generator available\"\n );\n }\n\n return bytes;\n}\n\n// ============================================================================\n// KEY TO ADDRESS DERIVATION\n// ============================================================================\n\n/**\n * Derives a blockchain address from a private key.\n *\n * @param key - The private key as a Uint8Array (32 bytes for EVM/Tron/BTC, 64 bytes for Solana)\n * @param chain - The target blockchain type\n * @param network - Network mode for BTC (mainnet/testnet)\n * @returns The derived address string\n */\nexport function keyToAddress(\n key: Uint8Array,\n chain: EChainType,\n network: NetworkMode = \"mainnet\"\n): string {\n switch (chain) {\n case EChainType.EVM:\n return deriveEvmAddress(key);\n case EChainType.SOL:\n return deriveSolanaAddress(key);\n case EChainType.TRON:\n return deriveTronAddress(key);\n case EChainType.BTC:\n case EChainType.BTC_T3:\n return deriveBtcAddress(key, network);\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n}\n\n/**\n * Derives an EVM address from a private key.\n */\nfunction deriveEvmAddress(privateKey: Uint8Array): string {\n const hexPrivateKey = \"0x\" + Buffer.from(privateKey).toString(\"hex\");\n const wallet = new ethers.Wallet(hexPrivateKey);\n return wallet.address;\n}\n\n/**\n * Derives a Solana address from a private key.\n * Note: Solana uses 64-byte secret keys (32-byte seed + 32-byte public key)\n */\nfunction deriveSolanaAddress(privateKey: Uint8Array): string {\n let keypair: Keypair;\n\n if (privateKey.length === 64) {\n keypair = Keypair.fromSecretKey(privateKey);\n } else if (privateKey.length === 32) {\n keypair = Keypair.fromSeed(privateKey);\n } else {\n throw new Error(\"Solana private key must be 32 or 64 bytes\");\n }\n\n return keypair.publicKey.toBase58();\n}\n\n/**\n * Derives a Tron address from a private key.\n */\nfunction deriveTronAddress(privateKey: Uint8Array): string {\n const hexPrivateKey = Buffer.from(privateKey).toString(\"hex\");\n const tronWeb = new TronWeb({ fullHost: \"https://api.trongrid.io\" });\n return tronWeb.address.fromPrivateKey(hexPrivateKey);\n}\n\n/**\n * Derives a BTC address from a private key (P2WPKH - native SegWit).\n */\nfunction deriveBtcAddress(\n privateKey: Uint8Array,\n network: NetworkMode\n): string {\n const btcNetwork =\n network === \"mainnet\" ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKey), {\n network: btcNetwork,\n });\n\n const { address } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n network: btcNetwork,\n });\n\n if (!address) {\n throw new Error(\"Failed to derive BTC address\");\n }\n\n return address;\n}\n\n// ============================================================================\n// PRIVATE KEY CONVERSION UTILITIES\n// ============================================================================\n\n/**\n * Converts raw private key bytes to chain-specific format.\n */\nexport function rawKeyToChainFormat(\n raw: Uint8Array,\n chain: EChainType,\n network: NetworkMode = \"mainnet\"\n): string | Uint8Array {\n switch (chain) {\n case EChainType.EVM:\n return \"0x\" + Buffer.from(raw).toString(\"hex\");\n case EChainType.SOL:\n return Keypair.fromSecretKey(raw).secretKey;\n case EChainType.TRON:\n return Buffer.from(raw).toString(\"hex\");\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n const btcNetwork =\n network === \"mainnet\"\n ? bitcoin.networks.bitcoin\n : bitcoin.networks.testnet;\n const keyPair = ECPair.fromPrivateKey(Buffer.from(raw), {\n network: btcNetwork,\n });\n return keyPair.toWIF();\n }\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n}\n\n// ============================================================================\n// ENCRYPTION / DECRYPTION (AES-GCM-256)\n// ============================================================================\n\nconst IV_LENGTH = 12;\nconst TAG_LENGTH = 16;\nconst ALGORITHM = \"AES-GCM\";\n\n/**\n * Encrypts data using AES-GCM-256.\n *\n * @param key - The 256-bit encryption key as a Uint8Array (32 bytes)\n * @param data - The plaintext data to encrypt\n * @returns The encrypted data (IV + ciphertext + auth tag)\n */\nexport async function encryptShare(\n key: Uint8Array,\n data: Uint8Array\n): Promise<Uint8Array> {\n if (key.length !== 32) {\n throw new Error(\"Encryption key must be 32 bytes (256 bits)\");\n }\n\n const iv = generateRandomBytes(IV_LENGTH);\n\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.subtle) {\n const keyBuffer = new Uint8Array(key).buffer as ArrayBuffer;\n const ivBuffer = new Uint8Array(iv).buffer as ArrayBuffer;\n const dataBuffer = new Uint8Array(data).buffer as ArrayBuffer;\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n \"raw\",\n keyBuffer,\n { name: ALGORITHM },\n false,\n [\"encrypt\"]\n );\n\n const encrypted = await globalThis.crypto.subtle.encrypt(\n { name: ALGORITHM, iv: ivBuffer },\n cryptoKey,\n dataBuffer\n );\n\n const encryptedBytes = new Uint8Array(encrypted);\n return concatBytes(iv, encryptedBytes);\n } else if (typeof require !== \"undefined\") {\n const nodeCrypto = require(\"crypto\");\n const cipher = nodeCrypto.createCipheriv(\"aes-256-gcm\", key, iv);\n\n const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n return concatBytes(iv, new Uint8Array(encrypted), new Uint8Array(authTag));\n }\n\n throw new Error(\"No encryption API available\");\n}\n\n/**\n * Decrypts data using AES-GCM-256.\n *\n * @param key - The 256-bit decryption key as a Uint8Array (32 bytes)\n * @param encryptedData - The encrypted data (IV + ciphertext + auth tag)\n * @returns The decrypted plaintext data\n */\nexport async function decryptShare(\n key: Uint8Array,\n encryptedData: Uint8Array\n): Promise<Uint8Array> {\n if (key.length !== 32) {\n throw new Error(\"Decryption key must be 32 bytes (256 bits)\");\n }\n\n if (encryptedData.length < IV_LENGTH + TAG_LENGTH) {\n throw new Error(\"Encrypted data is too short\");\n }\n\n const iv = encryptedData.slice(0, IV_LENGTH);\n const ciphertext = encryptedData.slice(IV_LENGTH);\n\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.subtle) {\n const keyBuffer = new Uint8Array(key).buffer as ArrayBuffer;\n const ivBuffer = new Uint8Array(iv).buffer as ArrayBuffer;\n const ciphertextBuffer = new Uint8Array(ciphertext).buffer as ArrayBuffer;\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n \"raw\",\n keyBuffer,\n { name: ALGORITHM },\n false,\n [\"decrypt\"]\n );\n\n const decrypted = await globalThis.crypto.subtle.decrypt(\n { name: ALGORITHM, iv: ivBuffer },\n cryptoKey,\n ciphertextBuffer\n );\n\n return new Uint8Array(decrypted);\n } else if (typeof require !== \"undefined\") {\n const nodeCrypto = require(\"crypto\");\n\n const authTag = ciphertext.slice(-TAG_LENGTH);\n const encryptedContent = ciphertext.slice(0, -TAG_LENGTH);\n\n const decipher = nodeCrypto.createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([\n decipher.update(encryptedContent),\n decipher.final(),\n ]);\n\n return new Uint8Array(decrypted);\n }\n\n throw new Error(\"No decryption API available\");\n}\n\n/**\n * Encrypts data with RSA-OAEP public key (for recovery share encryption).\n *\n * @param pemKey - The PEM-encoded public key\n * @param data - The data to encrypt (as string)\n * @returns Base64-encoded encrypted data\n */\nexport async function encryptRsaOaep(\n pemKey: string,\n data: string\n): Promise<string> {\n return encryptWithPublicKey(pemKey, data);\n}\n\n/**\n * Encrypts data with RSA-OAEP public key (for recovery share encryption).\n *\n * @param pemKey - The PEM-encoded public key\n * @param data - The data to encrypt (as string)\n * @returns Base64-encoded encrypted data\n */\nexport async function encryptWithPublicKey(\n pemKey: string,\n data: string\n): Promise<string> {\n if (\n typeof globalThis.crypto === \"undefined\" ||\n !globalThis.crypto ||\n !globalThis.crypto.subtle\n ) {\n console.error(\n \"Crypto Error: Web Crypto API (crypto.subtle) is not supported in this environment.\"\n );\n throw new Error(\n \"BROWSER_NOT_SUPPORTED: Encryption failed because Web Crypto API is not available.\"\n );\n }\n\n if (\n typeof TextEncoder === \"undefined\" ||\n typeof atob === \"undefined\" ||\n typeof btoa === \"undefined\"\n ) {\n console.error(\n \"Crypto Error: Required global functions (TextEncoder, atob, btoa) are missing.\"\n );\n throw new Error(\n \"BROWSER_NOT_SUPPORTED: Encryption failed because required global functions are missing.\"\n );\n }\n\n const pemContents = pemKey\n .replace(/-----BEGIN PUBLIC KEY-----/, \"\")\n .replace(/-----END PUBLIC KEY-----/, \"\")\n .replace(/\\s+/g, \"\");\n\n try {\n const binaryDer = Uint8Array.from(atob(pemContents), (c) =>\n c.charCodeAt(0)\n );\n\n const publicKey = await globalThis.crypto.subtle.importKey(\n \"spki\",\n binaryDer.buffer,\n {\n name: \"RSA-OAEP\",\n hash: \"SHA-256\",\n },\n false,\n [\"encrypt\"]\n );\n\n const encoded = new TextEncoder().encode(data);\n const encrypted = await globalThis.crypto.subtle.encrypt(\n {\n name: \"RSA-OAEP\",\n },\n publicKey,\n encoded\n );\n\n return btoa(String.fromCharCode(...new Uint8Array(encrypted)));\n } catch (e) {\n console.error(\n \"Crypto Error: Failed during key import or encryption step.\",\n e\n );\n throw new Error(\n \"ENCRYPTION_FAILED: Could not securely encrypt data. Check key format or algorithm support.\"\n );\n }\n}\n\n// ============================================================================\n// ENCODING UTILITIES\n// ============================================================================\n\n/**\n * Converts a hexadecimal string to a Uint8Array.\n *\n * @param hex - The hexadecimal string (with or without 0x prefix)\n * @returns The byte array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n\n const bytes = new Uint8Array(cleanHex.length / 2);\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return bytes;\n}\n\n/**\n * Converts a Uint8Array to a hexadecimal string.\n *\n * @param bytes - The byte array\n * @param prefix - Whether to include '0x' prefix (default: true)\n * @returns The hexadecimal string\n */\nexport function bytesToHex(bytes: Uint8Array, prefix: boolean = true): string {\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return prefix ? `0x${hex}` : hex;\n}\n\n/**\n * Concatenates multiple Uint8Arrays into a single array.\n *\n * @param arrays - The arrays to concatenate\n * @returns The concatenated array\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n\n return result;\n}\n\n/**\n * Compares two Uint8Arrays for equality in constant time.\n *\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays are equal\n */\nexport function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a[i] ^ b[i];\n }\n\n return result === 0;\n}\n\n/**\n * Converts Base64 string to Uint8Array.\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Converts Uint8Array to Base64 string.\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n return btoa(String.fromCharCode(...bytes));\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,55 @@
1
+ // src/core/types.ts
2
+ var EChainType = /* @__PURE__ */ ((EChainType2) => {
3
+ EChainType2["EVM"] = "EVM";
4
+ EChainType2["SOL"] = "SOL";
5
+ EChainType2["TRON"] = "TRON";
6
+ EChainType2["BTC"] = "BTC";
7
+ EChainType2["BTC_T3"] = "BTC_T3";
8
+ return EChainType2;
9
+ })(EChainType || {});
10
+ var _globalNetworkMode = "mainnet";
11
+ function _setGlobalNetworkMode(network) {
12
+ _globalNetworkMode = network;
13
+ }
14
+ function getBtcChainType() {
15
+ return _globalNetworkMode === "mainnet" ? "BTC" /* BTC */ : "BTC_T3" /* BTC_T3 */;
16
+ }
17
+ function toBackendChainType(chain) {
18
+ if (chain === "BTC_T3") {
19
+ return "BTC_T3";
20
+ }
21
+ return String(chain).toUpperCase();
22
+ }
23
+ var MultisigStatus = /* @__PURE__ */ ((MultisigStatus2) => {
24
+ MultisigStatus2["PENDING"] = "pending";
25
+ MultisigStatus2["ACTIVE"] = "active";
26
+ MultisigStatus2["INACTIVE"] = "inactive";
27
+ return MultisigStatus2;
28
+ })(MultisigStatus || {});
29
+ var OrderStatus = /* @__PURE__ */ ((OrderStatus2) => {
30
+ OrderStatus2["PENDING"] = "pending";
31
+ OrderStatus2["APPROVED"] = "approved";
32
+ OrderStatus2["EXECUTED"] = "executed";
33
+ OrderStatus2["REJECTED"] = "rejected";
34
+ OrderStatus2["CANCELLED"] = "cancelled";
35
+ OrderStatus2["FAILED"] = "failed";
36
+ return OrderStatus2;
37
+ })(OrderStatus || {});
38
+ var StatusFilterEnum = /* @__PURE__ */ ((StatusFilterEnum2) => {
39
+ StatusFilterEnum2["ALL"] = "all";
40
+ StatusFilterEnum2["PENDING"] = "pending";
41
+ StatusFilterEnum2["EXECUTED"] = "executed";
42
+ StatusFilterEnum2["REJECTED"] = "rejected";
43
+ return StatusFilterEnum2;
44
+ })(StatusFilterEnum || {});
45
+
46
+ export {
47
+ EChainType,
48
+ _setGlobalNetworkMode,
49
+ getBtcChainType,
50
+ toBackendChainType,
51
+ MultisigStatus,
52
+ OrderStatus,
53
+ StatusFilterEnum
54
+ };
55
+ //# sourceMappingURL=chunk-L45R2ICF.js.map