multisigns-sdk 1.0.7 → 1.0.8
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-WBCCQ7NO.js → chunk-3WZPZWTT.js} +1 -1
- package/dist/{chunk-WBCCQ7NO.js.map → chunk-3WZPZWTT.js.map} +1 -1
- package/dist/{chunk-NLKDOK73.js → chunk-5D47RCSE.js} +2 -2
- package/dist/{chunk-6XQPED32.js → chunk-AZDMZJMI.js} +2 -2
- package/dist/chunk-P5S66HVV.js +346 -0
- package/dist/chunk-P5S66HVV.js.map +1 -0
- package/dist/{chunk-DY2UK5YS.js → chunk-YSKI4MI7.js} +22 -363
- package/dist/chunk-YSKI4MI7.js.map +1 -0
- package/dist/{createSolanaMultisigOrder-32EEPGOH.js → createSolanaMultisigOrder-3ZAIO4W6.js} +3 -3
- package/dist/{estimateTronRegularFee-SKZZH256.js → estimateTronRegularFee-HKJLU27N.js} +1 -2
- package/dist/estimateTronRegularFee-HKJLU27N.js.map +1 -0
- package/dist/{evm-validation-EG7PSXX2.js → evm-validation-UEE3NEI6.js} +2 -2
- package/dist/{evmSendTransaction-DQ7JU6LZ.js → evmSendTransaction-PXDRH7MR.js} +4 -4
- package/dist/evmSendTransaction-PXDRH7MR.js.map +1 -0
- package/dist/index.cjs +404 -200
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +42 -25
- package/dist/index.js.map +1 -1
- package/dist/{order-helpers-L7WTEOHE.js → order-helpers-ZFGPS3HU.js} +2 -2
- package/dist/sendBtcTransaction-V24EFU5T.js +187 -0
- package/dist/sendBtcTransaction-V24EFU5T.js.map +1 -0
- package/dist/{sendSolanaTransaction-JOPQ63HF.js → sendSolanaTransaction-TPEFMG47.js} +2 -2
- package/dist/{shares-M7QW3YEV.js → shares-KAFAAQ2K.js} +2 -2
- package/dist/wallet.api-RPBMDZ5L.js +9 -0
- package/package.json +1 -1
- package/dist/chunk-DY2UK5YS.js.map +0 -1
- package/dist/estimateTronRegularFee-SKZZH256.js.map +0 -1
- package/dist/evmSendTransaction-DQ7JU6LZ.js.map +0 -1
- package/dist/wallet.api-G4UL7RS7.js +0 -9
- /package/dist/{chunk-NLKDOK73.js.map → chunk-5D47RCSE.js.map} +0 -0
- /package/dist/{chunk-6XQPED32.js.map → chunk-AZDMZJMI.js.map} +0 -0
- /package/dist/{createSolanaMultisigOrder-32EEPGOH.js.map → createSolanaMultisigOrder-3ZAIO4W6.js.map} +0 -0
- /package/dist/{evm-validation-EG7PSXX2.js.map → evm-validation-UEE3NEI6.js.map} +0 -0
- /package/dist/{order-helpers-L7WTEOHE.js.map → order-helpers-ZFGPS3HU.js.map} +0 -0
- /package/dist/{sendSolanaTransaction-JOPQ63HF.js.map → sendSolanaTransaction-TPEFMG47.js.map} +0 -0
- /package/dist/{shares-M7QW3YEV.js.map → shares-KAFAAQ2K.js.map} +0 -0
- /package/dist/{wallet.api-G4UL7RS7.js.map → wallet.api-RPBMDZ5L.js.map} +0 -0
|
@@ -1 +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\", // Bitcoin Testnet\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/**\n * Converts SDK chain type to backend API format.\n * This function handles the uppercase values and the special 'BTC_T3' value.\n */\nexport function toBackendChainType(\n chain: EChainType | ChainType | string\n): string {\n // Directly return the special Testnet chain value if encountered\n if (chain === \"BTC_T3\") {\n return \"BTC_T3\";\n }\n\n // For all other standard values ('EVM', 'SOL', 'TRON', 'BTC'), ensure they are uppercase.\n return String(chain).toUpperCase();\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 // Backwards compatibility aliases\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 */\nexport interface OrderInstruction {\n to?: string;\n toPubkey?: string;\n amount?: string;\n tokenAddress?: string;\n decimals?: number;\n type?: string;\n\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 OrderSigner {\n address: string;\n signature?: string;\n signedAt?: string;\n}\n\nexport type OrdersToken = {\n name: string;\n symbol: string;\n logoURL: string;\n priceUSD: number;\n price24hChange: number;\n decimals: number;\n amount: number;\n};\n\ntype InstructionArg = string | number | boolean;\n\nexport interface OrderMethod {\n method: string;\n args: InstructionArg[];\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 interface OrderParams {\n expireTime?: Date;\n chainType: string;\n proposalHash: string;\n transactionIndex: string;\n instructions: OrderInstructions[];\n safeTxGas?: string;\n token?: OrdersToken;\n methods?: OrderMethod[];\n operation?: \"0\" | \"1\" | string;\n data?: string;\n baseGas?: string;\n gasPrice?: string;\n gasToken?: string;\n value?: string;\n refundReceiver?: string;\n feeSats?: string;\n utxo?: Array<{ value: number }>;\n transaction?: {\n raw_data_hex?: string;\n };\n}\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\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 /** Output script in hex */\n script?: string;\n /** Script type for determining signing method */\n scriptType?: \"p2pkh\" | \"p2sh\" | \"p2wpkh\" | \"p2wsh\" | \"p2tr\";\n /** Non-witness UTXO (full previous tx hex) for legacy/nested inputs */\n nonWitnessUtxo?: string;\n}\n\n/**\n * Transaction result\n */\nexport interface TransactionResult {\n /** Transaction hash */\n txHash: string;\n /** Updated device share if rotation occurred */\n updatedDeviceShare: string | null;\n}\n\n/**\n * Signed transaction result (before broadcast)\n */\nexport interface SignedTransactionResult {\n /** Serialized signed transaction */\n signedTx: string;\n /** Updated device share if rotation occurred */\n updatedDeviceShare: string | null;\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 deviceShare: string;\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 deviceShare: string;\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 deviceShare: string;\n format?: \"hex\" | \"wif\" | \"bs58\" | \"array\";\n}\n\n/**\n * Output for exportWallet\n */\nexport interface ExportWalletOutput {\n privateKey: string;\n updatedDeviceShare: string | null;\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 deviceShare: 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 updatedDeviceShare: string | null;\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 deviceShare: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for createOrder\n */\nexport interface CreateOrderOutput {\n order: Order;\n proposalHash?: string;\n updatedDeviceShare: string | null;\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 deviceShare: string;\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 deviceShare: string;\n}\n\n/**\n * Input for signOrder\n */\nexport interface SignOrderInput {\n chain: ChainType;\n orderId: string;\n walletAddress: string;\n deviceShare?: 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 updatedDeviceShare: string | null;\n}\n\n/**\n * Input for rejectOrder\n */\nexport interface RejectOrderInput {\n chain: ChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n deviceShare?: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for rejectOrder\n */\nexport interface RejectOrderOutput {\n order: Order;\n updatedDeviceShare: string | null;\n}\n\n/**\n * Input for executeOrder\n */\nexport interface ExecuteOrderInput {\n chain: ChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n deviceShare: 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 updatedDeviceShare: string | null;\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// ============================================================================\n// EXECUTION TYPES (Internal but typed here for consistency)\n// ============================================================================\n\n/**\n * Execution action types (replaces iframe message types)\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 newDeviceShare: string | null;\n}\n\n/**\n * Share update result\n */\nexport interface ShareUpdateResult {\n deviceShare: string;\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; deviceShare: string }>;\n importWallet(\n params: ImportWalletInput\n ): Promise<{ wallet: TWallet; deviceShare: string }>;\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 getPaginatedMultisigs(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 addMember(params: {\n chain: ChainType;\n multisigId: string;\n newOwner: string;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }>;\n removeMember(params: {\n chain: ChainType;\n multisigId: string;\n ownerToRemove: string;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }>;\n updateThreshold(params: {\n chain: ChainType;\n multisigId: string;\n newThreshold: number;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }>;\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;AAMO,SAAS,mBACd,OACQ;AAER,MAAI,UAAU,UAAU;AACtB,WAAO;AAAA,EACT;AAGA,SAAO,OAAO,KAAK,EAAE,YAAY;AACnC;AAqEO,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;AA8eL,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
|
+
{"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\", // Bitcoin Testnet\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/**\n * Converts SDK chain type to backend API format.\n * This function handles the uppercase values and the special 'BTC_T3' value.\n */\nexport function toBackendChainType(\n chain: EChainType | ChainType | string\n): string {\n // Directly return the special Testnet chain value if encountered\n if (chain === \"BTC_T3\") {\n return \"BTC_T3\";\n }\n\n // For all other standard values ('EVM', 'SOL', 'TRON', 'BTC'), ensure they are uppercase.\n return String(chain).toUpperCase();\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 // Backwards compatibility aliases\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 */\nexport interface OrderInstruction {\n to?: string;\n toPubkey?: string;\n amount?: string;\n tokenAddress?: string;\n decimals?: number;\n type?: string;\n\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 OrderSigner {\n address: string;\n signature?: string;\n signedAt?: string;\n}\n\nexport type OrdersToken = {\n name: string;\n symbol: string;\n logoURL: string;\n priceUSD: number;\n price24hChange: number;\n decimals: number;\n amount: number;\n};\n\ntype InstructionArg = string | number | boolean;\n\nexport interface OrderMethod {\n method: string;\n args: InstructionArg[];\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 interface OrderParams {\n expireTime?: Date;\n chainType: string;\n proposalHash: string;\n transactionIndex: string;\n instructions: OrderInstructions[];\n safeTxGas?: string;\n token?: OrdersToken;\n methods?: OrderMethod[];\n operation?: \"0\" | \"1\" | string;\n data?: string;\n baseGas?: string;\n gasPrice?: string;\n gasToken?: string;\n value?: string;\n refundReceiver?: string;\n feeSats?: string;\n utxo?: Array<{ value: number }>;\n transaction?: {\n raw_data_hex?: string;\n };\n}\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\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 /** Output script in hex */\n script?: string;\n /** Script type for determining signing method */\n scriptType?: \"p2pkh\" | \"p2sh\" | \"p2wpkh\" | \"p2wsh\" | \"p2tr\";\n /** Non-witness UTXO (full previous tx hex) for legacy/nested inputs */\n nonWitnessUtxo?: string;\n}\n\n/**\n * Transaction result\n */\nexport interface TransactionResult {\n /** Transaction hash */\n txHash: string;\n /** Updated device share if rotation occurred */\n updatedDeviceShare: string | null;\n}\n\n/**\n * Signed transaction result (before broadcast)\n */\nexport interface SignedTransactionResult {\n /** Serialized signed transaction */\n signedTx: string;\n /** Updated device share if rotation occurred */\n updatedDeviceShare: string | null;\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 deviceShare: string;\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 deviceShare: string;\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 deviceShare: string;\n format?: \"hex\" | \"wif\" | \"bs58\" | \"array\";\n}\n\n/**\n * Output for exportWallet\n */\nexport interface ExportWalletOutput {\n privateKey: string;\n updatedDeviceShare: string | null;\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 deviceShare: 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 updatedDeviceShare: string | null;\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 deviceShare: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for createOrder\n */\nexport interface CreateOrderOutput {\n order: Order;\n proposalHash?: string;\n updatedDeviceShare: string | null;\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 deviceShare: string;\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 deviceShare: string;\n}\n\n/**\n * Input for signOrder\n */\nexport interface SignOrderInput {\n chain: ChainType;\n orderId: string;\n walletAddress: string;\n deviceShare?: 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 updatedDeviceShare: string | null;\n}\n\n/**\n * Input for rejectOrder\n */\nexport interface RejectOrderInput {\n chain: ChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n deviceShare?: string;\n chainId?: ChainIdValue;\n}\n\n/**\n * Output for rejectOrder\n */\nexport interface RejectOrderOutput {\n order: Order;\n updatedDeviceShare: string | null;\n}\n\n/**\n * Input for executeOrder\n */\nexport interface ExecuteOrderInput {\n chain: ChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n deviceShare: 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 updatedDeviceShare: string | null;\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// ============================================================================\n// EXECUTION TYPES (Internal but typed here for consistency)\n// ============================================================================\n\n/**\n * Execution action types (replaces iframe message types)\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 newDeviceShare: string | null;\n}\n\n/**\n * Share update result\n */\nexport interface ShareUpdateResult {\n deviceShare: string;\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; deviceShare: string }>;\n importWallet(\n params: ImportWalletInput\n ): Promise<{ wallet: TWallet; deviceShare: string }>;\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 getPaginatedMultisigs(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 addMember(params: {\n chain: ChainType;\n multisigId: string;\n newOwner: string;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }>;\n removeMember(params: {\n chain: ChainType;\n multisigId: string;\n ownerToRemove: string;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }>;\n updateThreshold(params: {\n chain: ChainType;\n multisigId: string;\n newThreshold: number;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }>;\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;AAMO,SAAS,mBACd,OACQ;AAER,MAAI,UAAU,UAAU;AACtB,WAAO;AAAA,EACT;AAGA,SAAO,OAAO,KAAK,EAAE,YAAY;AACnC;AAqEO,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;AA8eL,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"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-SLY2TEP7.js";
|
|
7
7
|
import {
|
|
8
8
|
EChainType
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-3WZPZWTT.js";
|
|
10
10
|
|
|
11
11
|
// src/strategies/iframeServices/solana/createSolanaMultisigOrder.ts
|
|
12
12
|
import {
|
|
@@ -542,4 +542,4 @@ export {
|
|
|
542
542
|
solToLamports,
|
|
543
543
|
createSolanaMultisigOrder
|
|
544
544
|
};
|
|
545
|
-
//# sourceMappingURL=chunk-
|
|
545
|
+
//# sourceMappingURL=chunk-5D47RCSE.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
toBackendChainType
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3WZPZWTT.js";
|
|
4
4
|
|
|
5
5
|
// src/api/wallet.api.ts
|
|
6
6
|
var WalletApi = class {
|
|
@@ -153,4 +153,4 @@ var WalletApi = class {
|
|
|
153
153
|
export {
|
|
154
154
|
WalletApi
|
|
155
155
|
};
|
|
156
|
-
//# sourceMappingURL=chunk-
|
|
156
|
+
//# sourceMappingURL=chunk-AZDMZJMI.js.map
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bytesToHex,
|
|
3
|
+
combineShares,
|
|
4
|
+
getReconstructionShares
|
|
5
|
+
} from "./chunk-G2AFPLPL.js";
|
|
6
|
+
import {
|
|
7
|
+
TRON_FULL_HOST
|
|
8
|
+
} from "./chunk-YIK2F4ES.js";
|
|
9
|
+
|
|
10
|
+
// src/services/key-reconstructor.ts
|
|
11
|
+
import { ethers } from "ethers";
|
|
12
|
+
import { Keypair } from "@solana/web3.js";
|
|
13
|
+
import { TronWeb } from "tronweb";
|
|
14
|
+
import { Buffer } from "buffer";
|
|
15
|
+
var KeyReconstructor = class {
|
|
16
|
+
apiClient;
|
|
17
|
+
network;
|
|
18
|
+
constructor(apiClient, network = "mainnet") {
|
|
19
|
+
this.apiClient = apiClient;
|
|
20
|
+
this.network = network;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Reconstruct and verify EVM key
|
|
24
|
+
*/
|
|
25
|
+
async reconstructEvmKey(deviceShare, address, forceUpdate = false) {
|
|
26
|
+
const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(
|
|
27
|
+
this.apiClient,
|
|
28
|
+
deviceShare,
|
|
29
|
+
address,
|
|
30
|
+
"EVM",
|
|
31
|
+
forceUpdate
|
|
32
|
+
);
|
|
33
|
+
const pkFromShares = await combineShares([mainShare, additionalShare]);
|
|
34
|
+
const hexPrivateKey = bytesToHex(pkFromShares);
|
|
35
|
+
const signer = new ethers.Wallet(hexPrivateKey);
|
|
36
|
+
if (signer.address.toLowerCase() !== address.toLowerCase()) {
|
|
37
|
+
throw new Error("KEY_MISMATCH");
|
|
38
|
+
}
|
|
39
|
+
return { privateKey: hexPrivateKey, signer, newDeviceShare };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reconstruct and verify Solana key
|
|
43
|
+
*
|
|
44
|
+
* Handles two formats:
|
|
45
|
+
* - 64-byte secret key (32 private + 32 public) - use fromSecretKey directly
|
|
46
|
+
* - 32-byte seed - use fromSeed to derive the keypair
|
|
47
|
+
*/
|
|
48
|
+
async reconstructSolanaKey(deviceShare, address, forceUpdate = false) {
|
|
49
|
+
const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(
|
|
50
|
+
this.apiClient,
|
|
51
|
+
deviceShare,
|
|
52
|
+
address,
|
|
53
|
+
"SOL",
|
|
54
|
+
forceUpdate
|
|
55
|
+
);
|
|
56
|
+
const pkFromShares = await combineShares([mainShare, additionalShare]);
|
|
57
|
+
let keypair;
|
|
58
|
+
try {
|
|
59
|
+
keypair = Keypair.fromSecretKey(pkFromShares);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.error("Keypair reconstruction failed:", err.message);
|
|
62
|
+
throw new Error("KEY_MISMATCH");
|
|
63
|
+
}
|
|
64
|
+
if (keypair.publicKey.toBase58() !== address) {
|
|
65
|
+
throw new Error("KEY_MISMATCH");
|
|
66
|
+
}
|
|
67
|
+
return { secretKey: keypair.secretKey, keypair, newDeviceShare };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Reconstruct and verify Bitcoin key
|
|
71
|
+
*/
|
|
72
|
+
async reconstructBtcKey(deviceShare, address, forceUpdate = false, isMainnet = false) {
|
|
73
|
+
const chainType = isMainnet ? "BTC" : "BTC_T3";
|
|
74
|
+
const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(
|
|
75
|
+
this.apiClient,
|
|
76
|
+
deviceShare,
|
|
77
|
+
address,
|
|
78
|
+
chainType,
|
|
79
|
+
forceUpdate
|
|
80
|
+
);
|
|
81
|
+
const pkFromShares = await combineShares([mainShare, additionalShare]);
|
|
82
|
+
const bitcoin = await import("bitcoinjs-lib");
|
|
83
|
+
const ecc = await import("tiny-secp256k1");
|
|
84
|
+
const { ECPairFactory } = await import("ecpair");
|
|
85
|
+
const ECPair = ECPairFactory(ecc);
|
|
86
|
+
const network = isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;
|
|
87
|
+
const keyPair = ECPair.fromPrivateKey(Buffer.from(pkFromShares), { network });
|
|
88
|
+
const { address: derivedAddress } = bitcoin.payments.p2wpkh({
|
|
89
|
+
pubkey: Buffer.from(keyPair.publicKey),
|
|
90
|
+
network
|
|
91
|
+
});
|
|
92
|
+
if (derivedAddress !== address) {
|
|
93
|
+
throw new Error("KEY_MISMATCH");
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
privateKeyWif: keyPair.toWIF(),
|
|
97
|
+
privateKeyBuffer: pkFromShares,
|
|
98
|
+
newDeviceShare
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reconstruct and verify Tron key
|
|
103
|
+
*/
|
|
104
|
+
async reconstructTronKey(deviceShare, address, forceUpdate = false) {
|
|
105
|
+
const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(
|
|
106
|
+
this.apiClient,
|
|
107
|
+
deviceShare,
|
|
108
|
+
address,
|
|
109
|
+
"TRON",
|
|
110
|
+
forceUpdate
|
|
111
|
+
);
|
|
112
|
+
const pkFromShares = await combineShares([mainShare, additionalShare]);
|
|
113
|
+
const privateKey = Buffer.from(pkFromShares).toString("hex");
|
|
114
|
+
const fullHost = TRON_FULL_HOST[this.network];
|
|
115
|
+
const tronWeb = new TronWeb({ fullHost });
|
|
116
|
+
const derivedAddress = tronWeb.address.fromPrivateKey(privateKey);
|
|
117
|
+
if (derivedAddress !== address) {
|
|
118
|
+
throw new Error("KEY_MISMATCH");
|
|
119
|
+
}
|
|
120
|
+
return { privateKey, newDeviceShare };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Attempt key reconstruction with retry on KEY_MISMATCH
|
|
124
|
+
* This pattern is used throughout the iframe codebase
|
|
125
|
+
*/
|
|
126
|
+
async reconstructWithRetry(reconstructFn, maxRetries = 1) {
|
|
127
|
+
try {
|
|
128
|
+
return await reconstructFn(false);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
if (error instanceof Error && error.message === "KEY_MISMATCH" && maxRetries > 0) {
|
|
131
|
+
try {
|
|
132
|
+
return await reconstructFn(true);
|
|
133
|
+
} catch (retryError) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
"Wallet key verification failed, even after forcing a share update. The account may be corrupted."
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generic transaction signing interface that mimics the iframe signTransactionInIframe
|
|
144
|
+
* Reconstructs key and performs signing based on chain type and action
|
|
145
|
+
*/
|
|
146
|
+
async signTransaction(params) {
|
|
147
|
+
const { deviceShare, address, chainType, action, params: actionParams } = params;
|
|
148
|
+
const normalizedChainType = chainType.toLowerCase();
|
|
149
|
+
if (normalizedChainType === "evm") {
|
|
150
|
+
return this.signEvmTransaction(deviceShare, address, action, actionParams);
|
|
151
|
+
} else if (normalizedChainType === "sol" || normalizedChainType === "solana") {
|
|
152
|
+
return this.signSolanaTransaction(deviceShare, address, action, actionParams);
|
|
153
|
+
} else if (normalizedChainType === "tron") {
|
|
154
|
+
return this.signTronTransaction(deviceShare, address, action, actionParams);
|
|
155
|
+
} else if (normalizedChainType === "btc") {
|
|
156
|
+
return this.signBtcTransaction(deviceShare, address, action, actionParams);
|
|
157
|
+
}
|
|
158
|
+
throw new Error(`Unsupported chain type: ${chainType}`);
|
|
159
|
+
}
|
|
160
|
+
getChainConfig(chainId) {
|
|
161
|
+
const CHAIN_CONFIGS = {
|
|
162
|
+
1: { key: "ethereum", maxGwei: 200 },
|
|
163
|
+
11155111: { key: "sepolia", maxGwei: 200 },
|
|
164
|
+
137: { key: "polygon", maxGwei: 500 },
|
|
165
|
+
8453: { key: "base", maxGwei: 10 }
|
|
166
|
+
// Add others as needed
|
|
167
|
+
};
|
|
168
|
+
return CHAIN_CONFIGS[chainId];
|
|
169
|
+
}
|
|
170
|
+
async signEvmTransaction(deviceShare, address, action, params) {
|
|
171
|
+
const { signer, newDeviceShare } = await this.reconstructWithRetry(
|
|
172
|
+
(forceUpdate) => this.reconstructEvmKey(deviceShare || "-", address, forceUpdate)
|
|
173
|
+
);
|
|
174
|
+
if (action === "signEvmOrder") {
|
|
175
|
+
const hashToSign = params.hashToSign;
|
|
176
|
+
const signature = await signer.signMessage(ethers.getBytes(hashToSign));
|
|
177
|
+
return { tx: signature, updatedDeviceShare: newDeviceShare };
|
|
178
|
+
}
|
|
179
|
+
if (action === "signEvmTx" || action === "signTransaction") {
|
|
180
|
+
const transaction = params.transaction || params.unsignedTx;
|
|
181
|
+
const expectedChainId = params.expectedChainId;
|
|
182
|
+
const unsignedTx = ethers.Transaction.from(transaction);
|
|
183
|
+
const expectedChainIdBigInt = BigInt(expectedChainId);
|
|
184
|
+
if (unsignedTx.chainId !== expectedChainIdBigInt) {
|
|
185
|
+
console.error(
|
|
186
|
+
`Chain ID mismatch. Expected: ${expectedChainId}, Received: ${unsignedTx.chainId}`
|
|
187
|
+
);
|
|
188
|
+
throw new Error("Transaction chain ID does not match the expected network.");
|
|
189
|
+
}
|
|
190
|
+
const isERC20Transfer = unsignedTx.data && unsignedTx.data !== "0x";
|
|
191
|
+
const chainConfig = this.getChainConfig(expectedChainId);
|
|
192
|
+
if (!chainConfig) {
|
|
193
|
+
console.warn(`Unknown EVM chain ID: ${expectedChainId}`);
|
|
194
|
+
} else {
|
|
195
|
+
const MAX_GAS_LIMIT = isERC20Transfer ? 2e5 : 5e5;
|
|
196
|
+
if (unsignedTx.gasLimit > BigInt(MAX_GAS_LIMIT)) {
|
|
197
|
+
console.warn(`Gas limit (${unsignedTx.gasLimit}) exceeds recommended maximum (${MAX_GAS_LIMIT})`);
|
|
198
|
+
}
|
|
199
|
+
const MAX_GAS_PRICE = ethers.parseUnits(String(chainConfig.maxGwei), "gwei");
|
|
200
|
+
if (unsignedTx.gasPrice && unsignedTx.gasPrice > MAX_GAS_PRICE) {
|
|
201
|
+
console.error(`Gas price too high: ${unsignedTx.gasPrice}`);
|
|
202
|
+
throw new Error("Gas price exceeds safe limit.");
|
|
203
|
+
}
|
|
204
|
+
if (unsignedTx.maxFeePerGas && unsignedTx.maxFeePerGas > MAX_GAS_PRICE) {
|
|
205
|
+
console.error(`Max Fee Per Gas too high for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`);
|
|
206
|
+
throw new Error("Max Fee Per Gas exceeds safe limit.");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (isERC20Transfer) {
|
|
210
|
+
try {
|
|
211
|
+
const transferSignature = "0xa9059cbb";
|
|
212
|
+
if (unsignedTx.data.startsWith(transferSignature)) {
|
|
213
|
+
const dataWithoutSig = unsignedTx.data.slice(10);
|
|
214
|
+
if (dataWithoutSig.length !== 128) {
|
|
215
|
+
throw new Error("Invalid ERC20 transfer data length");
|
|
216
|
+
}
|
|
217
|
+
const recipientHex = "0x" + dataWithoutSig.slice(24, 64);
|
|
218
|
+
const recipient = ethers.getAddress(recipientHex);
|
|
219
|
+
if (!ethers.isAddress(recipient)) {
|
|
220
|
+
throw new Error("Invalid recipient address in transfer data");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
} catch (decodeError) {
|
|
224
|
+
console.error("Error validating ERC20 data:", decodeError);
|
|
225
|
+
throw new Error("Not standart transaction");
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const signedTx = await signer.signTransaction(unsignedTx);
|
|
229
|
+
return { tx: signedTx, updatedDeviceShare: newDeviceShare };
|
|
230
|
+
}
|
|
231
|
+
if (action === "signTypedData") {
|
|
232
|
+
const domain = params.domain;
|
|
233
|
+
const types = params.types;
|
|
234
|
+
const value = params.value;
|
|
235
|
+
const signature = await signer.signTypedData(domain, types, value);
|
|
236
|
+
return { tx: signature, updatedDeviceShare: newDeviceShare };
|
|
237
|
+
}
|
|
238
|
+
throw new Error(`Unknown EVM action: ${action}`);
|
|
239
|
+
}
|
|
240
|
+
async signSolanaTransaction(deviceShare, address, action, params) {
|
|
241
|
+
const { Transaction, VersionedTransaction, PublicKey, Connection } = await import("@solana/web3.js");
|
|
242
|
+
const { keypair, newDeviceShare } = await this.reconstructWithRetry(
|
|
243
|
+
(forceUpdate) => this.reconstructSolanaKey(deviceShare || "-", address, forceUpdate)
|
|
244
|
+
);
|
|
245
|
+
if (action === "sol.executeOrder") {
|
|
246
|
+
const multisigParams = params.multisigParams;
|
|
247
|
+
const method = params.method;
|
|
248
|
+
const Squads = await import("@sqds/multisig");
|
|
249
|
+
const connection = new Connection(multisigParams.rpcUrl, "confirmed");
|
|
250
|
+
const multisigPda = new PublicKey(multisigParams.multisigPda);
|
|
251
|
+
const transactionIndex = BigInt(multisigParams.transactionIndex);
|
|
252
|
+
const tx = new Transaction();
|
|
253
|
+
if (method.toLowerCase() === "native" || method.toLowerCase() === "spl") {
|
|
254
|
+
const ix = await Squads.instructions.vaultTransactionExecute({
|
|
255
|
+
connection,
|
|
256
|
+
multisigPda,
|
|
257
|
+
transactionIndex,
|
|
258
|
+
member: keypair.publicKey
|
|
259
|
+
});
|
|
260
|
+
tx.add(ix.instruction);
|
|
261
|
+
} else {
|
|
262
|
+
const ix = Squads.instructions.configTransactionExecute({
|
|
263
|
+
multisigPda,
|
|
264
|
+
transactionIndex,
|
|
265
|
+
member: keypair.publicKey,
|
|
266
|
+
rentPayer: keypair.publicKey
|
|
267
|
+
});
|
|
268
|
+
tx.add(ix);
|
|
269
|
+
}
|
|
270
|
+
const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
|
|
271
|
+
tx.feePayer = keypair.publicKey;
|
|
272
|
+
tx.recentBlockhash = recentBlockhash;
|
|
273
|
+
tx.partialSign(keypair);
|
|
274
|
+
const execTransaction = tx.serialize().toString("base64");
|
|
275
|
+
return { tx: execTransaction, updatedDeviceShare: newDeviceShare };
|
|
276
|
+
}
|
|
277
|
+
if (action === "sol.rejectOrder") {
|
|
278
|
+
const multisigParams = params.multisigParams;
|
|
279
|
+
const Squads = await import("@sqds/multisig");
|
|
280
|
+
const connection = new Connection(multisigParams.rpcUrl, "confirmed");
|
|
281
|
+
const multisigPda = new PublicKey(multisigParams.multisigPda);
|
|
282
|
+
const transactionIndex = BigInt(multisigParams.transactionIndex);
|
|
283
|
+
const tx = new Transaction();
|
|
284
|
+
const ix = Squads.instructions.proposalReject({
|
|
285
|
+
member: keypair.publicKey,
|
|
286
|
+
multisigPda,
|
|
287
|
+
transactionIndex,
|
|
288
|
+
memo: multisigParams.orderId
|
|
289
|
+
});
|
|
290
|
+
tx.add(ix);
|
|
291
|
+
tx.feePayer = keypair.publicKey;
|
|
292
|
+
const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
|
|
293
|
+
tx.recentBlockhash = recentBlockhash;
|
|
294
|
+
tx.partialSign(keypair);
|
|
295
|
+
const rejectTransaction = tx.serialize().toString("base64");
|
|
296
|
+
return { tx: rejectTransaction, updatedDeviceShare: newDeviceShare };
|
|
297
|
+
}
|
|
298
|
+
const serializedTx = params.transaction;
|
|
299
|
+
const txBuffer = Buffer.from(serializedTx, "base64");
|
|
300
|
+
let signedTx;
|
|
301
|
+
try {
|
|
302
|
+
const tx = Transaction.from(txBuffer);
|
|
303
|
+
tx.partialSign(keypair);
|
|
304
|
+
signedTx = tx.serialize({ requireAllSignatures: false }).toString("base64");
|
|
305
|
+
} catch {
|
|
306
|
+
const versionedTx = VersionedTransaction.deserialize(txBuffer);
|
|
307
|
+
versionedTx.sign([keypair]);
|
|
308
|
+
signedTx = Buffer.from(versionedTx.serialize()).toString("base64");
|
|
309
|
+
}
|
|
310
|
+
return { tx: signedTx, updatedDeviceShare: newDeviceShare };
|
|
311
|
+
}
|
|
312
|
+
async signTronTransaction(deviceShare, address, action, params) {
|
|
313
|
+
const { privateKey, newDeviceShare } = await this.reconstructWithRetry(
|
|
314
|
+
(forceUpdate) => this.reconstructTronKey(deviceShare || "-", address, forceUpdate)
|
|
315
|
+
);
|
|
316
|
+
const fullHost = TRON_FULL_HOST[this.network];
|
|
317
|
+
const tronWeb = new TronWeb({ fullHost, privateKey });
|
|
318
|
+
const unsignedTx = params.unsignedTx;
|
|
319
|
+
const signedTx = await tronWeb.trx.sign(unsignedTx, privateKey);
|
|
320
|
+
const signature = signedTx.signature?.[0] || "";
|
|
321
|
+
return { tx: signature, updatedDeviceShare: newDeviceShare };
|
|
322
|
+
}
|
|
323
|
+
async signBtcTransaction(deviceShare, address, action, params) {
|
|
324
|
+
const bitcoin = await import("bitcoinjs-lib");
|
|
325
|
+
const ecc = await import("tiny-secp256k1");
|
|
326
|
+
const { ECPairFactory } = await import("ecpair");
|
|
327
|
+
const ECPair = ECPairFactory(ecc);
|
|
328
|
+
const isMainnet = params.isMainnet || false;
|
|
329
|
+
const { privateKeyBuffer, newDeviceShare } = await this.reconstructWithRetry(
|
|
330
|
+
(forceUpdate) => this.reconstructBtcKey(deviceShare || "-", address, forceUpdate, isMainnet)
|
|
331
|
+
);
|
|
332
|
+
const network = isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;
|
|
333
|
+
const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKeyBuffer), { network });
|
|
334
|
+
const psbtHex = params.psbtHex;
|
|
335
|
+
const psbt = bitcoin.Psbt.fromHex(psbtHex, { network });
|
|
336
|
+
psbt.signAllInputs(keyPair);
|
|
337
|
+
psbt.finalizeAllInputs();
|
|
338
|
+
const signedTxHex = psbt.extractTransaction().toHex();
|
|
339
|
+
return { tx: signedTxHex, updatedDeviceShare: newDeviceShare };
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
export {
|
|
344
|
+
KeyReconstructor
|
|
345
|
+
};
|
|
346
|
+
//# sourceMappingURL=chunk-P5S66HVV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/key-reconstructor.ts"],"sourcesContent":["\n\nimport { ethers } from 'ethers';\nimport { Keypair } from '@solana/web3.js';\nimport { TronWeb } from 'tronweb';\nimport { combineShares, getReconstructionShares, bytesToHex } from '../crypto/shares';\nimport { Buffer } from 'buffer';\nimport { TRON_FULL_HOST } from '../core/config';\nimport type { ApiClient } from '../api/client';\nimport type { NetworkMode } from '../core/types';\n\n\nexport interface ReconstructedEvmKey {\n privateKey: string;\n signer: ethers.Wallet;\n newDeviceShare: string | null;\n}\n\nexport interface ReconstructedSolanaKey {\n secretKey: Uint8Array;\n keypair: Keypair;\n newDeviceShare: string | null;\n}\n\nexport interface ReconstructedBtcKey {\n privateKeyWif: string;\n privateKeyBuffer: Uint8Array;\n newDeviceShare: string | null;\n}\n\nexport interface ReconstructedTronKey {\n privateKey: string;\n newDeviceShare: string | null;\n}\n\nexport class KeyReconstructor {\n private apiClient: ApiClient;\n private network: NetworkMode;\n\n constructor(apiClient: ApiClient, network: NetworkMode = 'mainnet') {\n this.apiClient = apiClient;\n this.network = network;\n }\n\n /**\n * Reconstruct and verify EVM key\n */\n async reconstructEvmKey(\n deviceShare: string,\n address: string,\n forceUpdate: boolean = false\n ): Promise<ReconstructedEvmKey> {\n\n\n const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(\n this.apiClient,\n deviceShare,\n address,\n 'EVM',\n forceUpdate\n );\n\n const pkFromShares = await combineShares([mainShare, additionalShare]);\n const hexPrivateKey = bytesToHex(pkFromShares);\n const signer = new ethers.Wallet(hexPrivateKey);\n\n if (signer.address.toLowerCase() !== address.toLowerCase()) {\n throw new Error('KEY_MISMATCH');\n }\n\n return { privateKey: hexPrivateKey, signer, newDeviceShare };\n }\n\n /**\n * Reconstruct and verify Solana key\n * \n * Handles two formats:\n * - 64-byte secret key (32 private + 32 public) - use fromSecretKey directly\n * - 32-byte seed - use fromSeed to derive the keypair\n */\n async reconstructSolanaKey(\n deviceShare: string,\n address: string,\n forceUpdate: boolean = false\n ): Promise<ReconstructedSolanaKey> {\n const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(\n this.apiClient,\n deviceShare,\n address,\n 'SOL',\n forceUpdate\n );\n\n const pkFromShares = await combineShares([mainShare, additionalShare]);\n\n let keypair: Keypair;\n\n try {\n keypair = Keypair.fromSecretKey(pkFromShares);\n } catch (err: any) {\n console.error('Keypair reconstruction failed:', err.message);\n throw new Error('KEY_MISMATCH');\n }\n\n if (keypair.publicKey.toBase58() !== address) {\n throw new Error('KEY_MISMATCH');\n }\n\n return { secretKey: keypair.secretKey, keypair, newDeviceShare };\n }\n\n /**\n * Reconstruct and verify Bitcoin key\n */\n async reconstructBtcKey(\n deviceShare: string,\n address: string,\n forceUpdate: boolean = false,\n isMainnet: boolean = false\n ): Promise<ReconstructedBtcKey> {\n const chainType = isMainnet ? 'BTC' : 'BTC_T3';\n\n const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(\n this.apiClient,\n deviceShare,\n address,\n chainType,\n forceUpdate\n );\n\n const pkFromShares = await combineShares([mainShare, additionalShare]);\n\n // For BTC, we need to import dynamically to avoid bundling issues\n const bitcoin = await import('bitcoinjs-lib');\n const ecc = await import('tiny-secp256k1');\n const { ECPairFactory } = await import('ecpair');\n\n const ECPair = ECPairFactory(ecc);\n const network = isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(pkFromShares), { network });\n const { address: derivedAddress } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n network,\n });\n\n if (derivedAddress !== address) {\n throw new Error('KEY_MISMATCH');\n }\n\n return {\n privateKeyWif: keyPair.toWIF(),\n privateKeyBuffer: pkFromShares,\n newDeviceShare,\n };\n }\n\n /**\n * Reconstruct and verify Tron key\n */\n async reconstructTronKey(\n deviceShare: string,\n address: string,\n forceUpdate: boolean = false\n ): Promise<ReconstructedTronKey> {\n const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(\n this.apiClient,\n deviceShare,\n address,\n 'TRON',\n forceUpdate\n );\n const pkFromShares = await combineShares([mainShare, additionalShare]);\n const privateKey = Buffer.from(pkFromShares).toString('hex');\n\n // Use TronWeb to derive address from private key with correct network\n const fullHost = TRON_FULL_HOST[this.network];\n const tronWeb = new TronWeb({ fullHost });\n const derivedAddress = tronWeb.address.fromPrivateKey(privateKey);\n\n if (derivedAddress !== address) {\n throw new Error('KEY_MISMATCH');\n }\n\n return { privateKey, newDeviceShare };\n }\n\n /**\n * Attempt key reconstruction with retry on KEY_MISMATCH\n * This pattern is used throughout the iframe codebase\n */\n async reconstructWithRetry<T>(\n reconstructFn: (forceUpdate: boolean) => Promise<T>,\n maxRetries: number = 1\n ): Promise<T> {\n try {\n return await reconstructFn(false);\n } catch (error: unknown) {\n if (error instanceof Error && error.message === 'KEY_MISMATCH' && maxRetries > 0) {\n try {\n return await reconstructFn(true);\n } catch (retryError: unknown) {\n throw new Error(\n 'Wallet key verification failed, even after forcing a share update. The account may be corrupted.'\n );\n }\n }\n throw error;\n }\n }\n\n /**\n * Generic transaction signing interface that mimics the iframe signTransactionInIframe\n * Reconstructs key and performs signing based on chain type and action\n */\n async signTransaction(params: {\n deviceShare: string;\n address: string;\n chainType: 'evm' | 'sol' | 'solana' | 'tron' | 'btc';\n action: string;\n params: Record<string, unknown>;\n }): Promise<{ tx: string; updatedDeviceShare: string | null }> {\n const { deviceShare, address, chainType, action, params: actionParams } = params;\n const normalizedChainType = chainType.toLowerCase();\n\n if (normalizedChainType === 'evm') {\n return this.signEvmTransaction(deviceShare, address, action, actionParams);\n } else if (normalizedChainType === 'sol' || normalizedChainType === 'solana') {\n return this.signSolanaTransaction(deviceShare, address, action, actionParams);\n } else if (normalizedChainType === 'tron') {\n return this.signTronTransaction(deviceShare, address, action, actionParams);\n } else if (normalizedChainType === 'btc') {\n return this.signBtcTransaction(deviceShare, address, action, actionParams);\n }\n\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n\n private getChainConfig(chainId: number): { key: string; maxGwei: number } | undefined {\n // Basic chain config for validation - inline to avoid external dependencies if file missing\n const CHAIN_CONFIGS: Record<number, { key: string; maxGwei: number }> = {\n 1: { key: 'ethereum', maxGwei: 200 },\n 11155111: { key: 'sepolia', maxGwei: 200 },\n 137: { key: 'polygon', maxGwei: 500 },\n 8453: { key: 'base', maxGwei: 10 },\n // Add others as needed\n };\n return CHAIN_CONFIGS[chainId];\n }\n\n private async signEvmTransaction(\n deviceShare: string,\n address: string,\n action: string,\n params: Record<string, unknown>\n ): Promise<{ tx: string; updatedDeviceShare: string | null }> {\n const { signer, newDeviceShare } = await this.reconstructWithRetry(\n (forceUpdate) => this.reconstructEvmKey(deviceShare || '-', address, forceUpdate)\n );\n\n if (action === 'signEvmOrder') {\n const hashToSign = params.hashToSign as string;\n const signature = await signer.signMessage(ethers.getBytes(hashToSign));\n return { tx: signature, updatedDeviceShare: newDeviceShare };\n }\n\n if (action === 'signEvmTx' || action === 'signTransaction') {\n const transaction = params.transaction as any || params.unsignedTx as any;\n const expectedChainId = params.expectedChainId as number;\n\n // Robust Validation Logic\n const unsignedTx = ethers.Transaction.from(transaction);\n const expectedChainIdBigInt = BigInt(expectedChainId);\n\n if (unsignedTx.chainId !== expectedChainIdBigInt) {\n console.error(\n `Chain ID mismatch. Expected: ${expectedChainId}, Received: ${unsignedTx.chainId}`\n );\n throw new Error('Transaction chain ID does not match the expected network.');\n }\n\n const isERC20Transfer = unsignedTx.data && unsignedTx.data !== '0x';\n const chainConfig = this.getChainConfig(expectedChainId);\n\n if (!chainConfig) {\n // Warning instead of error to allow unlisted chains\n console.warn(`Unknown EVM chain ID: ${expectedChainId}`);\n } else {\n const MAX_GAS_LIMIT = isERC20Transfer ? 200000 : 500000;\n if (unsignedTx.gasLimit > BigInt(MAX_GAS_LIMIT)) {\n console.warn(`Gas limit (${unsignedTx.gasLimit}) exceeds recommended maximum (${MAX_GAS_LIMIT})`);\n }\n\n const MAX_GAS_PRICE = ethers.parseUnits(String(chainConfig.maxGwei), 'gwei');\n\n if (unsignedTx.gasPrice && unsignedTx.gasPrice > MAX_GAS_PRICE) {\n console.error(`Gas price too high: ${unsignedTx.gasPrice}`);\n throw new Error('Gas price exceeds safe limit.');\n }\n\n if (unsignedTx.maxFeePerGas && unsignedTx.maxFeePerGas > MAX_GAS_PRICE) {\n console.error(`Max Fee Per Gas too high for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`);\n throw new Error('Max Fee Per Gas exceeds safe limit.');\n }\n }\n\n if (isERC20Transfer) {\n try {\n const transferSignature = '0xa9059cbb';\n if (unsignedTx.data.startsWith(transferSignature)) {\n const dataWithoutSig = unsignedTx.data.slice(10);\n if (dataWithoutSig.length !== 128) {\n throw new Error('Invalid ERC20 transfer data length');\n }\n const recipientHex = '0x' + dataWithoutSig.slice(24, 64);\n const recipient = ethers.getAddress(recipientHex);\n\n if (!ethers.isAddress(recipient)) {\n throw new Error('Invalid recipient address in transfer data');\n }\n }\n } catch (decodeError) {\n console.error('Error validating ERC20 data:', decodeError);\n throw new Error('Not standart transaction');\n }\n }\n\n const signedTx = await signer.signTransaction(unsignedTx);\n return { tx: signedTx, updatedDeviceShare: newDeviceShare };\n }\n\n if (action === 'signTypedData') {\n const domain = params.domain as ethers.TypedDataDomain;\n const types = params.types as Record<string, ethers.TypedDataField[]>;\n const value = params.value as Record<string, unknown>;\n const signature = await signer.signTypedData(domain, types, value);\n return { tx: signature, updatedDeviceShare: newDeviceShare };\n }\n\n throw new Error(`Unknown EVM action: ${action}`);\n }\n\n\n private async signSolanaTransaction(\n deviceShare: string,\n address: string,\n action: string,\n params: Record<string, unknown>\n ): Promise<{ tx: string; updatedDeviceShare: string | null }> {\n const { Transaction, VersionedTransaction, PublicKey, Connection } = await import('@solana/web3.js');\n\n const { keypair, newDeviceShare } = await this.reconstructWithRetry(\n (forceUpdate) => this.reconstructSolanaKey(deviceShare || '-', address, forceUpdate)\n );\n\n // Handle executeOrder action (builds Squads transaction)\n if (action === 'sol.executeOrder') {\n const multisigParams = params.multisigParams as any;\n const method = params.method as string;\n const Squads = await import('@sqds/multisig');\n\n const connection = new Connection(multisigParams.rpcUrl, 'confirmed');\n const multisigPda = new PublicKey(multisigParams.multisigPda);\n const transactionIndex = BigInt(multisigParams.transactionIndex);\n\n const tx = new Transaction();\n\n // Build appropriate instruction based on method type\n if (method.toLowerCase() === 'native' || method.toLowerCase() === 'spl') {\n const ix = await Squads.instructions.vaultTransactionExecute({\n connection,\n multisigPda,\n transactionIndex,\n member: keypair.publicKey,\n });\n tx.add(ix.instruction);\n } else {\n // Config transaction (for settings changes like AddOwner, RemoveOwner, etc.)\n const ix = Squads.instructions.configTransactionExecute({\n multisigPda,\n transactionIndex,\n member: keypair.publicKey,\n rentPayer: keypair.publicKey,\n });\n tx.add(ix);\n }\n\n const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = keypair.publicKey;\n tx.recentBlockhash = recentBlockhash;\n tx.partialSign(keypair);\n\n const execTransaction = tx.serialize().toString('base64');\n return { tx: execTransaction, updatedDeviceShare: newDeviceShare };\n }\n\n // Handle rejectOrder action (builds Squads rejection transaction)\n if (action === 'sol.rejectOrder') {\n const multisigParams = params.multisigParams as any;\n const Squads = await import('@sqds/multisig');\n\n const connection = new Connection(multisigParams.rpcUrl, 'confirmed');\n const multisigPda = new PublicKey(multisigParams.multisigPda);\n const transactionIndex = BigInt(multisigParams.transactionIndex);\n\n const tx = new Transaction();\n const ix = Squads.instructions.proposalReject({\n member: keypair.publicKey,\n multisigPda,\n transactionIndex,\n memo: multisigParams.orderId,\n });\n tx.add(ix);\n\n tx.feePayer = keypair.publicKey;\n const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.recentBlockhash = recentBlockhash;\n tx.partialSign(keypair);\n\n const rejectTransaction = tx.serialize().toString('base64');\n return { tx: rejectTransaction, updatedDeviceShare: newDeviceShare };\n }\n\n // Handle regular transaction signing\n const serializedTx = params.transaction as string;\n const txBuffer = Buffer.from(serializedTx, 'base64');\n\n let signedTx: string;\n\n try {\n const tx = Transaction.from(txBuffer);\n tx.partialSign(keypair);\n signedTx = tx.serialize({ requireAllSignatures: false }).toString('base64');\n } catch {\n const versionedTx = VersionedTransaction.deserialize(txBuffer);\n versionedTx.sign([keypair]);\n signedTx = Buffer.from(versionedTx.serialize()).toString('base64');\n }\n\n return { tx: signedTx, updatedDeviceShare: newDeviceShare };\n }\n\n private async signTronTransaction(\n deviceShare: string,\n address: string,\n action: string,\n params: Record<string, unknown>\n ): Promise<{ tx: string; updatedDeviceShare: string | null }> {\n const { privateKey, newDeviceShare } = await this.reconstructWithRetry(\n (forceUpdate) => this.reconstructTronKey(deviceShare || '-', address, forceUpdate)\n );\n\n const fullHost = TRON_FULL_HOST[this.network];\n const tronWeb = new TronWeb({ fullHost, privateKey });\n\n const unsignedTx = params.unsignedTx as { raw_data_hex?: string };\n const signedTx = await tronWeb.trx.sign(unsignedTx, privateKey);\n\n const signature = signedTx.signature?.[0] || '';\n return { tx: signature, updatedDeviceShare: newDeviceShare };\n }\n\n private async signBtcTransaction(\n deviceShare: string,\n address: string,\n action: string,\n params: Record<string, unknown>\n ): Promise<{ tx: string; updatedDeviceShare: string | null }> {\n const bitcoin = await import('bitcoinjs-lib');\n const ecc = await import('tiny-secp256k1');\n const { ECPairFactory } = await import('ecpair');\n\n const ECPair = ECPairFactory(ecc);\n const isMainnet = (params.isMainnet as boolean) || false;\n\n const { privateKeyBuffer, newDeviceShare } = await this.reconstructWithRetry(\n (forceUpdate) => this.reconstructBtcKey(deviceShare || '-', address, forceUpdate, isMainnet)\n );\n\n const network = isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKeyBuffer), { network });\n\n const psbtHex = params.psbtHex as string;\n const psbt = bitcoin.Psbt.fromHex(psbtHex, { network });\n\n psbt.signAllInputs(keyPair as unknown as Parameters<typeof psbt.signAllInputs>[0]);\n psbt.finalizeAllInputs();\n\n const signedTxHex = psbt.extractTransaction().toHex();\n return { tx: signedTxHex, updatedDeviceShare: newDeviceShare };\n }\n}\n"],"mappings":"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","names":[]}
|