multisigns-sdk 1.0.13 → 1.0.14
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/dist/{chunk-MMFIK73L.js → chunk-BYC2AV2K.js} +17 -35
- package/dist/chunk-BYC2AV2K.js.map +1 -0
- package/dist/{chunk-IML3VBNR.js → chunk-CITU3MML.js} +1 -8
- package/dist/chunk-CITU3MML.js.map +1 -0
- package/dist/{chunk-G2AFPLPL.js → chunk-D3CARXPJ.js} +15 -25
- package/dist/chunk-D3CARXPJ.js.map +1 -0
- package/dist/{chunk-TFOTORKG.js → chunk-DYYPGVXB.js} +13 -23
- package/dist/chunk-DYYPGVXB.js.map +1 -0
- package/dist/{chunk-F3M2R7J7.js → chunk-FS2P4LP4.js} +20 -32
- package/dist/chunk-FS2P4LP4.js.map +1 -0
- package/dist/{chunk-PLIK3T7H.js → chunk-HI2MHFRJ.js} +1 -1
- package/dist/chunk-HI2MHFRJ.js.map +1 -0
- package/dist/{chunk-FXHRAW2N.js → chunk-QU34IDSK.js} +2 -2
- package/dist/chunk-QU34IDSK.js.map +1 -0
- package/dist/{chunk-WQBQUQDF.js → chunk-U3RN3RQG.js} +8 -10
- package/dist/chunk-U3RN3RQG.js.map +1 -0
- package/dist/{chunk-XKRULADY.js → chunk-VQ5YOKDX.js} +3 -5
- package/dist/chunk-VQ5YOKDX.js.map +1 -0
- package/dist/{chunk-7ZAVPDIR.js → chunk-VQF7GAK7.js} +9 -13
- package/dist/chunk-VQF7GAK7.js.map +1 -0
- package/dist/{chunk-64EQLMXL.js → chunk-WWICEUCG.js} +52 -71
- package/dist/chunk-WWICEUCG.js.map +1 -0
- package/dist/{chunk-SW35WN7S.js → chunk-XDHJIP6P.js} +1 -59
- package/dist/chunk-XDHJIP6P.js.map +1 -0
- package/dist/{config-IHPN2CZ2.js → config-FB4XTF26.js} +2 -2
- package/dist/createSolanaMultisigOrder-K6GYUAKH.js +12 -0
- package/dist/{estimateOrderExecutionFee-56V4CYAB.js → estimateOrderExecutionFee-ODG2VHBJ.js} +5 -4
- package/dist/estimateOrderExecutionFee-ODG2VHBJ.js.map +1 -0
- package/dist/{evm-validation-3LCDVXVI.js → evm-validation-X6KI2PQ2.js} +3 -3
- package/dist/{evmSendTransaction-CY6OSAGH.js → evmSendTransaction-SV7AYELP.js} +18 -35
- package/dist/evmSendTransaction-SV7AYELP.js.map +1 -0
- package/dist/index.cjs +436 -1018
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +115 -80
- package/dist/index.d.ts +115 -80
- package/dist/index.js +166 -576
- package/dist/index.js.map +1 -1
- package/dist/{order-helpers-R7MTU3AK.js → order-helpers-LH6YKT3C.js} +2 -2
- package/dist/{sendBtcTransaction-QZD4MUQ5.js → sendBtcTransaction-F7S34ETP.js} +18 -16
- package/dist/sendBtcTransaction-F7S34ETP.js.map +1 -0
- package/dist/{sendSolanaTransaction-7HYOPWGB.js → sendSolanaTransaction-YNCPRN7L.js} +11 -23
- package/dist/sendSolanaTransaction-YNCPRN7L.js.map +1 -0
- package/dist/{sendTronTransaction-7GBAATTP.js → sendTronTransaction-6Y4PLUJF.js} +16 -25
- package/dist/sendTronTransaction-6Y4PLUJF.js.map +1 -0
- package/dist/{shares-TMRSGPFR.js → shares-LDNLV6LF.js} +4 -4
- package/dist/{types-BX2UUK7G.js → types-JDHIKATP.js} +2 -2
- package/dist/wallet.api-XZYXM5WF.js +8 -0
- package/package.json +1 -1
- package/dist/chunk-64EQLMXL.js.map +0 -1
- package/dist/chunk-7ZAVPDIR.js.map +0 -1
- package/dist/chunk-F3M2R7J7.js.map +0 -1
- package/dist/chunk-FXHRAW2N.js.map +0 -1
- package/dist/chunk-G2AFPLPL.js.map +0 -1
- package/dist/chunk-IML3VBNR.js.map +0 -1
- package/dist/chunk-MMFIK73L.js.map +0 -1
- package/dist/chunk-PLIK3T7H.js.map +0 -1
- package/dist/chunk-SW35WN7S.js.map +0 -1
- package/dist/chunk-TFOTORKG.js.map +0 -1
- package/dist/chunk-WQBQUQDF.js.map +0 -1
- package/dist/chunk-XKRULADY.js.map +0 -1
- package/dist/createSolanaMultisigOrder-L56Y6S7E.js +0 -13
- package/dist/estimateOrderExecutionFee-56V4CYAB.js.map +0 -1
- package/dist/evmSendTransaction-CY6OSAGH.js.map +0 -1
- package/dist/sendBtcTransaction-QZD4MUQ5.js.map +0 -1
- package/dist/sendSolanaTransaction-7HYOPWGB.js.map +0 -1
- package/dist/sendTronTransaction-7GBAATTP.js.map +0 -1
- package/dist/wallet.api-EOAUI53I.js +0 -9
- /package/dist/{config-IHPN2CZ2.js.map → config-FB4XTF26.js.map} +0 -0
- /package/dist/{createSolanaMultisigOrder-L56Y6S7E.js.map → createSolanaMultisigOrder-K6GYUAKH.js.map} +0 -0
- /package/dist/{evm-validation-3LCDVXVI.js.map → evm-validation-X6KI2PQ2.js.map} +0 -0
- /package/dist/{order-helpers-R7MTU3AK.js.map → order-helpers-LH6YKT3C.js.map} +0 -0
- /package/dist/{shares-TMRSGPFR.js.map → shares-LDNLV6LF.js.map} +0 -0
- /package/dist/{types-BX2UUK7G.js.map → types-JDHIKATP.js.map} +0 -0
- /package/dist/{wallet.api-EOAUI53I.js.map → wallet.api-XZYXM5WF.js.map} +0 -0
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
encryptRsaOaep
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import {
|
|
5
|
-
EChainType
|
|
6
|
-
} from "./chunk-IML3VBNR.js";
|
|
7
|
-
|
|
8
|
-
// src/strategies/iframeServices/types.ts
|
|
9
|
-
var EChainType2 = EChainType;
|
|
3
|
+
} from "./chunk-XDHJIP6P.js";
|
|
10
4
|
|
|
11
|
-
// src/strategies/
|
|
5
|
+
// src/strategies/utils/crypto.ts
|
|
12
6
|
import { ethers } from "ethers";
|
|
13
7
|
import { combine } from "shamir-secret-sharing";
|
|
14
8
|
import { Keypair } from "@solana/web3.js";
|
|
@@ -23,7 +17,7 @@ var combineShares = async (shares) => {
|
|
|
23
17
|
return reconstructed;
|
|
24
18
|
};
|
|
25
19
|
|
|
26
|
-
// src/strategies/
|
|
20
|
+
// src/strategies/utils/wallet.ts
|
|
27
21
|
import { ethers as ethers2 } from "ethers";
|
|
28
22
|
var fetchServerShare = async (apiKey, walletAddress, chainType, apiUrl) => {
|
|
29
23
|
const res = await fetch(
|
|
@@ -156,37 +150,25 @@ var updateShares = async (walletAddress, serverShare, recoveryShare, apiKey, api
|
|
|
156
150
|
}
|
|
157
151
|
};
|
|
158
152
|
|
|
159
|
-
// src/strategies/
|
|
160
|
-
var getReconstructionShares = async (
|
|
153
|
+
// src/strategies/utils/getReconstructionShares.ts
|
|
154
|
+
var getReconstructionShares = async (walletAddress, apiKey, chainType, apiUrl) => {
|
|
161
155
|
let mainShare;
|
|
162
156
|
let additionalShare;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
additionalShare = server;
|
|
175
|
-
newDeviceShare = device;
|
|
176
|
-
} else {
|
|
177
|
-
const serverShare = await fetchServerShare(apiKey, walletAddress, chainType, apiUrl);
|
|
178
|
-
mainShare = deviceShare;
|
|
179
|
-
additionalShare = serverShare;
|
|
180
|
-
}
|
|
181
|
-
if (!mainShare || !additionalShare) {
|
|
182
|
-
throw new Error("Failed to retrieve key shares.");
|
|
183
|
-
}
|
|
184
|
-
return { mainShare, additionalShare, newDeviceShare };
|
|
157
|
+
const shares = await fetchShares(apiKey, walletAddress, chainType, apiUrl);
|
|
158
|
+
const { device, server } = await updateShares(
|
|
159
|
+
walletAddress,
|
|
160
|
+
shares.server,
|
|
161
|
+
shares.recovery,
|
|
162
|
+
apiKey,
|
|
163
|
+
apiUrl
|
|
164
|
+
);
|
|
165
|
+
mainShare = device;
|
|
166
|
+
additionalShare = server;
|
|
167
|
+
return { mainShare, additionalShare };
|
|
185
168
|
};
|
|
186
169
|
|
|
187
170
|
export {
|
|
188
|
-
EChainType2 as EChainType,
|
|
189
171
|
combineShares,
|
|
190
172
|
getReconstructionShares
|
|
191
173
|
};
|
|
192
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-BYC2AV2K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/strategies/utils/crypto.ts","../src/strategies/utils/wallet.ts","../src/strategies/utils/getReconstructionShares.ts"],"sourcesContent":["import { ethers } from \"ethers\";\nimport { combine } from \"shamir-secret-sharing\";\nimport { Keypair } from \"@solana/web3.js\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Buffer } from 'buffer';\nimport { ECPairFactory } from \"ecpair\";\nimport * as bitcoin from \"bitcoinjs-lib\";\n\nconst ECPair = ECPairFactory(ecc);\n\nexport const combineShares = async (shares: string[]): Promise<Uint8Array> => {\n const shareBuffers = shares.map((share) => ethers.getBytes(share));\n const reconstructed = await combine(shareBuffers);\n return reconstructed;\n};\n\nexport const combineSolanaSharesToPrivateKey = (\n raw: Uint8Array\n): Uint8Array => {\n const key = Keypair.fromSecretKey(raw);\n return key.secretKey;\n};\n\nexport const combineEvmSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const reconstructedPK = \"0x\" + Buffer.from(raw).toString(\"hex\");\n return reconstructedPK;\n};\n\nexport const combineBtcSharesToPrivateKey = async (\n raw: Uint8Array,\n isMainnet: boolean\n): Promise<string> => {\n const keyPair = ECPair.fromPrivateKey(Buffer.from(raw), {\n network: isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet,\n });\n return keyPair.toWIF();\n};\n\nexport const combineTronSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const privateKey = Buffer.from(raw).toString(\"hex\");\n return privateKey;\n};\n","import { ethers } from 'ethers';\nimport { encryptRsaOaep } from '../../crypto/util';\nimport { EChainTypeValue } from '../types';\n\n\nexport const fetchServerShare = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(\n `${apiUrl}/sdk/wallets/share/c/${chainType}/${walletAddress}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n },\n credentials: \"include\",\n }\n );\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch server share\");\n }\n\n const data = await res.json();\n return data.share;\n};\n\nexport const fetchRecoveryShare = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(\n `${apiUrl}/sdk/wallets/share/s/${chainType}/${walletAddress}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n },\n credentials: \"include\",\n }\n );\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch recovery share\");\n }\n\n const data = await res.json();\n return data.share;\n};\n\nexport const fetchShares = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<{\n recovery: string;\n server: string;\n}> => {\n const [recovery, server] = await Promise.all([\n fetchRecoveryShare(apiKey, walletAddress, chainType, apiUrl),\n fetchServerShare(apiKey, walletAddress, chainType, apiUrl),\n ]);\n return {\n recovery,\n server,\n };\n};\n\nexport const fetchMultisigServerShare = async (\n multisigId: string,\n walletAddress: string,\n apiKey: string,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(`${apiUrl}/sdk/multisig/share/tron`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n body: JSON.stringify({\n multisigId,\n walletAddress,\n }),\n });\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch multisig server share\");\n }\n\n const data = await res.json();\n if (!data?.share) {\n throw new Error(\"Failed to fetch multisig server share\");\n }\n\n return data.share;\n};\n\nexport interface SplitPrivateKey {\n deviceShare: string;\n serverShare: string;\n recoveryShare: string;\n}\n\nexport const SHAMIR_THRESHOLD_PERSONAL = 2;\nexport const SHAMIR_SHARES_NUM = 3;\n\nexport const combineSharesFromHex = async (shares: string[]): Promise<Uint8Array> => {\n const { combine } = await import('shamir-secret-sharing');\n const shareBuffers = shares.map((share) => ethers.getBytes(share));\n const reconstructed = await combine(shareBuffers);\n return reconstructed;\n};\n\nexport const splitPrivateKey = async (\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> => {\n const { split } = await import('shamir-secret-sharing');\n const shares = await split(\n privateKeyBytes,\n SHAMIR_SHARES_NUM,\n SHAMIR_THRESHOLD_PERSONAL\n );\n const { ethers } = await import('ethers');\n\n const deviceShare = ethers.hexlify(shares[0]);\n const serverShare = ethers.hexlify(shares[1]);\n const recoveryShare = ethers.hexlify(shares[2]);\n return {\n deviceShare,\n serverShare,\n recoveryShare,\n };\n};\n\nexport const createShares = async (\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> => {\n if (!privateKeyBytes) {\n throw new Error(\"Cannot create shares\");\n }\n const shares = await splitPrivateKey(privateKeyBytes);\n return shares;\n};\n\nexport const updateShares = async (\n walletAddress: string,\n serverShare: string,\n recoveryShare: string,\n apiKey: string,\n apiUrl: string\n): Promise<{\n device: string;\n server: string;\n recovery: string;\n}> => {\n try {\n const reconstructed = await combineSharesFromHex([recoveryShare, serverShare]);\n const shares = await createShares(reconstructed);\n const pubkeyResponse = await fetch(`${apiUrl}/sdk/wallets/pubkey`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n });\n\n if (!pubkeyResponse.ok) {\n await pubkeyResponse.text().catch(() => \"N/A\");\n console.error(\n `Critical Failure [${walletAddress}]: STEP 2 (Get Pubkey). Status: ${pubkeyResponse.status}.`\n );\n throw new Error(\n `Failed to fetch public key. Status: ${pubkeyResponse.status}`\n );\n }\n\n const { pubkey } = await pubkeyResponse.json();\n const encryptedRecoveryShare = await encryptRsaOaep(\n pubkey,\n shares.recoveryShare\n );\n const updateResponse = await fetch(`${apiUrl}/sdk/wallets/update`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n body: JSON.stringify({\n walletAddress,\n serverShare: shares.serverShare,\n encryptedRecoveryShare,\n }),\n });\n\n if (!updateResponse.ok) {\n await updateResponse.text().catch(() => \"N/A\");\n console.error(\n `Critical Failure [${walletAddress}]: STEP 4 (Update Shares). Status: ${updateResponse.status}.`\n );\n throw new Error(\n `Failed to update shares on server. Status: ${updateResponse.status}`\n );\n }\n\n return {\n recovery: \"\",\n server: shares.serverShare,\n device: shares.deviceShare,\n };\n } catch (err) {\n console.error(`UpdateShares Critical Failure for ${walletAddress}:`, err);\n throw err;\n }\n};\n","import { EChainTypeValue } from \"../types\";\nimport { fetchShares, updateShares } from \"./wallet\";\n\nexport const getReconstructionShares = async (\n walletAddress: string,\n apiKey: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<{\n mainShare: string;\n additionalShare: string;\n}> => {\n let mainShare: string | null;\n let additionalShare: string | null;\n\n\n const shares = await fetchShares(apiKey, walletAddress, chainType, apiUrl);\n const { device, server } = await updateShares(\n walletAddress,\n shares.server,\n shares.recovery,\n apiKey,\n apiUrl\n );\n mainShare = device;\n additionalShare = server;\n return { mainShare, additionalShare };\n};\n"],"mappings":"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","names":["ethers","combine","ethers"]}
|
|
@@ -14,12 +14,6 @@ function _setGlobalNetworkMode(network) {
|
|
|
14
14
|
function getBtcChainType() {
|
|
15
15
|
return _globalNetworkMode === "mainnet" ? "BTC" /* BTC */ : "BTC_T3" /* BTC_T3 */;
|
|
16
16
|
}
|
|
17
|
-
function toBackendChainType(chain) {
|
|
18
|
-
if (chain === "BTC_T3") {
|
|
19
|
-
return "BTC_T3";
|
|
20
|
-
}
|
|
21
|
-
return String(chain).toUpperCase();
|
|
22
|
-
}
|
|
23
17
|
var MultisigStatus = /* @__PURE__ */ ((MultisigStatus2) => {
|
|
24
18
|
MultisigStatus2["PENDING"] = "pending";
|
|
25
19
|
MultisigStatus2["ACTIVE"] = "active";
|
|
@@ -47,9 +41,8 @@ export {
|
|
|
47
41
|
EChainType,
|
|
48
42
|
_setGlobalNetworkMode,
|
|
49
43
|
getBtcChainType,
|
|
50
|
-
toBackendChainType,
|
|
51
44
|
MultisigStatus,
|
|
52
45
|
OrderStatus,
|
|
53
46
|
StatusFilterEnum
|
|
54
47
|
};
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
48
|
+
//# sourceMappingURL=chunk-CITU3MML.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts"],"sourcesContent":["/**\n * Supported blockchain chain types\n */\nexport type ChainType = \"EVM\" | \"SOL\" | \"TRON\" | \"BTC\" | \"BTC_T3\";\n\nexport enum EChainType {\n EVM = \"EVM\",\n SOL = \"SOL\",\n TRON = \"TRON\",\n BTC = \"BTC\",\n BTC_T3 = \"BTC_T3\",\n}\n\nlet _globalNetworkMode: NetworkMode = \"mainnet\";\nexport function _setGlobalNetworkMode(network: NetworkMode): void {\n _globalNetworkMode = network;\n}\n\n/**\n * Returns the appropriate BTC chain type based on the current network mode.\n * - Mainnet: EChainType.BTC\n * - Testnet: EChainType.BTC_T3\n *\n * @example\n * ```typescript\n * const btcChain = getBtcChainType(); // Returns EChainType.BTC or EChainType.BTC_T3\n * ```\n */\nexport function getBtcChainType(): EChainType.BTC | EChainType.BTC_T3 {\n return _globalNetworkMode === \"mainnet\" ? EChainType.BTC : EChainType.BTC_T3;\n}\n\n\nexport enum TestnetChainId {\n BASE_SEPOLIA = \"84532\",\n ARBITRUM_SEPOLIA = \"421614\",\n SOLANA_DEVNET = \"sol_devnet\",\n BTC = \"BTC_T3\",\n BNB = \"97\",\n POL = \"80002\",\n ETH_SEPOLIA = \"11155111\",\n OPTIMISM_SEPOLIA = \"11155420\",\n TRON = \"tron_shasta\",\n AVAX_FUJI = \"43113\",\n}\n\n// Frontend MainnetChainId values\nexport enum MainnetChainId {\n BASE = \"8453\",\n ARBITRUM = \"42161\",\n SOLANA = \"sol_mainnet\",\n BTC = \"BTC\",\n BNB = \"56\",\n POL = \"137\",\n ETH = \"1\",\n OPTIMISM = \"10\",\n TRON = \"tron_mainnet\",\n AVAX = \"43114\",\n}\n\n/**\n * Union of all possible chain ID values (EVM chain IDs are strings here for consistency)\n */\nexport type ChainIdValue = `${MainnetChainId}` | `${TestnetChainId}`;\n\nexport interface TWallet {\n name: string | null;\n chain: EChainType;\n address: string;\n share: string;\n isImported: boolean;\n}\n\n/**\n * Response from wallet creation/import\n */\nexport interface CreateWalletResponse {\n wallets: TWallet[];\n}\n\n/**\n * Single wallet details response\n */\nexport interface SingleWalletDetailsResponse {\n data: TWallet;\n}\n\n/**\n * Paginated wallets response\n */\nexport interface PaginatedWalletsResponse {\n wallets: TWallet[];\n total: number;\n page: number;\n limit: number;\n}\n\n/**\n * Multisig status enum\n */\nexport enum MultisigStatus {\n PENDING = \"pending\",\n ACTIVE = \"active\",\n INACTIVE = \"inactive\",\n}\n\n/**\n * Multisig params with deployment data\n */\nexport interface MultisigParams {\n chainType: EChainType;\n to: string;\n data: string;\n paymentToken: string;\n payment: string;\n vaultAddress: string;\n paymentReceiverAddress: string;\n fallbackAddress: string;\n singleton: string;\n initializer: string;\n deployData: string;\n share?: string;\n}\n\n/**\n * Token within a multisig\n */\nexport interface MultisignToken extends TokenMultisignBalance { }\n\n/**\n * Multisig vault/safe object\n */\nexport interface MultisigsItem {\n id: string;\n address: string | null;\n chainId: ChainIdValue;\n status: \"created\" | \"execution\" | \"deployed\";\n threshold: string;\n chainType: EChainType;\n isDeployed: boolean;\n factoryId: string;\n name: string;\n params: MultisigParams;\n updatedAt: string;\n createdAt: string;\n owners: { walletAddress: string }[];\n tokens: MultisignToken[];\n factoryAddress: string;\n}\n\nexport interface MultisigBaseDTO {\n address: string;\n chainType: EChainType;\n data: MultisigsItem[];\n}\n\n/**\n * Order status enum\n */\nexport enum OrderStatus {\n PENDING = \"pending\",\n APPROVED = \"approved\",\n EXECUTED = \"executed\",\n REJECTED = \"rejected\",\n CANCELLED = \"cancelled\",\n FAILED = \"failed\",\n}\n\n/**\n * Order method types - the action the order will perform\n */\nexport type OrderMethodType =\n | \"native\"\n | \"erc20\"\n | \"spl\"\n | \"trc20\"\n | \"trc\"\n | \"addOwner\"\n | \"removeOwner\"\n | \"changeThreshold\"\n | \"addOwnerWithThreshold\"\n | \"AddOwner\"\n | \"RemoveOwner\"\n | \"ChangeThreshold\"\n | \"multiSend\"\n | \"MultiSend\"\n | \"updateOwners\"\n | \"updateOwnerThreshold\";\n\n/**\n * Solana instruction types\n */\nexport enum ESolanaInstructionType {\n native = \"native\",\n spl = \"spl\",\n addOwner = \"addOwner\",\n removeOwner = \"removeOwner\",\n changeThreshold = \"changeThreshold\",\n MultiSend = \"MultiSend\",\n NATIVE = \"native\",\n SPL = \"spl\",\n ADD_OWNER = \"addOwner\",\n REMOVE_OWNER = \"removeOwner\",\n CHANGE_THRESHOLD = \"changeThreshold\",\n}\n\n/**\n * EVM method types for Gnosis Safe\n */\nexport type EvmMethodType =\n | \"execTransaction\"\n | \"addOwnerWithThreshold\"\n | \"AddOwner\"\n | \"removeOwner\"\n | \"RemoveOwner\"\n | \"changeThreshold\"\n | \"ChangeThreshold\"\n | \"multiSend\"\n | \"MultiSend\";\n\n/**\n * Tron order types\n */\nexport enum ETronOrderType {\n native = \"native\",\n trc20 = \"trc20\",\n trc = \"trc\",\n addOwner = \"addOwner\",\n removeOwner = \"removeOwner\",\n changeThreshold = \"changeThreshold\",\n updateOwners = \"updateOwners\",\n updateOwnerThreshold = \"updateOwnerThreshold\",\n}\n\n/**\n * Order instruction for creating orders\n */\n// ============================================================================\n// SOLANA INSTRUCTIONS\n// ============================================================================\n\nexport interface SolanaSPLInstruction {\n type: ESolanaInstructionType.spl;\n toPubkey: string;\n tokenAddress: string;\n amount: string;\n}\n\nexport interface SolanaNativeInstruction {\n type: ESolanaInstructionType.native;\n toPubkey: string;\n amount: string;\n}\n\nexport interface SolanaConfigAddOwnerInstruction {\n type: ESolanaInstructionType.addOwner;\n newOwner: string;\n}\n\nexport interface SolanaConfigRemoveOwnerInstruction {\n type: ESolanaInstructionType.removeOwner;\n removeOwner: string;\n}\n\nexport interface SolanaConfigChangeThresholdInstruction {\n type: ESolanaInstructionType.changeThreshold;\n newThreshold: number;\n}\n\nexport type TSolanaCommandInstruction =\n | SolanaNativeInstruction\n | SolanaSPLInstruction\n | SolanaConfigAddOwnerInstruction\n | SolanaConfigRemoveOwnerInstruction\n | SolanaConfigChangeThresholdInstruction;\n\n// ============================================================================\n// TRON INSTRUCTIONS\n// ============================================================================\n\nexport interface TronNativeOrder {\n type: ETronOrderType.native;\n to: string;\n amount: string;\n}\n\nexport interface TronTrcOrder {\n type: ETronOrderType.trc | ETronOrderType.trc20;\n to: string;\n tokenAddress: string;\n amount: string;\n}\n\nexport interface TronConfigChangeThresholdOrder {\n type: ETronOrderType.changeThreshold;\n newThreshold: number;\n}\n\nexport interface TronConfigChangeOwnersOrder {\n type: ETronOrderType.updateOwners;\n owners: string[];\n}\n\nexport interface TronConfigChangeOwnerThresholdOrder {\n type: ETronOrderType.updateOwnerThreshold;\n newThreshold: number;\n owners: string[];\n}\n\nexport type TTronCommandInstruction =\n | TronNativeOrder\n | TronTrcOrder\n | TronConfigChangeOwnersOrder\n | TronConfigChangeThresholdOrder\n | TronConfigChangeOwnerThresholdOrder;\n\n// ============================================================================\n// BTC INSTRUCTIONS\n// ============================================================================\n\nexport interface BtcNativeInstruction {\n type: \"native\";\n to: string;\n amount: string | number;\n}\n\n// ============================================================================\n// EVM METHODS\n// ============================================================================\n\nexport interface OrderParamsMethodsEvmDto {\n method: string;\n args: any[] | string;\n}\n\n// ============================================================================\n// ORDER PARAMS (Chain Specific)\n// ============================================================================\n\nexport interface OrderParamsSol {\n chainType: EChainType.SOL;\n proposalHash: string;\n transactionIndex: string;\n instructions: TSolanaCommandInstruction[];\n token?: TokenMultisignBalance | null;\n expireTime?: Date;\n}\n\nexport interface OrderParamsEvm {\n chainType: EChainType.EVM;\n operation: \"0\" | \"1\" | string;\n safeTxGas: string;\n baseGas: string;\n gasPrice: string;\n gasToken: string;\n refundReceiver: string;\n methods: OrderParamsMethodsEvmDto[];\n token?: TokenMultisignBalance | null;\n expireTime?: Date;\n value?: string;\n data?: string;\n}\n\nexport interface OrderParamsBtc {\n chainType: EChainType.BTC | EChainType.BTC_T3;\n instructions: BtcNativeInstruction;\n feeSats: string;\n utxo: Array<{ value: number; txid: string; vout: number }>;\n token?: TokenMultisignBalance | null;\n expireTime?: Date;\n}\n\nexport interface OrderParamsTron {\n chainType: EChainType.TRON;\n instructions: TTronCommandInstruction[];\n transaction?: {\n txID: string;\n raw_data: any;\n raw_data_hex: string;\n visible?: boolean;\n signature?: string[];\n };\n token?: TokenMultisignBalance | null;\n expireTime?: Date | string;\n}\n\n/**\n * Legacy support for loose typing (optional, but good for migration)\n * We recommend using Discriminated Union `OrderParams` instead.\n */\n\nexport interface OrderSigner {\n address: string;\n signature?: string;\n signedAt?: string;\n}\n\nexport interface OrderInstruction {\n to?: string;\n toPubkey?: string;\n amount?: string;\n tokenAddress?: string;\n decimals?: number;\n type?: string;\n newOwner?: string;\n owners?: string[];\n removeOwner?: string;\n ownerToRemove?: string;\n newThreshold?: number;\n data?: string;\n value?: string;\n}\n\nexport interface OrderInstructions {\n type?: ESolanaInstructionType | ETronOrderType | EvmMethodType;\n toPubkey?: string;\n amount?: string;\n newThreshold?: number;\n newOwner?: string;\n removeOwner?: string;\n tokenAddress?: string;\n to?: string;\n value?: string;\n data?: string;\n owners?: string[];\n}\n\nexport type OrderParams = OrderParamsSol | OrderParamsEvm | OrderParamsBtc | OrderParamsTron;\n\nexport interface Signature {\n id: string;\n orderId: string;\n multisigOwnerId: string;\n signedHash: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Signatures {\n walletAddress: string;\n signedHash: string;\n status: string;\n}\n\nexport enum EOrderStatus {\n proposed = \"proposed\",\n created = \"created\",\n pending = \"pending\",\n ready = \"ready\",\n rejected = \"rejected\",\n execution = \"execution\",\n expired = \"expired\",\n completed = \"completed\",\n}\n\n/**\n * Order object\n */\nexport interface Order {\n id: string;\n type?: string;\n multisigId: string;\n to: string;\n data: string;\n value: string;\n method: string;\n operation: number;\n hashToSing: string;\n txHash: string | null;\n updatedAt: string;\n createdAt: string;\n nonce: number;\n walletInitiator: string;\n signature: Signature;\n status: EOrderStatus;\n multisig: MultisigsItem;\n signatures: Signatures[];\n params?: OrderParams;\n isSmallestNonce?: boolean;\n}\n\nexport type SolOrderParams = {\n vaultAddress: string;\n multisigPda: string;\n};\n\nexport type SolOrder = {\n order: Order;\n params: SolOrderParams;\n};\n\n/**\n * Paginated orders response\n */\nexport interface PaginatedOrdersResponse {\n orders: Order[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name?: string;\n decimals: number;\n logoUrl?: string;\n priceUsd?: string;\n balance?: string;\n}\n\n/**\n * Supported token from backend\n */\nexport interface SupportedToken {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n chainType: EChainType;\n chainId: ChainIdValue;\n logoUrl?: string;\n}\n\n/**\n * Token balance for multisig\n */\nexport interface TokenMultisignBalance {\n name: string;\n symbol: string;\n balanceWei: string;\n balance: string;\n decimals: number;\n address: string;\n logoURL: string;\n nativeTokenSymbol: string;\n nativeTokenName: string;\n\n amountNum?: number;\n priceUsd?: number;\n priceUSD?: number;\n priceChange24h?: number;\n price24hChange?: number;\n valueUsd?: number;\n balanceUSD?: number;\n}\n\n/**\n * Wallet portfolio response\n */\nexport interface TokensBalance {\n name: string;\n symbol: string;\n balanceWei: string;\n balance: string;\n priceUSD: number;\n price24hChange: number;\n balanceUSD: number;\n decimals: number;\n address: string;\n logoURL: string;\n}\n\nexport interface WalletPortfolioResponse {\n walletAddress: string;\n chainType: EChainType;\n chain: ChainIdValue;\n tokens: TokensBalance[];\n}\n\n\n/**\n * Portfolio request payload\n */\nexport interface PortfolioRequest {\n walletAddress: string;\n chainType: EChainType;\n chain: string;\n}\n\n/**\n * Wallet address with chain type for batch requests\n */\nexport interface WalletAddressAndChainType {\n walletAddress: string;\n chainType: EChainType;\n}\n\n/**\n * Total asset value response\n */\nexport interface TotalAssetValueResponse {\n totalAssetValueUSD: string;\n}\n\n/**\n * Supported tokens response\n */\nexport interface SupportedTokensResponse {\n tokens: SupportedToken[];\n total: number;\n}\n\nexport type FeeEstimationTxType =\n | \"send\"\n | \"sendToken\"\n | \"activate\"\n | \"createOrder\"\n | \"signOrder\"\n | \"executeOrder\";\n\n/**\n * Estimated fee response\n */\nexport interface EstimatedFee {\n estimatedFee: string;\n gasLimit?: string;\n gasPrice?: string;\n\n nativeFeeLamports?: number;\n\n gasFeeRaw?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n energyFee?: string;\n bandwidthFee?: string;\n priorityFee?: string;\n feeRate?: number;\n feeInUsd?: string;\n totalFee?: string;\n currency?: string;\n}\n\nexport interface TransactionParams {\n chain: EChainType;\n from: string;\n to: string;\n value?: string;\n tokenAddress?: string;\n decimals?: number;\n chainId?: number;\n nonce?: number;\n gasLimit?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n utxos?: BtcUtxo[];\n isNativeToken?: boolean;\n feeRate?: number;\n data?: string;\n feeHint?: EstimatedFee\n}\n\nexport interface SignedTransaction {\n rawTransaction: string;\n hash?: string;\n chain: ChainType;\n}\n\n/**\n * Transaction broadcast result\n */\nexport interface BroadcastResult {\n /** Transaction hash */\n txHash: string;\n /** Chain type */\n chain: ChainType;\n explorerUrl?: string;\n}\n\n/**\n * Transaction parameters for building transactions\n */\nexport interface TxParams {\n from: string;\n to: string;\n amount: string;\n tokenAddress?: string;\n decimals?: number;\n chainId?: ChainIdValue;\n gasLimit?: string;\n gasPrice?: string;\n nonce?: number;\n utxos?: BtcUtxo[];\n feeHint?: EstimatedFee;\n}\n\n/**\n * BTC UTXO structure\n * Supports different script types: P2PKH (legacy), P2SH (nested), P2WPKH (native segwit), P2TR (taproot)\n */\nexport interface BtcUtxo {\n txid: string;\n vout: number;\n value: number;\n script?: string;\n scriptType?: \"p2pkh\" | \"p2sh\" | \"p2wpkh\" | \"p2wsh\" | \"p2tr\";\n nonWitnessUtxo?: string;\n}\n\n/**\n * Transaction result\n */\nexport interface TransactionResult {\n txHash: string;\n}\n\n/**\n * Signed transaction result (before broadcast)\n */\nexport interface SignedTransactionResult {\n /** Serialized signed transaction */\n signedTx: string;\n}\n\n// ============================================================================\n// HISTORY TYPES\n// ============================================================================\n\n/**\n * Transaction history item\n */\ninterface TokenData {\n symbol: string;\n value: string;\n logoURL: string;\n}\n\ninterface TransactionDetails {\n to: string;\n value: string;\n data: string;\n operation: number;\n safeTxGas: string;\n baseGas: number;\n gasPrice: number;\n gasToken: number;\n refundReceiver: string;\n nonce: number;\n}\n\nexport interface TransactionHistoryItem {\n chainType: EChainType;\n chainId: ChainIdValue;\n threshold: string;\n executed: string;\n status: \"success\" | \"failed\" | \"pending\";\n method: string;\n from: string;\n to: string;\n value: string;\n creator: string;\n confirmations: string[];\n token: TokenData;\n details: TransactionDetails;\n hash: string;\n time: string;\n}\n\nexport interface HistoryResponse {\n total: number;\n page: number;\n limit: number;\n items: TransactionHistoryItem[];\n}\n\n/**\n * Status filter for history queries\n */\nexport enum StatusFilterEnum {\n ALL = \"all\",\n PENDING = \"pending\",\n EXECUTED = \"executed\",\n REJECTED = \"rejected\",\n}\n\nexport interface TxHistoryToken {\n symbol: string;\n logoURL: string;\n value: string;\n\n name?: string;\n priceUSD?: number;\n price24hChange?: number;\n}\n\nexport interface TxHistoryMethod {\n args: (string | number)[];\n method: string;\n}\n\nexport interface Instruction {\n type: \"native\" | \"spl\" | \"trc20\" | string;\n amount: string;\n toPubkey?: string;\n to?: string;\n tokenAddress?: string;\n}\n\nexport interface TxHistoryDetails {\n to: string;\n value: string;\n data: string;\n operation: number;\n safeTxGas: string;\n baseGas: number;\n gasPrice: number;\n gasToken: number;\n refundReceiver: string;\n nonce: number;\n\n instructions?: Instruction | Instruction[];\n token: TxHistoryToken;\n methods: TxHistoryMethod[];\n chainType: string;\n}\n\nexport interface TxHistoryItem {\n id: string;\n status: string;\n method: string;\n chainId: string;\n chainType: string;\n threshold: string;\n from: string;\n to: string;\n value: string;\n token: TxHistoryToken;\n details?: TxHistoryDetails;\n hash: string;\n time: string;\n executed: string;\n creator: string;\n confirmations: string[];\n}\n\n/**\n * Combined transaction history for multisigs\n */\nexport interface TxHistoryCombinedResponse {\n items: TxHistoryItem[];\n limit: number;\n total: number;\n page: number;\n}\n\n// ============================================================================\n// SDK INPUT TYPES - WALLET MODULE\n// ============================================================================\n\n/**\n * Input for createWallet\n */\nexport interface CreateWalletInput {\n chain: ChainType;\n}\n\n/**\n * Input for importWallet\n */\nexport interface ImportWalletInput {\n chain: ChainType;\n privateKey: string;\n}\n\n/**\n * Input for deleteWallet\n */\nexport interface DeleteWalletInput {\n chain: ChainType;\n address: string;\n}\n\n/**\n * Input for getWallet\n */\nexport interface GetWalletInput {\n chain: ChainType;\n address: string;\n}\n\n/**\n * Input for getWallets\n */\nexport interface GetWalletsInput {\n chain?: ChainType;\n page?: number;\n limit?: number;\n}\n\n/**\n * Input for getPortfolio\n */\nexport interface GetPortfolioInput {\n chain: ChainType;\n address: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Input for sendTransaction (native currency)\n */\nexport interface SendTransactionInput {\n chain: ChainType;\n from: string;\n to: string;\n amount: string;\n\n chainId?: ChainIdValue;\n feeHint?: EstimatedFee;\n}\n\n/**\n * Input for sendToken\n */\nexport interface SendTokenInput {\n chain: ChainType;\n from: string;\n to: string;\n amount: string;\n tokenAddress: string;\n decimals: number;\n\n chainId?: ChainIdValue;\n feeHint?: EstimatedFee;\n}\n\n/**\n * Input for estimateFee\n */\nexport interface EstimateFeeInput {\n chain: ChainType;\n txType: import('../strategies/types').TransactionEstimatingTypeValue;\n payload: {\n from?: string;\n to?: string;\n amount?: string;\n tokenAddress?: string;\n decimals?: number;\n orderId?: string;\n multisigId?: string;\n owners?: string[];\n threshold?: number;\n order?: Order;\n multisig?: MultisigsItem;\n method?: any;\n };\n chainId?: ChainIdValue;\n}\n\n/**\n * Input for exportWallet\n */\nexport interface ExportWalletInput {\n chain: ChainType;\n address: string;\n\n format?: \"hex\" | \"wif\" | \"bs58\" | \"array\";\n}\n\n/**\n * Output for exportWallet\n */\nexport interface ExportWalletOutput {\n privateKey: string;\n}\n\n/**\n * Input for updateWalletName\n */\nexport interface UpdateWalletNameInput {\n chain: ChainType;\n address: string;\n name: string;\n}\n\n// ============================================================================\n// SDK INPUT TYPES - MULTISIG MODULE\n// ============================================================================\n\n/**\n * Input for createMultisig\n */\nexport interface CreateMultisigInput {\n chain: ChainType;\n owners: string[];\n threshold: number;\n chainIds?: ChainIdValue[];\n}\n\n/**\n * Input for getMultisigs\n */\nexport interface GetMultisigsInput {\n chain: ChainType;\n walletAddress?: string;\n}\n\n/**\n * Input for getMultisigById\n */\nexport interface GetMultisigByIdInput {\n chain: ChainType;\n address: string;\n}\n\n/**\n * Input for activateMultisig\n */\nexport interface ActivateMultisigInput {\n chain: ChainType;\n multisigId: string;\n multisigAddress: string;\n walletAddress: string;\n feeQuote: EstimatedFee;\n chainId?: ChainIdValue;\n /** Full multisig object for EVM activation */\n multisig: MultisigsItem;\n /** Gas limit override */\n gasLimit?: string;\n /** Gas price override */\n gasPrice?: string;\n}\n\n/**\n * Output for activateMultisig\n */\nexport interface ActivateMultisigOutput {\n txHash: string;\n}\n\n/**\n * Input for estimateActivationFee\n */\nexport interface EstimateActivationFeeInput {\n chain: ChainType;\n multisigId?: string;\n owners?: string[];\n threshold?: number;\n chainId?: ChainIdValue;\n}\n\n/**\n * Input for updateMultisigName\n */\nexport interface UpdateMultisigNameInput {\n chain: ChainType;\n multisigId: string;\n name: string;\n walletAddress: string;\n}\n\n/**\n * Input for deleteMultisig\n */\nexport interface DeleteMultisigInput {\n chain: ChainType;\n multisigId: string;\n}\n\n// ============================================================================\n// SDK INPUT TYPES - ORDER MODULE\n// ============================================================================\n\n/**\n * Input for createOrder\n */\nexport interface CreateOrderInput {\n chain: ChainType;\n multisigId: string;\n multisigAddress?: string;\n walletAddress: string;\n method: OrderMethodType;\n instructions: OrderInstruction[];\n\n // Optional fields for settings orders\n multisig?: MultisigsItem;\n threshold?: number;\n newOwners?: string[];\n ownersToRemove?: string[];\n owners?: string[];\n multisigThreshold?: number;\n newThreshold?: number;\n\n // Optional fields for send orders\n selectedToken?: TokenInfo;\n token?: TokenInfo;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for createOrder\n */\nexport interface CreateOrderOutput {\n order: Order;\n proposalHash?: string;\n}\n\n/**\n * Input for creating a send order (token transfer) - Simplified API\n * SDK handles method detection and instruction building automatically\n */\nexport interface CreateSendOrderInput {\n multisigId: string;\n walletAddress: string;\n to: string;\n amount: string;\n token?: TokenInfo; // If omitted, assumes native token\n chainId: string;\n}\n\n/**\n * Input for creating a settings order (multisig configuration change) - Simplified API\n * SDK calculates changes and determines method automatically\n */\nexport interface CreateSettingsOrderInput {\n multisigId: string;\n multisig: MultisigsItem; // Current multisig state\n walletAddress: string;\n newOwners: string[]; // Desired final owner list\n newThreshold?: number; // Desired final threshold (optional, keeps current if omitted)\n}\n\n/**\n * Input for signOrder\n */\nexport interface SignOrderInput {\n chain: ChainType;\n orderId: string;\n walletAddress: string;\n chainId?: ChainIdValue;\n multisigId?: string;\n version?: string;\n transaction?: string;\n}\n\n/**\n * Output for signOrder\n */\nexport interface SignOrderOutput {\n signature: string;\n order: Order;\n}\n\n/**\n * Input for rejectOrder\n */\nexport interface RejectOrderInput {\n chain: ChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for rejectOrder\n */\nexport interface RejectOrderOutput {\n order: Order;\n}\n\n/**\n * Input for executeOrder\n */\nexport interface ExecuteOrderInput {\n chain: ChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n feeQuote?: EstimatedFee;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for executeOrder\n */\nexport interface ExecuteOrderOutput {\n txHash: string;\n order: Order;\n}\n\n/**\n * Input for estimateOrderExecutionFee\n */\nexport interface EstimateOrderExecutionFeeInput {\n chain: ChainType;\n orderId: string;\n walletAddress: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Input for getOrders\n */\nexport interface GetOrdersInput {\n chain: ChainType;\n multisigId: string;\n page?: number;\n limit?: number;\n}\n\n/**\n * Input for getOrderById\n */\nexport interface GetOrderByIdInput {\n chain: ChainType;\n orderId: string;\n}\n\n/**\n * Input for deleteOrder\n */\nexport interface DeleteOrderInput {\n chain: ChainType;\n orderId: string;\n}\n\n// ============================================================================\n// SDK INPUT TYPES - PORTFOLIO MODULE\n// ============================================================================\n\n/**\n * Input for getSupportedTokens\n */\nexport interface GetSupportedTokensInput {\n chain: ChainType;\n chainId: ChainIdValue;\n page?: number;\n limit?: number;\n search?: string;\n}\n\n// ============================================================================\n// SDK INPUT TYPES - HISTORY MODULE\n// ============================================================================\n\n/**\n * Input for getWalletHistory\n */\nexport interface GetWalletHistoryInput {\n chain: ChainType;\n walletAddress: string;\n page?: number;\n limit?: number;\n}\n\n/**\n * Input for getMultisigTxHistory\n */\nexport interface GetMultisigTxHistoryInput {\n multisigId: string;\n page?: number;\n limit?: number;\n}\n\n// ============================================================================\n// ERROR TYPES\n// ============================================================================\n\n/**\n * SDK error codes\n */\nexport enum SDKErrorCode {\n UNKNOWN = \"UNKNOWN\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n API_ERROR = \"API_ERROR\",\n INVALID_INPUT = \"INVALID_INPUT\",\n CHAIN_NOT_SUPPORTED = \"CHAIN_NOT_SUPPORTED\",\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n KEY_MISMATCH = \"KEY_MISMATCH\",\n KEY_RECONSTRUCTION_FAILED = \"KEY_RECONSTRUCTION_FAILED\",\n SIGNATURE_FAILED = \"SIGNATURE_FAILED\",\n TRANSACTION_FAILED = \"TRANSACTION_FAILED\",\n BROADCAST_FAILED = \"BROADCAST_FAILED\",\n ORDER_NOT_FOUND = \"ORDER_NOT_FOUND\",\n MULTISIG_NOT_FOUND = \"MULTISIG_NOT_FOUND\",\n WALLET_NOT_FOUND = \"WALLET_NOT_FOUND\",\n THRESHOLD_NOT_MET = \"THRESHOLD_NOT_MET\",\n UNAUTHORIZED = \"UNAUTHORIZED\",\n RATE_LIMITED = \"RATE_LIMITED\",\n TIMEOUT = \"TIMEOUT\",\n}\n\n/**\n * SDK error interface\n */\nexport interface SDKError {\n code: SDKErrorCode;\n message: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n}\n\n\nexport enum ExecutionAction {\n SIGN_NATIVE_TX = \"SIGN_NATIVE_TX\",\n SIGN_TOKEN_TX = \"SIGN_TOKEN_TX\",\n SIGN_ORDER = \"SIGN_ORDER\",\n CREATE_ORDER = \"CREATE_ORDER\",\n EXECUTE_ORDER = \"EXECUTE_ORDER\",\n REJECT_ORDER = \"REJECT_ORDER\",\n ACTIVATE_MULTISIG = \"ACTIVATE_MULTISIG\",\n EXPORT_KEY = \"EXPORT_KEY\",\n}\n\n/**\n * Key reconstruction result\n */\nexport interface KeyReconstructionResult {\n privateKey: Uint8Array;\n}\n\n/**\n * Share update result\n */\nexport interface ShareUpdateResult {\n serverShare: string;\n recoveryShare: string;\n}\n\n// ============================================================================\n// SDK CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Network mode\n */\nexport type NetworkMode = \"mainnet\" | \"testnet\";\n\n/**\n * RPC overrides per chain\n */\nexport type RpcOverrides = Partial<Record<ChainIdValue, string>>;\n\n/**\n * SDK configuration options\n */\nexport interface SDKConfig {\n /** API key for authentication (use this OR accessToken) */\n apiKey?: string;\n /** Access token for authentication (use this OR apiKey) */\n accessToken?: string;\n network?: NetworkMode;\n apiBaseUrl?: string;\n rpcOverrides?: RpcOverrides;\n timeout?: number;\n}\n\n// ============================================================================\n// EVENT TYPES\n// ============================================================================\n\n/**\n * Transaction sent event payload\n */\nexport interface TransactionSentEvent {\n chain: ChainType;\n txHash: string;\n from: string;\n to: string;\n amount: string;\n}\n\n/**\n * Transaction failed event payload\n */\nexport interface TransactionFailedEvent {\n chain: ChainType;\n error: SDKError;\n from: string;\n to: string;\n}\n\n/**\n * Order created event payload\n */\nexport interface OrderCreatedEvent {\n chain: ChainType;\n orderId: string;\n multisigId: string;\n}\n\n/**\n * Order signed event payload\n */\nexport interface OrderSignedEvent {\n chain: ChainType;\n orderId: string;\n signature: string;\n}\n\n/**\n * Order executed event payload\n */\nexport interface OrderExecutedEvent {\n chain: ChainType;\n orderId: string;\n txHash: string;\n}\n\n/**\n * Order rejected event payload\n */\nexport interface OrderRejectedEvent {\n chain: ChainType;\n orderId: string;\n}\n\n/**\n * Multisig activated event payload\n */\nexport interface MultisigActivatedEvent {\n chain: ChainType;\n multisigId: string;\n txHash: string;\n}\n\n/**\n * Key mismatch retry event payload\n */\nexport interface KeyMismatchRetryEvent {\n chain: ChainType;\n address: string;\n attempt: number;\n}\n\n/**\n * Error event payload\n */\nexport interface ErrorEvent {\n code: SDKErrorCode;\n message: string;\n chain?: ChainType;\n operation?: string;\n}\n\n/**\n * SDK event map for type-safe event handling\n */\nexport interface SDKEventMap {\n transactionSent: TransactionSentEvent;\n transactionFailed: TransactionFailedEvent;\n orderCreated: OrderCreatedEvent;\n orderSigned: OrderSignedEvent;\n orderExecuted: OrderExecutedEvent;\n orderRejected: OrderRejectedEvent;\n multisigActivated: MultisigActivatedEvent;\n keyMismatchRetry: KeyMismatchRetryEvent;\n error: ErrorEvent;\n}\n\n/**\n * SDK event names\n */\nexport type SDKEventName = keyof SDKEventMap;\n\n// ============================================================================\n// API RESPONSE TYPES\n// ============================================================================\n\n/**\n * Generic API response wrapper\n */\nexport interface ApiResponse<T> {\n data: T;\n status: number;\n message?: string;\n}\n\n/**\n * API error response\n */\nexport interface ApiErrorResponse {\n status: number;\n message: string;\n errors?: string[];\n}\n\n/**\n * Wallet rename response\n */\nexport interface WalletRenameResponse {\n wallet: TWallet;\n}\n\n/**\n * Delete operation response\n */\nexport interface DeleteResponse {\n success: boolean;\n}\n\n// ============================================================================\n// SDK API INTERFACES - Unified method signatures for public API\n// ============================================================================\n\n/**\n * Wallet API interface - Unified methods for wallet operations\n */\nexport interface IWalletApi {\n createWallet(\n params: CreateWalletInput\n ): Promise<{ wallet: TWallet }>;\n importWallet(\n params: ImportWalletInput\n ): Promise<{ wallet: TWallet }>;\n getWallet(params: GetWalletInput): Promise<SingleWalletDetailsResponse>;\n getWallets(params?: GetWalletsInput): Promise<PaginatedWalletsResponse>;\n getPaginatedWallets(\n params?: GetWalletsInput\n ): Promise<PaginatedWalletsResponse>;\n deleteWallet(params: DeleteWalletInput): Promise<DeleteResponse>;\n updateWalletName(\n params: UpdateWalletNameInput\n ): Promise<WalletRenameResponse>;\n fetchServerShare(params: {\n chain: ChainType;\n address: string;\n }): Promise<string>;\n fetchRecoveryShare(params: {\n chain: ChainType;\n address: string;\n }): Promise<string>;\n fetchShares(params: {\n chain: ChainType;\n address: string;\n }): Promise<{ server: string; recovery: string }>;\n fetchPublicKey(): Promise<string>;\n updateShares(params: {\n address: string;\n serverShare: string;\n encryptedRecoveryShare: string;\n }): Promise<void>;\n getPortfolio(params: GetPortfolioInput): Promise<WalletPortfolioResponse>;\n getSupportedTokens(\n params: GetSupportedTokensInput\n ): Promise<SupportedTokensResponse>;\n getTotalAssetValue(): Promise<TotalAssetValueResponse>;\n getHistory(params: GetWalletHistoryInput): Promise<HistoryResponse>;\n signTransaction(\n params: SendTransactionInput | SendTokenInput\n ): Promise<TransactionResult>;\n}\n\n/**\n * Multisig API interface - Unified methods for multisig operations\n */\nexport interface IMultisigApi {\n createMultisig(\n params: CreateMultisigInput\n ): Promise<MultisigsItem | MultisigsItem[]>;\n getMultisig(params: GetMultisigByIdInput): Promise<MultisigBaseDTO>;\n getMultisigs(params: GetMultisigsInput): Promise<MultisigBaseDTO[]>;\n updateMultisig(params: UpdateMultisigNameInput): Promise<MultisigBaseDTO>;\n deleteMultisig(params: DeleteMultisigInput): Promise<DeleteResponse>;\n activateMultisig(\n params: ActivateMultisigInput\n ): Promise<ActivateMultisigOutput>;\n getMultisigHistory(\n params: GetMultisigTxHistoryInput\n ): Promise<TxHistoryCombinedResponse>;\n fetchMultisigServerShare(params: {\n multisigId: string;\n walletAddress: string;\n }): Promise<string>;\n}\n\n/**\n * Order API interface - Unified methods for order operations\n */\nexport interface IOrderApi {\n createOrder(params: CreateOrderInput): Promise<CreateOrderOutput>;\n getOrder(params: GetOrderByIdInput): Promise<{ order: Order }>;\n getOrders(params: GetOrdersInput): Promise<PaginatedOrdersResponse>;\n getPaginatedOrders(params: GetOrdersInput): Promise<PaginatedOrdersResponse>;\n signOrder(params: SignOrderInput): Promise<SignOrderOutput>;\n executeOrder(params: ExecuteOrderInput): Promise<ExecuteOrderOutput>;\n rejectOrder(params: RejectOrderInput): Promise<RejectOrderOutput>;\n cancelOrder(params: DeleteOrderInput): Promise<DeleteResponse>;\n}\n"],"mappings":";AAKO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,YAAS;AALC,SAAAA;AAAA,GAAA;AAQZ,IAAI,qBAAkC;AAC/B,SAAS,sBAAsB,SAA4B;AAChE,uBAAqB;AACvB;AAYO,SAAS,kBAAsD;AACpE,SAAO,uBAAuB,YAAY,kBAAiB;AAC7D;AAsEO,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,cAAW;AAHD,SAAAA;AAAA,GAAA;AA2DL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,eAAY;AACZ,EAAAA,aAAA,YAAS;AANC,SAAAA;AAAA,GAAA;AAkmBL,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,SAAM;AACN,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,cAAW;AAJD,SAAAA;AAAA,GAAA;","names":["EChainType","MultisigStatus","OrderStatus","StatusFilterEnum"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
encryptRsaOaep
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XDHJIP6P.js";
|
|
4
4
|
|
|
5
5
|
// src/crypto/shares.ts
|
|
6
6
|
import { combine, split } from "shamir-secret-sharing";
|
|
@@ -33,7 +33,6 @@ async function splitPrivateKey(privateKeyBytes) {
|
|
|
33
33
|
const shares = await split(privateKeyBytes, SHAMIR_SHARES_NUM, SHAMIR_THRESHOLD);
|
|
34
34
|
const { ethers } = await import("ethers");
|
|
35
35
|
return {
|
|
36
|
-
deviceShare: ethers.hexlify(shares[0]),
|
|
37
36
|
serverShare: ethers.hexlify(shares[1]),
|
|
38
37
|
recoveryShare: ethers.hexlify(shares[2])
|
|
39
38
|
};
|
|
@@ -74,35 +73,26 @@ async function updateShares(apiClient, walletAddress, serverShare, recoveryShare
|
|
|
74
73
|
encryptedRecoveryShare
|
|
75
74
|
});
|
|
76
75
|
return {
|
|
77
|
-
recovery:
|
|
78
|
-
server: shares.serverShare
|
|
79
|
-
device: shares.deviceShare
|
|
76
|
+
recovery: shares.recoveryShare,
|
|
77
|
+
server: shares.serverShare
|
|
80
78
|
};
|
|
81
79
|
}
|
|
82
|
-
async function getReconstructionShares(apiClient,
|
|
80
|
+
async function getReconstructionShares(apiClient, walletAddress, chainType) {
|
|
83
81
|
let mainShare;
|
|
84
82
|
let additionalShare;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
mainShare = updated.device;
|
|
95
|
-
additionalShare = updated.server;
|
|
96
|
-
newDeviceShare = updated.device;
|
|
97
|
-
} else {
|
|
98
|
-
const serverShare = await fetchServerShare(apiClient, walletAddress, chainType);
|
|
99
|
-
mainShare = deviceShare;
|
|
100
|
-
additionalShare = serverShare;
|
|
101
|
-
}
|
|
83
|
+
const shares = await fetchShares(apiClient, walletAddress, chainType);
|
|
84
|
+
const updated = await updateShares(
|
|
85
|
+
apiClient,
|
|
86
|
+
walletAddress,
|
|
87
|
+
shares.server,
|
|
88
|
+
shares.recovery
|
|
89
|
+
);
|
|
90
|
+
mainShare = updated.recovery;
|
|
91
|
+
additionalShare = updated.server;
|
|
102
92
|
if (!mainShare || !additionalShare) {
|
|
103
93
|
throw new Error("Failed to retrieve key shares.");
|
|
104
94
|
}
|
|
105
|
-
return { mainShare, additionalShare
|
|
95
|
+
return { mainShare, additionalShare };
|
|
106
96
|
}
|
|
107
97
|
|
|
108
98
|
export {
|
|
@@ -119,4 +109,4 @@ export {
|
|
|
119
109
|
updateShares,
|
|
120
110
|
getReconstructionShares
|
|
121
111
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
112
|
+
//# sourceMappingURL=chunk-D3CARXPJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crypto/shares.ts"],"sourcesContent":["\n\nimport { combine, split } from 'shamir-secret-sharing';\nimport { encryptRsaOaep } from './util';\nimport type { ApiClient } from '../api/client';\n\nexport const SHAMIR_THRESHOLD = 2;\nexport const SHAMIR_SHARES_NUM = 3;\n\nexport interface SplitPrivateKey {\n\n serverShare: string;\n recoveryShare: string;\n}\n\nexport interface ReconstructionShares {\n mainShare: string;\n additionalShare: string;\n}\n\nexport interface TxResponse {\n tx: string;\n\n}\n\n/**\n * Convert hex string to Uint8Array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return '0x' + Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Normalize hex strings to the same length by LEFT-padding with zeros\n * This preserves the numeric value while ensuring consistent byte length\n * Required because shamir-secret-sharing needs all shares to have the same byte length\n */\nfunction normalizeHexStrings(hexStrings: string[]): string[] {\n if (hexStrings.length === 0) return hexStrings;\n\n // Clean all hex strings (remove 0x prefix if present)\n const cleanHexStrings = hexStrings.map(hex => hex.startsWith('0x') ? hex.slice(2) : hex);\n\n // Find the maximum length among all hex strings\n const maxLength = Math.max(...cleanHexStrings.map(s => s.length));\n\n // Left-pad shorter strings with zeros to match the maximum length\n // LEFT-padding preserves the numeric value (adds leading zeros)\n return cleanHexStrings.map(hex => hex.padStart(maxLength, '0'));\n}\n\n/**\n * Combine Shamir shares to reconstruct the private key bytes\n * Handles shares of different lengths by left-padding hex strings before conversion\n */\nexport async function combineShares(shares: string[]): Promise<Uint8Array> {\n // Normalize hex strings by left-padding to ensure consistent byte length\n const normalizedHexStrings = normalizeHexStrings(shares);\n\n // Convert normalized hex strings to byte arrays\n const shareBuffers = normalizedHexStrings.map((hex) => hexToBytes('0x' + hex));\n\n const reconstructed = await combine(shareBuffers);\n return new Uint8Array(reconstructed);\n}\n\n/**\n * Split private key into Shamir shares\n */\nexport async function splitPrivateKey(\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> {\n const shares = await split(privateKeyBytes, SHAMIR_SHARES_NUM, SHAMIR_THRESHOLD);\n const { ethers } = await import('ethers');\n return {\n\n serverShare: ethers.hexlify(shares[1]),\n recoveryShare: ethers.hexlify(shares[2]),\n };\n}\n\n/**\n * Create new shares from private key bytes\n */\nexport async function createShares(\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> {\n if (!privateKeyBytes || privateKeyBytes.length === 0) {\n throw new Error('Cannot create shares from empty private key');\n }\n return splitPrivateKey(privateKeyBytes);\n}\n\n/**\n * Fetch server share from API\n */\nexport async function fetchServerShare(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string\n): Promise<string> {\n const response = await apiClient.get<{ share: string }>(\n `/sdk/wallets/share/c/${chainType}/${walletAddress}`\n );\n return response.share;\n}\n\n/**\n * Fetch recovery share from API\n */\nexport async function fetchRecoveryShare(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string\n): Promise<string> {\n const response = await apiClient.get<{ share: string }>(\n `/sdk/wallets/share/s/${chainType}/${walletAddress}`\n );\n return response.share;\n}\n\n/**\n * Fetch both server and recovery shares\n */\nexport async function fetchShares(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string\n): Promise<{ recovery: string; server: string }> {\n const [recovery, server] = await Promise.all([\n fetchRecoveryShare(apiClient, walletAddress, chainType),\n fetchServerShare(apiClient, walletAddress, chainType),\n ]);\n return { recovery, server };\n}\n\n/**\n * Update shares on the server (after share rotation)\n */\nexport async function updateShares(\n apiClient: ApiClient,\n walletAddress: string,\n serverShare: string,\n recoveryShare: string\n): Promise<{ server: string; recovery: string }> {\n const reconstructed = await combineShares([recoveryShare, serverShare]);\n const shares = await createShares(reconstructed);\n\n const pubkeyResponse = await apiClient.get<{ pubkey: string }>('/sdk/wallets/pubkey');\n const encryptedRecoveryShare = await encryptRsaOaep(pubkeyResponse.pubkey, shares.recoveryShare);\n\n await apiClient.post('/sdk/wallets/update', {\n walletAddress,\n serverShare: shares.serverShare,\n encryptedRecoveryShare,\n });\n\n return {\n recovery: shares.recoveryShare,\n server: shares.serverShare,\n };\n}\n\n/**\n * Get reconstruction shares for key operations\n * Handles both normal case (device share available) and recovery case (force update)\n */\nexport async function getReconstructionShares(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string,\n): Promise<ReconstructionShares> {\n let mainShare: string;\n let additionalShare: string;\n\n const shares = await fetchShares(apiClient, walletAddress, chainType);\n const updated = await updateShares(\n apiClient,\n walletAddress,\n shares.server,\n shares.recovery\n );\n mainShare = updated.recovery;\n additionalShare = updated.server;\n\n if (!mainShare || !additionalShare) {\n throw new Error('Failed to retrieve key shares.');\n }\n\n return { mainShare, additionalShare };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
KeyReconstructor
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WWICEUCG.js";
|
|
4
4
|
import {
|
|
5
5
|
TransactionEstimatingType,
|
|
6
6
|
TransactionExecutionType
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HI2MHFRJ.js";
|
|
8
8
|
|
|
9
9
|
// src/strategies/evm.strategy.ts
|
|
10
10
|
import { ethers, formatUnits, Interface } from "ethers";
|
|
@@ -111,8 +111,7 @@ var EvmStrategy = class {
|
|
|
111
111
|
* Sign EVM order (Gnosis Safe signature)
|
|
112
112
|
*/
|
|
113
113
|
async signOrder(params) {
|
|
114
|
-
const { wallet,
|
|
115
|
-
const currentDeviceShare = deviceShare || "-";
|
|
114
|
+
const { wallet, order } = params;
|
|
116
115
|
if (!wallet) {
|
|
117
116
|
throw new Error("Wallet address missing");
|
|
118
117
|
}
|
|
@@ -121,13 +120,11 @@ var EvmStrategy = class {
|
|
|
121
120
|
throw new Error("Order hash not found");
|
|
122
121
|
}
|
|
123
122
|
let signer;
|
|
124
|
-
let updatedDeviceShare = null;
|
|
125
123
|
try {
|
|
126
124
|
const result = await this.keyReconstructor.reconstructWithRetry(
|
|
127
|
-
(
|
|
125
|
+
() => this.keyReconstructor.reconstructEvmKey(wallet.address)
|
|
128
126
|
);
|
|
129
127
|
signer = result.signer;
|
|
130
|
-
updatedDeviceShare = result.newDeviceShare;
|
|
131
128
|
} catch (error) {
|
|
132
129
|
throw new Error(error.message || "Order signing failed on EVM key reconstruction.");
|
|
133
130
|
}
|
|
@@ -140,8 +137,7 @@ var EvmStrategy = class {
|
|
|
140
137
|
signer.address
|
|
141
138
|
);
|
|
142
139
|
return {
|
|
143
|
-
tx: signedHash
|
|
144
|
-
updatedDeviceShare
|
|
140
|
+
tx: signedHash
|
|
145
141
|
};
|
|
146
142
|
} catch (error) {
|
|
147
143
|
console.error("Error signing EVM order:", error);
|
|
@@ -195,19 +191,18 @@ var EvmStrategy = class {
|
|
|
195
191
|
/**
|
|
196
192
|
* Sign EVM transaction (for native/ERC20 sends)
|
|
197
193
|
*/
|
|
198
|
-
async signEvmTransaction(
|
|
194
|
+
async signEvmTransaction(address, transaction, expectedChainId) {
|
|
199
195
|
const result = await this.keyReconstructor.reconstructWithRetry(
|
|
200
|
-
(
|
|
196
|
+
() => this.keyReconstructor.reconstructEvmKey(address)
|
|
201
197
|
);
|
|
202
|
-
const { signer
|
|
198
|
+
const { signer } = result;
|
|
203
199
|
const unsignedTx = ethers.Transaction.from(transaction);
|
|
204
200
|
if (unsignedTx.chainId !== BigInt(expectedChainId)) {
|
|
205
201
|
throw new Error("Transaction chain ID does not match the expected network.");
|
|
206
202
|
}
|
|
207
203
|
const signedTx = await signer.signTransaction(unsignedTx);
|
|
208
204
|
return {
|
|
209
|
-
tx: signedTx
|
|
210
|
-
updatedDeviceShare: newDeviceShare
|
|
205
|
+
tx: signedTx
|
|
211
206
|
};
|
|
212
207
|
}
|
|
213
208
|
async createOrder(params) {
|
|
@@ -249,10 +244,6 @@ var EvmStrategy = class {
|
|
|
249
244
|
throw new Error(`Transaction type ${input.type} not yet implemented`);
|
|
250
245
|
}
|
|
251
246
|
async executeNativeSend(data, wallet, chainId) {
|
|
252
|
-
const deviceShare = wallet.deviceShare;
|
|
253
|
-
if (!deviceShare) {
|
|
254
|
-
throw new Error("Device share missing");
|
|
255
|
-
}
|
|
256
247
|
const provider = this.getProvider(String(chainId));
|
|
257
248
|
const { to, amount, estimatedFee, tokenAddress, isNativeToken } = data;
|
|
258
249
|
const actualGasLimit = estimatedFee?.gasLimit ? Math.floor(Number(estimatedFee.gasLimit) * 0.9).toString() : FALLBACK_GAS_LIMIT;
|
|
@@ -265,7 +256,7 @@ var EvmStrategy = class {
|
|
|
265
256
|
data: "0x",
|
|
266
257
|
gasLimit: BigInt(actualGasLimit),
|
|
267
258
|
gasPrice: BigInt(actualGasPrice),
|
|
268
|
-
chainId
|
|
259
|
+
chainId
|
|
269
260
|
};
|
|
270
261
|
} else {
|
|
271
262
|
if (!tokenAddress) {
|
|
@@ -281,15 +272,14 @@ var EvmStrategy = class {
|
|
|
281
272
|
data: txData,
|
|
282
273
|
gasLimit: BigInt(actualGasLimit),
|
|
283
274
|
gasPrice: BigInt(actualGasPrice),
|
|
284
|
-
chainId
|
|
275
|
+
chainId
|
|
285
276
|
};
|
|
286
277
|
}
|
|
287
278
|
transaction.nonce = await this.getNonce(provider, wallet.address);
|
|
288
279
|
const { tx: signedTx } = await this.signEvmTransaction(
|
|
289
|
-
deviceShare,
|
|
290
280
|
wallet.address,
|
|
291
281
|
transaction,
|
|
292
|
-
|
|
282
|
+
chainId
|
|
293
283
|
);
|
|
294
284
|
return await this.broadcastTransaction(provider, signedTx);
|
|
295
285
|
}
|
|
@@ -544,4 +534,4 @@ var EvmStrategy = class {
|
|
|
544
534
|
export {
|
|
545
535
|
EvmStrategy
|
|
546
536
|
};
|
|
547
|
-
//# sourceMappingURL=chunk-
|
|
537
|
+
//# sourceMappingURL=chunk-DYYPGVXB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/strategies/evm.strategy.ts"],"sourcesContent":["\n\nimport { ethers, formatUnits, Interface } from 'ethers';\nimport type { ApiClient } from '../api/client';\nimport { KeyReconstructor } from '../services/key-reconstructor';\nimport {\n TransactionExecutionType,\n TransactionEstimatingType,\n} from './types';\nimport type {\n ChainStrategy,\n SignOrderParams,\n CreateOrderParams,\n RejectOrderParams,\n ExecuteTransactionParams,\n EstimateFeeParams,\n TxResponse,\n SendData,\n ExecOrderEstimateData,\n ActivateMultisigEstimateData,\n} from './types';\nimport type { ChainIdValue, EstimatedFee, Order } from '../core/types';\nimport type { ResolvedRpcConfig } from '../core/config';\n\nexport enum SigningMethod {\n ETH_SIGN = \"eth_sign\",\n ETH_SIGN_TYPED_DATA = \"eth_signTypedData\",\n ETH_SIGN_TYPED_DATA_V3 = \"eth_signTypedData_v3\",\n ETH_SIGN_TYPED_DATA_V4 = \"eth_signTypedData_v4\",\n SAFE_SIGNATURE = \"safe_sign\"\n}\n\nconst SENTINEL_OWNERS = '0x0000000000000000000000000000000000000001';\n\nexport const GNOSIS_ABI = [\n 'function getOwners() view returns (address[])',\n 'function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address payable refundReceiver, bytes signatures) payable returns (bool)',\n 'function addOwnerWithThreshold(address owner, uint256 _threshold)',\n 'function removeOwner(address prevOwner, address owner, uint256 _threshold)',\n 'function changeThreshold(uint256 _threshold)',\n 'function nonce() view returns (uint256)',\n 'function getThreshold() view returns (uint256)',\n];\n\nconst ERC20_TRANSFER_ABI = ['function transfer(address to, uint256 amount)'];\n\nconst FALLBACK_GAS_LIMIT = '50000';\nconst FALLBACK_ERC20_GAS_LIMIT = '100000';\nconst FALLBACK_GAS_PRICE = '20000000000';\n\nconst iface = new ethers.Interface(GNOSIS_ABI);\nconst erc20Interface = new Interface(ERC20_TRANSFER_ABI);\n\nexport class EvmStrategy implements ChainStrategy<ethers.JsonRpcProvider> {\n private apiClient: ApiClient;\n private keyReconstructor: KeyReconstructor;\n private rpcConfig: ResolvedRpcConfig;\n\n constructor(apiClient: ApiClient, rpcConfig: ResolvedRpcConfig) {\n this.apiClient = apiClient;\n this.rpcConfig = rpcConfig;\n this.keyReconstructor = new KeyReconstructor(apiClient);\n }\n\n getProvider(chainId?: string | number): ethers.JsonRpcProvider {\n if (!chainId) {\n throw new Error('ChainId required to get provider');\n }\n\n const chainIdNum = Number(chainId);\n const rpcUrl = this.rpcConfig.evm[chainIdNum];\n\n if (!rpcUrl) {\n throw new Error(`Unsupported EVM network ID: ${chainId}`);\n }\n\n return new ethers.JsonRpcProvider(rpcUrl);\n }\n\n async getFeeData(provider: ethers.JsonRpcProvider): Promise<ethers.FeeData> {\n return await provider.getFeeData();\n }\n\n async getBalance(address: string, provider: ethers.JsonRpcProvider): Promise<string> {\n const balance = await provider.getBalance(address);\n return ethers.formatEther(balance);\n }\n\n async getTransactionHash(unsignedTx: string): Promise<string> {\n return ethers.keccak256(unsignedTx);\n }\n\n async getSignedTransaction(serializedTx: string): Promise<ethers.Transaction> {\n return ethers.Transaction.from(serializedTx);\n }\n\n async getNonce(provider: ethers.JsonRpcProvider, address: string): Promise<number> {\n return await provider.getTransactionCount(address);\n }\n\n async simulateTransaction(provider: ethers.JsonRpcProvider, tx: unknown): Promise<unknown> {\n const txRequest = tx as ethers.TransactionRequest;\n return await provider.call({\n to: txRequest.to,\n from: txRequest.from,\n data: txRequest.data,\n value: txRequest.value,\n gasLimit: txRequest.gasLimit,\n gasPrice: txRequest.gasPrice,\n });\n }\n\n async broadcastTransaction(\n provider: ethers.JsonRpcProvider,\n signedTx: string\n ): Promise<ethers.TransactionResponse> {\n return await provider.broadcastTransaction(signedTx);\n }\n\n encodeExecTransaction(\n to: string,\n value: string,\n data: string,\n operation: number,\n signature: string\n ): string {\n return iface.encodeFunctionData('execTransaction', [\n to,\n value,\n data,\n operation,\n '0',\n '0',\n '0',\n ethers.ZeroAddress,\n ethers.ZeroAddress,\n signature,\n ]);\n }\n\n async getOwners(multisigAddress: string, provider: ethers.JsonRpcProvider): Promise<string[]> {\n const contract = new ethers.Contract(multisigAddress, GNOSIS_ABI, provider);\n return await contract.getOwners();\n }\n\n encodeRemoveOwner(owners: string[], ownerToRemove: string, newThreshold: number): string {\n const index = owners.findIndex(\n (owner) => owner.toLowerCase() === ownerToRemove.toLowerCase()\n );\n if (index === -1) throw new Error('Owner not found');\n if (owners.length === 1) throw new Error('Cannot remove the only owner');\n\n const prevOwner = index === 0 ? SENTINEL_OWNERS : owners[index - 1];\n return iface.encodeFunctionData('removeOwner', [prevOwner, ownerToRemove, newThreshold]);\n }\n\n encodeChangeThreshold(newThreshold: number): string {\n return iface.encodeFunctionData('changeThreshold', [newThreshold]);\n }\n\n encodeAddOwnerWithThreshold(newOwner: string, threshold: number): string {\n return iface.encodeFunctionData('addOwnerWithThreshold', [newOwner, threshold]);\n }\n\n /**\n * Sign EVM order (Gnosis Safe signature)\n */\n async signOrder(params: SignOrderParams): Promise<TxResponse> {\n const { wallet, order } = params;\n\n if (!wallet) {\n throw new Error('Wallet address missing');\n }\n const hashToSign = (order as any)?.hashToSing || (order?.params as any)?.safeTxHash;\n if (!hashToSign) {\n throw new Error('Order hash not found');\n }\n\n let signer: ethers.Wallet;\n\n try {\n const result = await this.keyReconstructor.reconstructWithRetry(\n () => this.keyReconstructor.reconstructEvmKey(wallet.address)\n );\n signer = result.signer;\n } catch (error: any) {\n throw new Error(error.message || \"Order signing failed on EVM key reconstruction.\");\n }\n\n try {\n const signedOrderHash = await signer.signMessage(ethers.getBytes(hashToSign));\n\n const signedHash = await this.gnosisAdjustVInSignature(\n SigningMethod.ETH_SIGN,\n signedOrderHash,\n hashToSign,\n signer.address\n );\n\n return {\n tx: signedHash,\n };\n } catch (error: any) {\n console.error(\"Error signing EVM order:\", error);\n throw new Error(error.message || \"Order signing failed on EVM.\");\n }\n }\n\n /**\n * Adjust V value in signature for Gnosis Safe\n */\n private async gnosisAdjustVInSignature(\n signingMethod: SigningMethod,\n signature: string,\n safeTxHash: string,\n signerAddress: string\n ): Promise<string> {\n const ETHEREUM_V_VALUES = [0, 1, 27, 28];\n const MIN_VALID_V_VALUE_FOR_SAFE_ECDSA = 27;\n\n let signatureV = parseInt(signature.slice(-2), 16);\n\n if (!ETHEREUM_V_VALUES.includes(signatureV)) {\n throw new Error(\"Invalid signature\");\n }\n\n if (signingMethod === SigningMethod.ETH_SIGN) {\n if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {\n signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;\n }\n\n let adjustedSignature = signature.slice(0, -2) + signatureV.toString(16);\n\n const signatureHasPrefix = await this.isTxHashSignedWithPrefix(\n safeTxHash,\n adjustedSignature,\n signerAddress\n );\n\n if (signatureHasPrefix) {\n signatureV += 4;\n }\n\n signature = signature.slice(0, -2) + signatureV.toString(16);\n }\n\n if (signingMethod === SigningMethod.ETH_SIGN_TYPED_DATA) {\n if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {\n signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;\n }\n signature = signature.slice(0, -2) + signatureV.toString(16);\n }\n\n return signature;\n }\n\n /**\n * Checks if a signature was produced by signing the hash with the Ethereum prefix\n */\n private async isTxHashSignedWithPrefix(\n hash: string,\n signature: string,\n signerAddress: string\n ): Promise<boolean> {\n try {\n const recoveredAddress = ethers.verifyMessage(ethers.getBytes(hash), signature);\n return recoveredAddress.toLowerCase() === signerAddress.toLowerCase();\n } catch (e) {\n return false;\n }\n }\n\n\n\n\n /**\n * Sign EVM transaction (for native/ERC20 sends)\n */\n async signEvmTransaction(\n address: string,\n transaction: ethers.TransactionRequest,\n expectedChainId: ChainIdValue\n ): Promise<TxResponse> {\n const result = await this.keyReconstructor.reconstructWithRetry(\n () => this.keyReconstructor.reconstructEvmKey(address)\n );\n\n const { signer } = result;\n const unsignedTx = ethers.Transaction.from(transaction as ethers.TransactionLike);\n\n if (unsignedTx.chainId !== BigInt(expectedChainId)) {\n throw new Error('Transaction chain ID does not match the expected network.');\n }\n\n const signedTx = await signer.signTransaction(unsignedTx);\n\n return {\n tx: signedTx,\n };\n }\n\n async createOrder(params: CreateOrderParams): Promise<{ order: Order; proposalHash: string }> {\n const { multisigId, wallet, method, instructions } = params;\n\n const response = await this.apiClient.post<{ order: Order & { hashToSing?: string } }>('/sdk/order/create/evm', {\n multisigId,\n walletAddress: wallet.address,\n method,\n instructions,\n });\n\n return {\n order: response.order,\n proposalHash: (response.order as any).hashToSing || '',\n };\n }\n\n async rejectOrder(params: RejectOrderParams): Promise<{ rejectionHash: string; order: unknown }> {\n const { orderId, multisigId, wallet } = params;\n\n if (!multisigId) {\n throw new Error('Vault id missing');\n }\n\n const response = await this.apiClient.post<{ order: unknown }>('/sdk/order/reject/evm', {\n orderId,\n multisigId,\n walletAddress: wallet.address,\n });\n\n return {\n rejectionHash: '',\n order: response.order,\n };\n }\n\n async executeTransaction(params: ExecuteTransactionParams): Promise<unknown> {\n const { input, actualWallet, chainId } = params;\n\n if (!actualWallet) {\n throw new Error('Wallet not connected');\n }\n\n if (input.type === TransactionExecutionType.Send) {\n return this.executeNativeSend(input.data as SendData, actualWallet, chainId);\n }\n\n throw new Error(`Transaction type ${input.type} not yet implemented`);\n }\n\n private async executeNativeSend(\n data: SendData,\n wallet: { address: string },\n chainId: ChainIdValue\n ): Promise<ethers.TransactionResponse> {\n const provider = this.getProvider(String(chainId));\n const { to, amount, estimatedFee, tokenAddress, isNativeToken } = data;\n\n const actualGasLimit = estimatedFee?.gasLimit\n ? Math.floor(Number(estimatedFee.gasLimit) * 0.9).toString()\n : FALLBACK_GAS_LIMIT;\n const actualGasPrice = estimatedFee?.gasPrice\n ? Math.floor(Number(estimatedFee.gasPrice) * 0.9).toString()\n : FALLBACK_GAS_PRICE;\n\n let transaction: ethers.TransactionRequest;\n\n if (isNativeToken) {\n transaction = {\n to,\n value: ethers.parseEther(String(amount)),\n data: '0x',\n gasLimit: BigInt(actualGasLimit),\n gasPrice: BigInt(actualGasPrice),\n chainId: chainId,\n };\n } else {\n if (!tokenAddress) {\n throw new Error('Token address is required for ERC20 transfers');\n }\n const tokenContract = new ethers.Contract(tokenAddress, ['function decimals() view returns (uint8)'], provider);\n const decimals = await tokenContract.decimals();\n const amountInWei = ethers.parseUnits(String(amount), decimals);\n const txData = erc20Interface.encodeFunctionData('transfer', [to, amountInWei]);\n\n transaction = {\n to: tokenAddress,\n value: 0n,\n data: txData,\n gasLimit: BigInt(actualGasLimit),\n gasPrice: BigInt(actualGasPrice),\n chainId: chainId,\n };\n }\n\n transaction.nonce = await this.getNonce(provider, wallet.address);\n\n const { tx: signedTx } = await this.signEvmTransaction(\n wallet.address,\n transaction,\n chainId\n );\n\n return await this.broadcastTransaction(provider, signedTx);\n }\n\n async estimateFee(params: EstimateFeeParams): Promise<EstimatedFee> {\n const { input, actualWallet, chainId } = params;\n\n switch (input.type) {\n case TransactionEstimatingType.Send:\n const { estimateEvmRegularFee } = await import(\n \"./evmServices/estimateEvmRegularFee\"\n );\n return estimateEvmRegularFee({\n input: { data: input.data as SendData },\n activeWallet: actualWallet,\n chainId,\n evmStrategy: this,\n });\n\n case TransactionEstimatingType.ExecOrder:\n return this.estimateExecOrderFee(input.data as ExecOrderEstimateData, actualWallet, chainId);\n\n case TransactionEstimatingType.ActivateMultisig:\n return this.estimateMultisigActivationFee(input.data as ActivateMultisigEstimateData, actualWallet, chainId);\n\n case TransactionEstimatingType.CreateOrder:\n case TransactionEstimatingType.SignOrder:\n case TransactionEstimatingType.ChangeMultisig:\n console.log(`Method ${input.type} does not require fee on EVM`);\n return {\n estimatedFee: '0',\n gasLimit: '0',\n gasPrice: '0',\n currency: 'ETH'\n };\n\n default:\n throw new Error(`Fee estimation not implemented for EVM type: ${(input as any).type}`);\n }\n }\n\n\n\n /**\n * Estimate fee for sending Native/ERC20 tokens\n */\n private async estimateEvmRegularFee(\n data: SendData,\n activeWallet: { address: string },\n chainId: string | number\n ): Promise<EstimatedFee> {\n try {\n const { to, amount, isNativeToken, tokenAddress, decimals } = data;\n const provider = this.getProvider(chainId);\n\n try {\n await provider.getNetwork();\n } catch (e: any) {\n throw new Error(\n `RPC Connection Error during setup: ${e.message || \"Node connection failed.\"}`\n );\n }\n\n let transaction: ethers.TransactionRequest;\n let fallbackGasLimit = FALLBACK_GAS_LIMIT;\n\n if (isNativeToken) {\n let estimationValue: bigint;\n try {\n const balance = await provider.getBalance(activeWallet.address);\n const requestedValue = ethers.parseEther(amount.toString());\n\n if (requestedValue > (balance * 99n) / 100n) {\n estimationValue =\n balance > ethers.parseEther(\"0.02\")\n ? ethers.parseEther(\"0.01\")\n : balance / 2n;\n } else {\n estimationValue = requestedValue;\n }\n } catch (balanceError) {\n console.warn(\n \"Failed to fetch balance, using requested amount:\",\n balanceError\n );\n estimationValue = ethers.parseEther(amount.toString());\n }\n\n transaction = {\n from: activeWallet.address,\n to: to,\n value: estimationValue,\n data: \"0x\",\n };\n fallbackGasLimit = FALLBACK_GAS_LIMIT;\n } else {\n if (!tokenAddress) {\n throw new Error(\"tokenAddress is required for ERC20 transfers.\");\n }\n if (decimals === undefined) {\n throw new Error(\"decimals are required for ERC20 transfers.\");\n }\n\n const amountInSmallestUnit = ethers.parseUnits(\n amount.toString(),\n decimals\n );\n\n const txData = erc20Interface.encodeFunctionData(\"transfer\", [\n to,\n amountInSmallestUnit,\n ]);\n\n transaction = {\n from: activeWallet.address,\n to: tokenAddress,\n value: \"0x0\",\n data: txData,\n };\n fallbackGasLimit = FALLBACK_ERC20_GAS_LIMIT;\n }\n\n let gasLimit: string;\n let gasPrice: string;\n\n try {\n const estimatedGas = await provider.estimateGas(transaction);\n const bufferedGas = (estimatedGas * 115n) / 100n;\n gasLimit = bufferedGas.toString();\n } catch (gasError: any) {\n const isTransactionSimulationError =\n typeof gasError === \"object\" &&\n gasError !== null &&\n \"code\" in gasError &&\n (gasError.code === \"UNPREDICTABLE_GAS_LIMIT\" ||\n gasError.code === \"INSUFFICIENT_FUNDS\");\n\n if (isTransactionSimulationError) {\n console.warn(\n `Gas estimation failed (${gasError.code}), using fallback limit.`\n );\n gasLimit = fallbackGasLimit;\n } else {\n console.error(\n \"CRITICAL network error during gas estimation, skipping further attempts:\",\n gasError\n );\n throw gasError;\n }\n }\n\n try {\n const feeData = await this.getFeeData(provider);\n const MIN_SAFE_GAS_PRICE = 2_000_000_000n;\n const baseGasPrice = feeData.gasPrice || BigInt(FALLBACK_GAS_PRICE);\n\n const safeBasePrice =\n baseGasPrice > MIN_SAFE_GAS_PRICE ? baseGasPrice : MIN_SAFE_GAS_PRICE;\n gasPrice = ((safeBasePrice * 105n) / 100n).toString();\n } catch (feeError) {\n console.error(\n \"Failed to fetch gas price, using fallback value:\",\n feeError\n );\n throw feeError;\n }\n\n const totalFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n const estimatedFeeEth = formatUnits(totalFeeWei, 18);\n\n return {\n gasLimit,\n gasPrice,\n estimatedFee: estimatedFeeEth,\n };\n } catch (error) {\n console.error(\n \"Complete fee estimation failed, returning fallback values:\",\n error\n );\n\n const fallbackGasLimit = data.isNativeToken\n ? FALLBACK_GAS_LIMIT\n : FALLBACK_ERC20_GAS_LIMIT;\n const fallbackTotalFeeWei =\n BigInt(fallbackGasLimit) * BigInt(FALLBACK_GAS_PRICE);\n const fallbackEstimatedFeeEth = formatUnits(fallbackTotalFeeWei, 18);\n\n return {\n gasLimit: fallbackGasLimit,\n gasPrice: FALLBACK_GAS_PRICE,\n estimatedFee: fallbackEstimatedFeeEth,\n };\n }\n }\n\n /**\n * Estimate fee for executing an EVM multisig order\n */\n private async estimateExecOrderFee(\n data: ExecOrderEstimateData,\n activeWallet: { address: string },\n chainId: string | number\n ): Promise<EstimatedFee> {\n const { order, multisigAddress } = data;\n if (!activeWallet?.address) {\n throw new Error(\"Wallet not connected\");\n }\n\n const provider = this.getProvider(chainId);\n\n try {\n await provider.getNetwork();\n } catch (e: any) {\n console.error(\"Failed to connect to RPC during initial check:\", e);\n throw new Error(\n `RPC Connection Error: ${e.message || \"Node connection failed.\"}`\n );\n }\n\n const { to, value, data: orderData, operation, signature } = order;\n\n const FALLBACK_GAS_LIMIT_EXEC = \"1000000\";\n\n let encodedData: string;\n try {\n encodedData = await this.encodeExecTransaction(\n to,\n value,\n orderData,\n operation,\n signature.toString()\n );\n } catch (err) {\n console.error(\"Fail encoding data for order execution:\", err);\n throw new Error(\"Fail encoding data\");\n }\n\n const transactionForEstimation = {\n from: activeWallet.address,\n to: multisigAddress,\n value: \"0\",\n data: encodedData,\n };\n\n let gasPrice: string;\n try {\n const feeData = await this.getFeeData(provider);\n gasPrice = feeData.gasPrice?.toString() || FALLBACK_GAS_PRICE;\n } catch (err) {\n console.error(\"Fail to get gas price, using fallback:\", err);\n gasPrice = FALLBACK_GAS_PRICE;\n }\n\n let gasLimit: string;\n try {\n const estimatedGas = await provider.estimateGas(transactionForEstimation);\n const bufferedGas = (estimatedGas * 120n) / 100n;\n gasLimit = bufferedGas.toString();\n } catch (gasError) {\n console.error(\n \"Failed to estimate gas for order execution, using fallback limit:\",\n gasError\n );\n gasLimit = FALLBACK_GAS_LIMIT_EXEC;\n }\n\n const totalFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n const estimatedFee = formatUnits(totalFeeWei, 18);\n\n return { gasLimit, gasPrice, estimatedFee };\n }\n\n /**\n * Estimate fee for activating/deploying an EVM multisig\n */\n private async estimateMultisigActivationFee(\n data: ActivateMultisigEstimateData,\n activeWallet: { address: string },\n chainId: string | number\n ): Promise<EstimatedFee> {\n const { multisig } = data;\n if (!activeWallet?.address) {\n throw new Error(\"Wallet not connected\");\n }\n\n const provider = this.getProvider(chainId);\n\n const transaction = {\n from: activeWallet.address,\n to: multisig.factoryAddress,\n data: multisig.params.deployData,\n value: \"0\",\n chainId: Number(multisig.chainId),\n };\n\n const feeData = await this.getFeeData(provider);\n const gasPrice = feeData.gasPrice?.toString() || \"20000000000\";\n\n let gasLimit: string;\n const FALLBACK_GAS_LIMIT_ACTIVATION = \"800000\";\n\n try {\n const estimatedGas = await provider.estimateGas(transaction);\n const bufferedGas = (estimatedGas * 120n) / 100n;\n gasLimit = bufferedGas.toString();\n } catch (gasError) {\n console.error(\"Failed to estimate gas, using fallback limit:\", gasError);\n gasLimit = FALLBACK_GAS_LIMIT_ACTIVATION;\n }\n\n const totalFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n const estimatedFee = formatUnits(totalFeeWei, 18);\n\n return {\n gasLimit,\n gasPrice,\n estimatedFee,\n };\n }\n}\n"],"mappings":"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","names":[]}
|