multisigns-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/config.ts","../src/core/errors.ts","../src/api/wallet.api.ts","../src/crypto/util.ts","../src/crypto/shares.ts","../src/strategies/types.ts","../src/api/gnosis-abi.ts","../src/api/order-helpers.ts","../src/strategies/iframeServices/types.ts","../src/strategies/iframeServices/utils/crypto.ts","../src/strategies/iframeServices/api/wallet.ts","../src/strategies/iframeServices/utils/getReconstructionShares.ts","../src/strategies/iframeServices/solana/utils/reconstructAndVerifySolKey.ts","../src/strategies/iframeServices/solana/utils/prepareActions.ts","../src/strategies/iframeServices/solana/utils/solToLamports.ts","../src/strategies/iframeServices/solana/utils/detectTokenProgram.ts","../src/strategies/iframeServices/solana/createSolanaMultisigOrder.ts","../src/chains/evm/evm-validation.ts","../src/index.ts","../src/core/sdk.ts","../src/api/client.ts","../src/api/multisig.api.ts","../src/strategies/evm.strategy.ts","../src/services/key-reconstructor.ts","../src/api/order.api.ts","../src/core/abi.ts","../src/strategies/solanaServices/utils/solanaHelpers.ts","../src/services/wallet-key-manager.ts","../src/crypto/shamir.ts","../src/services/transaction.service.ts","../src/services/wallet.service.ts","../src/strategies/solana.strategy.ts","../src/strategies/iframeServices/solana/signOrder.ts","../src/strategies/tron.strategy.ts","../src/strategies/btc.strategy.ts","../src/strategies/blockchain-adapter.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}\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}\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 feeRate?: number;\n data?: string;\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: FeeEstimationTxType;\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 };\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 interface RpcOverrides {\n evm?: Record<number, string>;\n solana?: string;\n tron?: string;\n btc?: string;\n}\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 data: {\n wallet: TWallet;\n };\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","import type { SDKConfig, RpcOverrides, NetworkMode, ChainType } from \"./types\";\n\n/**\n * Default RPC endpoints for all supported chains across networks\n */\nexport const DEFAULT_RPC_ENDPOINTS: Record<\n NetworkMode,\n {\n evm: Record<number, string>;\n solana: string;\n tron: string;\n btc: string;\n }\n> = {\n mainnet: {\n evm: {\n 1: \"https://ethereum-rpc.publicnode.com\",\n 137: \"https://polygon-rpc.com\",\n 8453: \"https://mainnet.base.org\",\n 42161: \"https://arb1.arbitrum.io/rpc\",\n 10: \"https://mainnet.optimism.io\",\n 56: \"https://bsc-rpc.publicnode.com\",\n },\n solana: \"https://public.rpc.solanavibestation.com/\",\n tron: \"https://api.trongrid.io\",\n btc: \"https://mempool.space/api\",\n },\n testnet: {\n evm: {\n 11155111: \"https://ethereum-sepolia-rpc.publicnode.com\",\n 80002: \"https://rpc-amoy.polygon.technology\",\n 84532: \"https://sepolia.base.org\",\n 421614: \"https://sepolia-rollup.arbitrum.io/rpc\",\n 11155420: \"https://optimism-sepolia-rpc.publicnode.com\",\n 97: \"https://bsc-testnet-rpc.publicnode.com\",\n },\n solana: \"https://api.devnet.solana.com\",\n tron: \"https://api.shasta.trongrid.io\",\n btc: \"https://mempool.space/testnet/api\",\n },\n};\n\n\n/**\n * Default Tron full host URLs\n */\nexport const TRON_FULL_HOST: Record<NetworkMode, string> = {\n mainnet: \"https://api.trongrid.io\",\n testnet: \"https://api.shasta.trongrid.io\",\n};\n\n/**\n * Chain ID to network name mapping for EVM chains\n */\nexport const EVM_CHAIN_NAMES: Record<number, string> = {\n 1: \"Ethereum\",\n 137: \"Polygon\",\n 8453: \"Base\",\n 42161: \"Arbitrum One\",\n 10: \"Optimism\",\n 56: \"BNB Smart Chain\",\n 11155111: \"Ethereum Sepolia\",\n 80002: \"Polygon Amoy\",\n 84532: \"Base Sepolia\",\n 421614: \"Arbitrum Sepolia\",\n 11155420: \"Optimism Sepolia\",\n 97: \"BNB Smart Chain Testnet\",\n};\n\n/**\n * Default SDK configuration values\n */\nexport const DEFAULT_CONFIG: Required<\n Omit<SDKConfig, \"apiKey\" | \"accessToken\">\n> = {\n network: \"mainnet\",\n apiBaseUrl: \"https://afridax-backend-production.up.railway.app\",\n rpcOverrides: {},\n timeout: 30000,\n};\n\n/**\n * Resolved configuration with all values populated\n */\nexport interface ResolvedConfig {\n apiKey: string;\n accessToken?: string;\n network: NetworkMode;\n apiBaseUrl: string;\n rpcOverrides: RpcOverrides;\n timeout: number;\n}\n\n/**\n * Resolved RPC configuration with merged overrides\n */\nexport interface ResolvedRpcConfig {\n evm: Record<number, string>;\n solana: string;\n tron: string;\n btc: string;\n}\n\n/**\n * Merges user configuration with defaults to produce a fully resolved config\n *\n * @param userConfig - User-provided SDK configuration\n * @returns Fully resolved configuration with all defaults applied\n */\nexport function resolveConfig(userConfig: SDKConfig): ResolvedConfig {\n if (!userConfig.apiKey && !userConfig.accessToken) {\n throw new Error(\"Either apiKey or accessToken must be provided\");\n }\n return {\n apiKey: userConfig.apiKey ?? \"\",\n accessToken: userConfig.accessToken,\n network: userConfig.network ?? DEFAULT_CONFIG.network,\n apiBaseUrl: userConfig.apiBaseUrl ?? DEFAULT_CONFIG.apiBaseUrl,\n rpcOverrides: userConfig.rpcOverrides ?? DEFAULT_CONFIG.rpcOverrides,\n timeout: userConfig.timeout ?? DEFAULT_CONFIG.timeout,\n };\n}\n\n/**\n * Resolves RPC endpoints by merging defaults with user overrides\n *\n * @param network - Network mode (mainnet or testnet)\n * @param overrides - User-provided RPC overrides\n * @returns Fully resolved RPC configuration\n */\nexport function resolveRpcEndpoints(\n network: NetworkMode,\n overrides: RpcOverrides = {}\n): ResolvedRpcConfig {\n const defaults = DEFAULT_RPC_ENDPOINTS[network];\n\n return {\n evm: {\n ...defaults.evm,\n ...(overrides.evm ?? {}),\n },\n solana: overrides.solana ?? defaults.solana,\n tron: overrides.tron ?? defaults.tron,\n btc: overrides.btc ?? defaults.btc,\n };\n}\n\n/**\n * Gets the RPC endpoint for a specific chain and chain ID\n *\n * @param chain - Chain type\n * @param rpcConfig - Resolved RPC configuration\n * @param chainId - Chain ID (required for EVM)\n * @returns RPC endpoint URL\n * @throws Error if chain ID not found for EVM\n */\nexport function getRpcEndpoint(\n chain: ChainType,\n rpcConfig: ResolvedRpcConfig,\n chainId?: number\n): string {\n switch (chain) {\n case \"EVM\": // <<< FIXED: 'evm' to 'EVM'\n if (chainId === undefined) {\n throw new Error(\"Chain ID is required for EVM chains\");\n }\n const evmEndpoint = rpcConfig.evm[chainId];\n if (!evmEndpoint) {\n throw new Error(\n `No RPC endpoint configured for EVM chain ID ${chainId}`\n );\n }\n return evmEndpoint;\n\n case \"SOL\": // <<< FIXED: 'solana' to 'SOL'\n return rpcConfig.solana;\n\n case \"TRON\": // <<< FIXED: 'tron' to 'TRON'\n return rpcConfig.tron;\n\n case \"BTC\": // <<< FIXED: 'btc' to 'BTC'\n case \"BTC_T3\": // <<< ADDED: Handle BTC_T3 as a case (for completeness, though logic is the same as 'BTC')\n return rpcConfig.btc;\n\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n}\n\n/**\n * Shamir secret sharing configuration\n */\nexport const SHAMIR_CONFIG = {\n THRESHOLD: 2,\n TOTAL_SHARES: 3,\n} as const;\n\n/**\n * Key reconstruction retry configuration\n */\nexport const KEY_RECONSTRUCTION_CONFIG = {\n MAX_RETRIES: 1,\n RETRY_ON_MISMATCH: true,\n} as const;\n\n/**\n * API timeout defaults (in milliseconds)\n */\nexport const API_TIMEOUTS = {\n DEFAULT: 30000,\n TRANSACTION: 60000,\n KEY_RECONSTRUCTION: 45000,\n} as const;\n\n/**\n * Minimum balance requirements for transaction fees\n */\nexport const MINIMUM_BALANCE_FOR_TX: Record<ChainType, string> = {\n EVM: \"0.001\", // <<< FIXED: 'evm' to 'EVM'\n SOL: \"0.01\", // <<< FIXED: 'solana' to 'SOL'\n TRON: \"1\", // <<< FIXED: 'tron' to 'TRON'\n BTC: \"0.0001\", // <<< FIXED: 'btc' to 'BTC'\n // Note: BTC_T3 is not explicitly required here if the backend handles it via BTC\n // but if you need it, add it based on the extended ChainType:\n BTC_T3: \"0.0001\", // <<< ADDED for consistency with ChainType\n};\n\n/**\n * Native currency symbols per chain\n */\nexport const NATIVE_CURRENCY: Record<\n ChainType,\n { symbol: string; decimals: number }\n> = {\n EVM: { symbol: \"ETH\", decimals: 18 }, // <<< FIXED\n SOL: { symbol: \"SOL\", decimals: 9 }, // <<< FIXED\n TRON: { symbol: \"TRX\", decimals: 6 }, // <<< FIXED\n BTC: { symbol: \"BTC\", decimals: 8 }, // <<< FIXED\n BTC_T3: { symbol: \"BTC\", decimals: 8 }, // <<< ADDED\n};\n\n/**\n * Supported chain types array for validation\n */\nexport const SUPPORTED_CHAINS: ChainType[] = [\"EVM\", \"SOL\", \"TRON\", \"BTC\"]; // <<< FIXED: 'evm', etc., to 'EVM', etc.\n/**\n * BTC network configuration\n */\nexport const BTC_NETWORK_CONFIG = {\n mainnet: {\n name: \"bitcoin\",\n bech32: \"bc\",\n pubKeyHash: 0x00,\n scriptHash: 0x05,\n wif: 0x80,\n },\n testnet: {\n name: \"testnet\",\n bech32: \"tb\",\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n wif: 0xef,\n },\n} as const;\n","import {\n SDKErrorCode,\n type SDKError,\n type ChainType,\n} from './types';\n\n\nexport abstract class AfridaxBaseError extends Error implements SDKError {\n public readonly code: SDKErrorCode;\n public readonly chain?: ChainType;\n public readonly operation?: string;\n public readonly details?: Record<string, unknown>;\n public readonly cause?: Error;\n\n constructor(\n code: SDKErrorCode,\n message: string,\n options?: {\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(message);\n\n this.name = this.constructor.name;\n this.code = code;\n this.chain = options?.chain;\n this.operation = options?.operation;\n this.details = options?.details;\n this.cause = options?.cause;\n\n Object.setPrototypeOf(this, new.target.prototype);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Converts the error to a plain SDKError object for serialization\n */\n public toJSON(): SDKError {\n return {\n code: this.code,\n message: this.message,\n chain: this.chain,\n operation: this.operation,\n details: this.details,\n cause: this.cause,\n };\n }\n\n /**\n * Returns a formatted string representation of the error\n */\n public toString(): string {\n let str = `[${this.code}] ${this.message}`;\n if (this.chain) {\n str += ` (chain: ${this.chain})`;\n }\n if (this.operation) {\n str += ` (operation: ${this.operation})`;\n }\n return str;\n }\n}\n\n/**\n * Error thrown when an API request fails.\n * Includes HTTP status code and response details.\n */\nexport class ApiError extends AfridaxBaseError {\n public readonly statusCode?: number;\n public readonly responseBody?: unknown;\n\n constructor(\n message: string,\n options?: {\n statusCode?: number;\n responseBody?: unknown;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.API_ERROR, message, options);\n\n this.statusCode = options?.statusCode;\n this.responseBody = options?.responseBody;\n }\n\n public override toJSON(): SDKError & { statusCode?: number } {\n return {\n ...super.toJSON(),\n statusCode: this.statusCode,\n };\n }\n}\n\n/**\n * Error thrown when reconstructed private key does not match expected address.\n * Indicates device share may be stale and requires force update.\n */\nexport class KeyMismatchError extends AfridaxBaseError {\n public readonly expectedAddress: string;\n public readonly derivedAddress?: string;\n\n constructor(\n message: string,\n options: {\n expectedAddress: string;\n derivedAddress?: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.KEY_MISMATCH, message, options);\n\n this.expectedAddress = options.expectedAddress;\n this.derivedAddress = options.derivedAddress;\n }\n\n public override toJSON(): SDKError & { expectedAddress: string; derivedAddress?: string } {\n return {\n ...super.toJSON(),\n expectedAddress: this.expectedAddress,\n derivedAddress: this.derivedAddress,\n };\n }\n}\n\n/**\n * Error thrown when wallet has insufficient balance for a transaction.\n * Includes required and available amounts.\n */\nexport class InsufficientBalanceError extends AfridaxBaseError {\n public readonly requiredAmount: string;\n public readonly availableAmount: string;\n public readonly currency: string;\n\n constructor(\n message: string,\n options: {\n requiredAmount: string;\n availableAmount: string;\n currency: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.INSUFFICIENT_BALANCE, message, options);\n\n this.requiredAmount = options.requiredAmount;\n this.availableAmount = options.availableAmount;\n this.currency = options.currency;\n }\n\n public override toJSON(): SDKError & {\n requiredAmount: string;\n availableAmount: string;\n currency: string;\n } {\n return {\n ...super.toJSON(),\n requiredAmount: this.requiredAmount,\n availableAmount: this.availableAmount,\n currency: this.currency,\n };\n }\n}\n\n/**\n * Error thrown when an operation is attempted on an unsupported chain.\n */\nexport class ChainNotSupportedError extends AfridaxBaseError {\n public readonly requestedChain: string;\n public readonly supportedChains: string[];\n\n constructor(\n message: string,\n options: {\n requestedChain: string;\n supportedChains: string[];\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.CHAIN_NOT_SUPPORTED, message, {\n operation: options.operation,\n details: options.details,\n cause: options.cause,\n });\n\n this.requestedChain = options.requestedChain;\n this.supportedChains = options.supportedChains;\n }\n\n public override toJSON(): SDKError & {\n requestedChain: string;\n supportedChains: string[];\n } {\n return {\n ...super.toJSON(),\n requestedChain: this.requestedChain,\n supportedChains: this.supportedChains,\n };\n }\n}\n\n/**\n * Error thrown when a network request fails (connection issues, timeouts, etc.).\n */\nexport class NetworkError extends AfridaxBaseError {\n public readonly endpoint?: string;\n public readonly isTimeout: boolean;\n\n constructor(\n message: string,\n options?: {\n endpoint?: string;\n isTimeout?: boolean;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.NETWORK_ERROR, message, options);\n\n this.endpoint = options?.endpoint;\n this.isTimeout = options?.isTimeout ?? false;\n }\n\n public override toJSON(): SDKError & { endpoint?: string; isTimeout: boolean } {\n return {\n ...super.toJSON(),\n endpoint: this.endpoint,\n isTimeout: this.isTimeout,\n };\n }\n}\n\n/**\n * Error thrown when key reconstruction fails.\n */\nexport class KeyReconstructionError extends AfridaxBaseError {\n public readonly address: string;\n\n constructor(\n message: string,\n options: {\n address: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.KEY_RECONSTRUCTION_FAILED, message, options);\n\n this.address = options.address;\n }\n}\n\n/**\n * Error thrown when transaction signing fails.\n */\nexport class SignatureError extends AfridaxBaseError {\n constructor(\n message: string,\n options?: {\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.SIGNATURE_FAILED, message, options);\n }\n}\n\n/**\n * Error thrown when a transaction fails to execute.\n */\nexport class TransactionError extends AfridaxBaseError {\n public readonly txHash?: string;\n\n constructor(\n message: string,\n options?: {\n txHash?: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.TRANSACTION_FAILED, message, options);\n\n this.txHash = options?.txHash;\n }\n}\n\n/**\n * Error thrown when transaction broadcast fails.\n */\nexport class BroadcastError extends AfridaxBaseError {\n public readonly signedTx?: string;\n\n constructor(\n message: string,\n options?: {\n signedTx?: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.BROADCAST_FAILED, message, options);\n\n this.signedTx = options?.signedTx;\n }\n}\n\n/**\n * Error thrown when input validation fails.\n */\nexport class InvalidInputError extends AfridaxBaseError {\n public readonly field?: string;\n public readonly value?: unknown;\n\n constructor(\n message: string,\n options?: {\n field?: string;\n value?: unknown;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.INVALID_INPUT, message, options);\n\n this.field = options?.field;\n this.value = options?.value;\n }\n}\n\n/**\n * Error thrown when authorization fails (invalid API key, expired token, etc.).\n */\nexport class UnauthorizedError extends AfridaxBaseError {\n constructor(\n message: string,\n options?: {\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.UNAUTHORIZED, message, options);\n }\n}\n\n/**\n * Error thrown when API rate limit is exceeded.\n */\nexport class RateLimitError extends AfridaxBaseError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string,\n options?: {\n retryAfter?: number;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.RATE_LIMITED, message, options);\n\n this.retryAfter = options?.retryAfter;\n }\n}\n\n/**\n * Error thrown when an operation times out.\n */\nexport class TimeoutError extends AfridaxBaseError {\n public readonly timeoutMs: number;\n\n constructor(\n message: string,\n options: {\n timeoutMs: number;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.TIMEOUT, message, options);\n\n this.timeoutMs = options.timeoutMs;\n }\n}\n\n/**\n * Error thrown when a resource is not found.\n */\nexport class NotFoundError extends AfridaxBaseError {\n public readonly resourceType: 'order' | 'multisig' | 'wallet';\n public readonly resourceId: string;\n\n constructor(\n message: string,\n options: {\n resourceType: 'order' | 'multisig' | 'wallet';\n resourceId: string;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n let code: SDKErrorCode;\n switch (options.resourceType) {\n case 'order':\n code = SDKErrorCode.ORDER_NOT_FOUND;\n break;\n case 'multisig':\n code = SDKErrorCode.MULTISIG_NOT_FOUND;\n break;\n case 'wallet':\n code = SDKErrorCode.WALLET_NOT_FOUND;\n break;\n }\n\n super(code, message, options);\n\n this.resourceType = options.resourceType;\n this.resourceId = options.resourceId;\n }\n}\n\n/**\n * Error thrown when multisig signature threshold is not met.\n */\nexport class ThresholdNotMetError extends AfridaxBaseError {\n public readonly required: number;\n public readonly current: number;\n\n constructor(\n message: string,\n options: {\n required: number;\n current: number;\n chain?: ChainType;\n operation?: string;\n details?: Record<string, unknown>;\n cause?: Error;\n }\n ) {\n super(SDKErrorCode.THRESHOLD_NOT_MET, message, options);\n\n this.required = options.required;\n this.current = options.current;\n }\n}\n\n/**\n * Type guard to check if an error is an AfridaxBaseError\n */\nexport function isAfridaxError(error: unknown): error is AfridaxBaseError {\n return error instanceof AfridaxBaseError;\n}\n\n/**\n * Type guard to check if an error has a specific SDK error code\n */\nexport function hasErrorCode(error: unknown, code: SDKErrorCode): boolean {\n return isAfridaxError(error) && error.code === code;\n}\n\n/**\n * Wraps an unknown error in an AfridaxBaseError if it isn't already one\n */\nexport function wrapError(\n error: unknown,\n defaultMessage: string,\n options?: {\n chain?: ChainType;\n operation?: string;\n }\n): AfridaxBaseError {\n if (isAfridaxError(error)) {\n return error;\n }\n\n const cause = error instanceof Error ? error : undefined;\n const message = error instanceof Error ? error.message : defaultMessage;\n\n return new NetworkError(message, {\n chain: options?.chain,\n operation: options?.operation,\n cause,\n });\n}\n","import type { ApiClient } from './client';\nimport type {\n EChainType,\n ChainIdValue,\n CreateWalletResponse,\n SingleWalletDetailsResponse,\n PaginatedWalletsResponse,\n WalletRenameResponse,\n DeleteResponse,\n WalletPortfolioResponse,\n SupportedTokensResponse,\n TotalAssetValueResponse,\n HistoryResponse,\n} from '../core/types';\nimport { toBackendChainType } from '../core/types';\n\nexport class WalletApi {\n private readonly client: ApiClient;\n\n constructor(client: ApiClient) {\n this.client = client;\n }\n\n /**\n * Creates a new wallet\n */\n public async createWallet(chain: EChainType): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>('/sdk/wallets/create', {\n wallets: [{ chain: toBackendChainType(chain) }],\n });\n }\n\n /**\n * Imports a wallet with a private key\n */\n public async importWallet(\n chain: EChainType,\n privateKey: string\n ): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>('/sdk/wallets/create', {\n wallets: [{ chain: toBackendChainType(chain), key: privateKey }],\n });\n }\n\n /**\n * Gets a single wallet by address\n */\n public async getWallet(address: string): Promise<SingleWalletDetailsResponse> {\n return this.client.get<SingleWalletDetailsResponse>(`/sdk/wallets/${address}`);\n }\n\n /**\n * Gets all wallets for the user\n */\n public async getWallets(): Promise<PaginatedWalletsResponse> {\n return this.client.get<PaginatedWalletsResponse>('/sdk/wallets/all');\n }\n\n /**\n * Gets paginated wallets\n */\n public async getPaginatedWallets(\n page: number = 1,\n limit: number = 10\n ): Promise<PaginatedWalletsResponse> {\n return this.client.get<PaginatedWalletsResponse>('/sdk/wallets', {\n params: { page, limit },\n });\n }\n\n /**\n * Deletes a wallet\n */\n public async deleteWallet(\n chain: EChainType,\n address: string\n ): Promise<DeleteResponse> {\n return this.client.delete<DeleteResponse>(`/sdk/wallets/${toBackendChainType(chain)}/${address}`);\n }\n\n /**\n * Updates wallet name\n */\n public async updateWalletName(\n chain: EChainType,\n address: string,\n name: string\n ): Promise<WalletRenameResponse> {\n return this.client.post<WalletRenameResponse>('/sdk/wallets/update/name', {\n walletAddress: address,\n name,\n chainType: toBackendChainType(chain),\n });\n }\n\n /**\n * Fetches server share for key reconstruction\n */\n public async fetchServerShare(\n chain: EChainType,\n address: string\n ): Promise<string> {\n const response = await this.client.get<{ share: string }>(\n `/sdk/wallets/share/c/${toBackendChainType(chain)}/${address}`\n );\n return response.share;\n }\n\n /**\n * Fetches recovery share for key reconstruction\n */\n public async fetchRecoveryShare(\n chain: EChainType,\n address: string\n ): Promise<string> {\n const response = await this.client.get<{ share: string }>(\n `/sdk/wallets/share/s/${toBackendChainType(chain)}/${address}`\n );\n return response.share;\n }\n\n /**\n * Fetches both shares for key reconstruction\n */\n public async fetchShares(\n chain: EChainType,\n address: string\n ): Promise<{ server: string; recovery: string }> {\n const [server, recovery] = await Promise.all([\n this.fetchServerShare(chain, address),\n this.fetchRecoveryShare(chain, address),\n ]);\n return { server, recovery };\n }\n\n /**\n * Fetches public key for share encryption\n */\n public async fetchPublicKey(): Promise<string> {\n const response = await this.client.get<{ pubkey: string }>('/sdk/wallets/pubkey');\n return response.pubkey;\n }\n\n /**\n * Updates shares on server after rotation\n */\n public async updateShares(\n address: string,\n serverShare: string,\n encryptedRecoveryShare: string\n ): Promise<void> {\n await this.client.post('/sdk/wallets/update', {\n walletAddress: address,\n serverShare,\n encryptedRecoveryShare,\n });\n }\n\n /**\n * Gets wallet portfolio/balances for multiple wallets (batch request)\n * User constructs the PortfolioRequest array themselves\n */\n public async getWalletsPortfolio(\n requests: import('../core/types').PortfolioRequest[]\n ): Promise<import('../core/types').WalletPortfolioResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const body = { wallets: requests };\n\n const response = await this.client.post<import('../core/types').WalletPortfolioResponse[]>(\n '/sdk/wallets/protfolio',\n body\n );\n\n return response;\n }\n\n /**\n * Gets supported tokens for a chain\n */\n public async getSupportedTokens(\n chain: EChainType,\n chainId: ChainIdValue,\n page: number = 1,\n limit: number = 50,\n search?: string\n ): Promise<SupportedTokensResponse> {\n return this.client.get<SupportedTokensResponse>(\n `/sdk/wallets/supported-tokens/${toBackendChainType(chain)}/${chainId}`,\n {\n params: { page, limit, search },\n }\n );\n }\n\n /**\n * Gets total asset value across all wallets\n */\n public async getTotalAssetValue(): Promise<TotalAssetValueResponse> {\n return this.client.get<TotalAssetValueResponse>('/sdk/wallets/total-asset-value');\n }\n\n /**\n * Gets wallet transaction history\n */\n public async getHistory(\n chain: EChainType,\n address: string,\n page: number = 1,\n limit: number = 20\n ): Promise<HistoryResponse> {\n return this.client.get<HistoryResponse>(\n `/sdk/history/wallet/${toBackendChainType(chain)}/${address}`,\n {\n params: { page, limit },\n }\n );\n }\n}\n","import { ethers } from \"ethers\";\nimport { Keypair } from \"@solana/web3.js\";\nimport { TronWeb } from \"tronweb\";\nimport * as bitcoin from \"bitcoinjs-lib\";\nimport ECPairFactory from \"ecpair\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Buffer } from \"buffer\";\nimport { EChainType, NetworkMode } from \"../core/types\";\n\nconst ECPair = ECPairFactory(ecc);\n\n/**\n * Generates a cryptographically secure random byte array.\n *\n * @param length - Number of random bytes to generate\n * @returns A Uint8Array of random bytes\n */\nexport function generateRandomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n\n if (\n typeof globalThis.crypto !== \"undefined\" &&\n globalThis.crypto.getRandomValues\n ) {\n globalThis.crypto.getRandomValues(bytes);\n } else if (typeof require !== \"undefined\") {\n const nodeCrypto = require(\"crypto\");\n const randomBytes = nodeCrypto.randomBytes(length);\n bytes.set(\n new Uint8Array(\n randomBytes.buffer,\n randomBytes.byteOffset,\n randomBytes.byteLength\n )\n );\n } else {\n throw new Error(\n \"No cryptographically secure random number generator available\"\n );\n }\n\n return bytes;\n}\n\n// ============================================================================\n// KEY TO ADDRESS DERIVATION\n// ============================================================================\n\n/**\n * Derives a blockchain address from a private key.\n *\n * @param key - The private key as a Uint8Array (32 bytes for EVM/Tron/BTC, 64 bytes for Solana)\n * @param chain - The target blockchain type\n * @param network - Network mode for BTC (mainnet/testnet)\n * @returns The derived address string\n */\nexport function keyToAddress(\n key: Uint8Array,\n chain: EChainType,\n network: NetworkMode = \"mainnet\"\n): string {\n switch (chain) {\n case EChainType.EVM:\n return deriveEvmAddress(key);\n case EChainType.SOL:\n return deriveSolanaAddress(key);\n case EChainType.TRON:\n return deriveTronAddress(key);\n case EChainType.BTC:\n case EChainType.BTC_T3:\n return deriveBtcAddress(key, network);\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n}\n\n/**\n * Derives an EVM address from a private key.\n */\nfunction deriveEvmAddress(privateKey: Uint8Array): string {\n const hexPrivateKey = \"0x\" + Buffer.from(privateKey).toString(\"hex\");\n const wallet = new ethers.Wallet(hexPrivateKey);\n return wallet.address;\n}\n\n/**\n * Derives a Solana address from a private key.\n * Note: Solana uses 64-byte secret keys (32-byte seed + 32-byte public key)\n */\nfunction deriveSolanaAddress(privateKey: Uint8Array): string {\n let keypair: Keypair;\n\n if (privateKey.length === 64) {\n keypair = Keypair.fromSecretKey(privateKey);\n } else if (privateKey.length === 32) {\n keypair = Keypair.fromSeed(privateKey);\n } else {\n throw new Error(\"Solana private key must be 32 or 64 bytes\");\n }\n\n return keypair.publicKey.toBase58();\n}\n\n/**\n * Derives a Tron address from a private key.\n */\nfunction deriveTronAddress(privateKey: Uint8Array): string {\n const hexPrivateKey = Buffer.from(privateKey).toString(\"hex\");\n const tronWeb = new TronWeb({ fullHost: \"https://api.trongrid.io\" });\n return tronWeb.address.fromPrivateKey(hexPrivateKey);\n}\n\n/**\n * Derives a BTC address from a private key (P2WPKH - native SegWit).\n */\nfunction deriveBtcAddress(\n privateKey: Uint8Array,\n network: NetworkMode\n): string {\n const btcNetwork =\n network === \"mainnet\" ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKey), {\n network: btcNetwork,\n });\n\n const { address } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n network: btcNetwork,\n });\n\n if (!address) {\n throw new Error(\"Failed to derive BTC address\");\n }\n\n return address;\n}\n\n// ============================================================================\n// PRIVATE KEY CONVERSION UTILITIES\n// ============================================================================\n\n/**\n * Converts raw private key bytes to chain-specific format.\n */\nexport function rawKeyToChainFormat(\n raw: Uint8Array,\n chain: EChainType,\n network: NetworkMode = \"mainnet\"\n): string | Uint8Array {\n switch (chain) {\n case EChainType.EVM:\n return \"0x\" + Buffer.from(raw).toString(\"hex\");\n case EChainType.SOL:\n return Keypair.fromSecretKey(raw).secretKey;\n case EChainType.TRON:\n return Buffer.from(raw).toString(\"hex\");\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n const btcNetwork =\n network === \"mainnet\"\n ? bitcoin.networks.bitcoin\n : bitcoin.networks.testnet;\n const keyPair = ECPair.fromPrivateKey(Buffer.from(raw), {\n network: btcNetwork,\n });\n return keyPair.toWIF();\n }\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n}\n\n// ============================================================================\n// ENCRYPTION / DECRYPTION (AES-GCM-256)\n// ============================================================================\n\nconst IV_LENGTH = 12;\nconst TAG_LENGTH = 16;\nconst ALGORITHM = \"AES-GCM\";\n\n/**\n * Encrypts data using AES-GCM-256.\n *\n * @param key - The 256-bit encryption key as a Uint8Array (32 bytes)\n * @param data - The plaintext data to encrypt\n * @returns The encrypted data (IV + ciphertext + auth tag)\n */\nexport async function encryptShare(\n key: Uint8Array,\n data: Uint8Array\n): Promise<Uint8Array> {\n if (key.length !== 32) {\n throw new Error(\"Encryption key must be 32 bytes (256 bits)\");\n }\n\n const iv = generateRandomBytes(IV_LENGTH);\n\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.subtle) {\n const keyBuffer = new Uint8Array(key).buffer as ArrayBuffer;\n const ivBuffer = new Uint8Array(iv).buffer as ArrayBuffer;\n const dataBuffer = new Uint8Array(data).buffer as ArrayBuffer;\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n \"raw\",\n keyBuffer,\n { name: ALGORITHM },\n false,\n [\"encrypt\"]\n );\n\n const encrypted = await globalThis.crypto.subtle.encrypt(\n { name: ALGORITHM, iv: ivBuffer },\n cryptoKey,\n dataBuffer\n );\n\n const encryptedBytes = new Uint8Array(encrypted);\n return concatBytes(iv, encryptedBytes);\n } else if (typeof require !== \"undefined\") {\n const nodeCrypto = require(\"crypto\");\n const cipher = nodeCrypto.createCipheriv(\"aes-256-gcm\", key, iv);\n\n const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n return concatBytes(iv, new Uint8Array(encrypted), new Uint8Array(authTag));\n }\n\n throw new Error(\"No encryption API available\");\n}\n\n/**\n * Decrypts data using AES-GCM-256.\n *\n * @param key - The 256-bit decryption key as a Uint8Array (32 bytes)\n * @param encryptedData - The encrypted data (IV + ciphertext + auth tag)\n * @returns The decrypted plaintext data\n */\nexport async function decryptShare(\n key: Uint8Array,\n encryptedData: Uint8Array\n): Promise<Uint8Array> {\n if (key.length !== 32) {\n throw new Error(\"Decryption key must be 32 bytes (256 bits)\");\n }\n\n if (encryptedData.length < IV_LENGTH + TAG_LENGTH) {\n throw new Error(\"Encrypted data is too short\");\n }\n\n const iv = encryptedData.slice(0, IV_LENGTH);\n const ciphertext = encryptedData.slice(IV_LENGTH);\n\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.subtle) {\n const keyBuffer = new Uint8Array(key).buffer as ArrayBuffer;\n const ivBuffer = new Uint8Array(iv).buffer as ArrayBuffer;\n const ciphertextBuffer = new Uint8Array(ciphertext).buffer as ArrayBuffer;\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n \"raw\",\n keyBuffer,\n { name: ALGORITHM },\n false,\n [\"decrypt\"]\n );\n\n const decrypted = await globalThis.crypto.subtle.decrypt(\n { name: ALGORITHM, iv: ivBuffer },\n cryptoKey,\n ciphertextBuffer\n );\n\n return new Uint8Array(decrypted);\n } else if (typeof require !== \"undefined\") {\n const nodeCrypto = require(\"crypto\");\n\n const authTag = ciphertext.slice(-TAG_LENGTH);\n const encryptedContent = ciphertext.slice(0, -TAG_LENGTH);\n\n const decipher = nodeCrypto.createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([\n decipher.update(encryptedContent),\n decipher.final(),\n ]);\n\n return new Uint8Array(decrypted);\n }\n\n throw new Error(\"No decryption API available\");\n}\n\n/**\n * Encrypts data with RSA-OAEP public key (for recovery share encryption).\n *\n * @param pemKey - The PEM-encoded public key\n * @param data - The data to encrypt (as string)\n * @returns Base64-encoded encrypted data\n */\nexport async function encryptRsaOaep(\n pemKey: string,\n data: string\n): Promise<string> {\n return encryptWithPublicKey(pemKey, data);\n}\n\n/**\n * Encrypts data with RSA-OAEP public key (for recovery share encryption).\n *\n * @param pemKey - The PEM-encoded public key\n * @param data - The data to encrypt (as string)\n * @returns Base64-encoded encrypted data\n */\nexport async function encryptWithPublicKey(\n pemKey: string,\n data: string\n): Promise<string> {\n if (\n typeof globalThis.crypto === \"undefined\" ||\n !globalThis.crypto ||\n !globalThis.crypto.subtle\n ) {\n console.error(\n \"Crypto Error: Web Crypto API (crypto.subtle) is not supported in this environment.\"\n );\n throw new Error(\n \"BROWSER_NOT_SUPPORTED: Encryption failed because Web Crypto API is not available.\"\n );\n }\n\n if (\n typeof TextEncoder === \"undefined\" ||\n typeof atob === \"undefined\" ||\n typeof btoa === \"undefined\"\n ) {\n console.error(\n \"Crypto Error: Required global functions (TextEncoder, atob, btoa) are missing.\"\n );\n throw new Error(\n \"BROWSER_NOT_SUPPORTED: Encryption failed because required global functions are missing.\"\n );\n }\n\n const pemContents = pemKey\n .replace(/-----BEGIN PUBLIC KEY-----/, \"\")\n .replace(/-----END PUBLIC KEY-----/, \"\")\n .replace(/\\s+/g, \"\");\n\n try {\n const binaryDer = Uint8Array.from(atob(pemContents), (c) =>\n c.charCodeAt(0)\n );\n\n const publicKey = await globalThis.crypto.subtle.importKey(\n \"spki\",\n binaryDer.buffer,\n {\n name: \"RSA-OAEP\",\n hash: \"SHA-256\",\n },\n false,\n [\"encrypt\"]\n );\n\n const encoded = new TextEncoder().encode(data);\n const encrypted = await globalThis.crypto.subtle.encrypt(\n {\n name: \"RSA-OAEP\",\n },\n publicKey,\n encoded\n );\n\n return btoa(String.fromCharCode(...new Uint8Array(encrypted)));\n } catch (e) {\n console.error(\n \"Crypto Error: Failed during key import or encryption step.\",\n e\n );\n throw new Error(\n \"ENCRYPTION_FAILED: Could not securely encrypt data. Check key format or algorithm support.\"\n );\n }\n}\n\n// ============================================================================\n// ENCODING UTILITIES\n// ============================================================================\n\n/**\n * Converts a hexadecimal string to a Uint8Array.\n *\n * @param hex - The hexadecimal string (with or without 0x prefix)\n * @returns The byte array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n\n const bytes = new Uint8Array(cleanHex.length / 2);\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return bytes;\n}\n\n/**\n * Converts a Uint8Array to a hexadecimal string.\n *\n * @param bytes - The byte array\n * @param prefix - Whether to include '0x' prefix (default: true)\n * @returns The hexadecimal string\n */\nexport function bytesToHex(bytes: Uint8Array, prefix: boolean = true): string {\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return prefix ? `0x${hex}` : hex;\n}\n\n/**\n * Concatenates multiple Uint8Arrays into a single array.\n *\n * @param arrays - The arrays to concatenate\n * @returns The concatenated array\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n\n return result;\n}\n\n/**\n * Compares two Uint8Arrays for equality in constant time.\n *\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays are equal\n */\nexport function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a[i] ^ b[i];\n }\n\n return result === 0;\n}\n\n/**\n * Converts Base64 string to Uint8Array.\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Converts Uint8Array to Base64 string.\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n return btoa(String.fromCharCode(...bytes));\n}\n","\n\nimport { combine, split } from 'shamir-secret-sharing';\nimport { encryptRsaOaep } from './util';\nimport type { ApiClient } from '../api/client';\n\nexport const SHAMIR_THRESHOLD = 2;\nexport const SHAMIR_SHARES_NUM = 3;\n\nexport interface SplitPrivateKey {\n deviceShare: string;\n serverShare: string;\n recoveryShare: string;\n}\n\nexport interface ReconstructionShares {\n mainShare: string;\n additionalShare: string;\n newDeviceShare: string | null;\n}\n\nexport interface IframeTxResponse {\n tx: string;\n updatedDeviceShare: string | null;\n}\n\n/**\n * Convert hex string to Uint8Array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return '0x' + Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Normalize hex strings to the same length by LEFT-padding with zeros\n * This preserves the numeric value while ensuring consistent byte length\n * Required because shamir-secret-sharing needs all shares to have the same byte length\n */\nfunction normalizeHexStrings(hexStrings: string[]): string[] {\n if (hexStrings.length === 0) return hexStrings;\n\n // Clean all hex strings (remove 0x prefix if present)\n const cleanHexStrings = hexStrings.map(hex => hex.startsWith('0x') ? hex.slice(2) : hex);\n\n // Find the maximum length among all hex strings\n const maxLength = Math.max(...cleanHexStrings.map(s => s.length));\n\n // Left-pad shorter strings with zeros to match the maximum length\n // LEFT-padding preserves the numeric value (adds leading zeros)\n return cleanHexStrings.map(hex => hex.padStart(maxLength, '0'));\n}\n\n/**\n * Combine Shamir shares to reconstruct the private key bytes\n * Handles shares of different lengths by left-padding hex strings before conversion\n */\nexport async function combineShares(shares: string[]): Promise<Uint8Array> {\n // Normalize hex strings by left-padding to ensure consistent byte length\n const normalizedHexStrings = normalizeHexStrings(shares);\n\n // Convert normalized hex strings to byte arrays\n const shareBuffers = normalizedHexStrings.map((hex) => hexToBytes('0x' + hex));\n\n const reconstructed = await combine(shareBuffers);\n return new Uint8Array(reconstructed);\n}\n\n/**\n * Split private key into Shamir shares\n */\nexport async function splitPrivateKey(\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> {\n const shares = await split(privateKeyBytes, SHAMIR_SHARES_NUM, SHAMIR_THRESHOLD);\n const { ethers } = await import('ethers');\n return {\n deviceShare: ethers.hexlify(shares[0]),\n serverShare: ethers.hexlify(shares[1]),\n recoveryShare: ethers.hexlify(shares[2]),\n };\n}\n\n/**\n * Create new shares from private key bytes\n */\nexport async function createShares(\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> {\n if (!privateKeyBytes || privateKeyBytes.length === 0) {\n throw new Error('Cannot create shares from empty private key');\n }\n return splitPrivateKey(privateKeyBytes);\n}\n\n/**\n * Fetch server share from API\n */\nexport async function fetchServerShare(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string\n): Promise<string> {\n const response = await apiClient.get<{ share: string }>(\n `/sdk/wallets/share/c/${chainType}/${walletAddress}`\n );\n return response.share;\n}\n\n/**\n * Fetch recovery share from API\n */\nexport async function fetchRecoveryShare(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string\n): Promise<string> {\n const response = await apiClient.get<{ share: string }>(\n `/sdk/wallets/share/s/${chainType}/${walletAddress}`\n );\n return response.share;\n}\n\n/**\n * Fetch both server and recovery shares\n */\nexport async function fetchShares(\n apiClient: ApiClient,\n walletAddress: string,\n chainType: string\n): Promise<{ recovery: string; server: string }> {\n const [recovery, server] = await Promise.all([\n fetchRecoveryShare(apiClient, walletAddress, chainType),\n fetchServerShare(apiClient, walletAddress, chainType),\n ]);\n return { recovery, server };\n}\n\n/**\n * Update shares on the server (after share rotation)\n */\nexport async function updateShares(\n apiClient: ApiClient,\n walletAddress: string,\n serverShare: string,\n recoveryShare: string\n): Promise<{ device: string; server: string; recovery: string }> {\n const reconstructed = await combineShares([recoveryShare, serverShare]);\n const shares = await createShares(reconstructed);\n\n const pubkeyResponse = await apiClient.get<{ pubkey: string }>('/sdk/wallets/pubkey');\n const encryptedRecoveryShare = await encryptRsaOaep(pubkeyResponse.pubkey, shares.recoveryShare);\n\n await apiClient.post('/sdk/wallets/update', {\n walletAddress,\n serverShare: shares.serverShare,\n encryptedRecoveryShare,\n });\n\n return {\n recovery: '',\n server: shares.serverShare,\n device: shares.deviceShare,\n };\n}\n\n/**\n * Get reconstruction shares for key operations\n * Handles both normal case (device share available) and recovery case (force update)\n */\nexport async function getReconstructionShares(\n apiClient: ApiClient,\n deviceShare: string,\n walletAddress: string,\n chainType: string,\n forceUpdate: boolean\n): Promise<ReconstructionShares> {\n let mainShare: string;\n let additionalShare: string;\n let newDeviceShare: string | null = null;\n if (forceUpdate || !deviceShare || deviceShare === '-') {\n\n const shares = await fetchShares(apiClient, walletAddress, chainType);\n const updated = await updateShares(\n apiClient,\n walletAddress,\n shares.server,\n shares.recovery\n );\n mainShare = updated.device;\n additionalShare = updated.server;\n newDeviceShare = updated.device;\n } else {\n const serverShare = await fetchServerShare(apiClient, walletAddress, chainType);\n mainShare = deviceShare;\n additionalShare = serverShare;\n }\n\n if (!mainShare || !additionalShare) {\n throw new Error('Failed to retrieve key shares.');\n }\n\n return { mainShare, additionalShare, newDeviceShare };\n}\n","import type { TWallet, Order, EstimatedFee, OrderInstruction, TokenMultisignBalance, MultisigsItem } from '../core/types';\n\nexport type ChainType = 'evm' | 'solana' | 'tron' | 'btc';\n\nexport const EChainType = {\n EVM: 'EVM',\n SOL: 'SOL',\n TRON: 'TRON',\n BTC: 'BTC',\n BTC_T3: 'BTC_T3',\n} as const;\n\nexport type EChainTypeValue = (typeof EChainType)[keyof typeof EChainType];\n\nexport type ESolanaInstructionType = 'native' | 'spl' | 'addOwner' | 'removeOwner' | 'changeThreshold';\nexport const ESolanaInstructionType = {\n native: 'native',\n spl: 'spl',\n addOwner: 'addOwner',\n removeOwner: 'removeOwner',\n changeThreshold: 'changeThreshold',\n} as const;\n\nexport type EvmMethodType = 'execTransaction' | 'addOwnerWithThreshold' | 'removeOwner' | 'changeThreshold' | 'multiSend';\nexport type ETronOrderType = 'native' | 'trc' | 'addOwner' | 'removeOwner' | 'changeThreshold';\nexport type OrderMethodType = ESolanaInstructionType | EvmMethodType | ETronOrderType;\n\nexport interface SolOrderData<T = any> {\n deviceShare: string;\n address: string;\n accessToken: string;\n multisigPda: string;\n method: OrderMethodType;\n instructions: T;\n orderId: string;\n rpcUrl: string;\n vaultAddress: string;\n selectedToken?: any;\n threshold?: number;\n action?: string;\n [key: string]: any;\n}\n\nexport interface OrderInstructions {\n type?: OrderMethodType;\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 SendData {\n to: string;\n amount: string | number;\n estimatedFee?: EstimatedFee;\n tokenAddress?: string;\n isNativeToken?: boolean;\n decimals?: number;\n}\n\nexport interface ExecOrderData {\n order: Order;\n multisigAddress: string;\n multisigId: string;\n multisigChainId: string;\n estimatedFee?: EstimatedFee;\n}\n\nexport interface ActivateMultisigData {\n multisig: MultisigsItem;\n gasLimit?: string;\n gasPrice?: string;\n}\n\nexport const TransactionExecutionType = {\n ExecOrder: 'execOrder',\n Send: 'send',\n ActivateMultisig: 'activateMultisig',\n} as const;\n\nexport type TransactionExecutionTypeValue = typeof TransactionExecutionType[keyof typeof TransactionExecutionType];\n\nexport const TransactionEstimatingType = {\n ExecOrder: 'execOrder',\n Send: 'send',\n ActivateMultisig: 'activateMultisig',\n SignOrder: 'SignOrder',\n CreateOrder: 'CreateOrder',\n ChangeMultisig: 'ChangeMultisig',\n} as const;\n\nexport type TransactionEstimatingTypeValue = typeof TransactionEstimatingType[keyof typeof TransactionEstimatingType];\n\nexport type ExecuteTransactionInput =\n | { type: typeof TransactionExecutionType.Send; data: SendData }\n | { type: typeof TransactionExecutionType.ExecOrder; data: ExecOrderData }\n | { type: typeof TransactionExecutionType.ActivateMultisig; data: ActivateMultisigData };\n\nexport interface ActivateMultisigEstimateData {\n multisig: MultisigsItem;\n}\n\nexport interface ExecOrderEstimateData {\n order: Order;\n multisigAddress: string;\n}\n\nexport interface ChangeMultisigEstimateData {\n multisig: MultisigsItem;\n newOwners: string[];\n newThreshold: number;\n}\n\nexport interface SignOrderData {\n order: Order;\n}\n\nexport interface CreateOrderData {\n to: string;\n amount: string;\n tokenAddress?: string | null;\n method?: ESolanaInstructionType | ETronOrderType;\n multisig: MultisigsItem;\n tokenDecimals: number;\n}\n\nexport type EstimateTransactionInput =\n | { type: typeof TransactionEstimatingType.ActivateMultisig; data: ActivateMultisigEstimateData }\n | { type: typeof TransactionEstimatingType.ExecOrder; data: ExecOrderEstimateData }\n | { type: typeof TransactionEstimatingType.Send; data: SendData }\n | { type: typeof TransactionEstimatingType.SignOrder; data: SignOrderData }\n | { type: typeof TransactionEstimatingType.CreateOrder; data: CreateOrderData }\n | { type: typeof TransactionEstimatingType.ChangeMultisig; data: ChangeMultisigEstimateData };\n\nexport interface SignOrderParams {\n orderId: string;\n multisigId: string;\n wallet: TWallet;\n deviceShare: string;\n networkType: string;\n order?: Order;\n}\n\nexport interface CreateOrderParams {\n multisigId: string;\n wallet: TWallet;\n threshold?: number;\n method: OrderMethodType;\n instructions: OrderInstructions[];\n selectedToken?: TokenMultisignBalance | null;\n deviceShare: string;\n networkType: string;\n orderToActivate?: any;\n}\n\nexport interface RejectOrderParams {\n multisigId?: string;\n orderId: string;\n wallet: TWallet;\n deviceShare: string;\n networkType: string;\n}\n\nexport interface ExecuteTransactionParams {\n input: ExecuteTransactionInput;\n actualWallet?: TWallet;\n networkType: string;\n chainId: string | number;\n}\n\nexport interface EstimateFeeParams {\n input: EstimateTransactionInput;\n actualWallet: TWallet;\n chainId: string | number;\n}\n\nexport interface IframeTxResponse {\n tx: string;\n updatedDeviceShare: string | null;\n version?: string;\n}\n\n/**\n * Chain Strategy Interface\n * Defines the contract that all chain-specific implementations must follow.\n */\nexport interface ChainStrategy<TProvider = unknown> {\n getProvider?: (networkType?: string | number) => TProvider;\n getBalance?: (address: string, provider: TProvider) => Promise<string>;\n getTransactionHash?: (unsignedTx: string) => string | Promise<string>;\n getFeeData?: (provider: TProvider) => Promise<unknown>;\n getNonce?: (provider: TProvider, address: string) => Promise<number>;\n simulateTransaction?: (provider: TProvider, tx: unknown) => Promise<unknown>;\n getSignedTransaction?: (serializedTx: string) => Promise<unknown>;\n broadcastTransaction?: (provider: TProvider, rawTx: string) => Promise<unknown>;\n\n signOrder: (params: SignOrderParams) => Promise<IframeTxResponse>;\n createOrder: (params: CreateOrderParams) => Promise<{ order: Order; proposalHash: string }>;\n rejectOrder: (params: RejectOrderParams) => Promise<{ rejectionHash: string; order: unknown }>;\n\n executeTransaction: (params: ExecuteTransactionParams) => Promise<unknown>;\n estimateFee?: (params: EstimateFeeParams) => Promise<EstimatedFee>;\n\n encodeExecTransaction?: (to: string, value: string, data: string, operation: number, signature: string) => string;\n getOwners?: (multisigAddress: string, provider: TProvider) => Promise<string[]>;\n encodeRemoveOwner?: (owners: string[], ownerToRemove: string, newThreshold: number) => string;\n encodeChangeThreshold?: (newThreshold: number) => string;\n encodeAddOwnerWithThreshold?: (newOwner: string, threshold: number) => string;\n}\n","/**\n * Gnosis Safe ABI for multisig settings operations\n */\n\nexport const GNOSIS_SAFE_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"owner\", type: \"address\" },\n { internalType: \"uint256\", name: \"_threshold\", type: \"uint256\" },\n ],\n name: \"addOwnerWithThreshold\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"prevOwner\", type: \"address\" },\n { internalType: \"address\", name: \"owner\", type: \"address\" },\n { internalType: \"uint256\", name: \"_threshold\", type: \"uint256\" },\n ],\n name: \"removeOwner\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"prevOwner\", type: \"address\" },\n { internalType: \"address\", name: \"oldOwner\", type: \"address\" },\n { internalType: \"address\", name: \"newOwner\", type: \"address\" },\n ],\n name: \"swapOwner\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_threshold\", type: \"uint256\" }],\n name: \"changeThreshold\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getOwners\",\n outputs: [{ internalType: \"address[]\", name: \"\", type: \"address[]\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n];\n\n/**\n * ERC20 ABI for token transfers\n */\nexport const ERC20_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"to\", type: \"address\" },\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n];\n\n/**\n * Sentinel address used in Gnosis Safe for linked list operations\n */\nexport const SENTINEL_OWNERS = \"0x0000000000000000000000000000000000000001\";\n","import { ethers } from \"ethers\";\nimport { GNOSIS_SAFE_ABI, ERC20_ABI, SENTINEL_OWNERS } from \"./gnosis-abi\";\nimport {\n EChainType,\n EvmMethodType,\n ESolanaInstructionType,\n ETronOrderType,\n OrderInstruction,\n} from \"../core/types\";\n\nconst gnosisSafeInterface = new ethers.Interface(GNOSIS_SAFE_ABI);\nconst erc20Interface = new ethers.Interface(ERC20_ABI);\n\n/**\n * Determines if an order is a send order (token transfer)\n */\nexport function isSendOrder(method: string): boolean {\n const sendMethods = [\n \"native\",\n \"erc20\",\n \"spl\",\n \"trc20\",\n \"trc\",\n ESolanaInstructionType.native,\n ESolanaInstructionType.spl,\n ETronOrderType.native,\n ETronOrderType.trc20,\n ETronOrderType.trc,\n ];\n return sendMethods.includes(method);\n}\n\n/**\n * Determines if an order is a settings order (multisig configuration change)\n */\nexport function isSettingsOrder(method: string): boolean {\n return !isSendOrder(method);\n}\n\n/**\n * Determines the correct method based on changes to multisig\n * Based on frontend getChangeMethod logic\n */\nexport function getChangeMethod(\n chainType: EChainType,\n ownersAddedCount: number,\n ownersRemovedCount: number,\n thresholdChanged: boolean\n): string | null {\n\n const hasMultipleOwnerChanges =\n ownersAddedCount > 1 || ownersRemovedCount > 1;\n const hasMixedChanges =\n (ownersAddedCount > 0 && thresholdChanged) ||\n (ownersRemovedCount > 0 && thresholdChanged) ||\n (ownersRemovedCount > 0 && ownersAddedCount > 0);\n const isMultiSendCase = hasMultipleOwnerChanges || hasMixedChanges;\n\n if (isMultiSendCase) {\n if (chainType === EChainType.EVM) {\n return \"MultiSend\";\n } else if (chainType === EChainType.SOL) {\n return ESolanaInstructionType.MultiSend;\n } else if (chainType === EChainType.TRON) {\n return ETronOrderType.updateOwnerThreshold;\n }\n }\n\n if (ownersAddedCount === 1) {\n if (chainType === EChainType.EVM) {\n return \"AddOwner\";\n } else if (chainType === EChainType.SOL) {\n return ESolanaInstructionType.addOwner;\n } else if (chainType === EChainType.TRON) {\n return ETronOrderType.updateOwners;\n }\n } else if (ownersRemovedCount === 1) {\n if (chainType === EChainType.EVM) {\n return \"RemoveOwner\";\n } else if (chainType === EChainType.SOL) {\n return ESolanaInstructionType.removeOwner;\n } else if (chainType === EChainType.TRON) {\n return ETronOrderType.updateOwners;\n }\n } else if (thresholdChanged) {\n if (chainType === EChainType.EVM) {\n return \"ChangeThreshold\";\n } else if (chainType === EChainType.SOL) {\n return ESolanaInstructionType.changeThreshold;\n } else if (chainType === EChainType.TRON) {\n return ETronOrderType.changeThreshold;\n }\n }\n\n return null;\n}\n\nexport interface CreateEvmActionsParams {\n chainId: string;\n method: string;\n multisigAddress: string;\n threshold: number;\n newThreshold?: number | null;\n owners: string[];\n ownersAdded?: string[];\n ownersRemoved?: string[];\n provider?: ethers.JsonRpcProvider;\n}\n\n/**\n * Creates EVM actions (Gnosis Safe encoded function calls)\n * Based on frontend createEvmActions logic\n */\nexport async function createEvmActions(\n params: CreateEvmActionsParams\n): Promise<Array<{ to: string; data: string; value: string }>> {\n const {\n method,\n multisigAddress,\n threshold,\n newThreshold = null,\n owners,\n ownersAdded,\n ownersRemoved,\n provider,\n } = params;\n\n const actions: Array<{ to: string; data: string; value: string }> = [];\n const currentOwners = [...owners];\n\n let onChainOwners = currentOwners;\n if (provider && multisigAddress) {\n try {\n const safe = new ethers.Contract(\n multisigAddress,\n GNOSIS_SAFE_ABI,\n provider\n );\n onChainOwners = (await safe.getOwners()).toArray() as string[];\n } catch (error) {\n console.warn(\"Failed to fetch on-chain owners, using provided owners\");\n }\n }\n\n switch (method) {\n case \"AddOwner\":\n case \"addOwnerWithThreshold\":\n if (!ownersAdded || ownersAdded.length === 0) {\n throw new Error(\"Missing parameters for addOwner\");\n }\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\"addOwnerWithThreshold\", [\n ownersAdded[0],\n newThreshold || threshold,\n ]),\n value: \"0\",\n });\n break;\n\n case \"RemoveOwner\":\n case \"removeOwner\":\n if (!ownersRemoved || ownersRemoved.length === 0) {\n throw new Error(\"Missing parameters for removeOwner\");\n }\n const ownerToRemove = ownersRemoved[0];\n const ownerToRemoveLower = ownerToRemove.toLowerCase();\n\n const index = onChainOwners.findIndex(\n (owner) => owner.toLowerCase() === ownerToRemoveLower\n );\n if (index === -1) throw new Error(\"Owner not found\");\n if (onChainOwners.length === 2)\n throw new Error(\"Multisig should have at least 2 owners\");\n\n const prevOwner =\n index === 0 ? SENTINEL_OWNERS : onChainOwners[index - 1];\n\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\"removeOwner\", [\n prevOwner,\n ownerToRemove,\n newThreshold || threshold,\n ]),\n value: \"0\",\n });\n break;\n\n case \"ChangeThreshold\":\n case \"changeThreshold\":\n if (newThreshold == null) {\n throw new Error(\"Missing parameters for changeThreshold\");\n }\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\"changeThreshold\", [\n newThreshold,\n ]),\n value: \"0\",\n });\n break;\n\n case \"MultiSend\":\n case \"multiSend\": {\n const ownersToProcessAdd = [...(ownersAdded ?? [])];\n const ownersToProcessRemove = [...(ownersRemoved ?? [])];\n\n // Optimize: swap owners where possible\n if (ownersToProcessAdd.length > 0 && ownersToProcessRemove.length > 0) {\n const swapCount = Math.min(\n ownersToProcessAdd.length,\n ownersToProcessRemove.length\n );\n\n for (let i = 0; i < swapCount; i++) {\n const oldOwner = ownersToProcessRemove.shift()!;\n const newOwner = ownersToProcessAdd.shift()!;\n\n const oldOwnerLower = oldOwner.toLowerCase();\n const ownerIndex = onChainOwners.findIndex(\n (o) => o.toLowerCase() === oldOwnerLower\n );\n\n if (ownerIndex === -1) {\n throw new Error(\n `Owner to remove (${oldOwner}) not found on-chain for swap.`\n );\n }\n\n const prevOwnerForSwap =\n ownerIndex === 0 ? SENTINEL_OWNERS : onChainOwners[ownerIndex - 1];\n\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\"swapOwner\", [\n prevOwnerForSwap,\n oldOwner,\n newOwner,\n ]),\n value: \"0\",\n });\n\n onChainOwners.splice(ownerIndex, 1, newOwner);\n }\n }\n\n // Add remaining owners\n if (ownersToProcessAdd.length > 0) {\n ownersToProcessAdd.forEach((owner) => {\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\n \"addOwnerWithThreshold\",\n [owner, newThreshold ?? threshold]\n ),\n value: \"0\",\n });\n onChainOwners.push(owner);\n });\n }\n\n if (ownersToProcessRemove.length > 0) {\n ownersToProcessRemove.forEach((ownerToRemove) => {\n const ownerToRemoveLower = ownerToRemove.toLowerCase();\n const index = onChainOwners.findIndex(\n (owner) => owner.toLowerCase() === ownerToRemoveLower\n );\n\n if (index === -1) {\n throw new Error(`Owner to remove (${ownerToRemove}) not found.`);\n }\n\n const prevOwner =\n index === 0 ? SENTINEL_OWNERS : onChainOwners[index - 1];\n\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\"removeOwner\", [\n prevOwner,\n ownerToRemove,\n newThreshold ?? threshold,\n ]),\n value: \"0\",\n });\n\n onChainOwners.splice(index, 1);\n });\n }\n\n if (\n newThreshold != null &&\n ownersToProcessAdd.length === 0 &&\n ownersToProcessRemove.length === 0\n ) {\n actions.push({\n to: multisigAddress,\n data: gnosisSafeInterface.encodeFunctionData(\"changeThreshold\", [\n newThreshold,\n ]),\n value: \"0\",\n });\n }\n\n if (actions.length === 0) {\n throw new Error(\"MultiSend method called with no actions to create.\");\n }\n break;\n }\n\n default:\n throw new Error(`Unsupported EVM method: ${method}`);\n }\n\n return actions;\n}\n\n/**\n * Creates EVM send action (native or ERC20 token transfer)\n */\nexport function createEvmSendAction(\n to: string,\n amount: string,\n isNative: boolean,\n tokenAddress?: string,\n decimals?: number\n): { to: string; data: string; value: string } {\n if (isNative) {\n const valueInWei = ethers.parseUnits(amount, 18).toString();\n return {\n to,\n data: \"0x\",\n value: valueInWei,\n };\n } else {\n // ERC20 token transfer\n if (!tokenAddress || decimals === undefined) {\n throw new Error(\"Token address and decimals required for ERC20 transfer\");\n }\n const valueInUnits = ethers.parseUnits(amount, decimals);\n const data = erc20Interface.encodeFunctionData(\"transfer\", [\n to,\n valueInUnits,\n ]);\n return {\n to: tokenAddress,\n data,\n value: \"0\",\n };\n }\n}\n\n/**\n * Creates Solana instructions for settings orders\n * Based on frontend createSolanaInstructions logic\n */\nexport function createSolanaInstructions(\n method: string,\n ownersAdded?: string[],\n ownersRemoved?: string[],\n newThreshold?: number\n): OrderInstruction[] {\n const instructions: OrderInstruction[] = [];\n\n switch (method) {\n case ESolanaInstructionType.addOwner:\n case \"addOwner\":\n if (!ownersAdded || ownersAdded.length === 0)\n throw new Error(\"Missing parameters for Solana addOwner instruction.\");\n return [{ type: method, newOwner: ownersAdded[0] }];\n\n case ESolanaInstructionType.removeOwner:\n case \"removeOwner\":\n if (!ownersRemoved || ownersRemoved.length === 0)\n throw new Error(\n \"Missing parameters for Solana removeOwner instruction.\"\n );\n return [{ type: method, removeOwner: ownersRemoved[0] }];\n\n case ESolanaInstructionType.changeThreshold:\n case \"changeThreshold\":\n if (newThreshold === undefined)\n throw new Error(\n \"Missing parameters for Solana changeThreshold instruction.\"\n );\n return [{ type: method, newThreshold: newThreshold }];\n\n case ESolanaInstructionType.MultiSend:\n case \"MultiSend\":\n if (ownersAdded && ownersAdded.length > 0) {\n ownersAdded.forEach((owner) => {\n instructions.push({\n type: ESolanaInstructionType.addOwner,\n newOwner: owner,\n });\n });\n }\n\n if (ownersRemoved && ownersRemoved.length > 0) {\n ownersRemoved.forEach((owner) => {\n instructions.push({\n type: ESolanaInstructionType.removeOwner,\n removeOwner: owner,\n });\n });\n }\n\n if (newThreshold !== undefined) {\n instructions.push({\n type: ESolanaInstructionType.changeThreshold,\n newThreshold: newThreshold,\n });\n }\n\n if (instructions.length === 0) {\n throw new Error(\"MultiSend method called with no actions to create.\");\n }\n return instructions;\n\n default:\n throw new Error(`Unsupported Solana instruction method: ${method}`);\n }\n}\n\n/**\n * Creates Tron instruction for settings orders\n * Based on frontend createTronInstructions logic\n */\nexport function createTronInstruction(\n method: string,\n owners?: string[],\n newThreshold?: number\n): OrderInstruction {\n switch (method) {\n case ETronOrderType.updateOwners:\n case \"updateOwners\":\n if (!owners) {\n throw new Error(\n \"Owners are required for Tron updateOwners instruction.\"\n );\n }\n return { type: method, owners: owners };\n\n case ETronOrderType.changeThreshold:\n case \"changeThreshold\":\n if (newThreshold === undefined) {\n throw new Error(\n \"New threshold is required for Tron changeThreshold instruction.\"\n );\n }\n return { type: method, newThreshold: newThreshold };\n\n case ETronOrderType.updateOwnerThreshold:\n case \"updateOwnerThreshold\":\n if (!owners || newThreshold === undefined) {\n throw new Error(\n \"Both owners and newThreshold are required for Tron updateOwnerThreshold instruction.\"\n );\n }\n return {\n type: method,\n owners: owners,\n newThreshold: newThreshold,\n };\n\n default:\n throw new Error(\"Unsupported Tron instruction method.\");\n }\n}\n","import { EChainType as EChainTypeEnum, ESolanaInstructionType as ESolanaInstructionTypeEnum } from '../../core/types';\nimport { TRON_FULL_HOST as TRON_FULL_HOST_CONFIG } from '../../core/config';\nexport type { ChainType as EChainTypeValue, ChainIdValue, NetworkMode } from '../../core/types';\n\nexport const EChainType = EChainTypeEnum;\nexport type EChainType = EChainTypeEnum;\n\nexport const ESolanaInstructionType = ESolanaInstructionTypeEnum;\nexport type ESolanaInstructionType = ESolanaInstructionTypeEnum;\n\nexport const TRON_FULL_HOST = TRON_FULL_HOST_CONFIG;\nexport const IS_MAINNET = process.env.IS_MAINNET === \"true\" || false;\n\nexport const BTC_API_TESTNET_MEMPOOL = \"https://mempool.space/testnet/api\";\n\nexport interface IframeTxResponse {\n tx: string;\n updatedDeviceShare: string | null;\n}\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 amountNum?: number;\n priceUsd?: number;\n priceChange24h?: number;\n valueUsd?: number;\n}\n\nexport interface SolOrderData<T> {\n deviceShare: string;\n address: string;\n accessToken: string;\n multisigPda: string;\n method: string;\n instructions: T;\n orderId: string;\n rpcUrl: string;\n threshold?: number;\n vaultAddress: string;\n selectedToken: TokenMultisignBalance;\n}\n\nexport interface BtcOrderData {\n orderId: string;\n multisigId: string;\n data: string;\n walletInitiator: string;\n to: string;\n value: string;\n feeSats: string;\n}\n\nexport interface TronOrderData {\n transaction: any;\n orderId: string;\n multisigId: string;\n isUpdateMultisigParams?: boolean;\n}\n\nexport interface MultisigParams {\n multisigPda: string;\n transactionIndex: string;\n orderId: string;\n rpcUrl: string;\n index?: string;\n}\n","import { ethers } from \"ethers\";\nimport { combine } from \"shamir-secret-sharing\";\nimport { Keypair } from \"@solana/web3.js\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Buffer } from 'buffer';\nimport { ECPairFactory } from \"ecpair\";\nimport * as bitcoin from \"bitcoinjs-lib\";\n\nconst ECPair = ECPairFactory(ecc);\n\nconst IS_MAINNET = process.env.IS_MAINNET === \"true\" || false;\n\nexport const combineShares = async (shares: string[]): Promise<Uint8Array> => {\n const shareBuffers = shares.map((share) => ethers.getBytes(share));\n const reconstructed = await combine(shareBuffers);\n return reconstructed;\n};\n\nexport const combineSolanaSharesToPrivateKey = (\n raw: Uint8Array\n): Uint8Array => {\n const key = Keypair.fromSecretKey(raw);\n return key.secretKey;\n};\n\nexport const combineEvmSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const reconstructedPK = \"0x\" + Buffer.from(raw).toString(\"hex\");\n return reconstructedPK;\n};\n\nexport const combineBtcSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const keyPair = ECPair.fromPrivateKey(Buffer.from(raw), {\n network: IS_MAINNET ? bitcoin.networks.bitcoin : bitcoin.networks.testnet,\n });\n return keyPair.toWIF();\n};\n\nexport const combineTronSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const privateKey = Buffer.from(raw).toString(\"hex\");\n return privateKey;\n};\n","import { ethers } from 'ethers';\nimport { combineShares as shamirCombine } from '../../../crypto/shamir';\nimport { hexToBytes, bytesToHex, encryptRsaOaep } from '../../../crypto/util';\nimport type { EChainTypeValue } from '../types';\n\n\nexport const fetchServerShare = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(\n `${apiUrl}/sdk/wallets/share/c/${chainType}/${walletAddress}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n },\n credentials: \"include\",\n }\n );\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch server share\");\n }\n\n const data = await res.json();\n return data.share;\n};\n\nexport const fetchRecoveryShare = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(\n `${apiUrl}/sdk/wallets/share/s/${chainType}/${walletAddress}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n },\n credentials: \"include\",\n }\n );\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch recovery share\");\n }\n\n const data = await res.json();\n return data.share;\n};\n\nexport const fetchShares = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<{\n recovery: string;\n server: string;\n}> => {\n const [recovery, server] = await Promise.all([\n fetchRecoveryShare(apiKey, walletAddress, chainType, apiUrl),\n fetchServerShare(apiKey, walletAddress, chainType, apiUrl),\n ]);\n return {\n recovery,\n server,\n };\n};\n\nexport const fetchMultisigServerShare = async (\n multisigId: string,\n walletAddress: string,\n apiKey: string,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(`${apiUrl}/sdk/multisig/share/tron`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n body: JSON.stringify({\n multisigId,\n walletAddress,\n }),\n });\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch multisig server share\");\n }\n\n const data = await res.json();\n if (!data?.share) {\n throw new Error(\"Failed to fetch multisig server share\");\n }\n\n return data.share;\n};\n\nexport interface SplitPrivateKey {\n deviceShare: string;\n serverShare: string;\n recoveryShare: string;\n}\n\nexport const SHAMIR_THRESHOLD_PERSONAL = 2;\nexport const SHAMIR_SHARES_NUM = 3;\n\nexport const combineSharesFromHex = async (shares: string[]): Promise<Uint8Array> => {\n const { combine } = await import('shamir-secret-sharing');\n const shareBuffers = shares.map((share) => ethers.getBytes(share));\n const reconstructed = await combine(shareBuffers);\n return reconstructed;\n};\n\nexport const splitPrivateKey = async (\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> => {\n const { split } = await import('shamir-secret-sharing');\n const shares = await split(\n privateKeyBytes,\n SHAMIR_SHARES_NUM,\n SHAMIR_THRESHOLD_PERSONAL\n );\n const { ethers } = await import('ethers');\n\n const deviceShare = ethers.hexlify(shares[0]);\n const serverShare = ethers.hexlify(shares[1]);\n const recoveryShare = ethers.hexlify(shares[2]);\n return {\n deviceShare,\n serverShare,\n recoveryShare,\n };\n};\n\nexport const createShares = async (\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> => {\n if (!privateKeyBytes) {\n throw new Error(\"Cannot create shares\");\n }\n const shares = await splitPrivateKey(privateKeyBytes);\n return shares;\n};\n\nexport const updateShares = async (\n walletAddress: string,\n serverShare: string,\n recoveryShare: string,\n apiKey: string,\n apiUrl: string\n): Promise<{\n device: string;\n server: string;\n recovery: string;\n}> => {\n try {\n const reconstructed = await combineSharesFromHex([recoveryShare, serverShare]);\n const shares = await createShares(reconstructed);\n const pubkeyResponse = await fetch(`${apiUrl}/sdk/wallets/pubkey`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n });\n\n if (!pubkeyResponse.ok) {\n await pubkeyResponse.text().catch(() => \"N/A\");\n console.error(\n `Critical Failure [${walletAddress}]: STEP 2 (Get Pubkey). Status: ${pubkeyResponse.status}.`\n );\n throw new Error(\n `Failed to fetch public key. Status: ${pubkeyResponse.status}`\n );\n }\n\n const { pubkey } = await pubkeyResponse.json();\n const encryptedRecoveryShare = await encryptRsaOaep(\n pubkey,\n shares.recoveryShare\n );\n const updateResponse = await fetch(`${apiUrl}/sdk/wallets/update`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n body: JSON.stringify({\n walletAddress,\n serverShare: shares.serverShare,\n encryptedRecoveryShare,\n }),\n });\n\n if (!updateResponse.ok) {\n await updateResponse.text().catch(() => \"N/A\");\n console.error(\n `Critical Failure [${walletAddress}]: STEP 4 (Update Shares). Status: ${updateResponse.status}.`\n );\n throw new Error(\n `Failed to update shares on server. Status: ${updateResponse.status}`\n );\n }\n\n return {\n recovery: \"\",\n server: shares.serverShare,\n device: shares.deviceShare,\n };\n } catch (err) {\n console.error(`UpdateShares Critical Failure for ${walletAddress}:`, err);\n throw err;\n }\n};\n","import { fetchServerShare, fetchShares, updateShares } from \"../api/wallet\";\nimport type { EChainTypeValue } from \"../types\";\n\nconst API_URL = process.env.AFRIDAX_API_URL || \"https://afridax-backend-production.up.railway.app\";\n\nexport const getReconstructionShares = async (\n deviceShare: string,\n walletAddress: string,\n apiKey: string,\n forceUpdate: boolean,\n chainType: EChainTypeValue\n): Promise<{\n mainShare: string;\n additionalShare: string;\n newDeviceShare: string | null;\n}> => {\n let mainShare: string | null;\n let additionalShare: string | null;\n let newDeviceShare: string | null = null;\n debugger;\n\n if (forceUpdate || !deviceShare || deviceShare === \"-\") {\n const shares = await fetchShares(apiKey, walletAddress, chainType, API_URL);\n const { device, server } = await updateShares(\n walletAddress,\n shares.server,\n shares.recovery,\n apiKey,\n API_URL\n );\n mainShare = device;\n additionalShare = server;\n newDeviceShare = device;\n } else {\n const serverShare = await fetchServerShare(apiKey, walletAddress, chainType, API_URL);\n mainShare = deviceShare;\n additionalShare = serverShare;\n }\n\n if (!mainShare || !additionalShare) {\n throw new Error(\"Failed to retrieve key shares.\");\n }\n\n return { mainShare, additionalShare, newDeviceShare };\n};\n","import { Keypair } from \"@solana/web3.js\";\nimport { EChainType } from \"../../types\";\nimport { combineShares } from \"../../utils/crypto\";\nimport { getReconstructionShares } from \"../../utils/getReconstructionShares\";\n\nexport const reconstructAndVerifySolKey = async (\n deviceShare: string,\n address: string,\n accessToken: string,\n forceUpdate: boolean\n): Promise<{ signer: Keypair; newDeviceShare: string | null }> => {\n const { mainShare, additionalShare, newDeviceShare } =\n await getReconstructionShares(\n deviceShare,\n address,\n accessToken,\n forceUpdate,\n EChainType.SOL\n );\n const reconstructed = await combineShares([mainShare, additionalShare]);\n\n let signer: Keypair;\n\n try {\n signer = Keypair.fromSecretKey(reconstructed);\n } catch (err: any) {\n console.error(\"Keypair reconstruction failed:\", err.message);\n\n throw new Error(\"KEY_MISMATCH\");\n }\n\n if (signer.publicKey.toBase58() !== address) {\n throw new Error(\"KEY_MISMATCH\");\n }\n\n return { signer, newDeviceShare };\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport { ESolanaInstructionType, type SolOrderData } from \"../../../types\";\nimport * as Squads from \"@sqds/multisig\";\n\nexport const prepareActions = (props: SolOrderData<any>): any[] => {\n const { instructions, threshold } = props;\n\n switch (instructions.type) {\n case ESolanaInstructionType.addOwner: {\n const newMember = instructions.newOwner;\n if (!newMember) {\n throw new Error(\"Error: newMember doesn't exist\");\n }\n const add = {\n __kind: \"AddMember\",\n newMember: {\n key: new PublicKey(newMember),\n permissions: Squads.types.Permissions.all(),\n },\n };\n const changeThreshold = {\n __kind: \"ChangeThreshold\",\n newThreshold: threshold,\n };\n const actions = threshold ? [add, changeThreshold] : [add];\n return actions;\n }\n\n case ESolanaInstructionType.removeOwner: {\n const oldMember = instructions.removeOwner;\n if (!oldMember) {\n throw new Error(\"Error: oldMember doesn't exist\");\n }\n const remove = {\n __kind: \"RemoveMember\",\n oldMember: new PublicKey(oldMember),\n };\n const changeThreshold = {\n __kind: \"ChangeThreshold\",\n newThreshold: threshold,\n };\n const actions = threshold ? [remove, changeThreshold] : [remove];\n return actions;\n }\n\n case ESolanaInstructionType.changeThreshold: {\n const newThreshold = instructions.newThreshold;\n const change = {\n __kind: \"ChangeThreshold\",\n newThreshold,\n };\n const actions = [change];\n return actions;\n }\n case ESolanaInstructionType.spl: {\n throw new Error(\"SPL instructions are not yet supported.\");\n }\n default:\n throw new Error(`Unsupported method type: ${instructions?.type}`);\n }\n};\n","export const solToLamports = (amountString: string | number): bigint => {\n const amount = String(amountString);\n const DECIMAL_REGEX = /^\\d+(\\.\\d{1,9})?$/;\n\n let numericValue: number;\n try {\n numericValue = parseFloat(amount);\n } catch (e) {\n throw new Error(\"Invalid number format for SOL amount.\");\n }\n\n if (isNaN(numericValue) || numericValue < 0) {\n throw new Error(\"Invalid or negative SOL amount provided.\");\n }\n\n const fixedAmountString = numericValue.toFixed(9).replace(/\\.?0+$/, \"\");\n\n if (!DECIMAL_REGEX.test(fixedAmountString)) {\n throw new Error(\n \"SOL amount must have up to 9 decimal places and contain only digits and a period.\"\n );\n }\n\n const lamportsNumber = Math.floor(numericValue * 1_000_000_000);\n\n if (lamportsNumber === 0 && numericValue > 0) {\n throw new Error(\n \"Amount is too small to be represented in lamports (potential dust).\"\n );\n }\n\n return BigInt(lamportsNumber);\n};\n","import type { Connection, PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\n\nexport const detectTokenProgram = async (\n connection: Connection,\n mintPublicKey: PublicKey\n): Promise<PublicKey> => {\n try {\n const accountInfo = await connection.getAccountInfo(mintPublicKey);\n\n if (!accountInfo) {\n throw new Error(\"Token mint account not found\");\n }\n\n if (accountInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) {\n console.log(\"Detected Token-2022 (Token Extensions) program\");\n return TOKEN_2022_PROGRAM_ID;\n }\n\n console.log(\"Detected legacy Token program\");\n return TOKEN_PROGRAM_ID;\n } catch (error) {\n console.warn(\n \"Failed to detect token program, defaulting to TOKEN_PROGRAM_ID:\",\n error\n );\n return TOKEN_PROGRAM_ID;\n }\n};\n","import {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionMessage,\n} from \"@solana/web3.js\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n createTransferCheckedInstruction,\n createAssociatedTokenAccountInstruction,\n} from \"@solana/spl-token\";\nimport {\n ESolanaInstructionType,\n type IframeTxResponse,\n type SolOrderData,\n} from \"../../types\";\nimport * as Squads from \"@sqds/multisig\";\nimport { reconstructAndVerifySolKey } from \"./utils/reconstructAndVerifySolKey\";\nimport { prepareActions } from \"./utils/prepareActions\";\nimport { solToLamports } from \"./utils/solToLamports\";\nimport { detectTokenProgram } from \"./utils/detectTokenProgram\";\n\nconst parseTokenAmount = (amount: string, decimals: number): bigint => {\n const [whole = \"0\", fraction = \"\"] = amount.split(\".\");\n const fracPadded = (fraction + \"0\".repeat(decimals)).slice(0, decimals);\n const combined = whole + (fracPadded || \"0\".repeat(decimals));\n const normalized = combined.replace(/^0+(?=\\d)/, \"\");\n return normalized === \"\" ? 0n : BigInt(normalized);\n};\n\nexport const createSolanaMultisigOrder = async (\n props: SolOrderData<any[]>\n): Promise<IframeTxResponse> => {\n const {\n deviceShare,\n address,\n accessToken,\n multisigPda,\n method,\n instructions,\n orderId,\n rpcUrl,\n vaultAddress,\n selectedToken,\n } = props;\n\n let signer: Keypair;\n let updatedDeviceShare: string | null = null;\n\n try {\n const result = await reconstructAndVerifySolKey(\n deviceShare,\n address,\n accessToken,\n false\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (error: any) {\n if (error.message !== \"KEY_MISMATCH\") {\n throw error;\n }\n\n try {\n const result = await reconstructAndVerifySolKey(\n deviceShare,\n address,\n accessToken,\n true\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (retryError: any) {\n throw new Error(\n \"Wallet key verification failed, even after forcing a share update. The account may be corrupted.\"\n );\n }\n }\n\n const connection = new Connection(rpcUrl, \"confirmed\");\n\n const multisigPkey = new PublicKey(multisigPda);\n const multisigInfo = await Squads.accounts.Multisig.fromAccountAddress(\n connection,\n multisigPkey\n );\n const transactionIndex =\n BigInt(multisigInfo.transactionIndex.toString()) + 1n;\n\n const tx = new Transaction();\n const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n\n if (method === ESolanaInstructionType.native) {\n if (!instructions[0].toPubkey || !instructions[0].amount) {\n throw new Error(\"Error: toPubkey or amount doesn't exist\");\n }\n const lamports = solToLamports(String(instructions[0].amount));\n\n const instructionIx = SystemProgram.transfer({\n fromPubkey: new PublicKey(vaultAddress),\n toPubkey: new PublicKey(instructions[0].toPubkey),\n lamports,\n });\n\n const transferMessage = new TransactionMessage({\n payerKey: new PublicKey(vaultAddress),\n recentBlockhash,\n instructions: [instructionIx],\n });\n\n const ix = Squads.instructions.vaultTransactionCreate({\n multisigPda: multisigPkey,\n transactionIndex: transactionIndex,\n creator: signer.publicKey,\n vaultIndex: 0,\n ephemeralSigners: 0,\n transactionMessage: transferMessage,\n memo: orderId,\n });\n\n tx.add(ix);\n } else if (method === ESolanaInstructionType.spl) {\n try {\n const inst = instructions[0];\n if (!inst?.toPubkey || !inst?.amount)\n throw new Error(\"SPL: missing toPubkey or amount\");\n if (!selectedToken?.address || typeof selectedToken.decimals !== \"number\")\n throw new Error(\"SPL: selectedToken info missing (mint/decimals)\");\n\n const [vaultPda] = Squads.getVaultPda({\n multisigPda: multisigPkey,\n index: 0,\n });\n\n const mint = new PublicKey(selectedToken.address);\n const recipient = new PublicKey(inst.toPubkey);\n\n const tokenProgramId = await detectTokenProgram(connection, mint);\n console.log(`🔍 Using token program: ${tokenProgramId.toBase58()}`);\n\n const tokenAccounts = await connection.getTokenAccountsByOwner(vaultPda, {\n mint,\n programId: tokenProgramId,\n });\n if (tokenAccounts.value.length === 0) {\n throw new Error(\n `SPL: vault has no token account for mint ${selectedToken.address}`\n );\n }\n const fromAta = tokenAccounts.value[0].pubkey;\n\n const toAta = await getAssociatedTokenAddress(\n mint,\n recipient,\n true,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const instructionsList = [];\n const toAtaInfo = await connection.getAccountInfo(toAta);\n if (!toAtaInfo) {\n instructionsList.push(\n createAssociatedTokenAccountInstruction(\n signer.publicKey,\n toAta,\n recipient,\n mint,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n )\n );\n }\n\n const amount = parseTokenAmount(\n String(inst.amount),\n selectedToken.decimals\n );\n if (amount <= 0n) throw new Error(\"SPL: amount must be > 0\");\n\n instructionsList.push(\n createTransferCheckedInstruction(\n fromAta,\n mint,\n toAta,\n vaultPda,\n amount,\n selectedToken.decimals,\n [],\n tokenProgramId\n )\n );\n\n const transferMessage = new TransactionMessage({\n payerKey: vaultPda,\n recentBlockhash,\n instructions: instructionsList,\n });\n\n const ix = Squads.instructions.vaultTransactionCreate({\n multisigPda: multisigPkey,\n transactionIndex,\n creator: signer.publicKey,\n vaultIndex: 0,\n ephemeralSigners: 0,\n transactionMessage: transferMessage,\n memo: orderId,\n });\n\n tx.add(ix);\n } catch (err) {\n console.error(\"createSolanaMultisigOrder (SPL) failed:\", err);\n throw err;\n }\n } else {\n const actions = props.instructions\n .map((inst) => prepareActions({ ...props, instructions: inst }))\n .flat();\n\n const ix = Squads.instructions.configTransactionCreate({\n multisigPda: multisigPkey,\n creator: signer.publicKey,\n transactionIndex: transactionIndex,\n actions: actions as any,\n memo: orderId,\n rentPayer: signer.publicKey,\n });\n tx.add(ix);\n }\n\n const proposalIx = Squads.instructions.proposalCreate({\n creator: signer.publicKey,\n multisigPda: multisigPkey,\n transactionIndex,\n });\n tx.add(proposalIx);\n tx.feePayer = signer.publicKey;\n tx.recentBlockhash = recentBlockhash;\n tx.partialSign(signer);\n\n const vaultTransaction = tx.serialize().toString(\"base64\");\n console.log(\"🚀 ~ vaultTransaction:\", vaultTransaction);\n\n return {\n tx: vaultTransaction,\n updatedDeviceShare,\n };\n};\n","\nimport { ethers } from 'ethers';\nimport { TransactionError } from '../../core/errors';\n\n/**\n * Chain configuration for gas limits\n */\nexport interface EvmChainConfig {\n key: string;\n chainId: string;\n maxGwei: number;\n}\n\n/**\n * Maximum gas price limits per chain (in Gwei)\n * These limits prevent users from accidentally paying excessive fees\n */\nexport const SYMBOLIC_GWEI_LIMITS: Record<string, number> = {\n ETH: 100,\n POL: 1000000,\n ARBITRUM: 150,\n OPTIMISM: 150,\n BASE: 150,\n BNB: 20,\n};\n\n/**\n * Chain ID mappings for mainnet and testnet\n */\nexport const MAINNET_CHAIN_IDS: Record<string, string> = {\n ETH: '1',\n POL: '137',\n ARBITRUM: '42161',\n OPTIMISM: '10',\n BASE: '8453',\n BNB: '56',\n};\n\nexport const TESTNET_CHAIN_IDS: Record<string, string> = {\n ETH_SEPOLIA: '11155111',\n POL: '80002',\n ARBITRUM_SEPOLIA: '421614',\n OPTIMISM_SEPOLIA: '11155420',\n BASE_SEPOLIA: '84532',\n BNB: '97',\n};\n\n/**\n * Get chain configuration by chain ID\n */\nexport function getChainConfig(chainId: string | number): EvmChainConfig | null {\n const numericId = String(chainId);\n\n // Check mainnet chains\n for (const [key, id] of Object.entries(MAINNET_CHAIN_IDS)) {\n if (id === numericId && SYMBOLIC_GWEI_LIMITS[key] !== undefined) {\n return {\n key,\n chainId: numericId,\n maxGwei: SYMBOLIC_GWEI_LIMITS[key],\n };\n }\n }\n\n // Check testnet chains\n for (const [key, id] of Object.entries(TESTNET_CHAIN_IDS)) {\n const baseKey = key.replace('_SEPOLIA', '');\n if (id === numericId && SYMBOLIC_GWEI_LIMITS[baseKey] !== undefined) {\n return {\n key: baseKey,\n chainId: numericId,\n maxGwei: SYMBOLIC_GWEI_LIMITS[baseKey],\n };\n }\n }\n\n return null;\n}\n\n/**\n * Recommended maximum gas limits\n */\nexport const MAX_GAS_LIMIT_NATIVE = 500000;\nexport const MAX_GAS_LIMIT_ERC20 = 200000;\n\n/**\n * Validate EVM transaction parameters before signing\n */\nexport function validateEvmTransaction(\n transaction: ethers.Transaction,\n expectedChainId: number\n): void {\n // Validate chain ID\n const expectedChainIdBigInt = BigInt(expectedChainId);\n if (transaction.chainId !== expectedChainIdBigInt) {\n throw new TransactionError(\n `Chain ID mismatch. Expected: ${expectedChainId}, Received: ${transaction.chainId}`,\n { details: { expectedChainId, receivedChainId: transaction.chainId } }\n );\n }\n\n // Validate nonce\n if (transaction.nonce === undefined || transaction.nonce === null) {\n throw new TransactionError('Transaction nonce is missing');\n }\n\n // Determine if this is an ERC20 transfer\n const isERC20Transfer = transaction.data && transaction.data !== '0x';\n\n // Get chain configuration for gas price validation\n const chainConfig = getChainConfig(expectedChainId);\n if (!chainConfig) {\n throw new TransactionError(`Unsupported EVM chain ID: ${expectedChainId}`);\n }\n\n // Validate gas limit\n const maxGasLimit = isERC20Transfer ? MAX_GAS_LIMIT_ERC20 : MAX_GAS_LIMIT_NATIVE;\n if (transaction.gasLimit && transaction.gasLimit > BigInt(maxGasLimit)) {\n console.warn(\n `Gas limit (${transaction.gasLimit}) exceeds recommended maximum (${maxGasLimit})`\n );\n }\n\n // Validate gas price\n const maxGasPrice = ethers.parseUnits(String(chainConfig.maxGwei), 'gwei');\n\n if (transaction.gasPrice && transaction.gasPrice > maxGasPrice) {\n throw new TransactionError(\n `Gas price exceeds safe limit for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`,\n { details: { gasPrice: transaction.gasPrice, maxGasPrice } }\n );\n }\n\n if (transaction.maxFeePerGas && transaction.maxFeePerGas > maxGasPrice) {\n throw new TransactionError(\n `Max Fee Per Gas exceeds safe limit for ${chainConfig.key}. Limit: ${chainConfig.maxGwei} Gwei`,\n { details: { maxFeePerGas: transaction.maxFeePerGas, maxGasPrice } }\n );\n }\n\n // Validate ERC20 transfer data\n if (isERC20Transfer) {\n validateERC20TransferData(transaction);\n }\n\n // Warn if ERC20 transfer includes native token value\n if (isERC20Transfer && transaction.value && transaction.value > 0n) {\n console.warn('ERC20 transfer includes native token value - this is unusual');\n }\n}\n\n/**\n * Validate ERC20 transfer function data\n */\nfunction validateERC20TransferData(transaction: ethers.Transaction): void {\n try {\n const transferSignature = '0xa9059cbb'; // transfer(address,uint256)\n\n if (!transaction.data.startsWith(transferSignature)) {\n console.warn('Transaction contains data but not a standard ERC20 transfer');\n return;\n }\n\n const dataWithoutSig = transaction.data.slice(10);\n if (dataWithoutSig.length !== 128) {\n throw new TransactionError('Invalid ERC20 transfer data length');\n }\n\n // Extract and validate recipient address\n const recipientHex = '0x' + dataWithoutSig.slice(24, 64);\n const recipient = ethers.getAddress(recipientHex);\n\n if (!ethers.isAddress(recipient)) {\n throw new TransactionError('Invalid recipient address in transfer data');\n }\n\n // Extract and validate amount\n const amountHex = '0x' + dataWithoutSig.slice(64, 128);\n const amount = BigInt(amountHex);\n\n if (amount <= 0n) {\n throw new TransactionError('Invalid transfer amount');\n }\n } catch (error) {\n if (error instanceof TransactionError) {\n throw error;\n }\n console.error('Error validating ERC20 data:', error);\n throw new TransactionError('Not standard transaction');\n }\n}\n","import { AfridaxSDK } from './core/sdk';\n\nexport { AfridaxSDK };\nexport default AfridaxSDK;\n\nexport type {\n CreateWalletInput,\n CreateWalletOutput,\n ImportWalletInput,\n DeleteWalletInput,\n GetWalletInput,\n GetWalletsInput,\n GetPortfolioInput,\n SendTransactionInput,\n SendTransactionOutput,\n SendTokenInput,\n EstimateFeeInput,\n ExportWalletInput,\n ExportWalletOutput,\n UpdateWalletNameInput,\n CreateMultisigInput,\n GetMultisigsInput,\n GetMultisigByIdInput,\n ActivateMultisigInput,\n ActivateMultisigOutput,\n EstimateActivationFeeInput,\n UpdateMultisigNameInput,\n DeleteMultisigInput,\n CreateOrderInput,\n CreateOrderOutput,\n SignOrderInput,\n SignOrderOutput,\n RejectOrderInput,\n ExecuteOrderInput,\n ExecuteOrderOutput,\n EstimateOrderExecutionFeeInput,\n GetOrdersInput,\n GetOrderByIdInput,\n DeleteOrderInput,\n GetSupportedTokensInput,\n GetWalletHistoryInput,\n GetMultisigTxHistoryInput,\n} from './core/sdk';\n\n\nexport type {\n // Chain types\n ChainType,\n ChainIdValue,\n\n // Wallet types\n TWallet,\n TokenInfo,\n CreateWalletResponse,\n SingleWalletDetailsResponse,\n PaginatedWalletsResponse,\n WalletRenameResponse,\n WalletPortfolioResponse,\n SupportedTokensResponse,\n TotalAssetValueResponse,\n\n // Multisig types\n MultisigsItem,\n\n // Order types\n Order,\n OrderInstruction,\n OrderSigner,\n PaginatedOrdersResponse,\n OrderMethodType,\n\n // Fee types\n EstimatedFee,\n\n // History types\n TransactionHistoryItem,\n HistoryResponse,\n TxHistoryCombinedResponse,\n\n // Common types\n DeleteResponse,\n\n // SDK configuration\n SDKConfig,\n MultisigBaseDTO\n} from './core/types';\n\nexport {\n EChainType,\n StatusFilterEnum,\n OrderStatus,\n MultisigStatus,\n getBtcChainType,\n} from './core/types';\n\nexport {\n AfridaxBaseError,\n ApiError,\n KeyMismatchError,\n InsufficientBalanceError,\n ChainNotSupportedError,\n NetworkError,\n InvalidInputError,\n UnauthorizedError,\n NotFoundError,\n isAfridaxError,\n} from './core/errors';\n","\nimport {\n SDKConfig,\n EChainType,\n ChainIdValue,\n TWallet,\n CreateWalletResponse,\n PaginatedWalletsResponse,\n WalletRenameResponse,\n WalletPortfolioResponse,\n SupportedTokensResponse,\n TotalAssetValueResponse,\n MultisigsItem,\n Order,\n OrderInstruction,\n OrderMethodType,\n PaginatedOrdersResponse,\n EstimatedFee,\n HistoryResponse,\n TxHistoryCombinedResponse,\n DeleteResponse,\n TokenInfo,\n TransactionParams,\n MainnetChainId,\n TestnetChainId,\n _setGlobalNetworkMode,\n ActivateMultisigInput,\n MultisigBaseDTO,\n} from \"./types\";\nimport type { ResolvedConfig } from \"./config\";\nimport { resolveConfig } from \"./config\";\nimport { ApiClient } from \"../api/client\";\nimport { WalletApi } from \"../api/wallet.api\";\nimport { MultisigApi } from \"../api/multisig.api\";\nimport { OrderApi } from \"../api/order.api\";\nimport { WalletKeyManager } from \"../services/wallet-key-manager\";\nimport { TransactionService } from \"../services/transaction.service\";\nimport { WalletService } from \"../services/wallet.service\";\nimport { KeyReconstructor } from \"../services/key-reconstructor\";\nimport { BlockchainAdapter } from \"../strategies/blockchain-adapter\";\n\nexport interface CreateWalletInput {\n chain: EChainType;\n}\n\nexport interface CreateWalletOutput {\n wallets: TWallet[];\n deviceShare: string;\n}\nexport interface ImportWalletInput {\n chain: EChainType;\n privateKey: string;\n}\n\nexport interface DeleteWalletInput {\n chain: EChainType;\n address: string;\n}\nexport interface GetWalletInput {\n address: string;\n}\n\nexport interface GetWalletsInput {\n chain?: EChainType;\n page?: number;\n limit?: number;\n}\n\nexport interface GetPortfolioInput {\n chain: EChainType;\n address: string;\n chainId: ChainIdValue;\n}\n\nexport interface SendTransactionInput {\n chain: EChainType;\n from: string;\n to: string;\n amount: string;\n deviceShare: string;\n chainId?: number;\n feeHint?: EstimatedFee;\n}\n\nexport interface SendTransactionOutput {\n txHash: string;\n updatedDeviceShare: string | null;\n}\nexport interface SendTokenInput {\n chain: EChainType;\n from: string;\n to: string;\n amount: string;\n tokenAddress: string;\n decimals: number;\n deviceShare: string;\n chainId?: number;\n}\n\n/** Input for estimateFee */\nexport interface EstimateFeeInput {\n chain: EChainType;\n txType:\n | \"send\"\n | \"sendToken\"\n | \"createOrder\"\n | \"signOrder\"\n | \"executeOrder\"\n | \"activateMultisig\";\n from?: string;\n to?: string;\n amount?: string;\n tokenAddress?: string;\n decimals?: number;\n chainId?: number;\n orderId?: string;\n multisigId?: string;\n}\n\n/** Input for exportWallet */\nexport interface ExportWalletInput {\n chain: EChainType;\n address: string;\n deviceShare: string;\n format?: \"hex\" | \"wif\" | \"bs58\";\n}\n\n/** Output for exportWallet */\nexport interface ExportWalletOutput {\n privateKey: string;\n updatedDeviceShare: string | null;\n}\n\n/** Input for updateWalletName */\nexport interface UpdateWalletNameInput {\n chain: EChainType;\n address: string;\n name: string;\n}\n\n/** Input for createMultisig */\nexport interface CreateMultisigInput {\n chain: EChainType;\n owners: string[];\n threshold: number;\n chainIds?: ChainIdValue[];\n}\n\n/** Input for getMultisigs */\nexport interface GetMultisigsInput {\n chain: EChainType;\n walletAddress?: string;\n}\n\n/** Input for getMultisigById */\nexport interface GetMultisigByIdInput {\n chain: EChainType;\n address: string;\n}\n\n/** Input for activateMultisig */\nexport type { ActivateMultisigInput } from \"./types\";\n\n/** Output for activateMultisig */\nexport interface ActivateMultisigOutput {\n txHash: string;\n updatedDeviceShare: string | null;\n}\n\n/** Input for estimateActivationFee */\nexport interface EstimateActivationFeeInput {\n chain: EChainType;\n multisigId?: string;\n owners?: string[];\n threshold?: number;\n chainId?: ChainIdValue;\n}\n\n/** Input for updateMultisigName */\nexport interface UpdateMultisigNameInput {\n chain: EChainType;\n multisigId: string;\n name: string;\n walletAddress: string;\n}\n\n/** Input for deleteMultisig */\nexport interface DeleteMultisigInput {\n chain: EChainType;\n multisigId: string;\n}\n\n/** Input for createOrder */\nexport interface CreateOrderInput {\n chain: EChainType;\n multisigId: string;\n walletAddress: string;\n method: OrderMethodType;\n instructions: OrderInstruction[];\n threshold?: number;\n token?: TokenInfo;\n deviceShare: string;\n}\n\n/** Output for createOrder */\nexport interface CreateOrderOutput {\n order: Order;\n proposalHash?: string;\n updatedDeviceShare: string | null;\n}\n\n/** Input for signOrder */\nexport interface SignOrderInput {\n chain: EChainType;\n order: Order;\n walletAddress: string;\n deviceShare: string;\n multisigId?: string;\n}\n\n/** Output for signOrder */\nexport interface SignOrderOutput {\n signature: string;\n order: Order;\n updatedDeviceShare: string | null;\n}\n\n/** Input for rejectOrder */\nexport interface RejectOrderInput {\n chain: EChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n deviceShare?: string;\n}\n\n/** Input for executeOrder */\nexport interface ExecuteOrderInput {\n chain: EChainType;\n order: Order;\n multisig: MultisigsItem;\n walletAddress: string;\n deviceShare: string;\n feeQuote?: EstimatedFee;\n}\n\n/** Output for executeOrder */\nexport interface ExecuteOrderOutput {\n txHash: string;\n order: Order;\n updatedDeviceShare: string | null;\n}\n\n/** Input for estimateOrderExecutionFee */\nexport interface EstimateOrderExecutionFeeInput {\n chain: EChainType;\n orderId: string;\n walletAddress: string;\n chainId?: ChainIdValue;\n}\n\n/** Input for getOrders */\nexport interface GetOrdersInput {\n chain: EChainType;\n multisigId: string;\n page?: number;\n limit?: number;\n}\n\n/** Input for getOrderById */\nexport interface GetOrderByIdInput {\n chain: EChainType;\n orderId: string;\n}\n\n/** Input for deleteOrder */\nexport interface DeleteOrderInput {\n chain: EChainType;\n orderId: string;\n}\n\n/** Input for getSupportedTokens */\nexport interface GetSupportedTokensInput {\n chain: EChainType;\n chainId: ChainIdValue;\n page?: number;\n limit?: number;\n search?: string;\n}\n\n/** Input for getWalletHistory */\nexport interface GetWalletHistoryInput {\n chain: EChainType;\n walletAddress: string;\n page?: number;\n limit?: number;\n}\n\n/** Input for getMultisigTxHistory */\nexport interface GetMultisigTxHistoryInput {\n multisigId: string;\n page?: number;\n limit?: number;\n}\n\nexport class AfridaxSDK {\n private readonly resolvedConfig: ResolvedConfig;\n private readonly client: ApiClient;\n private readonly walletService: WalletService;\n private readonly multisigApi: MultisigApi;\n private readonly orderApi: OrderApi;\n private readonly blockchainAdapter: BlockchainAdapter;\n private readonly keyManager: WalletKeyManager;\n private readonly txService: TransactionService;\n\n constructor(config: SDKConfig) {\n this.resolvedConfig = resolveConfig(config);\n\n // Set global network mode for getBtcChainType() helper\n _setGlobalNetworkMode(this.resolvedConfig.network);\n\n this.client = new ApiClient(this.resolvedConfig);\n\n const walletApi = new WalletApi(this.client);\n this.keyManager = new WalletKeyManager(walletApi, this.resolvedConfig);\n this.txService = new TransactionService(this.resolvedConfig);\n\n this.walletService = new WalletService(\n this.client,\n this.keyManager,\n this.txService,\n this.resolvedConfig\n );\n\n // Create KeyReconstructor for MultisigApi (needed for Solana/Tron activation signing)\n const keyReconstructor = new KeyReconstructor(this.client);\n this.multisigApi = new MultisigApi(this.client, keyReconstructor);\n\n this.orderApi = new OrderApi(this.client);\n this.blockchainAdapter = new BlockchainAdapter(\n this.client,\n this.resolvedConfig.network === \"mainnet\"\n );\n }\n\n /**\n * 1.1 Create a new MPC wallet with Shamir secret sharing\n */\n public async createWallet(\n input: CreateWalletInput\n ): Promise<CreateWalletOutput> {\n const result = await this.walletService.createWallet(input.chain);\n return {\n wallets: result.wallets,\n deviceShare: result.deviceShare,\n };\n }\n\n /**\n * 1.2 Import an existing wallet via private key\n */\n public async importWallet(\n input: ImportWalletInput\n ): Promise<CreateWalletResponse> {\n return this.walletService.importWallet(input.chain, input.privateKey);\n }\n\n /**\n * 1.3 Remove wallet from account\n */\n public async deleteWallet(input: DeleteWalletInput): Promise<DeleteResponse> {\n return this.walletService.deleteWallet(input.chain, input.address);\n }\n\n /**\n * 1.4 Fetch single wallet details\n */\n public async getWallet(\n input: GetWalletInput\n ): Promise<TWallet> {\n return this.walletService.getWallet(input.address);\n }\n\n /**\n * 1.5 List all wallets for user (with optional pagination)\n */\n public async getWallets(\n input?: GetWalletsInput\n ): Promise<PaginatedWalletsResponse> {\n if (input?.page || input?.limit) {\n return this.walletService.getPaginatedWallets(input.page, input.limit);\n }\n return this.walletService.getWallets();\n }\n\n /**\n * 1.6 Get wallet token balances and portfolio (batch request)\n * User constructs the PortfolioRequest array themselves\n */\n public async getWalletsPortfolio(\n requests: import(\"./types\").PortfolioRequest[]\n ): Promise<import(\"./types\").WalletPortfolioResponse[]> {\n const walletApi = new (await import(\"../api/wallet.api\")).WalletApi(\n this.client\n );\n return walletApi.getWalletsPortfolio(requests);\n }\n\n /**\n * 1.7 Get wallet portfolio for a single wallet (convenience method)\n */\n public async getPortfolio(\n input: GetPortfolioInput\n ): Promise<WalletPortfolioResponse> {\n const requests: import(\"./types\").PortfolioRequest[] = [\n {\n walletAddress: input.address,\n chainType: input.chain,\n chain: input.chainId.toString(),\n },\n ];\n\n const results = await this.getWalletsPortfolio(requests);\n return results[0];\n }\n\n /**\n * 1.7 Send native currency (ETH/SOL/TRX/BTC)\n */\n public async sendTransaction(\n input: SendTransactionInput\n ): Promise<SendTransactionOutput> {\n const txParams: TransactionParams = {\n chain: input.chain,\n from: input.from,\n to: input.to,\n value: input.amount,\n chainId: input.chainId,\n };\n\n const result = await this.walletService.sendTransaction({\n chain: input.chain,\n address: input.from,\n deviceShareHex: input.deviceShare,\n txParams,\n });\n\n return {\n txHash: result.hash,\n updatedDeviceShare: null,\n };\n }\n\n /**\n * 1.8 Send token (ERC20/SPL/TRC20)\n */\n public async sendToken(\n input: SendTokenInput\n ): Promise<SendTransactionOutput> {\n const result = await this.walletService.sendToken(\n input.chain,\n input.from,\n input.deviceShare,\n input.to,\n input.amount,\n input.tokenAddress,\n input.decimals,\n input.chainId\n );\n\n return {\n txHash: result.hash,\n updatedDeviceShare: null,\n };\n }\n\n /**\n * 1.9 Estimate transaction fee for any operation\n */\n public async estimateFee(input: EstimateFeeInput): Promise<EstimatedFee> {\n const txParams: TransactionParams = {\n chain: input.chain,\n from: input.from || \"\",\n to: input.to || \"\",\n value: input.amount,\n tokenAddress: input.tokenAddress,\n decimals: input.decimals,\n chainId: input.chainId,\n };\n\n return this.walletService.estimateFee(input.chain, txParams);\n }\n\n /**\n * 1.10 Export private key (reconstructs from shares)\n * Works with empty deviceShare by fetching recovery+server shares from API\n */\n public async exportWallet(\n input: ExportWalletInput\n ): Promise<ExportWalletOutput> {\n const result = await this.walletService.exportWallet(\n input.chain,\n input.address,\n input.deviceShare\n );\n\n return {\n privateKey: result.privateKey,\n updatedDeviceShare: result.newDeviceShare,\n };\n }\n\n /**\n * 1.11 Rename a wallet\n */\n public async updateWalletName(\n input: UpdateWalletNameInput\n ): Promise<WalletRenameResponse> {\n return this.walletService.updateWalletName(\n input.chain,\n input.address,\n input.name\n );\n }\n\n /**\n * 2.1 Create a new multisig vault\n */\n public async createMultisig(\n input: CreateMultisigInput\n ): Promise<MultisigsItem | MultisigsItem[]> {\n return this.multisigApi.createMultisig({\n chain: input.chain,\n owners: input.owners,\n threshold: input.threshold,\n chainIds: input.chainIds,\n });\n }\n\n /**\n * 2.2 List all multisigs for user\n */\n public async getMultisigs(\n input: GetMultisigsInput\n ): Promise<MultisigBaseDTO[]> {\n return this.multisigApi.getMultisigs({\n chain: input.chain,\n walletAddress: input.walletAddress,\n });\n }\n\n /**\n * 2.3 Get single multisig details\n */\n public async getMultisigById(\n input: GetMultisigByIdInput\n ): Promise<MultisigBaseDTO> {\n return this.multisigApi.getMultisig({\n chain: input.chain,\n address: input.address,\n });\n }\n\n /**\n * 2.4 Deploy/activate multisig on-chain\n */\n public async activateMultisig(\n input: ActivateMultisigInput\n ): Promise<ActivateMultisigOutput> {\n const result = await this.multisigApi.activateMultisig({\n chain: input.chain,\n multisigId: input.multisigId,\n multisig: input.multisig,\n multisigAddress: input.multisigAddress,\n walletAddress: input.walletAddress,\n deviceShare: input.deviceShare,\n feeQuote: input.feeQuote,\n });\n\n return {\n txHash: result.txHash || \"\",\n updatedDeviceShare: result.updatedDeviceShare || null,\n };\n }\n\n /**\n * 2.5 Estimate gas/fee for multisig activation\n * Note: Returns a placeholder fee. Use chain-specific methods for accurate estimates.\n */\n public async estimateActivationFee(\n input: EstimateActivationFeeInput\n ): Promise<EstimatedFee> {\n const currency =\n input.chain === EChainType.EVM\n ? \"ETH\"\n : input.chain === EChainType.SOL\n ? \"SOL\"\n : input.chain === EChainType.TRON\n ? \"TRX\"\n : \"BTC\";\n\n return {\n estimatedFee: \"0.001\",\n currency: currency,\n };\n }\n\n /**\n * 2.6 Rename multisig vault\n */\n public async updateMultisigName(\n input: UpdateMultisigNameInput\n ): Promise<MultisigBaseDTO> {\n return this.multisigApi.updateMultisig({\n chain: input.chain,\n multisigId: input.multisigId,\n name: input.name,\n walletAddress: input.walletAddress,\n });\n }\n\n /**\n * 2.7 Remove multisig from account\n */\n public async deleteMultisig(\n input: DeleteMultisigInput\n ): Promise<DeleteResponse> {\n return this.multisigApi.deleteMultisig({\n chain: input.chain,\n multisigId: input.multisigId,\n });\n }\n\n /**\n * 2.8 Create a new transaction proposal\n */\n public async createOrder(\n input: CreateOrderInput\n ): Promise<CreateOrderOutput> {\n const result = await this.orderApi.createOrder({\n chain: input.chain,\n multisigId: input.multisigId,\n walletAddress: input.walletAddress,\n method: input.method,\n instructions: input.instructions,\n threshold: input.threshold,\n token: input.token,\n deviceShare: input.deviceShare,\n });\n\n return {\n order: result.order,\n proposalHash: result.proposalHash,\n updatedDeviceShare: result.updatedDeviceShare || null,\n };\n }\n\n /**\n * 2.8a Create a send order (token transfer) - Simplified API\n * Automatically detects method and builds instructions\n */\n public async createSendOrder(input: {\n multisigId: string;\n walletAddress: string;\n to: string;\n amount: string;\n token?: TokenInfo;\n deviceShare: string;\n chainId: string;\n }): Promise<CreateOrderOutput> {\n return this.orderApi.createSendOrder(input);\n }\n\n /**\n * 2.8b Create a settings order (multisig configuration change) - Simplified API\n * Automatically calculates changes and determines method\n */\n public async createSettingsOrder(input: {\n multisigId: string;\n multisig: MultisigsItem;\n walletAddress: string;\n newOwners: string[];\n newThreshold?: number;\n deviceShare: string;\n }): Promise<CreateOrderOutput> {\n return this.orderApi.createSettingsOrder(input);\n }\n\n /**\n * 2.9 Sign/approve a pending order\n * Uses blockchainAdapter to properly reconstruct key and sign order hash\n */\n public async signOrder(input: SignOrderInput): Promise<SignOrderOutput> {\n const { order } = input;\n const chainId = this.getChainIdForSignOrder(input.chain, order);\n\n const signResult = await this.blockchainAdapter.signOrder(chainId, {\n orderId: order.id,\n multisigId: input.multisigId || \"\",\n wallet: { address: input.walletAddress } as TWallet,\n deviceShare: input.deviceShare || \"-\",\n networkType: chainId,\n order,\n });\n\n const apiResult = await this.orderApi.signOrder({\n chain: input.chain,\n orderId: order.id,\n walletAddress: input.walletAddress,\n transaction: signResult.tx,\n multisigId: input.multisigId,\n version: signResult?.version,\n });\n\n return {\n signature: signResult.tx || \"\",\n order: apiResult.order,\n updatedDeviceShare: signResult.updatedDeviceShare || null,\n };\n }\n\n private getChainIdForSignOrder(\n chain: EChainType,\n order: Order\n ): ChainIdValue {\n const isMainnet = this.resolvedConfig.network === \"mainnet\";\n\n if (chain === EChainType.EVM) {\n const orderChainId = (order as any)?.chainId?.toString() as ChainIdValue;\n\n return (\n orderChainId ||\n (isMainnet ? MainnetChainId.ETH : TestnetChainId.ETH_SEPOLIA)\n );\n }\n\n if (chain === EChainType.SOL) {\n return isMainnet ? MainnetChainId.SOLANA : TestnetChainId.SOLANA_DEVNET;\n }\n\n if (chain === EChainType.TRON) {\n return isMainnet ? MainnetChainId.TRON : TestnetChainId.TRON;\n }\n\n if (chain === EChainType.BTC || chain === EChainType.BTC_T3) {\n return isMainnet ? MainnetChainId.BTC : TestnetChainId.BTC;\n }\n\n return MainnetChainId.ETH;\n }\n\n /**\n * 2.10 Reject a pending order\n */\n public async rejectOrder(input: RejectOrderInput): Promise<Order> {\n const result = await this.orderApi.rejectOrder({\n chain: input.chain,\n order: input.order,\n multisig: input.multisig,\n walletAddress: input.walletAddress,\n deviceShare: input.deviceShare,\n });\n\n return result.order;\n }\n\n /**\n * 2.11 Execute a fully-signed order\n */\n public async executeOrder(\n input: ExecuteOrderInput\n ): Promise<ExecuteOrderOutput> {\n const result = await this.orderApi.executeOrder({\n chain: input.chain,\n order: input.order,\n multisig: input.multisig,\n walletAddress: input.walletAddress,\n deviceShare: input.deviceShare,\n feeQuote: input.feeQuote,\n });\n\n return {\n txHash: result.txHash || \"\",\n order: result.order,\n updatedDeviceShare: result.updatedDeviceShare || null,\n };\n }\n\n /**\n * 2.12 Estimate fee for executing order\n * Note: Returns a placeholder fee. Use chain-specific methods for accurate estimates.\n */\n public async estimateOrderExecutionFee(\n input: EstimateOrderExecutionFeeInput\n ): Promise<EstimatedFee> {\n const currency =\n input.chain === EChainType.EVM\n ? \"ETH\"\n : input.chain === EChainType.SOL\n ? \"SOL\"\n : input.chain === EChainType.TRON\n ? \"TRX\"\n : \"BTC\";\n\n return {\n estimatedFee: \"0.001\",\n currency: currency,\n };\n }\n\n /**\n * 2.13 List orders for a multisig\n */\n public async getOrders(\n input: GetOrdersInput\n ): Promise<PaginatedOrdersResponse> {\n return this.orderApi.getOrders({\n chain: input.chain,\n multisigId: input.multisigId,\n page: input.page,\n limit: input.limit,\n });\n }\n\n /**\n * 2.14 Get single order details\n */\n public async getOrderById(\n input: GetOrderByIdInput\n ): Promise<{ order: Order }> {\n return this.orderApi.getOrder({\n chain: input.chain,\n orderId: input.orderId,\n });\n }\n\n /**\n * 2.15 Delete a pending order\n */\n public async deleteOrder(input: DeleteOrderInput): Promise<DeleteResponse> {\n return this.orderApi.cancelOrder({\n chain: input.chain,\n orderId: input.orderId,\n });\n }\n\n /**\n * 3.1 List supported tokens for a chain\n */\n public async getSupportedTokens(\n input: GetSupportedTokensInput\n ): Promise<SupportedTokensResponse> {\n return this.walletService.getSupportedTokens(\n input.chain,\n input.chainId,\n input.page,\n input.limit,\n input.search\n );\n }\n\n /**\n * 3.2 Get aggregate portfolio value across all wallets\n */\n public async getTotalAssetValue(): Promise<TotalAssetValueResponse> {\n return this.walletService.getTotalAssetValue();\n }\n\n /**\n * 4.1 Get transaction history for a wallet\n */\n public async getWalletHistory(\n input: GetWalletHistoryInput\n ): Promise<HistoryResponse> {\n return this.walletService.getHistory(\n input.chain,\n input.walletAddress,\n input.page,\n input.limit\n );\n }\n\n /**\n * 4.2 Get order/execution history for a multisig\n */\n public async getMultisigTxHistory(\n input: GetMultisigTxHistoryInput\n ): Promise<TxHistoryCombinedResponse> {\n return this.multisigApi.getMultisigHistory({\n multisigId: input.multisigId,\n page: input.page,\n limit: input.limit,\n });\n }\n}\n\nexport default AfridaxSDK;\n","import type { ResolvedConfig } from '../core/config';\nimport {\n ApiError,\n NetworkError,\n UnauthorizedError,\n RateLimitError,\n TimeoutError,\n} from '../core/errors';\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport interface RequestConfig {\n headers?: Record<string, string>;\n timeout?: number;\n params?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface InternalRequestOptions extends RequestConfig {\n method: HttpMethod;\n path: string;\n data?: unknown;\n}\n\nexport type AuthType = 'apiKey' | 'accessToken';\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly defaultTimeout: number;\n\n constructor(config: ResolvedConfig) {\n this.baseUrl = config.apiBaseUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n this.defaultTimeout = config.timeout;\n }\n\n /**\n * Gets the authentication token (apiKey)\n * @returns The authentication token value\n */\n public getAuthToken(): string {\n return this.apiKey;\n }\n\n /**\n * Internal request method that handles all HTTP calls\n *\n * @param options - Request options including method, path, data, and config\n * @returns Promise resolving to the response data\n * @throws NetworkError - On connection or timeout errors\n * @throws ApiError - On API errors (4xx, 5xx)\n * @throws UnauthorizedError - On 401 errors\n * @throws RateLimitError - On 429 errors\n */\n private async _request<T>(options: InternalRequestOptions): Promise<T> {\n const { method, path, data, headers, timeout, params } = options;\n\n const url = this._buildUrl(path, params);\n const requestTimeout = timeout ?? this.defaultTimeout;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n ...headers,\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers: requestHeaders,\n signal: controller.signal,\n };\n\n if (data !== undefined && method !== 'GET') {\n fetchOptions.body = JSON.stringify(data);\n }\n\n try {\n const response = await fetch(url, fetchOptions);\n\n clearTimeout(timeoutId);\n\n return await this._handleResponse<T>(response, method, path);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError || error instanceof UnauthorizedError || error instanceof RateLimitError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`, {\n timeoutMs: requestTimeout,\n operation: `${method} ${path}`,\n });\n }\n\n throw new NetworkError(`Network request failed: ${error.message}`, {\n endpoint: url,\n isTimeout: false,\n operation: `${method} ${path}`,\n cause: error,\n });\n }\n\n throw new NetworkError('An unknown network error occurred', {\n endpoint: url,\n isTimeout: false,\n operation: `${method} ${path}`,\n });\n }\n }\n\n /**\n * Builds the full URL with query parameters\n */\n private _buildUrl(\n path: string,\n params?: Record<string, string | number | boolean | undefined>\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${this.baseUrl}${normalizedPath}`);\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n return url.toString();\n }\n\n /**\n * Handles the HTTP response and extracts data or throws appropriate errors\n */\n private async _handleResponse<T>(\n response: Response,\n method: HttpMethod,\n path: string\n ): Promise<T> {\n let responseBody: unknown;\n\n try {\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n } catch {\n responseBody = null;\n }\n\n if (response.ok) {\n return responseBody as T;\n }\n\n const errorMessage = this._extractErrorMessage(responseBody) || response.statusText;\n\n if (response.status === 401) {\n throw new UnauthorizedError(errorMessage, {\n operation: `${method} ${path}`,\n details: { statusCode: 401, responseBody },\n });\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new RateLimitError(errorMessage, {\n retryAfter: retryAfter ? parseInt(retryAfter, 10) : undefined,\n operation: `${method} ${path}`,\n details: { statusCode: 429, responseBody },\n });\n }\n\n throw new ApiError(errorMessage, {\n statusCode: response.status,\n responseBody,\n operation: `${method} ${path}`,\n });\n }\n\n /**\n * Extracts error message from response body\n */\n private _extractErrorMessage(responseBody: unknown): string | null {\n if (!responseBody) {\n return null;\n }\n\n if (typeof responseBody === 'string') {\n return responseBody;\n }\n\n if (typeof responseBody === 'object') {\n const body = responseBody as Record<string, unknown>;\n\n if (typeof body.message === 'string') {\n return body.message;\n }\n\n if (Array.isArray(body.message) && body.message.length > 0) {\n const firstMessage = body.message[0];\n if (typeof firstMessage === 'string') {\n return firstMessage;\n }\n if (typeof firstMessage === 'object' && firstMessage !== null) {\n const msg = firstMessage as Record<string, unknown>;\n if (msg.constraints && typeof msg.constraints === 'object') {\n return Object.values(msg.constraints as Record<string, string>).join('; ');\n }\n return JSON.stringify(firstMessage);\n }\n }\n\n if (typeof body.error === 'string') {\n return body.error;\n }\n\n if (Array.isArray(body.errors) && body.errors.length > 0) {\n return String(body.errors[0]);\n }\n }\n\n return null;\n }\n /**\n * Performs a GET request\n *\n * @param path - API endpoint path\n * @param config - Optional request configuration\n * @returns Promise resolving to the response data\n */\n public async get<T>(path: string, config?: RequestConfig): Promise<T> {\n return this._request<T>({\n method: 'GET',\n path,\n ...config,\n });\n }\n\n /**\n * Performs a POST request\n *\n * @param path - API endpoint path\n * @param data - Request body data\n * @param config - Optional request configuration\n * @returns Promise resolving to the response data\n */\n public async post<T>(path: string, data?: unknown, config?: RequestConfig): Promise<T> {\n return this._request<T>({\n method: 'POST',\n path,\n data,\n ...config,\n });\n }\n\n /**\n * Performs a PUT request\n *\n * @param path - API endpoint path\n * @param data - Request body data\n * @param config - Optional request configuration\n * @returns Promise resolving to the response data\n */\n public async put<T>(path: string, data?: unknown, config?: RequestConfig): Promise<T> {\n return this._request<T>({\n method: 'PUT',\n path,\n data,\n ...config,\n });\n }\n\n /**\n * Performs a PATCH request\n *\n * @param path - API endpoint path\n * @param data - Request body data\n * @param config - Optional request configuration\n * @returns Promise resolving to the response data\n */\n public async patch<T>(path: string, data?: unknown, config?: RequestConfig): Promise<T> {\n return this._request<T>({\n method: 'PATCH',\n path,\n data,\n ...config,\n });\n }\n\n /**\n * Performs a DELETE request\n *\n * @param path - API endpoint path\n * @param config - Optional request configuration\n * @returns Promise resolving to the response data\n */\n public async delete<T>(path: string, config?: RequestConfig): Promise<T> {\n return this._request<T>({\n method: 'DELETE',\n path,\n ...config,\n });\n }\n}\n","\nimport { Buffer } from 'buffer';\nimport type { ApiClient } from \"./client\";\nimport {\n IMultisigApi,\n EChainType,\n ChainIdValue,\n MultisigsItem,\n DeleteResponse,\n TxHistoryCombinedResponse,\n StatusFilterEnum,\n WalletPortfolioResponse,\n Order,\n CreateMultisigInput,\n GetMultisigByIdInput,\n GetMultisigsInput,\n UpdateMultisigNameInput,\n DeleteMultisigInput,\n ActivateMultisigInput,\n ActivateMultisigOutput,\n GetMultisigTxHistoryInput,\n MultisigBaseDTO,\n} from \"../core/types\";\nimport { toBackendChainType } from \"../core/types\";\nimport { InvalidInputError } from \"../core/errors\";\nimport type { KeyReconstructor } from \"../services/key-reconstructor\";\nimport { EvmStrategy } from \"../strategies/evm.strategy\";\n\n/**\n * Implementation of multisig-related API operations with unified routing\n */\nexport class MultisigApi implements IMultisigApi {\n private readonly client: ApiClient;\n private readonly keyReconstructor?: KeyReconstructor;\n\n constructor(client: ApiClient, keyReconstructor?: KeyReconstructor) {\n this.client = client;\n this.keyReconstructor = keyReconstructor;\n }\n\n /**\n * Creates a multisig - routes to chain-specific implementation\n */\n public async createMultisig(\n params: CreateMultisigInput\n ): Promise<MultisigsItem | MultisigsItem[]> {\n const { chain, owners, threshold, chainIds } = params;\n\n switch (chain) {\n case EChainType.EVM:\n return this.createEvmMultisig(\n owners,\n threshold,\n (chainIds as ChainIdValue[] | undefined) ||\n ([\"11155111\"] as ChainIdValue[])\n );\n case EChainType.SOL:\n const solChainId =\n chainIds && chainIds.length > 0\n ? this.normalizeSolanaChainId(chainIds[0])\n : \"sol_devnet\";\n return this.createSolanaMultisig(\n solChainId as ChainIdValue,\n owners[0],\n owners,\n threshold\n );\n case EChainType.TRON:\n const tronChains =\n chainIds && chainIds.length > 0\n ? chainIds.map((id) => this.normalizeTronChainId(id))\n : [\"tron_shasta\"];\n return this.createTronMultisig(owners, threshold, tronChains);\n case EChainType.BTC:\n case EChainType.BTC_T3:\n const btcChainId =\n chainIds && chainIds.length > 0\n ? this.normalizeBtcChainId(chainIds[0])\n : \"btc_testnet\";\n return this.createBtcMultisig(\n btcChainId as ChainIdValue,\n owners[0],\n owners,\n threshold\n );\n default:\n throw new InvalidInputError(\n `Chain '${chain}' is not supported for createMultisig`\n );\n }\n }\n\n /**\n * Gets a multisig by ID/address\n */\n public async getMultisig(\n params: GetMultisigByIdInput\n ): Promise<MultisigBaseDTO> {\n return this.getMultisigById(params.chain as EChainType, params.address);\n }\n\n /**\n * Gets all multisigs for a chain\n */\n public async getMultisigs(\n params: GetMultisigsInput\n ): Promise<MultisigBaseDTO[]> {\n return this.getMultisigsByChain(\n params.chain as EChainType,\n params.walletAddress\n );\n }\n\n /**\n * Gets paginated multisigs (alias for getMultisigs)\n */\n public async getPaginatedMultisigs(\n params: GetMultisigsInput\n ): Promise<MultisigBaseDTO[]> {\n return this.getMultisigs(params);\n }\n\n /**\n * Updates multisig name\n */\n public async updateMultisig(\n params: UpdateMultisigNameInput\n ): Promise<MultisigBaseDTO> {\n return this.updateMultisigName(\n params.multisigId,\n params.name,\n params.walletAddress\n );\n }\n\n /**\n * Deletes a multisig\n */\n public async deleteMultisig(\n params: DeleteMultisigInput\n ): Promise<DeleteResponse> {\n return this.deleteMultisigById(params.multisigId);\n }\n\n /**\n * Activates a multisig - routes to chain-specific implementation\n *\n * For Solana and Tron, this requires signing a transaction locally using KeyReconstructor.\n * For EVM, the backend handles activation without local signing.\n */\n public async activateMultisig(\n params: ActivateMultisigInput\n ): Promise<ActivateMultisigOutput> {\n const { chain, multisigId, walletAddress, deviceShare } = params;\n\n switch (chain) {\n case EChainType.EVM: {\n if (!params.multisig) {\n throw new InvalidInputError(\n \"Multisig object is required for EVM activation\"\n );\n }\n const result = await this.activateEvmMultisig(\n params.multisig,\n walletAddress,\n deviceShare,\n params.gasLimit,\n params.gasPrice\n );\n return {\n txHash: result.txHash,\n updatedDeviceShare: result.updatedDeviceShare,\n };\n }\n case EChainType.SOL: {\n if (!this.keyReconstructor) {\n throw new InvalidInputError(\n \"KeyReconstructor is required for Solana multisig activation\"\n );\n }\n\n // Step 1: Get the unsigned deploy transaction from backend\n const deployResponse = await this.client.post<{ transaction: string }>(\n \"/sdk/multisig/sol/tx/deploy\",\n { multisigId, walletAddress }\n );\n\n if (!deployResponse.transaction) {\n throw new InvalidInputError(\n \"Failed to get Solana deploy transaction from backend\"\n );\n }\n\n // Step 2: Sign the transaction using KeyReconstructor\n const { tx: signedTxBase64, updatedDeviceShare } =\n await this.keyReconstructor.signTransaction({\n deviceShare: deviceShare || \"-\",\n address: walletAddress,\n chainType: \"solana\" as any,\n action: \"sol.signTransaction\",\n params: { transaction: deployResponse.transaction },\n });\n\n if (!signedTxBase64) {\n throw new InvalidInputError(\n \"Failed to sign Solana deploy transaction\"\n );\n }\n\n // Step 3: Submit the signed transaction to broadcast\n const broadcastResponse = await this.client.post<{\n multisig: any;\n txHash?: string;\n }>(\"/sdk/multisig/sol/deploy\", {\n multisigId,\n walletAddress,\n transaction: signedTxBase64,\n });\n\n return {\n txHash: broadcastResponse.txHash || \"Transaction submitted\",\n updatedDeviceShare: updatedDeviceShare || null,\n };\n }\n case EChainType.TRON: {\n if (!params.multisig) {\n throw new InvalidInputError(\n \"Multisig object is required for Tron activation\"\n );\n }\n\n const multisig = params.multisig;\n\n if (!multisig.address) {\n throw new InvalidInputError(\n \"Multisig address is required for Tron activation\"\n );\n }\n\n // For Tron, the share comes from multisig.params.share (not deviceShare)\n const multisigShare = multisig.params?.share;\n if (!multisigShare) {\n throw new InvalidInputError(\n \"Multisig share (params.share) is required for Tron multisig activation\"\n );\n }\n\n // Step 1: Fetch the server share for this multisig\n const serverShare = await this.fetchTronServerShare(\n multisigId,\n walletAddress\n );\n\n // Step 2: Reconstruct the private key from shares\n const { combineShares } = await import(\"../crypto/shares\");\n const pkFromShares = await combineShares([multisigShare, serverShare]);\n const privateKey = Buffer.from(pkFromShares).toString(\"hex\");\n\n // Step 3: Initialize TronWeb with the reconstructed private key\n const { TronWeb } = await import(\"tronweb\");\n const { TRON_FULL_HOST } = await import(\"../core/config\");\n const isMainnet = multisig.chainId === \"tron_mainnet\";\n const network = isMainnet ? \"mainnet\" : \"testnet\";\n\n const tronWeb = new TronWeb({\n fullHost: TRON_FULL_HOST[network],\n privateKey: privateKey,\n });\n\n // Step 4: Build the unsigned activation transaction\n // Set up owner permissions (type 0)\n const ownerPermissions = {\n type: 0,\n permission_name: \"owner\",\n threshold: Number(multisig.threshold),\n keys: multisig.owners.map((owner) => ({\n address: tronWeb.address.toHex(owner.walletAddress),\n weight: 1,\n })),\n };\n\n // Set up active permissions (type 2)\n const activePermission = {\n type: 2,\n permission_name: \"active\",\n threshold: Number(multisig.threshold),\n operations:\n \"7fff1fc0037e0000000000000000000000000000000000000000000000000000\",\n keys: multisig.owners.map((owner) => ({\n address: tronWeb.address.toHex(owner.walletAddress),\n weight: 1,\n })),\n };\n\n // Build the unsigned transaction\n\n const unsignedTx =\n await tronWeb.transactionBuilder.updateAccountPermissions(\n multisig.address,\n ownerPermissions,\n null,\n [activePermission]\n );\n\n // Step 5: Sign the transaction\n const signedTx = await tronWeb.trx.sign(unsignedTx, privateKey);\n\n if (!signedTx) {\n throw new InvalidInputError(\n \"Failed to sign Tron activation transaction\"\n );\n }\n\n // Step 6: Submit the signed transaction to the execute endpoint\n const executeResponse = await this.client.patch<{\n multisig: MultisigsItem;\n txHash?: string;\n transactionHash?: string;\n }>(`/sdk/multisig/execute/tron/${multisigId}`, {\n transaction: signedTx,\n });\n\n if (!executeResponse || !executeResponse.multisig) {\n throw new InvalidInputError(\n \"Failed to execute Tron activation transaction\"\n );\n }\n\n // Return the txHash (from response or derive from multisig) and null for updatedDeviceShare\n return {\n txHash:\n executeResponse.txHash ||\n executeResponse.transactionHash ||\n executeResponse.multisig?.id ||\n \"Transaction submitted\",\n updatedDeviceShare: null,\n };\n }\n case EChainType.BTC:\n case EChainType.BTC_T3:\n throw new InvalidInputError(\n \"BTC multisig activation is handled differently\"\n );\n default:\n throw new InvalidInputError(\n `Chain '${chain}' is not supported for activateMultisig`\n );\n }\n }\n\n /**\n * Adds a member to multisig (creates an order for this action)\n */\n public async addMember(params: {\n chain: string;\n multisigId: string;\n newOwner: string;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }> {\n throw new InvalidInputError(\n \"addMember should be called through createOrder with addOwner instruction\"\n );\n }\n\n /**\n * Removes a member from multisig (creates an order for this action)\n */\n public async removeMember(params: {\n chain: string;\n multisigId: string;\n ownerToRemove: string;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }> {\n throw new InvalidInputError(\n \"removeMember should be called through createOrder with removeOwner instruction\"\n );\n }\n\n /**\n * Updates multisig threshold (creates an order for this action)\n */\n public async updateThreshold(params: {\n chain: string;\n multisigId: string;\n newThreshold: number;\n walletAddress: string;\n deviceShare: string;\n }): Promise<{ order: Order }> {\n throw new InvalidInputError(\n \"updateThreshold should be called through createOrder with changeThreshold instruction\"\n );\n }\n\n /**\n * Gets multisig transaction history\n */\n public async getMultisigHistory(\n params: GetMultisigTxHistoryInput\n ): Promise<TxHistoryCombinedResponse> {\n return this.getHistory(params.multisigId, params.page, params.limit);\n }\n\n /**\n * Fetches multisig server share (Tron only)\n */\n public async fetchMultisigServerShare(params: {\n multisigId: string;\n walletAddress: string;\n }): Promise<string> {\n return this.fetchTronServerShare(params.multisigId, params.walletAddress);\n }\n\n public async createEvmMultisig(\n owners: string[],\n threshold: number,\n chainIds: ChainIdValue[]\n ): Promise<MultisigsItem[]> {\n const chains = chainIds.map((id) =>\n typeof id === \"number\" ? id : parseInt(String(id), 10) || 11155111\n );\n\n const response = await this.client.post<{ multisigs: MultisigsItem[] }>(\n \"/sdk/multisig/create/evm\",\n {\n owners,\n threshold,\n chains,\n }\n );\n return response.multisigs;\n }\n\n /**\n * Creates a new Solana multisig (Squads)\n */\n public async createSolanaMultisig(\n chainId: ChainIdValue,\n creatorAddress: string,\n owners: string[],\n threshold: number\n ): Promise<MultisigsItem> {\n const response = await this.client.post<{ multisig: MultisigsItem }>(\n `/sdk/multisig/create/sol/${chainId}/${creatorAddress}`,\n {\n owners,\n threshold,\n }\n );\n return response.multisig;\n }\n\n /**\n * Creates a new Tron multisig\n * Backend expects 'chains' array with values like ['tron_mainnet'] or ['tron_shasta']\n */\n public async createTronMultisig(\n owners: string[],\n threshold: number,\n chains: string[] = [\"tron_shasta\"]\n ): Promise<MultisigsItem> {\n const response = await this.client.post<{ multisig: MultisigsItem }>(\n \"/sdk/multisig/create/tron\",\n {\n owners,\n threshold,\n chains,\n }\n );\n return response.multisig;\n }\n\n /**\n * Creates a new BTC multisig\n */\n public async createBtcMultisig(\n chainId: ChainIdValue,\n creatorAddress: string,\n owners: string[],\n threshold: number\n ): Promise<MultisigsItem> {\n const response = await this.client.post<{ multisig: MultisigsItem }>(\n `/sdk/multisig/create/btc/${chainId}/${creatorAddress}`,\n {\n owners,\n threshold,\n }\n );\n return response.multisig;\n }\n\n /**\n * Gets all multisigs for a chain\n */\n public async getMultisigsByChain(\n chain: EChainType,\n walletAddress?: string\n ): Promise<MultisigBaseDTO[]> {\n const backendChain = toBackendChainType(chain);\n const path = walletAddress\n ? `/sdk/multisig/${backendChain}/${walletAddress}`\n : `/sdk/multisig/${backendChain}`;\n\n const response = await this.client.get<{ multisigs: MultisigBaseDTO[] }>(\n path\n );\n return response.multisigs;\n }\n\n /**\n * Gets a multisig by address\n */\n public async getMultisigById(\n chain: EChainType,\n address: string\n ): Promise<MultisigBaseDTO> {\n const response = await this.client.get<{ multisig: MultisigBaseDTO }>(\n `/sdk/multisig/id/${chain}/${address.toLowerCase()}`\n );\n return response.multisig;\n }\n\n /**\n * Activates an EVM multisig\n */\n public async activateEvmMultisig(\n multisig: MultisigsItem,\n walletAddress: string,\n deviceShare: string,\n gasLimit?: string,\n gasPrice?: string\n ): Promise<{ txHash: string; updatedDeviceShare: string | null }> {\n if (!this.keyReconstructor) {\n throw new InvalidInputError(\n \"KeyReconstructor is required for EVM multisig activation\"\n );\n }\n // 1. Use passed multisig details\n if (!multisig.factoryAddress || !multisig.params?.deployData) {\n throw new InvalidInputError(\n \"Multisig is missing deployment data (factoryAddress or deployData)\"\n );\n }\n\n const {\n id: multisigId,\n chainId,\n factoryAddress,\n params: { deployData },\n } = multisig;\n\n const evmStrategy = new EvmStrategy(this.client);\n const provider = evmStrategy.getProvider(String(chainId));\n\n let transaction: any = {\n to: factoryAddress,\n data: deployData,\n value: \"0\",\n chainId: Number(chainId),\n };\n\n transaction.nonce = await evmStrategy.getNonce(provider, walletAddress);\n\n if (gasLimit) {\n transaction.gasLimit = BigInt(gasLimit);\n } else {\n transaction.gasLimit = 500000n;\n }\n\n if (gasPrice) {\n transaction.gasPrice = BigInt(gasPrice);\n } else {\n try {\n const feeData = await evmStrategy.getFeeData(provider);\n if (feeData.gasPrice) transaction.gasPrice = feeData.gasPrice;\n } catch (e) {\n console.warn(\"Failed to fetch fee data for activation default.\");\n }\n }\n\n const { tx: signedTxObj, updatedDeviceShare } =\n await this.keyReconstructor.signTransaction({\n deviceShare: deviceShare || \"-\",\n address: walletAddress,\n chainType: \"evm\",\n action: \"signEvmTx\",\n params: {\n transaction,\n expectedChainId: Number(chainId),\n },\n });\n\n const signedTxString = signedTxObj as string;\n\n const signedTransaction = await evmStrategy.getSignedTransaction(\n signedTxString\n );\n if (!signedTransaction.hash) {\n throw new Error(\"Missing transaction hash after signing\");\n }\n\n await evmStrategy.simulateTransaction(provider, signedTransaction);\n\n const executeResponse = await this.client.post<{\n multisig: any;\n transactionHash: string;\n }>(`/sdk/multisig/execute/evm/${multisigId}`, {\n signedTransaction: signedTxString,\n });\n\n return {\n txHash: executeResponse.transactionHash,\n updatedDeviceShare: updatedDeviceShare || null,\n };\n }\n\n /**\n * Submits Solana multisig deploy transaction\n */\n public async submitSolanaDeployTx(\n transaction: string,\n multisigId: string,\n walletAddress: string\n ): Promise<{ txHash: string }> {\n return this.client.post<{ txHash: string }>(\"/sdk/multisig/sol/tx/deploy\", {\n transaction,\n multisigId,\n walletAddress,\n });\n }\n\n /**\n * Deploys Solana multisig on-chain\n */\n public async deploySolanaMultisig(\n multisigId: string,\n walletAddress: string\n ): Promise<{ params: { multisigPda: string; vaultAddress: string } }> {\n return this.client.post<{\n params: { multisigPda: string; vaultAddress: string };\n }>(\"/sdk/multisig/sol/deploy\", {\n multisigId,\n walletAddress,\n });\n }\n\n /**\n * Activates a Tron multisig\n */\n public async activateTronMultisig(\n multisigId: string,\n signedTransaction: string\n ): Promise<{ txHash: string }> {\n return this.client.patch<{ txHash: string }>(\n `/sdk/multisig/execute/tron/${multisigId}`,\n {\n signedTransaction,\n }\n );\n }\n\n /**\n * Updates multisig name\n */\n public async updateMultisigName(\n multisigId: string,\n name: string,\n walletAddress: string\n ): Promise<MultisigBaseDTO> {\n const response = await this.client.post<{ multisig: MultisigBaseDTO }>(\n \"/sdk/multisig/update/name\",\n {\n multisigId,\n name,\n walletAddress,\n }\n );\n return response.multisig;\n }\n\n /**\n * Deletes a multisig\n */\n public async deleteMultisigById(multisigId: string): Promise<DeleteResponse> {\n return this.client.delete<DeleteResponse>(`/sdk/multisig/${multisigId}`);\n }\n\n /**\n * Gets multisig transaction history\n */\n public async getHistory(\n multisigId: string,\n page: number = 1,\n limit: number = 10\n ): Promise<TxHistoryCombinedResponse> {\n return this.client.get<TxHistoryCombinedResponse>(\n `/sdk/history/${multisigId}`,\n {\n params: { page, limit },\n }\n );\n }\n\n /**\n * Fetches Tron multisig server share\n */\n public async fetchTronServerShare(\n multisigId: string,\n walletAddress: string\n ): Promise<string> {\n const response = await this.client.post<{ share: string }>(\n \"/sdk/multisig/share/tron\",\n {\n multisigId,\n walletAddress,\n }\n );\n return response.share;\n }\n\n /**\n * Gets portfolio for a single wallet (convenience method)\n * Uses WalletApi.getWalletsPortfolio internally\n */\n public async getPortfolio(\n chain: EChainType,\n chainId: ChainIdValue,\n address: string\n ): Promise<WalletPortfolioResponse> {\n const { WalletApi } = await import(\"./wallet.api\");\n const walletApi = new WalletApi(this.client);\n\n const requests: import(\"../core/types\").PortfolioRequest[] = [\n {\n walletAddress: address,\n chainType: chain,\n chain: chainId.toString(),\n },\n ];\n\n const results = await walletApi.getWalletsPortfolio(requests);\n return results[0];\n }\n\n private normalizeSolanaChainId(chainId: ChainIdValue): string {\n const id = String(chainId).toLowerCase();\n if (id === \"sol_devnet\" || id === \"devnet\") return \"sol_devnet\";\n if (id === \"sol_mainnet\" || id === \"mainnet\" || id === \"mainnet-beta\")\n return \"sol_mainnet\";\n return \"sol_devnet\";\n }\n\n /**\n * Normalize Tron chainId to backend format (tron_mainnet, tron_shasta)\n */\n private normalizeTronChainId(chainId: ChainIdValue): string {\n const id = String(chainId).toLowerCase();\n if (id === \"tron_mainnet\" || id === \"mainnet\") return \"tron_mainnet\";\n if (id === \"tron_shasta\" || id === \"shasta\") return \"tron_shasta\";\n if (id === \"tron_nile\" || id === \"nile\") return \"tron_nile\";\n return \"tron_shasta\";\n }\n\n /**\n * Normalize BTC chainId to backend format (btc_mainnet, btc_testnet)\n */\n private normalizeBtcChainId(chainId: ChainIdValue): string {\n const id = String(chainId).toLowerCase();\n if (id === \"btc_mainnet\" || id === \"mainnet\") return \"btc_mainnet\";\n if (id === \"btc_testnet\" || id === \"testnet\") return \"btc_testnet\";\n return \"btc_testnet\";\n }\n}\n","\n\nimport { ethers, formatUnits, Interface } from 'ethers';\nimport type { ApiClient } from '../api/client';\nimport { KeyReconstructor } from '../services/key-reconstructor';\nimport {\n TransactionExecutionType,\n TransactionEstimatingType,\n} from './types';\nimport type {\n ChainStrategy,\n SignOrderParams,\n CreateOrderParams,\n RejectOrderParams,\n ExecuteTransactionParams,\n EstimateFeeParams,\n IframeTxResponse,\n SendData,\n} from './types';\nimport type { EstimatedFee, Order, ChainIdValue } from '../core/types';\n\nexport enum SigningMethod {\n ETH_SIGN = \"eth_sign\",\n ETH_SIGN_TYPED_DATA = \"eth_signTypedData\",\n ETH_SIGN_TYPED_DATA_V3 = \"eth_signTypedData_v3\",\n ETH_SIGN_TYPED_DATA_V4 = \"eth_signTypedData_v4\",\n SAFE_SIGNATURE = \"safe_sign\"\n}\n\nconst SENTINEL_OWNERS = '0x0000000000000000000000000000000000000001';\n\nexport const GNOSIS_ABI = [\n 'function getOwners() view returns (address[])',\n 'function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address payable refundReceiver, bytes signatures) payable returns (bool)',\n 'function addOwnerWithThreshold(address owner, uint256 _threshold)',\n 'function removeOwner(address prevOwner, address owner, uint256 _threshold)',\n 'function changeThreshold(uint256 _threshold)',\n 'function nonce() view returns (uint256)',\n 'function getThreshold() view returns (uint256)',\n];\n\nconst ERC20_TRANSFER_ABI = ['function transfer(address to, uint256 amount)'];\n\nconst FALLBACK_GAS_LIMIT = '50000';\nconst FALLBACK_ERC20_GAS_LIMIT = '100000';\nconst FALLBACK_GAS_PRICE = '20000000000';\n\nconst iface = new ethers.Interface(GNOSIS_ABI);\nconst erc20Interface = new Interface(ERC20_TRANSFER_ABI);\n\nimport { DEFAULT_RPC_ENDPOINTS } from '../core/config';\n\nexport class EvmStrategy implements ChainStrategy<ethers.JsonRpcProvider> {\n private apiClient: ApiClient;\n private keyReconstructor: KeyReconstructor;\n\n constructor(apiClient: ApiClient) {\n this.apiClient = apiClient;\n this.keyReconstructor = new KeyReconstructor(apiClient);\n }\n\n getProvider(chainId?: string | number): ethers.JsonRpcProvider {\n if (!chainId) {\n throw new Error('ChainId required to get provider');\n }\n\n const chainIdNum = Number(chainId);\n\n // Check mainnet\n let rpcUrl = DEFAULT_RPC_ENDPOINTS.mainnet.evm[chainIdNum];\n\n // Check testnet if not found\n if (!rpcUrl) {\n rpcUrl = DEFAULT_RPC_ENDPOINTS.testnet.evm[chainIdNum];\n }\n\n if (!rpcUrl) {\n // Fallback for string aliases if legacy code still passes them (though unlikely to work with new config structure)\n // or throw error\n throw new Error(`Unsupported EVM network ID: ${chainId}`);\n }\n\n return new ethers.JsonRpcProvider(rpcUrl);\n }\n\n async getFeeData(provider: ethers.JsonRpcProvider): Promise<ethers.FeeData> {\n return await provider.getFeeData();\n }\n\n async getBalance(address: string, provider: ethers.JsonRpcProvider): Promise<string> {\n const balance = await provider.getBalance(address);\n return ethers.formatEther(balance);\n }\n\n async getTransactionHash(unsignedTx: string): Promise<string> {\n return ethers.keccak256(unsignedTx);\n }\n\n async getSignedTransaction(serializedTx: string): Promise<ethers.Transaction> {\n return ethers.Transaction.from(serializedTx);\n }\n\n async getNonce(provider: ethers.JsonRpcProvider, address: string): Promise<number> {\n return await provider.getTransactionCount(address);\n }\n\n async simulateTransaction(provider: ethers.JsonRpcProvider, tx: unknown): Promise<unknown> {\n const txRequest = tx as ethers.TransactionRequest;\n return await provider.call({\n to: txRequest.to,\n from: txRequest.from,\n data: txRequest.data,\n value: txRequest.value,\n gasLimit: txRequest.gasLimit,\n gasPrice: txRequest.gasPrice,\n });\n }\n\n async broadcastTransaction(\n provider: ethers.JsonRpcProvider,\n signedTx: string\n ): Promise<ethers.TransactionResponse> {\n return await provider.broadcastTransaction(signedTx);\n }\n\n encodeExecTransaction(\n to: string,\n value: string,\n data: string,\n operation: number,\n signature: string\n ): string {\n return iface.encodeFunctionData('execTransaction', [\n to,\n value,\n data,\n operation,\n '0',\n '0',\n '0',\n ethers.ZeroAddress,\n ethers.ZeroAddress,\n signature,\n ]);\n }\n\n async getOwners(multisigAddress: string, provider: ethers.JsonRpcProvider): Promise<string[]> {\n const contract = new ethers.Contract(multisigAddress, GNOSIS_ABI, provider);\n return await contract.getOwners();\n }\n\n encodeRemoveOwner(owners: string[], ownerToRemove: string, newThreshold: number): string {\n const index = owners.findIndex(\n (owner) => owner.toLowerCase() === ownerToRemove.toLowerCase()\n );\n if (index === -1) throw new Error('Owner not found');\n if (owners.length === 1) throw new Error('Cannot remove the only owner');\n\n const prevOwner = index === 0 ? SENTINEL_OWNERS : owners[index - 1];\n return iface.encodeFunctionData('removeOwner', [prevOwner, ownerToRemove, newThreshold]);\n }\n\n encodeChangeThreshold(newThreshold: number): string {\n return iface.encodeFunctionData('changeThreshold', [newThreshold]);\n }\n\n encodeAddOwnerWithThreshold(newOwner: string, threshold: number): string {\n return iface.encodeFunctionData('addOwnerWithThreshold', [newOwner, threshold]);\n }\n\n /**\n * Sign EVM order (Gnosis Safe signature)\n */\n async signOrder(params: SignOrderParams): Promise<IframeTxResponse> {\n const { wallet, deviceShare, order } = params;\n const currentDeviceShare = deviceShare || '-';\n\n if (!wallet) {\n throw new Error('Wallet address missing');\n }\n const hashToSign = (order as any)?.hashToSing || (order?.params as any)?.safeTxHash;\n if (!hashToSign) {\n throw new Error('Order hash not found');\n }\n\n let signer: ethers.Wallet;\n let updatedDeviceShare: string | null = null;\n\n try {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructEvmKey(currentDeviceShare, wallet.address, forceUpdate)\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (error: any) {\n throw new Error(error.message || \"Order signing failed on EVM key reconstruction.\");\n }\n\n try {\n const signedOrderHash = await signer.signMessage(ethers.getBytes(hashToSign));\n\n const signedHash = await this.gnosisAdjustVInSignature(\n SigningMethod.ETH_SIGN,\n signedOrderHash,\n hashToSign,\n signer.address\n );\n\n return {\n tx: signedHash,\n updatedDeviceShare: updatedDeviceShare,\n };\n } catch (error: any) {\n console.error(\"Error signing EVM order:\", error);\n throw new Error(error.message || \"Order signing failed on EVM.\");\n }\n }\n\n /**\n * Adjust V value in signature for Gnosis Safe\n */\n private async gnosisAdjustVInSignature(\n signingMethod: SigningMethod,\n signature: string,\n safeTxHash: string,\n signerAddress: string\n ): Promise<string> {\n const ETHEREUM_V_VALUES = [0, 1, 27, 28];\n const MIN_VALID_V_VALUE_FOR_SAFE_ECDSA = 27;\n\n let signatureV = parseInt(signature.slice(-2), 16);\n\n if (!ETHEREUM_V_VALUES.includes(signatureV)) {\n throw new Error(\"Invalid signature\");\n }\n\n if (signingMethod === SigningMethod.ETH_SIGN) {\n if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {\n signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;\n }\n\n let adjustedSignature = signature.slice(0, -2) + signatureV.toString(16);\n\n const signatureHasPrefix = await this.isTxHashSignedWithPrefix(\n safeTxHash,\n adjustedSignature,\n signerAddress\n );\n\n if (signatureHasPrefix) {\n signatureV += 4;\n }\n\n signature = signature.slice(0, -2) + signatureV.toString(16);\n }\n\n if (signingMethod === SigningMethod.ETH_SIGN_TYPED_DATA) {\n if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) {\n signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA;\n }\n signature = signature.slice(0, -2) + signatureV.toString(16);\n }\n\n return signature;\n }\n\n /**\n * Checks if a signature was produced by signing the hash with the Ethereum prefix\n */\n private async isTxHashSignedWithPrefix(\n hash: string,\n signature: string,\n signerAddress: string\n ): Promise<boolean> {\n try {\n const recoveredAddress = ethers.verifyMessage(ethers.getBytes(hash), signature);\n return recoveredAddress.toLowerCase() === signerAddress.toLowerCase();\n } catch (e) {\n return false;\n }\n }\n\n\n\n\n /**\n * Sign EVM transaction (for native/ERC20 sends)\n */\n async signEvmTransaction(\n deviceShare: string,\n address: string,\n transaction: ethers.TransactionRequest,\n expectedChainId: number\n ): Promise<IframeTxResponse> {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructEvmKey(deviceShare, address, forceUpdate)\n );\n\n const { signer, newDeviceShare } = result;\n const unsignedTx = ethers.Transaction.from(transaction as ethers.TransactionLike);\n\n if (unsignedTx.chainId !== BigInt(expectedChainId)) {\n throw new Error('Transaction chain ID does not match the expected network.');\n }\n\n const signedTx = await signer.signTransaction(unsignedTx);\n\n return {\n tx: signedTx,\n updatedDeviceShare: newDeviceShare,\n };\n }\n\n async createOrder(params: CreateOrderParams): Promise<{ order: Order; proposalHash: string }> {\n const { multisigId, wallet, method, instructions } = params;\n\n const response = await this.apiClient.post<{ order: Order & { hashToSing?: string } }>('/order/create/evm', {\n multisigId,\n walletAddress: wallet.address,\n method,\n instructions,\n });\n\n return {\n order: response.order,\n proposalHash: (response.order as any).hashToSing || '',\n };\n }\n\n async rejectOrder(params: RejectOrderParams): Promise<{ rejectionHash: string; order: unknown }> {\n const { orderId, multisigId, wallet } = params;\n\n if (!multisigId) {\n throw new Error('Vault id missing');\n }\n\n const response = await this.apiClient.post<{ order: unknown }>('/order/reject/evm', {\n orderId,\n multisigId,\n walletAddress: wallet.address,\n });\n\n return {\n rejectionHash: '',\n order: response.order,\n };\n }\n\n async executeTransaction(params: ExecuteTransactionParams): Promise<unknown> {\n const { input, actualWallet, chainId } = params;\n\n if (!actualWallet) {\n throw new Error('Wallet not connected');\n }\n\n if (input.type === TransactionExecutionType.Send) {\n return this.executeNativeSend(input.data as SendData, actualWallet, chainId);\n }\n\n throw new Error(`Transaction type ${input.type} not yet implemented`);\n }\n\n private async executeNativeSend(\n data: SendData,\n wallet: { address: string; deviceShare?: string },\n chainId: string | number\n ): Promise<ethers.TransactionResponse> {\n const deviceShare = wallet.deviceShare;\n if (!deviceShare) {\n throw new Error('Device share missing');\n }\n\n const provider = this.getProvider(String(chainId));\n const { to, amount, estimatedFee, tokenAddress, isNativeToken } = data;\n\n const actualGasLimit = estimatedFee?.gasLimit\n ? Math.floor(Number(estimatedFee.gasLimit) * 0.9).toString()\n : FALLBACK_GAS_LIMIT;\n const actualGasPrice = estimatedFee?.gasPrice\n ? Math.floor(Number(estimatedFee.gasPrice) * 0.9).toString()\n : FALLBACK_GAS_PRICE;\n\n let transaction: ethers.TransactionRequest;\n\n if (isNativeToken) {\n transaction = {\n to,\n value: ethers.parseEther(String(amount)),\n data: '0x',\n gasLimit: BigInt(actualGasLimit),\n gasPrice: BigInt(actualGasPrice),\n chainId: Number(chainId),\n };\n } else {\n if (!tokenAddress) {\n throw new Error('Token address is required for ERC20 transfers');\n }\n const tokenContract = new ethers.Contract(tokenAddress, ['function decimals() view returns (uint8)'], provider);\n const decimals = await tokenContract.decimals();\n const amountInWei = ethers.parseUnits(String(amount), decimals);\n const txData = erc20Interface.encodeFunctionData('transfer', [to, amountInWei]);\n\n transaction = {\n to: tokenAddress,\n value: 0n,\n data: txData,\n gasLimit: BigInt(actualGasLimit),\n gasPrice: BigInt(actualGasPrice),\n chainId: Number(chainId),\n };\n }\n\n transaction.nonce = await this.getNonce(provider, wallet.address);\n\n const { tx: signedTx } = await this.signEvmTransaction(\n deviceShare,\n wallet.address,\n transaction,\n Number(chainId)\n );\n\n return await this.broadcastTransaction(provider, signedTx);\n }\n\n async estimateFee(params: EstimateFeeParams): Promise<EstimatedFee> {\n const { input, actualWallet, chainId } = params;\n\n if (input.type === TransactionEstimatingType.Send) {\n return this.estimateEvmRegularFee(input.data as SendData, actualWallet, chainId);\n }\n\n throw new Error(`Fee estimation not implemented for type: ${input.type}`);\n }\n\n /**\n * Estimate EVM transaction fee\n */\n private async estimateEvmRegularFee(\n data: SendData,\n wallet: { address: string },\n chainId: string | number\n ): Promise<EstimatedFee> {\n const provider = this.getProvider(String(chainId));\n const { to, amount, isNativeToken, tokenAddress, decimals } = data;\n\n let transaction: ethers.TransactionRequest;\n let fallbackGasLimit = FALLBACK_GAS_LIMIT;\n\n if (isNativeToken) {\n let estimationValue: bigint;\n try {\n const balance = await provider.getBalance(wallet.address);\n const requestedValue = ethers.parseEther(String(amount));\n\n if (requestedValue > (balance * 99n) / 100n) {\n estimationValue = balance > ethers.parseEther('0.02')\n ? ethers.parseEther('0.01')\n : balance / 2n;\n } else {\n estimationValue = requestedValue;\n }\n } catch {\n estimationValue = ethers.parseEther(String(amount));\n }\n\n transaction = {\n from: wallet.address,\n to,\n value: estimationValue,\n data: '0x',\n };\n } else {\n if (!tokenAddress) throw new Error('tokenAddress is required for ERC20 transfers.');\n if (decimals === undefined) throw new Error('decimals are required for ERC20 transfers.');\n\n const amountInSmallestUnit = ethers.parseUnits(String(amount), decimals);\n const txData = erc20Interface.encodeFunctionData('transfer', [to, amountInSmallestUnit]);\n\n transaction = {\n from: wallet.address,\n to: tokenAddress,\n value: 0n,\n data: txData,\n };\n fallbackGasLimit = FALLBACK_ERC20_GAS_LIMIT;\n }\n\n let gasLimit: string;\n let gasPrice: string;\n\n try {\n const estimatedGas = await provider.estimateGas(transaction);\n const bufferedGas = (estimatedGas * 115n) / 100n;\n gasLimit = bufferedGas.toString();\n } catch {\n gasLimit = fallbackGasLimit;\n }\n\n try {\n const feeData = await this.getFeeData(provider);\n const baseGasPrice = feeData.gasPrice || BigInt(FALLBACK_GAS_PRICE);\n gasPrice = (baseGasPrice * 105n / 100n).toString();\n } catch {\n gasPrice = FALLBACK_GAS_PRICE;\n }\n\n const totalFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n const estimatedFeeEth = formatUnits(totalFeeWei, 18);\n\n return {\n estimatedFee: estimatedFeeEth,\n gasLimit,\n gasPrice,\n };\n }\n}\n","\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","\nimport type { ApiClient } from \"./client\";\nimport {\n IOrderApi,\n Order,\n PaginatedOrdersResponse,\n DeleteResponse,\n OrderInstruction,\n CreateOrderInput,\n CreateOrderOutput,\n CreateSendOrderInput,\n CreateSettingsOrderInput,\n GetOrderByIdInput,\n GetOrdersInput,\n SignOrderInput,\n SignOrderOutput,\n ExecuteOrderInput,\n ExecuteOrderOutput,\n RejectOrderInput,\n RejectOrderOutput,\n DeleteOrderInput,\n EChainType,\n ESolanaInstructionType,\n ETronOrderType,\n MultisigsItem,\n TokenInfo,\n OrderMethodType,\n ChainIdValue,\n} from \"../core/types\";\nimport { InvalidInputError } from \"../core/errors\";\nimport { KeyReconstructor } from \"../services/key-reconstructor\";\nimport { ethers } from \"ethers\";\nimport { GNOSIS_SAFE_ABI } from \"../core/abi\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { solToLamports, MINIMUM_AMOUNT_ON_WALLET_TO_CREATE_SOL_TX } from \"../strategies/solanaServices/utils/solanaHelpers\";\nimport { Multisig } from \"@solana/spl-token\";\n\n/**\n * Implementation of order-related API operations with unified routing\n */\nexport class OrderApi implements IOrderApi {\n private readonly client: ApiClient;\n private readonly keyReconstructor: KeyReconstructor;\n\n constructor(client: ApiClient) {\n this.client = client;\n this.keyReconstructor = new KeyReconstructor(client);\n }\n\n /**\n * Creates an order - routes to chain-specific implementation\n * Handles both Send (token transfers) and Settings (multisig configuration) orders\n */\n public async createOrder(\n params: CreateOrderInput\n ): Promise<CreateOrderOutput> {\n const { chain, multisigId, walletAddress, method, instructions } = params;\n\n switch (chain) {\n case EChainType.EVM: {\n const result = await this.createEvmOrder(\n multisigId,\n walletAddress,\n instructions,\n method,\n params\n );\n return {\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n case EChainType.SOL: {\n const result = await this.createSolanaOrder(\n multisigId,\n walletAddress,\n instructions,\n method,\n params\n );\n return {\n order: result.order,\n proposalHash: result.params?.multisigPda,\n updatedDeviceShare: null,\n };\n }\n case EChainType.TRON: {\n const result = await this.createTronOrder(\n multisigId,\n walletAddress,\n instructions,\n method,\n params\n );\n return {\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n const result = await this.createBtcOrder(\n multisigId,\n walletAddress,\n instructions\n );\n return {\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n default:\n throw new InvalidInputError(\n `Chain '${chain}' is not supported for createOrder`\n );\n }\n }\n\n /**\n * Creates a send order (token transfer) - Simplified API\n * Automatically detects method and builds instructions based on chain and token type\n */\n public async createSendOrder(\n params: CreateSendOrderInput\n ): Promise<CreateOrderOutput> {\n // 1. Get multisig to determine chain\n const multisigResponse = await this.client.get<{ multisig: MultisigsItem }>(\n `/sdk/multisig/${params.multisigId}`\n );\n const multisig = multisigResponse.multisig;\n\n // 2. Determine method based on chain and token\n const method = this.detectSendMethod(multisig.chainType, params.token) as OrderMethodType;\n\n // 3. Build instructions\n const instructions = this.buildSendInstructions(\n params.to,\n params.amount,\n params.token\n );\n\n // 4. Call existing createOrder\n return this.createOrder({\n chain: multisig.chainType,\n multisigId: params.multisigId,\n walletAddress: params.walletAddress,\n method,\n instructions,\n token: params.token,\n selectedToken: params.token,\n deviceShare: params.deviceShare,\n chainId: params.chainId as ChainIdValue,\n });\n }\n\n /**\n * Creates a settings order (multisig configuration change) - Simplified API\n * Automatically calculates changes and determines the optimal method\n */\n public async createSettingsOrder(\n params: CreateSettingsOrderInput\n ): Promise<CreateOrderOutput> {\n // 1. Extract current state\n const chainType = params.multisig.params.chainType;\n const currentOwners = params.multisig.owners.map((o) => o.walletAddress);\n const currentThreshold = +params.multisig.threshold;\n\n // 2. Calculate changes\n const ownersAdded = params.newOwners.filter(\n (o) => !currentOwners.includes(o)\n );\n const ownersRemoved = currentOwners.filter(\n (o) => !params.newOwners.includes(o)\n );\n const newThreshold = params.newThreshold ?? currentThreshold;\n const thresholdChanged = newThreshold !== currentThreshold;\n\n // 3. Determine method using existing helper\n const { getChangeMethod } = await import(\"./order-helpers\");\n const method = getChangeMethod(\n chainType,\n ownersAdded.length,\n ownersRemoved.length,\n thresholdChanged\n ) as OrderMethodType;\n\n if (!method) {\n throw new InvalidInputError(\"No changes detected in multisig configuration\");\n }\n\n // 4. Call existing createOrder with full params\n return this.createOrder({\n chain: chainType,\n multisigId: params.multisigId,\n multisigAddress: params.multisig.address || undefined,\n walletAddress: params.walletAddress,\n method,\n instructions: [],\n multisig: params.multisig,\n owners: currentOwners,\n newOwners: ownersAdded,\n ownersToRemove: ownersRemoved,\n multisigThreshold: currentThreshold,\n newThreshold: newThreshold,\n deviceShare: params.deviceShare,\n chainId: params.multisig.chainId,\n });\n }\n\n /**\n * Detects the appropriate send method based on chain and token type\n */\n private detectSendMethod(chain: EChainType, token?: TokenInfo): string {\n if (!token) {\n // Native token transfer\n return \"native\";\n }\n\n // Token transfer\n if (chain === EChainType.EVM) return \"erc20\";\n if (chain === EChainType.SOL) return \"spl\";\n if (chain === EChainType.TRON) {\n // Tron uses different methods for TRC20 vs TRC10\n return token.address.startsWith(\"T\") ? \"trc20\" : \"trc\";\n }\n\n throw new InvalidInputError(`Unsupported chain for token transfer: ${chain}`);\n }\n\n /**\n * Builds send order instructions\n */\n private buildSendInstructions(\n to: string,\n amount: string,\n token?: TokenInfo\n ): OrderInstruction[] {\n return [\n {\n to,\n toPubkey: to,\n amount,\n tokenAddress: token?.address,\n decimals: token?.decimals,\n },\n ];\n }\n\n /**\n * Gets an order by ID\n */\n public async getOrder(params: GetOrderByIdInput): Promise<{ order: Order }> {\n return this.getOrderById(params.orderId);\n }\n\n /**\n * Gets orders for a multisig\n */\n public async getOrders(\n params: GetOrdersInput\n ): Promise<PaginatedOrdersResponse> {\n return this.getOrdersByMultisigId(\n params.multisigId,\n params.page,\n params.limit\n );\n }\n\n /**\n * Gets paginated orders (alias for getOrders)\n */\n public async getPaginatedOrders(\n params: GetOrdersInput\n ): Promise<PaginatedOrdersResponse> {\n return this.getOrders(params);\n }\n\n /**\n * Signs an order - routes to chain-specific implementation\n */\n public async signOrder(params: SignOrderInput): Promise<SignOrderOutput> {\n\n const { chain, orderId, walletAddress, transaction, multisigId } = params;\n\n switch (chain) {\n case EChainType.EVM: {\n if (!transaction) {\n throw new InvalidInputError(\"Transaction is required for EVM orders\");\n }\n const result = await this.signEvmOrder(\n orderId,\n walletAddress,\n transaction,\n multisigId\n );\n return {\n signature: transaction,\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n case EChainType.SOL: {\n if (!transaction) {\n throw new InvalidInputError(\"Transaction is required for Solana orders\");\n }\n const result = await this.signSolanaOrder(\n orderId,\n walletAddress,\n transaction,\n multisigId\n );\n return {\n signature: transaction,\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n case EChainType.TRON: {\n if (!transaction) {\n throw new InvalidInputError(\"Transaction is required for Tron orders\");\n }\n const result = await this.signTronOrder(\n orderId,\n walletAddress,\n transaction,\n multisigId,\n params?.version\n );\n return {\n signature: transaction,\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n if (!transaction) {\n throw new InvalidInputError(\"Transaction is required for Btc orders\");\n }\n const result = await this.signBtcOrder(\n orderId,\n walletAddress,\n transaction,\n multisigId\n );\n return {\n signature: transaction,\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n default:\n throw new InvalidInputError(\n `Chain '${chain}' is not supported for signOrder`\n );\n }\n }\n\n /**\n * Executes an order - routes to chain-specific implementation\n * Builds transaction locally, signs via KeyReconstructor, validates, and submits to backend\n */\n public async executeOrder(\n params: ExecuteOrderInput\n ): Promise<ExecuteOrderOutput> {\n const { chain, order, multisig, walletAddress, deviceShare, feeQuote, chainId } = params;\n\n switch (chain) {\n case EChainType.EVM: {\n const multisigAddress = multisig.address || (order as any).multisigAddress || (order as any).vault?.address;\n\n const result = await this.executeEvmOrder({\n orderId: order.id,\n order: order as any,\n multisigAddress,\n walletAddress,\n deviceShare,\n chainId: chainId || (order as any).chainId || multisig.chainId || '1',\n gasLimit: feeQuote?.gasLimit,\n gasPrice: feeQuote?.gasPrice,\n });\n return {\n txHash: result.txHash || \"\",\n order: result.order,\n updatedDeviceShare: result.updatedDeviceShare,\n };\n }\n case EChainType.SOL: {\n // Determine method type from order params\n const method = (order as any).params?.instructions?.[0]?.type || \"native\";\n\n const result = await this.executeSolanaOrder({\n orderId: order.id,\n walletAddress,\n deviceShare,\n chainId: chainId || multisig.chainId || \"sol_mainnet\",\n method,\n });\n return {\n txHash: result.txHash || \"\",\n order: result.order,\n updatedDeviceShare: result.updatedDeviceShare,\n };\n }\n case EChainType.TRON: {\n const result = await this.executeTronOrder(order.id, walletAddress);\n return {\n txHash: result.txHash || \"\",\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n const result = await this.executeBtcOrder(order.id, walletAddress);\n return {\n txHash: result.txHash || \"\",\n order: result.order,\n updatedDeviceShare: null,\n };\n }\n default:\n throw new InvalidInputError(\n `Chain '${chain}' is not supported for executeOrder`\n );\n }\n }\n\n /**\n * Rejects an order - routes to chain-specific implementation\n */\n public async rejectOrder(\n params: RejectOrderInput\n ): Promise<RejectOrderOutput> {\n const { chain, order, multisig, walletAddress, deviceShare } = params;\n\n switch (chain) {\n case EChainType.EVM: {\n const newOrder = await this.rejectEvmOrder(\n order,\n walletAddress,\n multisig\n );\n return {\n order: newOrder,\n updatedDeviceShare: null,\n };\n }\n case EChainType.SOL: {\n const chainId = params.chainId || multisig.chainId;\n const result = await this.rejectSolanaOrder(\n order.id,\n walletAddress,\n deviceShare || \"\",\n multisig.id,\n chainId\n );\n return {\n order: result.order,\n updatedDeviceShare: result.updatedDeviceShare,\n };\n }\n case EChainType.TRON: {\n const result = await this.rejectTronOrder(\n order?.id,\n walletAddress,\n multisig.id\n );\n return {\n order: result,\n updatedDeviceShare: null,\n };\n }\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n const result = await this.rejectBtcOrder(\n order?.id,\n walletAddress,\n multisig.id\n );\n return {\n order: result,\n updatedDeviceShare: null,\n };\n }\n default:\n throw new InvalidInputError(\n `Chain '${chain}' is not supported for rejectOrder`\n );\n }\n }\n\n /**\n * Cancels/deletes an order\n */\n public async cancelOrder(params: DeleteOrderInput): Promise<DeleteResponse> {\n return this.deleteOrder(params.orderId);\n }\n\n /**\n * Creates an EVM order\n * Handles both Send (native/ERC20) and Settings (owner management) orders\n */\n public async createEvmOrder(\n multisigId: string,\n walletAddress: string,\n instructions: OrderInstruction[],\n method: string,\n params: CreateOrderInput\n ): Promise<{ order: Order }> {\n const {\n isSendOrder,\n createEvmSendAction,\n createEvmActions,\n } = await import(\"./order-helpers\");\n\n let actions: Array<{ to: string; data: string; value: string }>;\n\n if (isSendOrder(method)) {\n // Handle Send orders (native or ERC20 token transfer)\n const instruction = instructions[0];\n if (!instruction || !instruction.to) {\n throw new InvalidInputError(\"Send order requires 'to' address\");\n }\n if (!instruction.amount) {\n throw new InvalidInputError(\"Send order requires 'amount'\");\n }\n\n const isNative = method === \"native\";\n const selectedToken = params.selectedToken || params.token;\n\n actions = [\n createEvmSendAction(\n instruction.to,\n instruction.amount,\n isNative,\n selectedToken?.address,\n selectedToken?.decimals\n ),\n ];\n } else {\n // Handle Settings orders (owner management, threshold changes)\n if (!params.multisigAddress && !params.multisig?.address) {\n throw new InvalidInputError(\n \"Settings order requires multisigAddress or multisig object\"\n );\n }\n\n const multisigAddress =\n params.multisigAddress || params.multisig!.address!;\n const owners = params.owners || (params.multisig ? params.multisig.owners.map((o) => o.walletAddress) : []);\n const threshold = params.multisigThreshold || params.threshold || (params.multisig?.threshold ? parseInt(params.multisig.threshold) : 1);\n\n actions = await createEvmActions({\n chainId: params.chainId || \"1\",\n method,\n multisigAddress,\n threshold,\n newThreshold: params.newThreshold,\n owners,\n ownersAdded: params.newOwners,\n ownersRemoved: params.ownersToRemove,\n });\n }\n\n return this.client.post<{ order: Order }>(\"/sdk/order/create/evm\", {\n multisigId,\n walletAddress,\n actions,\n });\n }\n\n /**\n * Creates a Solana order\n * Full flow: Create order → Build & sign transaction → Activate order\n * \n * Based on working frontend implementation:\n * 1. Create order on backend (get order ID and params)\n * 2. Use createSolanaMultisigOrder to build and sign the transaction locally\n * 3. Submit signed transaction to /order/activate/sol\n */\n public async createSolanaOrder(\n multisigId: string,\n walletAddress: string,\n instructions: OrderInstruction[],\n method: string,\n params: CreateOrderInput\n ): Promise<{\n order: Order;\n params: { multisigPda: string; vaultAddress: string };\n }> {\n const {\n isSendOrder,\n createSolanaInstructions,\n } = await import(\"./order-helpers\");\n\n // Step 1: Prepare actions for backend order creation\n let actions: OrderInstruction[];\n\n if (isSendOrder(method)) {\n const instruction = instructions[0];\n if (!instruction) {\n throw new InvalidInputError(\"Send order requires instruction\");\n }\n\n const toPubkey = instruction.to || instruction.toPubkey;\n if (!toPubkey) {\n throw new InvalidInputError(\"Send order requires 'to' or 'toPubkey' address\");\n }\n if (!instruction.amount) {\n throw new InvalidInputError(\"Send order requires 'amount'\");\n }\n\n const tokenAddress =\n method === \"spl\" || method === ESolanaInstructionType.spl\n ? (params.selectedToken?.address || params.token?.address || instruction.tokenAddress)\n : undefined;\n\n actions = [\n {\n type: method,\n toPubkey,\n amount: instruction.amount,\n tokenAddress,\n },\n ];\n } else {\n actions = createSolanaInstructions(\n method,\n params.newOwners,\n params.ownersToRemove,\n params.newThreshold\n );\n }\n\n // Step 2: Create order on backend (get order ID and multisig params)\n const orderResponse = await this.client.post<{\n order: Order;\n params: { multisigPda: string; vaultAddress: string };\n }>(\"/sdk/order/create/sol\", {\n multisigId,\n walletAddress,\n actions,\n });\n\n const { order: orderToCreate, params: orderParams } = orderResponse;\n\n if (!orderParams?.vaultAddress || !orderParams?.multisigPda) {\n throw new InvalidInputError(\"Backend response missing multisig params\");\n }\n\n // Step 3: Build and sign transaction locally using Squads SDK\n const { createSolanaMultisigOrder } = await import(\n \"../strategies/iframeServices/solana/createSolanaMultisigOrder\"\n );\n\n const { Connection } = await import(\"@solana/web3.js\");\n const { DEFAULT_RPC_ENDPOINTS } = await import(\"../core/config\");\n\n const networkMode = params.chainId === \"sol_mainnet\" ? \"mainnet\" : \"testnet\";\n const rpcUrl = DEFAULT_RPC_ENDPOINTS[networkMode].solana;\n const connection = new Connection(rpcUrl, \"confirmed\");\n\n const { tx: signedTx } = await createSolanaMultisigOrder({\n deviceShare: params.deviceShare || \"-\",\n address: walletAddress,\n accessToken: this.client.getAuthToken(),\n multisigPda: orderParams.multisigPda,\n method: method as any,\n instructions: actions,\n orderId: orderToCreate.id,\n rpcUrl,\n vaultAddress: orderParams.vaultAddress,\n selectedToken: (params.selectedToken || params.token) as any, // Cast to any to handle optional type\n });\n\n // Step 4: Submit signed transaction to activate endpoint\n const activateResponse = await this.client.post<{ order: Order }>(\"/sdk/order/activate/sol\", {\n transaction: signedTx,\n multisigId,\n orderId: orderToCreate.id,\n walletAddress,\n });\n\n return {\n order: activateResponse.order,\n params: orderParams,\n };\n }\n\n /**\n * Activates a Solana order\n */\n public async activateSolanaOrder(\n transaction: string,\n multisigId: string,\n orderId: string,\n walletAddress: string\n ): Promise<{ order: Order }> {\n return this.client.post<{ order: Order }>(\"/sdk/order/activate/sol\", {\n transaction,\n multisigId,\n orderId,\n walletAddress,\n });\n }\n\n /**\n * Creates a Tron order\n * Handles both Send (native/TRC20) and Settings (owner management) orders\n */\n public async createTronOrder(\n multisigId: string,\n walletAddress: string,\n instructions: OrderInstruction[],\n method: string,\n params: CreateOrderInput\n ): Promise<{ order: Order }> {\n const {\n isSendOrder,\n createTronInstruction,\n } = await import(\"./order-helpers\");\n\n let actions: any[];\n\n if (isSendOrder(method)) {\n // Handle Send orders (native or TRC20 token transfer)\n const instruction = instructions[0];\n if (!instruction) {\n throw new InvalidInputError(\"Send order requires instruction\");\n }\n\n const toPubkey = instruction.to || instruction.toPubkey;\n if (!toPubkey) {\n throw new InvalidInputError(\"Send order requires 'to' or 'toPubkey' address\");\n }\n if (!instruction.amount) {\n throw new InvalidInputError(\"Send order requires 'amount'\");\n }\n\n const tokenAddress =\n method === \"trc20\" || method === \"trc\" || method === ETronOrderType.trc20 || method === ETronOrderType.trc\n ? (params.selectedToken?.address || params.token?.address || instruction.tokenAddress)\n : undefined;\n\n actions = [\n {\n amount: instruction.amount,\n to: toPubkey,\n type: method,\n tokenAddress,\n },\n ];\n } else {\n // Handle Settings orders (owner management, threshold changes)\n // For Tron settings, we need to prepare unique owners list\n const currentOwners = params.owners || params.multisig?.owners.map((o) => o.walletAddress) || [];\n const newOwners = params.newOwners || [];\n const ownersToRemove = params.ownersToRemove || [];\n\n const uniqueOwners = [\n ...new Set([...newOwners, ...currentOwners]),\n ].filter((o) => !ownersToRemove.length || !ownersToRemove.includes(o));\n\n const tronInstruction = createTronInstruction(\n method,\n uniqueOwners,\n params.newThreshold\n );\n\n actions = [tronInstruction];\n }\n\n return this.client.post<{ order: Order }>(\"/sdk/order/create/tron\", {\n multisigId,\n walletAddress,\n actions,\n });\n }\n\n /**\n * Creates a BTC order\n * Note: BTC uses 'instructions' object format (not array like other chains)\n */\n public async createBtcOrder(\n multisigId: string,\n walletAddress: string,\n actions: OrderInstruction[]\n ): Promise<{ order: Order }> {\n const instruction = (actions[0] || {}) as Record<string, unknown>;\n return this.client.post<{ order: Order }>(\"/sdk/order/create/btc\", {\n multisigId,\n walletAddress,\n instructions: {\n amount: instruction.amount || instruction.value,\n to: instruction.to || instruction.toPubkey,\n type: instruction.type || \"transfer\",\n },\n });\n }\n\n /**\n * Signs an EVM order\n */\n public async signEvmOrder(\n orderId: string,\n walletAddress: string,\n transaction: string,\n multisigId?: string\n ): Promise<{ order: Order }> {\n return this.client.post<{ order: Order }>(\"/sdk/order/sign/evm\", {\n orderId,\n walletAddress,\n signedHash: transaction,\n multisigId,\n });\n }\n\n /**\n * Signs a Solana order\n */\n public async signSolanaOrder(\n orderId: string,\n walletAddress: string,\n transaction?: string,\n multisigId?: string\n ): Promise<{ order: Order }> {\n return this.client.post<{ order: Order }>(\"/sdk/order/sign/sol\", {\n orderId,\n walletAddress,\n transaction,\n multisigId,\n });\n }\n\n /**\n * Signs a Tron order\n */\n public async signTronOrder(\n orderId: string,\n walletAddress: string,\n signature: string,\n multisigId?: string,\n version?: string\n ): Promise<{ order: Order }> {\n return this.client.post<{ order: Order }>(\"/sdk/order/sign/tron\", {\n orderId,\n walletAddress,\n signature,\n multisigId,\n version\n });\n }\n\n /**\n * Signs a BTC order\n */\n public async signBtcOrder(\n orderId: string,\n walletAddress: string,\n transaction: string,\n multisigId?: string\n ): Promise<{ order: Order }> {\n return this.client.post<{ order: Order }>(\"/sdk/order/sign/btc\", {\n orderId,\n walletAddress,\n signedData: transaction,\n multisigId,\n });\n }\n\n /**\n * Rejects an EVM order\n * Implementation matches working code: creates a rejection transaction (0-value, same nonce)\n */\n public async rejectEvmOrder(\n order: Order,\n walletAddress: string,\n multisig?: MultisigsItem\n ): Promise<Order> {\n // 1. Fetch the order to get the nonce\n\n // 2. Create rejection proposal (same nonce, 0 value to/from multisig or self)\n // Using /order/create/evm as specified in working code\n const response = await this.client.post<{ order: Order }>(\n \"/sdk/order/create/evm\",\n {\n multisigId: multisig?.id,\n walletAddress,\n nonce: order?.nonce,\n actions: [\n {\n to: multisig?.address,\n data: \"0x\",\n value: \"0\",\n },\n ],\n }\n );\n return response.order;\n }\n\n /**\n * Rejects a Solana order\n * Implementation matches working code: fetches params, signs rejection instruction, submits\n */\n public async rejectSolanaOrder(\n orderId: string,\n walletAddress: string,\n deviceShare: string,\n multisigId?: string,\n chainId?: string | number\n ): Promise<{ order: Order; updatedDeviceShare: string | null }> {\n // 1. Fetch Order Params\n const paramsResponse = await this.client.get<any>(`/sdk/order/params/sol/${orderId}`);\n const { order, params } = paramsResponse;\n\n if (!params?.multisigPda || !params?.transactionIndex) {\n throw new Error(\"Missing Vault params from backend response\");\n }\n\n // 2. Determine RPC URL\n const { DEFAULT_RPC_ENDPOINTS } = await import('../core/config');\n let rpcUrl = DEFAULT_RPC_ENDPOINTS.mainnet.solana;\n\n // Check if it's testnet/devnet based on chainId (generic check)\n // Solana devnet chainId is usually not numeric \"101\" etc in this context, but string \"solana_devnet\" or similar\n // We'll check if chainId contains \"devnet\" or \"testnet\"\n if (chainId) {\n const chainIdStr = String(chainId).toLowerCase();\n if (chainIdStr.includes('devnet') || chainIdStr.includes('testnet') || chainIdStr === '103' || chainIdStr === '102') {\n rpcUrl = DEFAULT_RPC_ENDPOINTS.testnet.solana;\n }\n }\n\n // 3. Sign Rejection Transaction\n const { tx: rejectTransaction, updatedDeviceShare } = await this.keyReconstructor.signTransaction({\n deviceShare,\n address: walletAddress,\n chainType: 'solana',\n action: 'sol.rejectOrder',\n params: {\n multisigParams: {\n multisigPda: params.multisigPda,\n transactionIndex: order.nonce.toString(),\n orderId: orderId,\n rpcUrl,\n },\n },\n });\n\n // 4. Submit Rejection\n const response = await this.client.post<{ order: Order }>(\n \"/sdk/order/reject/sol\",\n {\n transaction: rejectTransaction,\n orderId,\n multisigId: order.multisigId || multisigId,\n walletAddress,\n }\n );\n\n return {\n order: response.order,\n updatedDeviceShare,\n };\n }\n\n /**\n * Rejects a Tron order\n */\n public async rejectTronOrder(\n orderId: string,\n walletAddress: string,\n multisigId?: string\n ): Promise<Order> {\n if (!walletAddress) {\n throw new Error(\"Wallet address missing\");\n }\n if (!multisigId) {\n throw new Error(\"Vault id missing\");\n }\n\n try {\n const response = await this.client.post<{ order: Order }>(\n \"/sdk/order/reject/tron\",\n {\n orderId,\n multisigId,\n walletAddress,\n }\n );\n return response.order;\n } catch (error: any) {\n console.error(\"rejectOrder failed:\", error);\n throw new Error(error?.message || \"Order rejection failed\");\n }\n }\n\n /**\n * Rejects a BTC order\n */\n public async rejectBtcOrder(\n orderId: string,\n walletAddress: string,\n multisigId?: string\n ): Promise<Order> {\n if (!walletAddress) {\n throw new Error(\"Wallet address missing\");\n }\n if (!multisigId) {\n throw new Error(\"Vault id missing\");\n }\n\n try {\n const response = await this.client.post<{ order: Order }>(\n \"/sdk/order/reject/btc\",\n {\n orderId,\n multisigId,\n walletAddress,\n }\n );\n return response.order;\n } catch (error: any) {\n console.error(\"rejectOrder failed:\", error);\n throw new Error(\n error.response?.data?.message ||\n error?.message ||\n \"Order rejection failed\"\n );\n }\n }\n\n /**\n * Executes an EVM order\n * Full implementation matching frontend executeEvmOrder:\n * 1. Build transaction locally with Gnosis Safe encoding\n * 2. Fetch nonce from provider\n * 3. Sign transaction via KeyReconstructor\n * 4. Validate and simulate\n * 5. Submit to backend\n * 6. Comprehensive error handling\n */\n public async executeEvmOrder(params: {\n orderId: string;\n order: any;\n multisigAddress: string;\n walletAddress: string;\n deviceShare: string;\n chainId: string | number;\n gasLimit?: string;\n gasPrice?: string;\n }): Promise<{ txHash: string; order: Order; updatedDeviceShare: string | null }> {\n const { orderId, order, multisigAddress, walletAddress, deviceShare, chainId, gasLimit, gasPrice } = params;\n\n if (!walletAddress || !deviceShare) {\n throw new Error('Wallet not connected or share missing');\n }\n\n if (!multisigAddress) {\n throw new Error('Multisig address is required for EVM order execution');\n }\n\n const iface = new ethers.Interface(GNOSIS_SAFE_ABI);\n let transaction: any;\n\n try {\n const { to, value, data: orderData, operation, signature } = order;\n\n const encodedData = iface.encodeFunctionData('execTransaction', [\n to,\n value || '0',\n orderData || '0x',\n operation || 0,\n 0, // safeTxGas\n 0, // baseGas\n 0, // gasPrice\n ethers.ZeroAddress, // gasToken\n ethers.ZeroAddress, // refundReceiver\n signature || '0x',\n ]);\n\n transaction = {\n to: multisigAddress,\n value: '0',\n gasLimit: gasLimit || '500000',\n data: encodedData,\n chainId: +chainId,\n gasPrice: gasPrice,\n };\n } catch (err) {\n console.error('Error encoding EVM transaction:', err);\n throw new Error('Fail encoding EVM data');\n }\n\n // CRITICAL: Fetch nonce from provider (matching working frontend code)\n // This is required for KeyReconstructor validation\n try {\n const { DEFAULT_RPC_ENDPOINTS } = await import('../core/config');\n // Use mainnet by default, or detect from chainId if needed\n const networkMode = Number(chainId) >= 1000 ? 'testnet' : 'mainnet';\n const rpcUrl = DEFAULT_RPC_ENDPOINTS[networkMode].evm[Number(chainId)];\n\n if (!rpcUrl) {\n throw new Error(`No RPC endpoint configured for chain ID ${chainId}`);\n }\n\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n transaction.nonce = await provider.getTransactionCount(walletAddress, 'pending');\n transaction.chainId = Number(chainId);\n } catch (error) {\n console.error('Failed to fetch nonce:', error);\n throw new Error('Failed to fetch nonce from provider');\n }\n\n try {\n // Sign transaction via KeyReconstructor\n const { tx: signedTx, updatedDeviceShare } = await this.keyReconstructor.signTransaction({\n deviceShare: deviceShare || '-',\n address: walletAddress,\n chainType: 'evm',\n action: 'signTransaction',\n params: { transaction, expectedChainId: Number(chainId) },\n });\n\n const signedTransaction = ethers.Transaction.from(signedTx);\n if (!signedTransaction.hash) {\n throw new Error('Missing transaction hash after signing');\n }\n\n // Submit to backend\n const response = await this.client.post<{ txHash: string; order: Order }>(\n `/sdk/order/execute/evm/${orderId}`,\n {\n signedTransaction: signedTx,\n }\n );\n\n return {\n txHash: signedTransaction.hash,\n order: response.order,\n updatedDeviceShare,\n };\n } catch (err: any) {\n const error = err as Error & {\n code?: string;\n reason?: string;\n message?: string;\n };\n\n const msg = (error.message || error.reason || '').toLowerCase();\n\n console.error('EVM order execution failed:', err);\n\n // Comprehensive error handling matching frontend\n if (\n error.code === 'INSUFFICIENT_FUNDS' ||\n msg.includes('insufficient funds') ||\n msg.includes('insufficiend') ||\n msg.includes('insuffitiend')\n ) {\n throw new Error('Not enough ETH to pay for gas or transaction value.');\n } else if (\n error.code === 'CALL_EXCEPTION' ||\n msg.includes('execution reverted') ||\n msg.includes('revert') ||\n msg.includes('failed')\n ) {\n throw new Error('Transaction failed. Check inputs, wallet balance, or permissions.');\n } else if (\n msg.includes('gas required exceeds') ||\n msg.includes('out of gas')\n ) {\n throw new Error('Transaction ran out of gas. Try increasing gas limit.');\n } else {\n throw new Error(error.message || 'Unexpected error occurred.');\n }\n }\n }\n\n /**\n * Executes a Solana order\n * Full implementation matching frontend executeOrderSol:\n * 1. Check SOL balance\n * 2. Fetch order params from backend\n * 3. Sign transaction via KeyReconstructor (integrates Squads SDK)\n * 4. Submit to backend\n * 5. Handle balance errors\n */\n public async executeSolanaOrder(params: {\n orderId: string;\n walletAddress: string;\n deviceShare: string;\n chainId: string;\n method: string;\n }): Promise<{ txHash: string; order: Order; updatedDeviceShare: string | null }> {\n const { orderId, walletAddress, deviceShare, chainId, method } = params;\n\n // Determine RPC URL based on chainId\n const rpcUrl = chainId === 'sol_mainnet'\n ? 'https://api.mainnet-beta.solana.com'\n : 'https://api.devnet.solana.com';\n\n const connection = new Connection(rpcUrl, 'confirmed');\n const publicKey = new PublicKey(walletAddress);\n const balance = await connection.getBalance(publicKey);\n\n // Check minimum balance\n if (\n balance <\n Number(solToLamports(MINIMUM_AMOUNT_ON_WALLET_TO_CREATE_SOL_TX.toString()))\n ) {\n throw new Error('Insufficient SOL balance');\n }\n\n // Fetch order params from backend\n const response = await this.client.get<{ params: any; order: any }>(\n `/sdk/order/params/sol/${orderId}`\n );\n const { params: orderParams, order } = response;\n\n if (!orderParams?.multisigPda || !orderParams?.transactionIndex) {\n throw new Error('Missing Vault params from backend response');\n }\n\n try {\n // Sign transaction via KeyReconstructor\n // This will build the transaction using Squads SDK internally\n const { tx: executeTx, updatedDeviceShare } = await this.keyReconstructor.signTransaction({\n deviceShare: deviceShare || '-',\n address: walletAddress,\n chainType: 'solana',\n action: 'sol.executeOrder',\n params: {\n multisigParams: {\n multisigPda: orderParams.multisigPda,\n transactionIndex: order.nonce,\n orderId: orderId,\n rpcUrl: rpcUrl,\n },\n method: method,\n },\n });\n\n // Submit to backend\n const executeResponse = await this.client.patch<{ order: Order }>(\n '/sdk/order/execute/sol',\n {\n transaction: executeTx,\n orderId,\n walletAddress,\n }\n );\n\n return {\n txHash: '',\n order: executeResponse.order,\n updatedDeviceShare: updatedDeviceShare ?? null,\n };\n } catch (error: any) {\n console.error('Solana order execution failed:', error);\n\n let errorMessage = 'Transaction failed';\n if (\n typeof error?.message === 'string' &&\n (error.message.includes('insufficient funds') ||\n error.message.includes('Insufficient') ||\n error.message.includes('insufficient') ||\n error.message.includes('does not have enough balance') ||\n error.message.includes('blockhash not found') ||\n (error.message.includes('failed to send transaction:') &&\n error.message.includes('Insufficient')))\n ) {\n errorMessage = 'Transaction failed: insufficient balance';\n }\n\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Executes a Tron order\n * Simple backend call - backend handles transaction building and broadcasting\n */\n public async executeTronOrder(\n orderId: string,\n walletAddress: string\n ): Promise<{ txHash: string; order: Order }> {\n const response = await this.client.patch<any>(\n '/sdk/order/execute/tron',\n {\n orderId,\n walletAddress,\n }\n );\n\n return {\n txHash: response.txHash || response.data?.txHash || '',\n order: response.order || response.data?.order,\n };\n }\n\n /**\n * Executes a BTC order\n * Simple backend call - backend handles transaction building and broadcasting\n */\n public async executeBtcOrder(\n orderId: string,\n walletAddress: string\n ): Promise<{ txHash: string; order: Order }> {\n const response = await this.client.patch<any>(\n '/sdk/order/execute/btc',\n {\n orderId,\n walletAddress,\n }\n );\n\n return {\n txHash: response.txHash || response.data?.order?.txHash || '',\n order: response.order || response.data?.order,\n };\n }\n\n /**\n * Gets orders for a multisig\n */\n public async getOrdersByMultisigId(\n multisigId: string,\n page: number = 1,\n limit: number = 20\n ): Promise<PaginatedOrdersResponse> {\n return this.client.get<PaginatedOrdersResponse>(`/sdk/order/${multisigId}`, {\n params: { page, limit },\n });\n }\n\n /**\n * Gets a single order by ID\n */\n public async getOrderById(orderId: string): Promise<{ order: Order }> {\n return this.client.get<{ order: Order }>(`/sdk/order/data/${orderId}`);\n }\n\n /**\n * Deletes an order\n */\n public async deleteOrder(orderId: string): Promise<DeleteResponse> {\n return this.client.delete<DeleteResponse>(`/sdk/order/${orderId}`);\n }\n\n /**\n * Gets Solana order parameters\n */\n public async getSolanaOrderParams(\n orderId: string\n ): Promise<{\n params: {\n multisigPda: string;\n vaultAddress: string;\n transactionIndex: number;\n };\n }> {\n return this.client.get<{\n params: {\n multisigPda: string;\n vaultAddress: string;\n transactionIndex: number;\n };\n }>(`/sdk/order/params/sol/${orderId}`);\n }\n\n /**\n * Gets Tron order transaction for signing\n */\n public async getTronOrderTransaction(\n orderId: string\n ): Promise<{ transaction: unknown }> {\n return this.client.get<{ transaction: unknown }>(\n `/sdk/order/tx/tron/${orderId}`\n );\n }\n}\n","export const GNOSIS_SAFE_ABI = [\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"owner\", \"type\": \"address\" },\n { \"internalType\": \"uint256\", \"name\": \"_threshold\", \"type\": \"uint256\" }\n ],\n \"name\": \"addOwnerWithThreshold\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"prevOwner\", \"type\": \"address\" },\n { \"internalType\": \"address\", \"name\": \"owner\", \"type\": \"address\" },\n { \"internalType\": \"uint256\", \"name\": \"_threshold\", \"type\": \"uint256\" }\n ],\n \"name\": \"removeOwner\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"uint256\", \"name\": \"_threshold\", \"type\": \"uint256\" }\n ],\n \"name\": \"changeThreshold\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"prevOwner\", \"type\": \"address\" },\n { \"internalType\": \"address\", \"name\": \"oldOwner\", \"type\": \"address\" },\n { \"internalType\": \"address\", \"name\": \"newOwner\", \"type\": \"address\" }\n ],\n \"name\": \"swapOwner\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getOwners\",\n \"outputs\": [{ \"internalType\": \"address[]\", \"name\": \"\", \"type\": \"address[]\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getThreshold\",\n \"outputs\": [{ \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"to\", \"type\": \"address\" },\n { \"internalType\": \"uint256\", \"name\": \"value\", \"type\": \"uint256\" },\n { \"internalType\": \"bytes\", \"name\": \"data\", \"type\": \"bytes\" },\n { \"internalType\": \"uint8\", \"name\": \"operation\", \"type\": \"uint8\" },\n { \"internalType\": \"uint256\", \"name\": \"safeTxGas\", \"type\": \"uint256\" },\n { \"internalType\": \"uint256\", \"name\": \"baseGas\", \"type\": \"uint256\" },\n { \"internalType\": \"uint256\", \"name\": \"gasPrice\", \"type\": \"uint256\" },\n { \"internalType\": \"address\", \"name\": \"gasToken\", \"type\": \"address\" },\n { \"internalType\": \"address\", \"name\": \"refundReceiver\", \"type\": \"address\" },\n { \"internalType\": \"bytes\", \"name\": \"signatures\", \"type\": \"bytes\" }\n ],\n \"name\": \"execTransaction\",\n \"outputs\": [{ \"internalType\": \"bool\", \"name\": \"success\", \"type\": \"bool\" }],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"to\", \"type\": \"address\" },\n { \"internalType\": \"uint256\", \"name\": \"value\", \"type\": \"uint256\" },\n { \"internalType\": \"bytes\", \"name\": \"data\", \"type\": \"bytes\" },\n { \"internalType\": \"uint8\", \"name\": \"operation\", \"type\": \"uint8\" },\n { \"internalType\": \"uint256\", \"name\": \"safeTxGas\", \"type\": \"uint256\" },\n { \"internalType\": \"uint256\", \"name\": \"baseGas\", \"type\": \"uint256\" },\n { \"internalType\": \"uint256\", \"name\": \"gasPrice\", \"type\": \"uint256\" },\n { \"internalType\": \"address\", \"name\": \"gasToken\", \"type\": \"address\" },\n { \"internalType\": \"address payable\", \"name\": \"refundReceiver\", \"type\": \"address\" },\n { \"internalType\": \"uint256\", \"name\": \"_nonce\", \"type\": \"uint256\" }\n ],\n \"name\": \"getTransactionHash\",\n \"outputs\": [{ \"internalType\": \"bytes32\", \"name\": \"\", \"type\": \"bytes32\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"nonce\",\n \"outputs\": [{ \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n] as const;\n\nexport const MULTI_SEND_ABI = [\n {\n \"inputs\": [{ \"internalType\": \"bytes\", \"name\": \"transactions\", \"type\": \"bytes\" }],\n \"name\": \"multiSend\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n }\n] as const;\n\nexport const ERC20_ABI = [\n {\n \"inputs\": [\n { \"internalType\": \"address\", \"name\": \"to\", \"type\": \"address\" },\n { \"internalType\": \"uint256\", \"name\": \"amount\", \"type\": \"uint256\" }\n ],\n \"name\": \"transfer\",\n \"outputs\": [{ \"internalType\": \"bool\", \"name\": \"\", \"type\": \"bool\" }],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [{ \"internalType\": \"address\", \"name\": \"account\", \"type\": \"address\" }],\n \"name\": \"balanceOf\",\n \"outputs\": [{ \"internalType\": \"uint256\", \"name\": \"\", \"type\": \"uint256\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [{ \"internalType\": \"uint8\", \"name\": \"\", \"type\": \"uint8\" }],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n] as const;\n","export function parseTokenAmount(amount: string, decimals: number): bigint {\n const [integer, fractional] = amount.split(\".\");\n const paddedFractional = (fractional || \"\").padEnd(decimals, \"0\");\n return BigInt(integer + paddedFractional);\n}\n\nexport const solToLamports = (amount: string): bigint => {\n const [whole = \"0\", fraction = \"\"] = amount.split(\".\");\n const paddedFraction = (fraction + \"000000000\").slice(0, 9);\n const lamportsStr = whole + paddedFraction;\n return BigInt(lamportsStr);\n};\n\nexport const MINIMUM_AMOUNT_ON_WALLET_TO_CREATE_SOL_TX = 0.001;\n","import type { EChainType } from '../core/types';\nimport type { ResolvedConfig } from '../core/config';\n\n/**\n * Minimal interface for share operations required by WalletKeyManager\n */\nexport interface IShareApi {\n fetchServerShare(chain: EChainType, address: string): Promise<string>;\n fetchRecoveryShare(chain: EChainType, address: string): Promise<string>;\n fetchShares(chain: EChainType, address: string): Promise<{ server: string; recovery: string }>;\n fetchPublicKey(): Promise<string>;\n updateShares(address: string, serverShare: string, encryptedRecoveryShare: string): Promise<void>;\n}\nimport {\n generateRandomBytes,\n hexToBytes,\n bytesToHex,\n decryptShare,\n} from '../crypto/util';\nimport { Shamir } from '../crypto/shamir';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Size of private keys in bytes (256-bit)\n */\nconst PRIVATE_KEY_SIZE = 32;\n\n/**\n * Share indices for the 2-of-3 scheme\n */\nconst SHARE_INDEX = {\n SERVER: 0,\n DEVICE: 1,\n RECOVERY: 2,\n} as const;\n\n// ============================================================================\n// WALLET KEY MANAGER SERVICE\n// ============================================================================\n\n/**\n * Service class for managing wallet key operations.\n *\n * Handles the lifecycle of private keys including generation,\n * share splitting, and key reconstruction from shares.\n */\nexport class WalletKeyManager {\n private readonly shareApi: IShareApi;\n private readonly config: ResolvedConfig;\n\n /**\n * Creates a new WalletKeyManager instance.\n *\n * @param shareApi - The share API service for key operations\n * @param config - The resolved SDK configuration\n */\n constructor(shareApi: IShareApi, config: ResolvedConfig) {\n this.shareApi = shareApi;\n this.config = config;\n }\n\n /**\n * Generates a new private key and splits it into three shares.\n *\n * This method is used during wallet creation to:\n * 1. Generate a cryptographically secure private key\n * 2. Split it using Shamir's 2-of-3 scheme\n * 3. Return all shares for distribution\n *\n * Share distribution:\n * - Server share: Sent to Afridax backend for storage\n * - Device share: Stored locally on user's device\n * - Recovery share: Encrypted and backed up for device recovery\n *\n * @param chain - The blockchain type for the wallet\n * @returns Object containing the private key and all three shares as hex strings\n *\n * @example\n * ```typescript\n * const result = await keyManager.generateAndSplitShares('evm');\n *\n * // Send server share to backend\n * await api.wallet.createWallet({\n * chain: 'evm',\n * serverShare: result.serverShare,\n * recoveryShare: result.recoveryShare\n * });\n *\n * // Store device share locally\n * localStorage.setItem(`device_share_${address}`, result.deviceShare);\n * ```\n */\n public async generateAndSplitShares(chain: EChainType): Promise<{\n privateKey: Uint8Array;\n serverShare: string;\n deviceShare: string;\n recoveryShare: string;\n }> {\n const privateKey = generateRandomBytes(PRIVATE_KEY_SIZE);\n\n const shares = Shamir.split(privateKey, 2, 3);\n\n const serverShare = bytesToHex(shares[SHARE_INDEX.SERVER]);\n const deviceShare = bytesToHex(shares[SHARE_INDEX.DEVICE]);\n const recoveryShare = bytesToHex(shares[SHARE_INDEX.RECOVERY]);\n\n return {\n privateKey,\n serverShare,\n deviceShare,\n recoveryShare,\n };\n }\n\n /**\n * Reconstructs a private key using server and device shares.\n *\n * This is the primary key reconstruction method used for normal\n * transaction signing. It requires:\n * - Server share: Fetched from Afridax API\n * - Device share: Retrieved from local storage\n *\n * @param chain - The blockchain type\n * @param address - The wallet address\n * @param deviceShareHex - The device share as a hex string (from local storage)\n * @returns Object containing the reconstructed private key\n *\n * @example\n * ```typescript\n * const deviceShare = localStorage.getItem(`device_share_${address}`);\n * const { privateKey } = await keyManager.reconstructKey('evm', address, deviceShare);\n *\n * // Use privateKey for signing\n * const signature = await signTransaction(privateKey, tx);\n * ```\n */\n public async reconstructKey(\n chain: EChainType,\n address: string,\n deviceShareHex: string\n ): Promise<{ privateKey: Uint8Array }> {\n const serverShareHex = await this.shareApi.fetchServerShare(chain, address);\n\n const serverShare = hexToBytes(serverShareHex);\n const deviceShare = hexToBytes(deviceShareHex);\n\n const privateKey = Shamir.combine([serverShare, deviceShare]);\n\n return { privateKey };\n }\n\n /**\n * Reconstructs a private key using server and recovery shares.\n *\n * This method is used for device recovery scenarios when the\n * device share is no longer available. It requires:\n * - Server share: Fetched from Afridax API\n * - Recovery share: Decrypted using the user's recovery key\n *\n * After successful reconstruction, the caller should:\n * 1. Generate new shares using the recovered key\n * 2. Update the server with new shares\n * 3. Store the new device share locally\n *\n * @param chain - The blockchain type\n * @param address - The wallet address\n * @param encryptedRecoveryShareHex - The encrypted recovery share as hex\n * @param decryptionKey - The key to decrypt the recovery share\n * @returns Object containing the reconstructed private key\n *\n * @example\n * ```typescript\n * // User provides their recovery passphrase\n * const decryptionKey = deriveKeyFromPassphrase(passphrase);\n * const encryptedShare = await fetchEncryptedRecoveryShare(address);\n *\n * const { privateKey } = await keyManager.reconstructKeyWithRecovery(\n * 'evm',\n * address,\n * encryptedShare,\n * decryptionKey\n * );\n *\n * // Regenerate shares for new device\n * const newShares = await keyManager.rotateShares(privateKey);\n * ```\n */\n public async reconstructKeyWithRecovery(\n chain: EChainType,\n address: string,\n encryptedRecoveryShareHex: string,\n decryptionKey: Uint8Array\n ): Promise<{ privateKey: Uint8Array }> {\n const serverShareHex = await this.shareApi.fetchServerShare(chain, address);\n\n const serverShare = hexToBytes(serverShareHex);\n\n const encryptedRecoveryShare = hexToBytes(encryptedRecoveryShareHex);\n const decryptedRecoveryShare = await decryptShare(decryptionKey, encryptedRecoveryShare);\n\n const privateKey = Shamir.combine([serverShare, decryptedRecoveryShare]);\n\n return { privateKey };\n }\n\n /**\n * Rotates all shares for an existing private key.\n *\n * This is used after device recovery to generate fresh shares,\n * invalidating any previously compromised device share.\n *\n * @param privateKey - The existing private key\n * @returns New set of shares\n */\n public async rotateShares(privateKey: Uint8Array): Promise<{\n serverShare: string;\n deviceShare: string;\n recoveryShare: string;\n }> {\n const shares = Shamir.split(privateKey, 2, 3);\n\n return {\n serverShare: bytesToHex(shares[SHARE_INDEX.SERVER]),\n deviceShare: bytesToHex(shares[SHARE_INDEX.DEVICE]),\n recoveryShare: bytesToHex(shares[SHARE_INDEX.RECOVERY]),\n };\n }\n\n /**\n * Validates that a device share can be used with a server share.\n *\n * This performs a test reconstruction to verify share compatibility\n * before attempting actual key operations.\n *\n * @param serverShareHex - The server share as hex\n * @param deviceShareHex - The device share as hex\n * @returns True if shares are compatible\n */\n public validateShareCompatibility(\n serverShareHex: string,\n deviceShareHex: string\n ): boolean {\n try {\n const serverShare = hexToBytes(serverShareHex);\n const deviceShare = hexToBytes(deviceShareHex);\n\n return Shamir.validateShares([serverShare, deviceShare]);\n } catch {\n return false;\n }\n }\n}\n","\n\nimport { generateRandomBytes } from './util';\n\n// ============================================================================\n// GF(2^8) FIELD ARITHMETIC\n// ============================================================================\n\n/**\n * GF(2^8) is the Galois Field with 256 elements.\n * We use the AES irreducible polynomial: x^8 + x^4 + x^3 + x + 1 = 0x11B\n */\nconst GF_POLY = 0x11b;\n\n/**\n * Precomputed exponential table for GF(2^8).\n * exp[i] = g^i where g = 0x03 is a generator of the multiplicative group.\n */\nconst EXP_TABLE = new Uint8Array(512);\n\n/**\n * Precomputed logarithm table for GF(2^8).\n * log[x] = i where g^i = x\n */\nconst LOG_TABLE = new Uint8Array(256);\n\n/**\n * Initialize the exp and log tables for fast GF(2^8) arithmetic.\n */\nfunction initTables(): void {\n let x = 1;\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x;\n EXP_TABLE[i + 255] = x;\n LOG_TABLE[x] = i;\n\n x = x ^ (x << 1);\n if (x & 0x100) {\n x ^= GF_POLY;\n }\n }\n LOG_TABLE[0] = 0;\n}\n\ninitTables();\n\n/**\n * Multiplies two elements in GF(2^8).\n *\n * @param a - First operand (0-255)\n * @param b - Second operand (0-255)\n * @returns Product in GF(2^8)\n */\nfunction gfMult(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return EXP_TABLE[LOG_TABLE[a] + LOG_TABLE[b]];\n}\n\n/**\n * Divides two elements in GF(2^8).\n *\n * @param a - Numerator (0-255)\n * @param b - Denominator (0-255, must be non-zero)\n * @returns Quotient in GF(2^8)\n * @throws Error if dividing by zero\n */\nfunction gfDiv(a: number, b: number): number {\n if (b === 0) {\n throw new Error('Division by zero in GF(2^8)');\n }\n if (a === 0) {\n return 0;\n }\n let exp = LOG_TABLE[a] - LOG_TABLE[b];\n if (exp < 0) {\n exp += 255;\n }\n return EXP_TABLE[exp];\n}\n\n/**\n * Adds two elements in GF(2^8).\n * In GF(2^8), addition is XOR.\n *\n * @param a - First operand\n * @param b - Second operand\n * @returns Sum in GF(2^8)\n */\nfunction gfAdd(a: number, b: number): number {\n return a ^ b;\n}\n\n/**\n * Subtracts two elements in GF(2^8).\n * In GF(2^8), subtraction is the same as addition (XOR).\n *\n * @param a - First operand\n * @param b - Second operand\n * @returns Difference in GF(2^8)\n */\nfunction gfSub(a: number, b: number): number {\n return a ^ b;\n}\n\n// ============================================================================\n// POLYNOMIAL OPERATIONS\n// ============================================================================\n\n/**\n * Evaluates a polynomial at a given x-value in GF(2^8).\n *\n * The polynomial is represented as an array of coefficients where\n * coeffs[0] is the constant term (secret), coeffs[1] is the x coefficient, etc.\n *\n * @param coeffs - Polynomial coefficients (coeffs[0] = constant term)\n * @param x - The x-value to evaluate at (1-255)\n * @returns The polynomial value at x\n */\nfunction evaluatePolynomial(coeffs: Uint8Array, x: number): number {\n if (x === 0) {\n return coeffs[0];\n }\n\n let result = 0;\n for (let i = coeffs.length - 1; i >= 0; i--) {\n result = gfAdd(gfMult(result, x), coeffs[i]);\n }\n return result;\n}\n\n/**\n * Performs Lagrange interpolation to find f(0) given points (x_i, y_i).\n *\n * This is the core algorithm for reconstructing the secret from shares.\n * We only need f(0) since that's where the secret is stored.\n *\n * @param xValues - Array of x-coordinates\n * @param yValues - Array of y-coordinates\n * @returns f(0) - the interpolated value at x=0\n */\nfunction lagrangeInterpolate(xValues: number[], yValues: number[]): number {\n const k = xValues.length;\n let result = 0;\n\n for (let i = 0; i < k; i++) {\n let numerator = 1;\n let denominator = 1;\n\n for (let j = 0; j < k; j++) {\n if (i !== j) {\n numerator = gfMult(numerator, xValues[j]);\n denominator = gfMult(denominator, gfSub(xValues[j], xValues[i]));\n }\n }\n\n const lagrangeCoeff = gfDiv(numerator, denominator);\n result = gfAdd(result, gfMult(yValues[i], lagrangeCoeff));\n }\n\n return result;\n}\n\n// ============================================================================\n// SHAMIR'S SECRET SHARING\n// ============================================================================\n\n/**\n * Default configuration for 2-of-3 threshold scheme.\n */\nexport const SHAMIR_THRESHOLD = 2;\nexport const SHAMIR_TOTAL_SHARES = 3;\n\n/**\n * Splits a secret into n shares using Shamir's Secret Sharing.\n *\n * Each byte of the secret is treated independently in GF(2^8).\n * A random polynomial of degree (k-1) is generated for each byte,\n * with the secret byte as the constant term.\n *\n * @param secret - The secret to split (32-byte private key)\n * @param required - Minimum shares needed to reconstruct (k, default: 2)\n * @param total - Total shares to generate (n, default: 3)\n * @returns Array of n shares, each 33 bytes (1-byte ID + 32-byte value)\n * @throws Error if parameters are invalid\n *\n * @example\n * ```typescript\n * const privateKey = generateRandomBytes(32);\n * const shares = splitSecret(privateKey, 2, 3);\n * // shares[0] = server share (33 bytes: [1, ...32 bytes])\n * // shares[1] = device share (33 bytes: [2, ...32 bytes])\n * // shares[2] = recovery share (33 bytes: [3, ...32 bytes])\n * ```\n */\nexport function splitSecret(\n secret: Uint8Array,\n required: number = SHAMIR_THRESHOLD,\n total: number = SHAMIR_TOTAL_SHARES\n): Uint8Array[] {\n if (required < 2) {\n throw new Error('Threshold must be at least 2');\n }\n\n if (required > total) {\n throw new Error('Threshold cannot exceed total shares');\n }\n\n if (total > 255) {\n throw new Error('Cannot generate more than 255 shares');\n }\n\n if (secret.length === 0) {\n throw new Error('Secret cannot be empty');\n }\n\n const secretLength = secret.length;\n const shares: Uint8Array[] = [];\n\n for (let i = 0; i < total; i++) {\n shares.push(new Uint8Array(secretLength + 1));\n shares[i][0] = i + 1;\n }\n\n for (let byteIndex = 0; byteIndex < secretLength; byteIndex++) {\n const coeffs = new Uint8Array(required);\n coeffs[0] = secret[byteIndex];\n\n const randomCoeffs = generateRandomBytes(required - 1);\n for (let i = 1; i < required; i++) {\n coeffs[i] = randomCoeffs[i - 1];\n if (coeffs[i] === 0) {\n coeffs[i] = 1;\n }\n }\n\n for (let shareIndex = 0; shareIndex < total; shareIndex++) {\n const x = shareIndex + 1;\n const y = evaluatePolynomial(coeffs, x);\n shares[shareIndex][byteIndex + 1] = y;\n }\n }\n\n return shares;\n}\n\n/**\n * Combines shares to reconstruct the original secret.\n *\n * Uses Lagrange interpolation over GF(2^8) to recover the secret.\n * The secret is the constant term of the polynomial (f(0)).\n *\n * @param shares - Array of k or more shares (each 33 bytes)\n * @returns The reconstructed secret (32 bytes)\n * @throws Error if shares are invalid or insufficient\n *\n * @example\n * ```typescript\n * const serverShare = hexToBytes(await api.fetchServerShare(chain, address));\n * const deviceShare = hexToBytes(deviceShareHex);\n * const privateKey = combineShares([serverShare, deviceShare]);\n * ```\n */\nexport function combineShares(shares: Uint8Array[]): Uint8Array {\n if (shares.length < 2) {\n throw new Error('Need at least 2 shares to reconstruct');\n }\n\n if (shares.some((share) => share.length === 0)) {\n throw new Error('All shares must be non-empty');\n }\n\n const shareLength = shares[0].length;\n if (shares.some((share) => share.length !== shareLength)) {\n throw new Error('All shares must have the same length');\n }\n\n if (shareLength < 2) {\n throw new Error('Share length must be at least 2 bytes (1 ID + 1 data)');\n }\n\n const xValues: number[] = shares.map((share) => share[0]);\n\n const uniqueX = new Set(xValues);\n if (uniqueX.size !== xValues.length) {\n throw new Error('Duplicate share IDs detected');\n }\n\n if (xValues.some((x) => x === 0)) {\n throw new Error('Share ID cannot be 0');\n }\n\n const secretLength = shareLength - 1;\n const secret = new Uint8Array(secretLength);\n\n for (let byteIndex = 0; byteIndex < secretLength; byteIndex++) {\n const yValues: number[] = shares.map((share) => share[byteIndex + 1]);\n secret[byteIndex] = lagrangeInterpolate(xValues, yValues);\n }\n\n return secret;\n}\n\n// ============================================================================\n// SHAMIR CLASS (STATIC API)\n// ============================================================================\n\n/**\n * Shamir Secret Sharing class providing a static API.\n *\n * This class wraps the splitSecret and combineShares functions\n * with additional validation and configuration.\n */\nexport class Shamir {\n public static readonly THRESHOLD = SHAMIR_THRESHOLD;\n public static readonly TOTAL_SHARES = SHAMIR_TOTAL_SHARES;\n\n /**\n * Splits a secret into multiple shares.\n *\n * @param secret - The secret to split\n * @param required - Minimum shares needed (default: 2)\n * @param total - Total shares to generate (default: 3)\n * @returns Array of shares\n */\n public static split(\n secret: Uint8Array,\n required: number = Shamir.THRESHOLD,\n total: number = Shamir.TOTAL_SHARES\n ): Uint8Array[] {\n return splitSecret(secret, required, total);\n }\n\n /**\n * Combines shares to recover the secret.\n *\n * @param shares - Array of shares\n * @returns The recovered secret\n */\n public static combine(shares: Uint8Array[]): Uint8Array {\n return combineShares(shares);\n }\n\n /**\n * Validates that shares are properly formatted and sufficient.\n *\n * @param shares - Array of shares to validate\n * @param required - Minimum shares needed (default: 2)\n * @returns True if shares are valid\n */\n public static validateShares(\n shares: Uint8Array[],\n required: number = Shamir.THRESHOLD\n ): boolean {\n if (!Array.isArray(shares)) {\n return false;\n }\n\n if (shares.length < required) {\n return false;\n }\n\n if (shares.some((share) => !(share instanceof Uint8Array))) {\n return false;\n }\n\n if (shares.some((share) => share.length < 2)) {\n return false;\n }\n\n const expectedLength = shares[0].length;\n if (shares.some((share) => share.length !== expectedLength)) {\n return false;\n }\n\n const xValues = shares.map((share) => share[0]);\n const uniqueX = new Set(xValues);\n if (uniqueX.size !== xValues.length) {\n return false;\n }\n\n if (xValues.some((x) => x === 0 || x > 255)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets the share index (x-value) from an encoded share.\n *\n * @param share - The encoded share\n * @returns The share index (1-based)\n */\n public static getShareIndex(share: Uint8Array): number {\n if (share.length === 0) {\n throw new Error('Share cannot be empty');\n }\n return share[0];\n }\n\n /**\n * Extracts the data portion of a share (without the ID byte).\n *\n * @param share - The full share (ID + data)\n * @returns The data portion only\n */\n public static getShareData(share: Uint8Array): Uint8Array {\n if (share.length < 2) {\n throw new Error('Share must have at least 2 bytes');\n }\n return share.slice(1);\n }\n\n /**\n * Creates a share from an ID and data.\n *\n * @param id - The share ID (1-255)\n * @param data - The share data\n * @returns The encoded share\n */\n public static createShare(id: number, data: Uint8Array): Uint8Array {\n if (id < 1 || id > 255) {\n throw new Error('Share ID must be between 1 and 255');\n }\n const share = new Uint8Array(data.length + 1);\n share[0] = id;\n share.set(data, 1);\n return share;\n }\n}\n\nexport default Shamir;\n","\nimport { ethers, formatUnits, Interface } from \"ethers\";\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionMessage,\n sendAndConfirmTransaction,\n LAMPORTS_PER_SOL,\n} from \"@solana/web3.js\";\nimport {\n getAssociatedTokenAddress,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n createTransferCheckedInstruction,\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { TronWeb } from \"tronweb\";\nimport * as bitcoin from \"bitcoinjs-lib\";\nimport ECPairFactory from \"ecpair\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Buffer } from \"buffer\";\n\nimport {\n EChainType,\n type TransactionParams,\n type SignedTransaction,\n type BroadcastResult,\n type EstimatedFee,\n} from \"../core/types\";\nimport {\n type ResolvedConfig,\n resolveRpcEndpoints,\n getRpcEndpoint,\n type ResolvedRpcConfig,\n TRON_FULL_HOST,\n} from \"../core/config\";\nimport {\n TransactionError,\n BroadcastError,\n ChainNotSupportedError,\n NetworkError,\n InsufficientBalanceError,\n} from \"../core/errors\";\n\nconst ECPair = ECPairFactory(ecc);\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst EVM_FALLBACK_GAS_LIMIT = \"50000\";\nconst EVM_FALLBACK_ERC20_GAS_LIMIT = \"100000\";\nconst EVM_FALLBACK_GAS_PRICE = \"20000000000\";\n\nconst SOLANA_FALLBACK_FEE = 0.000005;\nconst SOLANA_FALLBACK_SPL_FEE = 0.00001;\nconst SOLANA_FALLBACK_ACCOUNT_CREATION_FEE = 0.00203928;\n\nconst TRON_BANDWIDTH_PRICE_SUN = 1000;\nconst TRON_SUN_PER_TRX = 1_000_000;\nconst TRON_FALLBACK_TRX_FEE = 0.3;\nconst TRON_FALLBACK_TRC20_FEE = 3.5;\nconst TRON_ACCOUNT_ACTIVATION_FEE = 1.1;\nconst TRON_ENERGY_PRICE_SUN = 420;\nconst TRON_TRC20_TRANSFER_ENERGY = 14000;\n\nconst BTC_NATIVE_INPUT_VBYTES = 57.5;\nconst BTC_LEGACY_INPUT_VBYTES = 148;\nconst BTC_NESTED_INPUT_VBYTES = 74;\nconst BTC_BASE_VBYTES = 10;\nconst BTC_OUTPUT_VBYTES = 31;\nconst BTC_SATOSHIS_PER_BTC = 100_000_000;\nconst BTC_FALLBACK_FEE_RATE = 20;\n\nconst ERC20_TRANSFER_ABI = [\"function transfer(address to, uint256 amount)\"];\nconst erc20Interface = new Interface(ERC20_TRANSFER_ABI);\n\n// ============================================================================\n// TRANSACTION SERVICE CLASS\n// ============================================================================\n\nexport class TransactionService {\n private readonly config: ResolvedConfig;\n private readonly rpcConfig: ResolvedRpcConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n this.rpcConfig = resolveRpcEndpoints(config.network, config.rpcOverrides);\n }\n\n // ==========================================================================\n // FEE ESTIMATION\n // ==========================================================================\n\n public async getEstimatedFee(\n chain: EChainType,\n txParams: TransactionParams\n ): Promise<EstimatedFee> {\n this.validateChain(chain);\n\n switch (chain) {\n case EChainType.EVM:\n return this.estimateEvmFee(txParams);\n case EChainType.SOL:\n return this.estimateSolanaFee(txParams);\n case EChainType.TRON:\n return this.estimateTronFee(txParams);\n case EChainType.BTC:\n case EChainType.BTC_T3:\n return this.estimateBtcFee(txParams);\n default:\n throw new ChainNotSupportedError(`Unsupported chain: ${chain}`, {\n requestedChain: chain,\n supportedChains: [\n EChainType.EVM,\n EChainType.SOL,\n EChainType.TRON,\n EChainType.BTC,\n ],\n });\n }\n }\n\n private async estimateEvmFee(\n txParams: TransactionParams\n ): Promise<EstimatedFee> {\n try {\n const rpcUrl = getRpcEndpoint(EChainType.EVM, this.rpcConfig, txParams.chainId);\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n const isNativeToken = !txParams.tokenAddress;\n let transaction: ethers.TransactionRequest;\n let fallbackGasLimit = EVM_FALLBACK_GAS_LIMIT;\n\n if (isNativeToken) {\n transaction = {\n from: txParams.from,\n to: txParams.to,\n value: ethers.parseEther(txParams.value || \"0\"),\n data: \"0x\",\n };\n } else {\n const amountInSmallestUnit = ethers.parseUnits(\n txParams.value || \"0\",\n txParams.decimals || 18\n );\n const txData = erc20Interface.encodeFunctionData(\"transfer\", [\n txParams.to,\n amountInSmallestUnit,\n ]);\n transaction = {\n from: txParams.from,\n to: txParams.tokenAddress,\n value: \"0x0\",\n data: txData,\n };\n fallbackGasLimit = EVM_FALLBACK_ERC20_GAS_LIMIT;\n }\n\n let gasLimit: string;\n let gasPrice: string;\n\n try {\n const estimatedGas = await provider.estimateGas(transaction);\n const bufferedGas = (estimatedGas * 115n) / 100n;\n gasLimit = bufferedGas.toString();\n } catch {\n gasLimit = fallbackGasLimit;\n }\n\n try {\n const feeData = await provider.getFeeData();\n const baseGasPrice = feeData.gasPrice || BigInt(EVM_FALLBACK_GAS_PRICE);\n gasPrice = ((baseGasPrice * 105n) / 100n).toString();\n } catch {\n gasPrice = EVM_FALLBACK_GAS_PRICE;\n }\n\n const totalFeeWei = BigInt(gasLimit) * BigInt(gasPrice);\n const estimatedFee = formatUnits(totalFeeWei, 18);\n\n return {\n estimatedFee: estimatedFee,\n gasLimit,\n gasPrice,\n totalFee: estimatedFee,\n currency: \"ETH\",\n };\n } catch (error) {\n const fallbackGasLimit = txParams.tokenAddress\n ? EVM_FALLBACK_ERC20_GAS_LIMIT\n : EVM_FALLBACK_GAS_LIMIT;\n const fallbackTotalFeeWei =\n BigInt(fallbackGasLimit) * BigInt(EVM_FALLBACK_GAS_PRICE);\n\n return {\n estimatedFee: formatUnits(fallbackTotalFeeWei, 18),\n gasLimit: fallbackGasLimit,\n gasPrice: EVM_FALLBACK_GAS_PRICE,\n totalFee: formatUnits(fallbackTotalFeeWei, 18),\n currency: \"ETH\",\n };\n }\n }\n\n private async estimateSolanaFee(\n txParams: TransactionParams\n ): Promise<EstimatedFee> {\n try {\n const rpcUrl = getRpcEndpoint(EChainType.SOL, this.rpcConfig);\n const connection = new Connection(rpcUrl, \"confirmed\");\n\n const fromPubkey = new PublicKey(txParams.from!);\n const toPubkey = new PublicKey(txParams.to);\n const isNativeToken = !txParams.tokenAddress;\n\n let accountCreationFee = 0n;\n const { blockhash } = await connection.getLatestBlockhash(\"confirmed\");\n const instructions = [];\n\n if (isNativeToken) {\n const lamports = Math.ceil(Number(txParams.value) * LAMPORTS_PER_SOL);\n instructions.push(\n SystemProgram.transfer({\n fromPubkey,\n toPubkey,\n lamports: BigInt(lamports),\n })\n );\n } else {\n const mintPublicKey = new PublicKey(txParams.tokenAddress!);\n const tokenProgramId = await this.detectTokenProgram(\n connection,\n mintPublicKey\n );\n\n const senderTokenAccount = await getAssociatedTokenAddress(\n mintPublicKey,\n fromPubkey,\n false,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const recipientTokenAccount = await getAssociatedTokenAddress(\n mintPublicKey,\n toPubkey,\n false,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const recipientAccountInfo = await connection.getAccountInfo(\n recipientTokenAccount\n );\n if (!recipientAccountInfo) {\n const rentExemption =\n await connection.getMinimumBalanceForRentExemption(165);\n accountCreationFee = BigInt(rentExemption);\n instructions.push(\n createAssociatedTokenAccountInstruction(\n fromPubkey,\n recipientTokenAccount,\n toPubkey,\n mintPublicKey,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n )\n );\n }\n\n const tokenAmount = BigInt(\n Math.round(\n Number(txParams.value) * Math.pow(10, txParams.decimals || 9)\n )\n );\n if (tokenProgramId.equals(TOKEN_2022_PROGRAM_ID)) {\n instructions.push(\n createTransferCheckedInstruction(\n senderTokenAccount,\n mintPublicKey,\n recipientTokenAccount,\n fromPubkey,\n tokenAmount,\n txParams.decimals || 9,\n [],\n tokenProgramId\n )\n );\n } else {\n instructions.push(\n createTransferInstruction(\n senderTokenAccount,\n recipientTokenAccount,\n fromPubkey,\n tokenAmount,\n [],\n tokenProgramId\n )\n );\n }\n }\n\n const messageV0 = new TransactionMessage({\n payerKey: fromPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToLegacyMessage();\n\n const simulationResult = await connection.getFeeForMessage(\n messageV0,\n \"confirmed\"\n );\n const totalFeeLamports = BigInt(simulationResult.value || 5000);\n const totalFeeSol =\n Number(totalFeeLamports + accountCreationFee) / LAMPORTS_PER_SOL;\n\n return {\n estimatedFee: totalFeeSol.toString(),\n gasLimit: \"N/A\",\n gasPrice: \"N/A\",\n totalFee: totalFeeSol.toString(),\n currency: \"SOL\",\n };\n } catch {\n const fallbackFee = txParams.tokenAddress\n ? SOLANA_FALLBACK_SPL_FEE + SOLANA_FALLBACK_ACCOUNT_CREATION_FEE\n : SOLANA_FALLBACK_FEE;\n\n return {\n estimatedFee: fallbackFee.toString(),\n gasLimit: \"N/A\",\n gasPrice: \"N/A\",\n totalFee: fallbackFee.toString(),\n currency: \"SOL\",\n };\n }\n }\n\n private async estimateTronFee(\n txParams: TransactionParams\n ): Promise<EstimatedFee> {\n try {\n const tronWeb = new TronWeb({\n fullHost: TRON_FULL_HOST[this.config.network],\n });\n const isNativeToken = !txParams.tokenAddress;\n let estimatedFeeTRX = isNativeToken\n ? TRON_FALLBACK_TRX_FEE\n : TRON_FALLBACK_TRC20_FEE;\n\n if (isNativeToken) {\n const sunAmount = Math.ceil(Number(txParams.value) * TRON_SUN_PER_TRX);\n let accountActivationFee = 0;\n\n try {\n const recipientAccount = await tronWeb.trx.getAccount(txParams.to);\n if (!recipientAccount || !recipientAccount.address) {\n accountActivationFee = TRON_ACCOUNT_ACTIVATION_FEE;\n }\n } catch {\n accountActivationFee = TRON_ACCOUNT_ACTIVATION_FEE;\n }\n\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n txParams.to,\n sunAmount,\n txParams.from\n );\n const rawDataHex = (transaction as { raw_data_hex: string })\n .raw_data_hex;\n const requiredBP = rawDataHex.length / 2;\n\n const accountResources = (await tronWeb.trx.getAccountResources(\n txParams.from\n )) as {\n NetLimit?: number;\n NetUsed?: number;\n freeNetLimit?: number;\n freeNetUsed?: number;\n };\n const availableBP =\n (accountResources.NetLimit || 0) -\n (accountResources.NetUsed || 0) +\n (accountResources.freeNetLimit || 0) -\n (accountResources.freeNetUsed || 0);\n\n let bandwidthFeeTRX = 0;\n if (availableBP < requiredBP) {\n const BPCosted = requiredBP - availableBP;\n bandwidthFeeTRX =\n (BPCosted * TRON_BANDWIDTH_PRICE_SUN) / TRON_SUN_PER_TRX;\n }\n\n estimatedFeeTRX = bandwidthFeeTRX + accountActivationFee;\n } else {\n const accountResources = await tronWeb.trx.getAccountResources(\n txParams.from\n );\n const availableEnergy =\n (accountResources.EnergyLimit || 0) -\n (accountResources.EnergyUsed || 0);\n\n let energyFeeTRX = 0;\n if (availableEnergy < TRON_TRC20_TRANSFER_ENERGY) {\n const energyToBuy = TRON_TRC20_TRANSFER_ENERGY - availableEnergy;\n energyFeeTRX =\n (energyToBuy * TRON_ENERGY_PRICE_SUN) / TRON_SUN_PER_TRX;\n }\n\n estimatedFeeTRX = energyFeeTRX * 1.1;\n }\n\n return {\n estimatedFee: estimatedFeeTRX.toFixed(6),\n gasLimit: \"N/A\",\n gasPrice: \"N/A\",\n totalFee: estimatedFeeTRX.toFixed(6),\n currency: \"TRX\",\n };\n } catch {\n const fallbackFee = txParams.tokenAddress\n ? TRON_FALLBACK_TRC20_FEE.toString()\n : TRON_FALLBACK_TRX_FEE.toString();\n return {\n estimatedFee: fallbackFee,\n gasLimit: \"N/A\",\n gasPrice: \"N/A\",\n totalFee: fallbackFee,\n currency: \"TRX\",\n };\n }\n }\n\n private async estimateBtcFee(\n txParams: TransactionParams\n ): Promise<EstimatedFee> {\n const currentFeeRate = txParams.feeRate || BTC_FALLBACK_FEE_RATE;\n const address = txParams.from || \"\";\n\n let inputSize = BTC_NATIVE_INPUT_VBYTES;\n if (address.startsWith(\"1\")) {\n inputSize = BTC_LEGACY_INPUT_VBYTES;\n } else if (address.startsWith(\"3\")) {\n inputSize = BTC_NESTED_INPUT_VBYTES;\n }\n\n const assumedInputs = 1;\n const assumedOutputs = 2;\n const totalVBytes =\n BTC_BASE_VBYTES +\n assumedInputs * inputSize +\n assumedOutputs * BTC_OUTPUT_VBYTES;\n const totalFeeSatoshis = Math.ceil(totalVBytes * currentFeeRate);\n const estimatedFeeBTC = totalFeeSatoshis / BTC_SATOSHIS_PER_BTC;\n\n return {\n estimatedFee: estimatedFeeBTC.toFixed(8),\n gasLimit: totalVBytes.toFixed(2),\n gasPrice: currentFeeRate.toString(),\n totalFee: estimatedFeeBTC.toFixed(8),\n currency: \"BTC\",\n };\n }\n\n // ==========================================================================\n // TRANSACTION SIGNING\n // ==========================================================================\n\n public async signTransaction(\n privateKey: Uint8Array,\n chain: EChainType,\n txParams: TransactionParams\n ): Promise<SignedTransaction> {\n this.validateChain(chain);\n this.validatePrivateKey(privateKey);\n\n switch (chain) {\n case EChainType.EVM:\n return this.signEvmTransaction(privateKey, txParams);\n case EChainType.SOL:\n return this.signSolanaTransaction(privateKey, txParams);\n case EChainType.TRON:\n return this.signTronTransaction(privateKey, txParams);\n case EChainType.BTC:\n case EChainType.BTC_T3:\n return this.signBtcTransaction(privateKey, txParams);\n default:\n throw new ChainNotSupportedError(`Unsupported chain: ${chain}`, {\n requestedChain: chain,\n supportedChains: [\n EChainType.EVM,\n EChainType.SOL,\n EChainType.TRON,\n EChainType.BTC,\n ],\n });\n }\n }\n\n\n private async signEvmTransaction(\n privateKey: Uint8Array,\n txParams: TransactionParams\n ): Promise<SignedTransaction> {\n if (!txParams.chainId) {\n throw new TransactionError('Chain ID is required for EVM transactions', {\n chain: EChainType.EVM,\n });\n }\n\n const hexPrivateKey = \"0x\" + Buffer.from(privateKey).toString(\"hex\");\n const signer = new ethers.Wallet(hexPrivateKey);\n\n const rpcUrl = getRpcEndpoint(EChainType.EVM, this.rpcConfig, txParams.chainId);\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n let gasLimit = txParams.gasLimit;\n if (!gasLimit) {\n try {\n const estimatedGas = await provider.estimateGas({\n from: txParams.from,\n to: txParams.to,\n value: txParams.value ? ethers.parseEther(txParams.value) : 0n,\n data: txParams.data || \"0x\",\n });\n gasLimit = ((estimatedGas * 120n) / 100n).toString();\n } catch (error) {\n const isTokenTransfer = txParams.data && txParams.data !== \"0x\";\n gasLimit = isTokenTransfer ? \"100000\" : \"21000\";\n }\n }\n\n let gasPrice = txParams.gasPrice;\n if (!gasPrice && !txParams.maxFeePerGas) {\n try {\n const feeData = await provider.getFeeData();\n if (feeData.gasPrice) {\n gasPrice = feeData.gasPrice.toString();\n }\n } catch (error) {\n gasPrice = \"20000000000\"; // 20 Gwei fallback\n }\n }\n\n let nonce = txParams.nonce;\n if (nonce === undefined) {\n try {\n nonce = await provider.getTransactionCount(txParams.from, 'pending');\n } catch (error) {\n console.error('Failed to fetch nonce from provider:', error);\n throw new TransactionError('Failed to fetch nonce from provider', {\n chain: EChainType.EVM,\n details: { error: String(error) },\n });\n }\n }\n\n const unsignedTx = ethers.Transaction.from({\n chainId: txParams.chainId,\n to: txParams.to,\n value: txParams.value ? ethers.parseEther(txParams.value) : 0n,\n data: txParams.data || \"0x\",\n nonce: nonce,\n gasLimit: BigInt(gasLimit),\n gasPrice: gasPrice ? BigInt(gasPrice) : undefined,\n maxFeePerGas: txParams.maxFeePerGas\n ? BigInt(txParams.maxFeePerGas)\n : undefined,\n maxPriorityFeePerGas: txParams.maxPriorityFeePerGas\n ? BigInt(txParams.maxPriorityFeePerGas)\n : undefined,\n });\n\n const { validateEvmTransaction } = await import('../chains/evm/evm-validation');\n try {\n validateEvmTransaction(unsignedTx, txParams.chainId);\n } catch (error: unknown) {\n if (error instanceof TransactionError) {\n throw error;\n }\n const errorDetails: Record<string, unknown> =\n error instanceof Error\n ? { message: error.message, name: error.name }\n : { error: String(error) };\n throw new TransactionError('Transaction validation failed', {\n chain: EChainType.EVM,\n details: errorDetails,\n });\n }\n\n const signedTx = await signer.signTransaction(unsignedTx);\n\n return {\n rawTransaction: signedTx,\n hash: ethers.keccak256(signedTx),\n chain: EChainType.EVM,\n };\n }\n\n\n private async signSolanaTransaction(\n privateKey: Uint8Array,\n txParams: TransactionParams\n ): Promise<SignedTransaction> {\n let keypair: Keypair;\n if (privateKey.length === 64) {\n keypair = Keypair.fromSecretKey(privateKey);\n } else if (privateKey.length === 32) {\n keypair = Keypair.fromSeed(privateKey);\n } else {\n throw new TransactionError(\"Solana private key must be 32 or 64 bytes\", {\n chain: EChainType.SOL,\n });\n }\n\n const rpcUrl = getRpcEndpoint(EChainType.SOL, this.rpcConfig);\n const connection = new Connection(rpcUrl, \"confirmed\");\n const transaction = new Transaction();\n\n if (!txParams.tokenAddress) {\n const lamports = BigInt(\n Math.ceil(Number(txParams.value) * LAMPORTS_PER_SOL)\n );\n transaction.add(\n SystemProgram.transfer({\n fromPubkey: keypair.publicKey,\n toPubkey: new PublicKey(txParams.to),\n lamports,\n })\n );\n } else {\n const mintPublicKey = new PublicKey(txParams.tokenAddress);\n const tokenProgramId = await this.detectTokenProgram(\n connection,\n mintPublicKey\n );\n const decimals = txParams.decimals || 9;\n const tokenAmount = BigInt(\n Math.round(Number(txParams.value) * Math.pow(10, decimals))\n );\n\n const senderTokenAccount = await getAssociatedTokenAddress(\n mintPublicKey,\n keypair.publicKey,\n false,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const recipientTokenAccount = await getAssociatedTokenAddress(\n mintPublicKey,\n new PublicKey(txParams.to),\n true,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const recipientAccountInfo = await connection.getAccountInfo(\n recipientTokenAccount\n );\n if (!recipientAccountInfo) {\n transaction.add(\n createAssociatedTokenAccountInstruction(\n keypair.publicKey,\n recipientTokenAccount,\n new PublicKey(txParams.to),\n mintPublicKey,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n )\n );\n }\n\n // Use createTransferCheckedInstruction for Token-2022, regular transfer for SPL Token\n if (tokenProgramId.equals(TOKEN_2022_PROGRAM_ID)) {\n transaction.add(\n createTransferCheckedInstruction(\n senderTokenAccount,\n mintPublicKey,\n recipientTokenAccount,\n keypair.publicKey,\n tokenAmount,\n decimals,\n [],\n tokenProgramId\n )\n );\n } else {\n transaction.add(\n createTransferInstruction(\n senderTokenAccount,\n recipientTokenAccount,\n keypair.publicKey,\n tokenAmount,\n [],\n tokenProgramId\n )\n );\n }\n }\n\n const { blockhash } = await connection.getLatestBlockhash(\"confirmed\");\n transaction.recentBlockhash = blockhash;\n transaction.feePayer = keypair.publicKey;\n transaction.sign(keypair);\n\n const serialized = transaction.serialize().toString(\"base64\");\n\n return {\n rawTransaction: serialized,\n chain: EChainType.SOL,\n };\n }\n\n private async signTronTransaction(\n privateKey: Uint8Array,\n txParams: TransactionParams\n ): Promise<SignedTransaction> {\n try {\n\n const hexPrivateKey = Buffer.from(privateKey).toString(\"hex\");\n const tronWeb = new TronWeb({\n fullHost: TRON_FULL_HOST[this.config.network],\n });\n\n let transaction: any;\n\n if (!txParams.tokenAddress) {\n const sunAmount = Math.ceil(Number(txParams.value) * TRON_SUN_PER_TRX);\n if (!txParams.from) {\n throw new TransactionError(\n \"From address is required for TRON transactions\",\n { chain: EChainType.TRON }\n );\n }\n transaction = await tronWeb.transactionBuilder.sendTrx(\n txParams.to,\n sunAmount,\n txParams.from\n );\n } else {\n const decimals = txParams.decimals || 6;\n const amountInSmallestUnit = Math.round(\n Number(txParams.value) * Math.pow(10, decimals)\n );\n\n const parameter = [\n { type: \"address\", value: txParams.to },\n { type: \"uint256\", value: amountInSmallestUnit.toString() },\n ];\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n txParams.tokenAddress,\n \"transfer(address,uint256)\",\n { feeLimit: 100_000_000, callValue: 0 },\n parameter,\n txParams.from\n );\n\n if (!result || !result.transaction) {\n throw new TransactionError(\n \"Failed to build TRC20 transfer transaction\",\n {\n chain: EChainType.TRON,\n details: result,\n }\n );\n }\n transaction = result.transaction;\n }\n\n if (!transaction) {\n throw new TransactionError(\"Failed to build TRON transaction\", {\n chain: EChainType.TRON,\n });\n }\n\n const signedTx = await tronWeb.trx.sign(transaction, hexPrivateKey);\n\n if (!signedTx || !signedTx.txID) {\n throw new TransactionError(\"Failed to sign TRON transaction\", {\n chain: EChainType.TRON,\n });\n }\n\n return {\n rawTransaction: JSON.stringify(signedTx),\n hash: signedTx.txID,\n chain: EChainType.TRON,\n };\n } catch (error: any) {\n if (error instanceof TransactionError) {\n throw error;\n }\n const message =\n error?.message ||\n error?.error ||\n JSON.stringify(error) ||\n \"Unknown TRON transaction error\";\n throw new TransactionError(`TRON transaction failed: ${message}`, {\n chain: EChainType.TRON,\n details: error,\n });\n }\n }\n\n private async getBtcUtxos(address: string): Promise<Array<{ txid: string; vout: number; value: number }>> {\n const apiUrl = this.config.network === \"mainnet\"\n ? \"https://mempool.space/api\"\n : \"https://mempool.space/testnet/api\";\n\n try {\n const response = await fetch(`${apiUrl}/address/${address}/utxo`);\n if (!response.ok) {\n throw new Error(`Failed to fetch UTXOs: `);\n }\n return await response.json();\n } catch (error) {\n console.error(\"Error fetching UTXOs:\", error);\n throw new TransactionError(\"Failed to fetch UTXOs\", { chain: EChainType.BTC });\n }\n }\n\n private async fetchBtcFee(): Promise<number> {\n const btcFetchFeeRpc = this.config.network !== \"mainnet\"\n ? \"https://mempool.space/testnet/api/v1/fees/recommended\"\n : \"https://mempool.space/api/v1/fees/recommended\";\n\n try {\n const response = await fetch(btcFetchFeeRpc);\n if (!response.ok) {\n throw new Error(`Failed to fetch BTC fee: ${response.statusText}`);\n }\n const data = await response.json();\n return this.config.network !== \"mainnet\" ? data.fastestFee : data.hourFee;\n } catch (error) {\n console.error(\"Error fetching BTC fee:\", error);\n throw new Error(\"Failed to fetch recommended fee.\");\n }\n }\n\n private async signBtcTransaction(\n privateKey: Uint8Array,\n txParams: TransactionParams\n ): Promise<SignedTransaction> {\n const network =\n this.config.network === \"mainnet\"\n ? bitcoin.networks.bitcoin\n : bitcoin.networks.testnet;\n\n try {\n bitcoin.address.toOutputScript(txParams.to, network);\n } catch (e) {\n throw new TransactionError(\"Recipient address is invalid for the current network.\", {\n chain: EChainType.BTC,\n details: { to: txParams.to, network: this.config.network }\n });\n }\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKey), { network });\n const { address: senderAddress } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n network,\n });\n\n if (!senderAddress) {\n throw new TransactionError(\"Could not derive sender address\", { chain: EChainType.BTC });\n }\n\n const allUtxos = await this.getBtcUtxos(senderAddress);\n\n if (allUtxos.length === 0) {\n throw new InsufficientBalanceError(\"No funds found on your Bitcoin address\", {\n requiredAmount: txParams.value || \"0\",\n availableAmount: \"0\",\n currency: \"BTC\",\n chain: EChainType.BTC,\n });\n }\n\n const feeRate = await this.fetchBtcFee();\n\n const amountSats = BigInt(Math.round(Number(txParams.value) * BTC_SATOSHIS_PER_BTC));\n const sortedUtxos = [...allUtxos].sort((a, b) => b.value - a.value);\n\n let accumulatedValue = 0;\n const selectedUtxos = [];\n const outputCount = 2;\n\n for (const utxo of sortedUtxos) {\n selectedUtxos.push(utxo);\n accumulatedValue += utxo.value;\n\n const inputCount = selectedUtxos.length;\n const estimatedSize = inputCount * 148 + outputCount * 34 + 10;\n const estimatedFee = Math.ceil(feeRate * estimatedSize);\n\n if (accumulatedValue >= Number(amountSats) + estimatedFee) {\n break;\n }\n }\n\n const inputCount = selectedUtxos.length;\n const estimatedSize = inputCount * 148 + outputCount * 34 + 10;\n const estimatedFee = Math.ceil(feeRate * estimatedSize);\n\n const MAX_ALLOWED_FEE_SATS = 10000;\n if (estimatedFee > MAX_ALLOWED_FEE_SATS || estimatedFee <= 0) {\n throw new TransactionError(`Estimated fee is outside the allowed range (1 - ${MAX_ALLOWED_FEE_SATS} sats).`, {\n chain: EChainType.BTC,\n details: { estimatedFee }\n });\n }\n\n const totalBalanceSats = selectedUtxos.reduce((sum, utxo) => sum + utxo.value, 0);\n\n if (totalBalanceSats < Number(amountSats) + estimatedFee) {\n throw new InsufficientBalanceError(\"Insufficient BTC balance to cover amount and fees\", {\n requiredAmount: ((Number(amountSats) + estimatedFee) / BTC_SATOSHIS_PER_BTC).toString(),\n availableAmount: (totalBalanceSats / BTC_SATOSHIS_PER_BTC).toString(),\n currency: \"BTC\",\n chain: EChainType.BTC\n });\n }\n\n const MAX_INPUT_SATS = 5000000000n;\n if (BigInt(totalBalanceSats) > MAX_INPUT_SATS) {\n throw new TransactionError(\"Total input amount exceeds safe limit (50 BTC).\", {\n chain: EChainType.BTC\n });\n }\n\n // 4. Build PSBT\n const psbt = new bitcoin.Psbt({ network });\n let totalInputAmount = 0;\n\n for (const utxo of selectedUtxos) {\n psbt.addInput({\n hash: utxo.txid,\n index: utxo.vout,\n witnessUtxo: {\n script: bitcoin.address.toOutputScript(senderAddress, network),\n value: BigInt(utxo.value) as any,\n },\n });\n totalInputAmount += utxo.value;\n }\n\n psbt.addOutput({\n address: txParams.to,\n value: amountSats as any,\n });\n\n const estimatedFeeBigInt = BigInt(Math.round(estimatedFee));\n let changeAmount = BigInt(totalInputAmount) - amountSats - estimatedFeeBigInt;\n\n const DUST_LIMIT_SATS = 546n;\n\n if (changeAmount < 0n) {\n throw new TransactionError(\"Insufficient funds to cover amount and fee.\", { chain: EChainType.BTC });\n }\n\n if (changeAmount > 0n && changeAmount < DUST_LIMIT_SATS) {\n changeAmount = 0n;\n }\n\n if (changeAmount > 0n) {\n psbt.addOutput({\n address: senderAddress,\n value: changeAmount as any,\n });\n }\n\n // 5. Sign\n for (let i = 0; i < selectedUtxos.length; i++) {\n psbt.signInput(i, keyPair as unknown as bitcoin.Signer);\n }\n\n psbt.finalizeAllInputs();\n\n const txHex = psbt.extractTransaction().toHex();\n const txId = psbt.extractTransaction().getId();\n\n return {\n rawTransaction: txHex,\n hash: txId,\n chain: \"BTC\", // Use \"BTC\" to match legacy code requests\n };\n }\n\n public async broadcastTransaction(\n chain: EChainType,\n signedTx: SignedTransaction\n ): Promise<BroadcastResult> {\n this.validateChain(chain);\n\n if (!signedTx.rawTransaction) {\n throw new BroadcastError(\"Signed transaction data is missing\", { chain });\n }\n\n switch (chain) {\n case EChainType.EVM:\n return this.broadcastEvmTransaction(signedTx);\n case EChainType.SOL:\n return this.broadcastSolanaTransaction(signedTx);\n case EChainType.TRON:\n return this.broadcastTronTransaction(signedTx);\n case EChainType.BTC:\n case EChainType.BTC_T3:\n return this.broadcastBtcTransaction(signedTx);\n default:\n throw new ChainNotSupportedError(`Unsupported chain: ${chain}`, {\n requestedChain: chain,\n supportedChains: [\n EChainType.EVM,\n EChainType.SOL,\n EChainType.TRON,\n EChainType.BTC,\n ],\n });\n }\n }\n\n private async broadcastEvmTransaction(\n signedTx: SignedTransaction\n ): Promise<BroadcastResult> {\n const parsedTx = ethers.Transaction.from(signedTx.rawTransaction);\n const chainId = Number(parsedTx.chainId);\n const rpcUrl = getRpcEndpoint(EChainType.EVM, this.rpcConfig, chainId);\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n // Ensure provider is ready\n await provider.getNetwork();\n\n const txResponse = await provider.broadcastTransaction(\n signedTx.rawTransaction\n );\n\n return {\n txHash: txResponse.hash,\n chain: EChainType.EVM,\n };\n }\n\n private async broadcastSolanaTransaction(\n signedTx: SignedTransaction\n ): Promise<BroadcastResult> {\n const rpcUrl = getRpcEndpoint(EChainType.SOL, this.rpcConfig);\n const connection = new Connection(rpcUrl, \"confirmed\");\n\n const txBuffer = Buffer.from(signedTx.rawTransaction, \"base64\");\n const transaction = Transaction.from(txBuffer);\n\n const signature = await connection.sendRawTransaction(\n transaction.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: \"confirmed\",\n }\n );\n\n return {\n txHash: signature,\n chain: EChainType.SOL,\n };\n }\n\n private async broadcastTronTransaction(\n signedTx: SignedTransaction\n ): Promise<BroadcastResult> {\n const tronWeb = new TronWeb({\n fullHost: TRON_FULL_HOST[this.config.network],\n });\n const signedTransaction = JSON.parse(signedTx.rawTransaction);\n\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction);\n\n if (!result.result) {\n throw new BroadcastError(\"Tron broadcast failed\", {\n chain: EChainType.TRON,\n details: { result },\n });\n }\n\n return {\n txHash: result.txid,\n chain: EChainType.TRON,\n };\n }\n\n private async broadcastBtcTransaction(\n signedTx: SignedTransaction\n ): Promise<BroadcastResult> {\n const apiUrl =\n this.config.network === \"mainnet\"\n ? \"https://mempool.space/api\"\n : \"https://mempool.space/testnet/api\";\n\n const response = await fetch(`${apiUrl}/tx`, {\n method: \"POST\",\n body: signedTx.rawTransaction,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new BroadcastError(`BTC broadcast failed: ${errorText}`, {\n chain: EChainType.BTC,\n });\n }\n\n const txHash = await response.text();\n\n return {\n txHash,\n chain: EChainType.BTC,\n };\n }\n\n private async detectTokenProgram(\n connection: Connection,\n mintPublicKey: PublicKey\n ): Promise<PublicKey> {\n try {\n const accountInfo = await connection.getAccountInfo(mintPublicKey);\n if (accountInfo && accountInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) {\n return TOKEN_2022_PROGRAM_ID;\n }\n return TOKEN_PROGRAM_ID;\n } catch {\n return TOKEN_PROGRAM_ID;\n }\n }\n\n public getRpcEndpointUrl(chain: EChainType, chainId?: number): string {\n return getRpcEndpoint(chain, this.rpcConfig, chainId);\n }\n\n private validateChain(chain: EChainType): void {\n const supportedChains = [\n EChainType.EVM,\n EChainType.SOL,\n EChainType.TRON,\n EChainType.BTC,\n EChainType.BTC_T3,\n ];\n if (!supportedChains.includes(chain)) {\n throw new ChainNotSupportedError(`Chain '${chain}' is not supported`, {\n requestedChain: chain,\n supportedChains,\n });\n }\n }\n\n private validatePrivateKey(privateKey: Uint8Array): void {\n if (!privateKey || privateKey.length === 0) {\n throw new TransactionError(\"Private key is required for signing\");\n }\n if (privateKey.length !== 32 && privateKey.length !== 64) {\n throw new TransactionError(\"Private key must be 32 or 64 bytes\", {\n details: { keyLength: privateKey.length },\n });\n }\n }\n}\n","import { Buffer } from \"buffer\";\nimport type { ApiClient } from \"../api/client\";\nimport { EChainType, toBackendChainType } from \"../core/types\";\nimport type {\n ChainIdValue,\n CreateWalletResponse,\n SingleWalletDetailsResponse,\n PaginatedWalletsResponse,\n WalletRenameResponse,\n DeleteResponse,\n WalletPortfolioResponse,\n SupportedTokensResponse,\n TotalAssetValueResponse,\n HistoryResponse,\n TransactionParams,\n SignedTransaction,\n EstimatedFee,\n TWallet,\n} from \"../core/types\";\nimport type { ResolvedConfig } from \"../core/config\";\nimport type { WalletKeyManager } from \"./wallet-key-manager\";\nimport type { TransactionService } from \"./transaction.service\";\nimport { KeyReconstructor } from \"./key-reconstructor\";\n\n// ============================================================================\n// WALLET SERVICE PARAMETER TYPES\n// ============================================================================\n\n/**\n * Parameters for wallet creation\n */\nexport interface WalletCreationParams {\n chain: EChainType;\n name?: string;\n}\n\n/**\n * Parameters for transaction signing\n */\nexport interface WalletSignTxParams {\n chain: EChainType;\n address: string;\n deviceShareHex: string;\n txParams: TransactionParams;\n}\n\n/**\n * Parameters for wallet fetch operations\n */\nexport interface WalletFetchParams {\n page?: number;\n limit?: number;\n}\n\n// ============================================================================\n// WALLET SERVICE CLASS\n// ============================================================================\n\n/**\n * Public-facing wallet service implementing IWalletApi.\n *\n * This service acts as the controller for all wallet-related operations,\n * coordinating between the API client, key manager, and transaction service.\n */\nexport class WalletService {\n private readonly client: ApiClient;\n private readonly keyManager: WalletKeyManager;\n private readonly txService: TransactionService;\n private readonly config: ResolvedConfig;\n private readonly keyReconstructor: KeyReconstructor;\n\n /**\n * Creates a new WalletService instance.\n *\n * @param client - The API client for HTTP requests\n * @param keyManager - The wallet key manager for share operations\n * @param txService - The transaction service for signing/broadcasting\n * @param config - The resolved SDK configuration\n */\n constructor(\n client: ApiClient,\n keyManager: WalletKeyManager,\n txService: TransactionService,\n config: ResolvedConfig\n ) {\n this.client = client;\n this.keyManager = keyManager;\n this.txService = txService;\n this.config = config;\n this.keyReconstructor = new KeyReconstructor(client, config.network);\n }\n\n // ==========================================================================\n // WALLET CREATION & IMPORT\n // ==========================================================================\n\n /**\n * Creates a new wallet with generated key and split shares.\n *\n * @param chain - The blockchain type for the wallet\n * @returns The created wallet response\n */\n public async createWallet(\n chain: EChainType\n ): Promise<CreateWalletResponse & { deviceShare: string }> {\n const shares = await this.keyManager.generateAndSplitShares(chain);\n\n const response = await this.client.post<CreateWalletResponse>(\n \"/sdk/wallets/create\",\n {\n wallets: [\n {\n chain: toBackendChainType(chain),\n serverShare: shares.serverShare,\n recoveryShare: shares.recoveryShare,\n },\n ],\n }\n );\n\n return {\n ...response,\n deviceShare: shares.deviceShare,\n };\n }\n\n /**\n * Imports a wallet using an existing private key.\n *\n * @param chain - The blockchain type\n * @param privateKey - The private key to import\n * @returns The imported wallet response\n */\n public async importWallet(\n chain: EChainType,\n privateKey: string\n ): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>(\"/sdk/wallets/create\", {\n wallets: [{ chain: toBackendChainType(chain), key: privateKey }],\n });\n }\n\n // ==========================================================================\n // WALLET RETRIEVAL\n // ==========================================================================\n\n /**\n * Gets a single wallet by address.\n */\n public async getWallet(address: string): Promise<TWallet> {\n const response = await this.client.get<SingleWalletDetailsResponse>(\n `/sdk/wallets/${address}`\n );\n return response.data;\n }\n\n /**\n * Gets all wallets for the user.\n */\n public async getWallets(): Promise<PaginatedWalletsResponse> {\n return this.client.get<PaginatedWalletsResponse>(\"/sdk/wallets/all\");\n }\n\n /**\n * Gets paginated wallets.\n */\n public async getPaginatedWallets(\n page: number = 1,\n limit: number = 10\n ): Promise<PaginatedWalletsResponse> {\n return this.client.get<PaginatedWalletsResponse>(\"/sdk/wallets\", {\n params: { page, limit },\n });\n }\n\n // ==========================================================================\n // WALLET MANAGEMENT\n // ==========================================================================\n\n /**\n * Deletes a wallet.\n */\n public async deleteWallet(\n chain: EChainType,\n address: string\n ): Promise<DeleteResponse> {\n return this.client.delete<DeleteResponse>(\n `/sdk/wallets/${toBackendChainType(chain)}/${address}`\n );\n }\n\n /**\n * Updates a wallet's name.\n */\n public async updateWalletName(\n chain: EChainType,\n address: string,\n name: string\n ): Promise<WalletRenameResponse> {\n return this.client.post<WalletRenameResponse>(\"/sdk/wallets/update/name\", {\n walletAddress: address,\n name,\n chainType: toBackendChainType(chain),\n });\n }\n\n // ==========================================================================\n // SHARE OPERATIONS\n // ==========================================================================\n\n /**\n * Fetches the server share for key reconstruction.\n */\n public async fetchServerShare(\n chain: EChainType,\n address: string\n ): Promise<string> {\n const response = await this.client.get<{ share: string }>(\n `/sdk/wallets/share/c/${toBackendChainType(chain)}/${address}`\n );\n return response.share;\n }\n\n /**\n * Fetches the recovery share for key reconstruction.\n */\n public async fetchRecoveryShare(\n chain: EChainType,\n address: string\n ): Promise<string> {\n const response = await this.client.get<{ share: string }>(\n `/sdk/wallets/share/s/${toBackendChainType(chain)}/${address}`\n );\n return response.share;\n }\n\n /**\n * Fetches both shares for key reconstruction.\n */\n public async fetchShares(\n chain: EChainType,\n address: string\n ): Promise<{ server: string; recovery: string }> {\n const [server, recovery] = await Promise.all([\n this.fetchServerShare(chain, address),\n this.fetchRecoveryShare(chain, address),\n ]);\n return { server, recovery };\n }\n\n /**\n * Fetches the public key for share encryption.\n */\n public async fetchPublicKey(): Promise<string> {\n const response = await this.client.get<{ pubkey: string }>(\n \"/sdk/wallets/pubkey\"\n );\n return response.pubkey;\n }\n\n /**\n * Updates shares on the server after rotation.\n */\n public async updateShares(\n address: string,\n serverShare: string,\n encryptedRecoveryShare: string\n ): Promise<void> {\n await this.client.post(\"/sdk/wallets/update\", {\n walletAddress: address,\n serverShare,\n encryptedRecoveryShare,\n });\n }\n\n // ==========================================================================\n // PORTFOLIO & BALANCE\n // ==========================================================================\n\n /**\n * Gets wallet portfolio/balances.\n */\n public async getPortfolio(\n chain: EChainType,\n chainId: ChainIdValue,\n address: string\n ): Promise<WalletPortfolioResponse> {\n const apiChainType = this.toApiChainType(chain);\n return this.client.get<WalletPortfolioResponse>(\n `/sdk/wallets/protfolio/${apiChainType}/${chainId}/${address}`\n );\n }\n\n /**\n * Converts SDK chain type to API format (uppercase).\n */\n private toApiChainType(chain: EChainType): string {\n const mapping: Record<EChainType, string> = {\n [EChainType.EVM]: \"EVM\",\n [EChainType.SOL]: \"SOL\",\n [EChainType.TRON]: \"TRON\",\n [EChainType.BTC]: \"BTC\",\n [EChainType.BTC_T3]: \"BTC_T3\",\n };\n return mapping[chain] || chain.toUpperCase();\n }\n\n /**\n * Gets supported tokens for a chain.\n */\n public async getSupportedTokens(\n chain: EChainType,\n chainId: ChainIdValue,\n page: number = 1,\n limit: number = 50,\n search?: string\n ): Promise<SupportedTokensResponse> {\n return this.client.get<SupportedTokensResponse>(\n `/sdk/wallets/supported-tokens/${toBackendChainType(chain)}/${chainId}`,\n {\n params: { page, limit, search },\n }\n );\n }\n\n /**\n * Gets total asset value across all wallets.\n */\n public async getTotalAssetValue(): Promise<TotalAssetValueResponse> {\n return this.client.get<TotalAssetValueResponse>(\n \"/sdk/wallets/total-asset-value\"\n );\n }\n\n // ==========================================================================\n // HISTORY\n // ==========================================================================\n\n /**\n * Gets wallet transaction history.\n */\n public async getHistory(\n chain: EChainType,\n address: string,\n page: number = 1,\n limit: number = 20\n ): Promise<HistoryResponse> {\n const backendChain = toBackendChainType(chain);\n return this.client.get<HistoryResponse>(\n `/sdk/history/wallet/${backendChain}/${address}`,\n {\n params: { page, limit },\n }\n );\n }\n\n // ==========================================================================\n // TRANSACTION SIGNING (ORCHESTRATED)\n // ==========================================================================\n\n /**\n * Signs a transaction using reconstructed private key.\n *\n * This method orchestrates the full signing flow:\n * 1. Reconstructs the private key from server + device shares\n * 2. Signs the transaction using the recovered key\n * 3. Returns the signed transaction\n *\n * @param params - Transaction signing parameters\n * @returns The signed transaction\n *\n * @example\n * ```typescript\n * const signedTx = await walletService.signTransaction({\n * chain: 'evm',\n * address: '0x...',\n * deviceShareHex: localStorage.getItem('device_share'),\n * txParams: {\n * chainId: 1,\n * to: recipient,\n * value: amount,\n * gasLimit: '21000',\n * gasPrice: '50000000000'\n * }\n * });\n * ```\n */\n public async signTransaction(\n params: WalletSignTxParams\n ): Promise<SignedTransaction> {\n // Use KeyReconstructor which handles empty deviceShare by fetching shares from API\n const deviceShare = params.deviceShareHex || \"-\";\n\n let privateKeyBytes: Uint8Array;\n\n if (params.chain === EChainType.EVM) {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructEvmKey(\n deviceShare,\n params.address,\n forceUpdate\n )\n );\n // Convert hex string to Uint8Array\n const hexKey = result.privateKey.startsWith(\"0x\")\n ? result.privateKey.slice(2)\n : result.privateKey;\n privateKeyBytes = Buffer.from(hexKey, \"hex\");\n } else if (params.chain === EChainType.SOL) {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructSolanaKey(\n deviceShare,\n params.address,\n forceUpdate\n )\n );\n privateKeyBytes = result.secretKey;\n } else if (params.chain === EChainType.TRON) {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructTronKey(\n deviceShare,\n params.address,\n forceUpdate\n )\n );\n // Convert hex string to Uint8Array\n const hexKey = result.privateKey.startsWith(\"0x\")\n ? result.privateKey.slice(2)\n : result.privateKey;\n privateKeyBytes = Buffer.from(hexKey, \"hex\");\n } else if (\n params.chain === EChainType.BTC ||\n params.chain === EChainType.BTC_T3\n ) {\n const isMainnet = params.chain === EChainType.BTC;\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructBtcKey(\n deviceShare,\n params.address,\n forceUpdate,\n isMainnet\n )\n );\n privateKeyBytes = result.privateKeyBuffer;\n } else {\n throw new Error(`Unsupported chain: ${params.chain}`);\n }\n\n const signedTx = await this.txService.signTransaction(\n privateKeyBytes,\n params.chain,\n params.txParams\n );\n\n return signedTx;\n }\n\n // ==========================================================================\n // SEND TRANSACTION (SIGN + BROADCAST)\n // ==========================================================================\n\n /**\n * Sends a transaction (signs and broadcasts in one step).\n *\n * @param params - Transaction parameters including wallet info and tx details\n * @returns The broadcast result with transaction hash\n */\n public async sendTransaction(\n params: WalletSignTxParams\n ): Promise<{ hash: string; rawTransaction: string }> {\n const signedTx = await this.signTransaction(params);\n const result = await this.txService.broadcastTransaction(\n params.chain,\n signedTx\n );\n return { hash: result.txHash, rawTransaction: signedTx.rawTransaction };\n }\n\n /**\n * Sends a token transfer (signs and broadcasts in one step).\n *\n * @param chain - The blockchain type\n * @param address - The sender wallet address\n * @param deviceShareHex - The device share for key reconstruction\n * @param to - Recipient address\n * @param amount - Amount to transfer\n * @param tokenAddress - Token contract address\n * @param decimals - Token decimals\n * @param chainId - Optional chain ID for EVM\n * @returns The broadcast result with transaction hash\n */\n public async sendToken(\n chain: EChainType,\n address: string,\n deviceShareHex: string,\n to: string,\n amount: string,\n tokenAddress: string,\n decimals: number,\n chainId?: number\n ): Promise<{ hash: string; rawTransaction: string }> {\n const txParams: TransactionParams = {\n chain,\n from: address,\n to,\n value: amount,\n tokenAddress,\n decimals,\n chainId,\n };\n\n return this.sendTransaction({\n chain,\n address,\n deviceShareHex,\n txParams,\n });\n }\n\n // ==========================================================================\n // FEE ESTIMATION\n // ==========================================================================\n\n /**\n * Estimates the fee for a transaction.\n *\n * @param chain - The blockchain type\n * @param txParams - Transaction parameters\n * @returns Estimated fee details\n */\n public async estimateFee(\n chain: EChainType,\n txParams: TransactionParams\n ): Promise<EstimatedFee> {\n return this.txService.getEstimatedFee(chain, txParams);\n }\n\n // ==========================================================================\n // WALLET EXPORT\n // ==========================================================================\n\n /**\n * Exports a wallet's private key by reconstructing it from shares.\n * Uses KeyReconstructor which handles empty deviceShare by fetching recovery+server shares.\n *\n * WARNING: This returns the raw private key. Handle with extreme care.\n *\n * @param chain - The blockchain type\n * @param address - The wallet address\n * @param deviceShareHex - The device share for key reconstruction (can be empty or '-')\n * @returns The private key in hex format and updated device share\n */\n public async exportWallet(\n chain: EChainType,\n address: string,\n deviceShareHex: string\n ): Promise<{ privateKey: string; newDeviceShare: string | null }> {\n const currentShare = deviceShareHex || \"-\";\n const isMainnet = this.config.network === \"mainnet\";\n\n switch (chain) {\n case EChainType.EVM: {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructEvmKey(\n currentShare,\n address,\n forceUpdate\n )\n );\n return {\n privateKey: result.privateKey,\n newDeviceShare: result.newDeviceShare,\n };\n }\n case EChainType.SOL: {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructSolanaKey(\n currentShare,\n address,\n forceUpdate\n )\n );\n const privateKeyHex = Buffer.from(result.secretKey).toString(\"hex\");\n return {\n privateKey: privateKeyHex,\n newDeviceShare: result.newDeviceShare,\n };\n }\n case EChainType.TRON: {\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructTronKey(\n currentShare,\n address,\n forceUpdate\n )\n );\n return {\n privateKey: result.privateKey,\n newDeviceShare: result.newDeviceShare,\n };\n }\n case EChainType.BTC:\n case EChainType.BTC_T3: {\n const isBtcMainnet = chain === EChainType.BTC;\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) =>\n this.keyReconstructor.reconstructBtcKey(\n currentShare,\n address,\n forceUpdate,\n isBtcMainnet\n )\n );\n const privateKeyHex = Buffer.from(result.privateKeyBuffer).toString(\n \"hex\"\n );\n return {\n privateKey: privateKeyHex,\n newDeviceShare: result.newDeviceShare,\n };\n }\n default:\n throw new Error(`Unsupported chain type: ${chain}`);\n }\n }\n}\n","\n\nimport {\n Connection,\n PublicKey,\n Transaction,\n SystemProgram,\n LAMPORTS_PER_SOL,\n} from '@solana/web3.js';\nimport { Buffer } from 'buffer';\nimport * as Squads from '@sqds/multisig';\nimport type { ApiClient } from '../api/client';\nimport { KeyReconstructor } from '../services/key-reconstructor';\nimport { createSolanaMultisigOrder } from './iframeServices/solana/createSolanaMultisigOrder';\nimport { signSolanaMultisigOrder } from './iframeServices/solana/signOrder';\nimport { solToLamports } from './iframeServices/solana/utils/solToLamports';\nimport {\n TransactionExecutionType,\n TransactionEstimatingType,\n ESolanaInstructionType,\n EChainType,\n} from './types';\nimport type {\n ChainStrategy,\n SignOrderParams,\n CreateOrderParams,\n RejectOrderParams,\n ExecuteTransactionParams,\n EstimateFeeParams,\n IframeTxResponse,\n SendData,\n SolOrderData,\n} from './types';\nimport type { EstimatedFee, Order, TWallet } from '../core/types';\n\n\nconst NETWORK_CONFIG = {\n mainnet: 'https://api.mainnet-beta.solana.com',\n devnet: 'https://api.devnet.solana.com',\n};\n\nconst FALLBACK_FEE_LAMPORTS = 5000;\nconst SQUADS_MULTISIG_ACCOUNT_SIZE = 1378;\nconst MINIMUM_AMOUNT_ON_WALLET_TO_CREATE_SOL_TX = 0.002; // Assuming value from constant\n\n// Helper for parsing token amount (from user snippet)\nconst parseTokenAmount = (amount: string, decimals: number): bigint => {\n const [whole = \"0\", fraction = \"\"] = amount.split(\".\");\n const fracPadded = (fraction + \"0\".repeat(decimals)).slice(0, decimals);\n const combined = whole + (fracPadded || \"0\".repeat(decimals));\n const normalized = combined.replace(/^0+(?=\\d)/, \"\");\n return normalized === \"\" ? 0n : BigInt(normalized);\n};\n\nexport class SolanaStrategy implements ChainStrategy<Connection> {\n private apiClient: ApiClient;\n private keyReconstructor: KeyReconstructor;\n private isMainnet: boolean;\n\n constructor(apiClient: ApiClient, isMainnet: boolean) {\n this.isMainnet = isMainnet;\n this.apiClient = apiClient;\n this.keyReconstructor = new KeyReconstructor(apiClient);\n }\n\n getProvider(): Connection {\n const selectedNetwork = (this.isMainnet ? 'mainnet' : 'devnet');\n const rpcUrl = selectedNetwork === 'mainnet'\n ? NETWORK_CONFIG.mainnet\n : NETWORK_CONFIG.devnet;\n return new Connection(rpcUrl, 'confirmed');\n }\n\n async getBalance(address: string, provider: Connection): Promise<string> {\n const publicKey = new PublicKey(address);\n const balance = await provider.getBalance(publicKey);\n return (balance / LAMPORTS_PER_SOL).toString();\n }\n\n getTransactionHash(signedTx: string | Transaction): string {\n if (typeof signedTx === 'string') {\n return signedTx;\n }\n const signature = signedTx.signature?.toString('base64');\n if (!signature) throw new Error('Missing signature in transaction.');\n return signature;\n }\n\n async broadcastTransaction(\n provider: Connection,\n rawTx: string\n ): Promise<{ hash: string }> {\n const txBytes = Buffer.from(rawTx, 'base64');\n\n const txId = await provider.sendRawTransaction(txBytes, {\n skipPreflight: false,\n preflightCommitment: 'confirmed',\n });\n\n const { blockhash, lastValidBlockHeight } = await provider.getLatestBlockhash();\n\n await provider.confirmTransaction(\n { signature: txId, blockhash, lastValidBlockHeight },\n 'confirmed'\n );\n\n return { hash: txId };\n }\n\n /**\n * Sign Solana order\n */\n async signOrder(params: SignOrderParams): Promise<IframeTxResponse> {\n const { orderId, wallet, deviceShare, multisigId } = params;\n const connection = this.getProvider();\n\n const response = await this.apiClient.get<{\n order: { nonce: string };\n params: { multisigPda: string; transactionIndex: string };\n }>(`/order/params/sol/${orderId}`);\n\n const { order, params: orderParams } = response;\n\n if (!orderParams?.multisigPda || !orderParams?.transactionIndex) {\n throw new Error(\"Missing Vault params from backend response\");\n }\n\n try {\n const { tx: signedTx, updatedDeviceShare } = await signSolanaMultisigOrder({\n deviceShare,\n address: wallet.address,\n accessToken: this.apiClient?.getAuthToken(),\n multisigParams: {\n multisigPda: orderParams.multisigPda,\n orderId: orderId,\n rpcUrl: connection.rpcEndpoint,\n index: order.nonce,\n },\n });\n\n\n\n\n return {\n tx: signedTx,\n updatedDeviceShare,\n };\n\n } catch (err: any) {\n console.error(err);\n const errorMessage = err?.response?.data?.message || err.message || '';\n if (\n errorMessage?.includes(\"insufficient funds\") ||\n errorMessage?.includes(\"does not have enough balance\")\n ) {\n throw new Error(\"Transaction failed: insufficient SOL in wallet.\");\n } else if (errorMessage?.includes(\"Proposal is stale\")) {\n throw new Error(\n \"Transaction failed: Vault can not be changed acording this transaction\"\n );\n }\n\n throw new Error(`Transaction failed: ${errorMessage}`);\n }\n }\n\n /**\n * Create Solana order\n */\n async createOrder(params: CreateOrderParams): Promise<{ order: Order; proposalHash: string }> {\n const {\n multisigId,\n wallet,\n method,\n instructions,\n deviceShare,\n selectedToken,\n threshold,\n orderToActivate,\n } = params;\n\n const connection = this.getProvider();\n const publicKey = new PublicKey(wallet.address);\n const balance = await connection.getBalance(publicKey);\n\n const isNativeTransfer = method === ESolanaInstructionType.native;\n const isSplTransfer = method === ESolanaInstructionType.spl;\n // logic for orderToActivate token extraction if passed, otherwise selectedToken\n const token = orderToActivate\n ? {\n ...orderToActivate.order.params?.token,\n address: orderToActivate.order?.params?.instructions[0].tokenAddress,\n }\n : selectedToken;\n\n const minSolAmount = solToLamports(\n MINIMUM_AMOUNT_ON_WALLET_TO_CREATE_SOL_TX.toString()\n );\n\n if (balance < Number(minSolAmount)) {\n throw new Error(\"Insufficient SOL balance for transaction fees\");\n }\n\n if (isNativeTransfer) {\n if (!instructions[0].amount) throw new Error(\"Amount is not provided\");\n const lamports = solToLamports(String(instructions[0].amount));\n if (lamports < 1n) throw new Error(\"Amount is too small to transfer\");\n if (balance < Number(lamports)) throw new Error(\"Insufficient SOL balance for transaction\");\n } else if (isSplTransfer && instructions[0].amount) {\n if (!instructions[0].amount) throw new Error(\"Amount is not provided\");\n // Check tokens\n if (!token || !token?.decimals) {\n console.error(\"Decimals is not provided\");\n throw new Error(\"Decimals is not provided\");\n }\n const rawAmount = parseTokenAmount(String(instructions[0].amount), token.decimals);\n if (rawAmount < 1n) throw new Error(\"Amount is too small to transfer\");\n }\n\n // Fetch params / provisional order\n let vaultParams: { vaultAddress: string; multisigPda: string };\n let orderToCreate: Order;\n\n if (orderToActivate) {\n vaultParams = orderToActivate.params;\n orderToCreate = orderToActivate.order;\n } else {\n const createResponse = await this.apiClient.post<{ params: any; order: Order }>(\n \"/order/create/sol\",\n {\n multisigId,\n walletAddress: wallet.address,\n actions: instructions,\n }\n );\n vaultParams = createResponse.params;\n orderToCreate = createResponse.order;\n }\n\n if (!vaultParams?.vaultAddress || !vaultParams?.multisigPda) {\n throw new Error(\"Missing data from backend response\");\n }\n\n try {\n const { tx: signedTx, updatedDeviceShare } = await createSolanaMultisigOrder({\n deviceShare,\n address: wallet.address,\n accessToken: '', // Passed empty\n multisigPda: vaultParams.multisigPda,\n method,\n instructions,\n orderId: orderToCreate.id,\n rpcUrl: connection.rpcEndpoint,\n threshold,\n // vaultAddress and selectedToken needed\n vaultAddress: vaultParams.vaultAddress,\n selectedToken: token,\n // Cast strictly to match SolOrderData requirements\n // We pass extra props that createSolanaMultisigOrder expects (from IframeCreateSolanaMultisigOrderInput)\n } as unknown as SolOrderData<any[]>); // Using casting to fit type if needed, verify `createSolanaMultisigOrder` signature\n\n // Submit finalized transaction\n const response = await this.apiClient.post<{ order: Order }>(\"/order/activate/sol\", {\n transaction: signedTx,\n multisigId,\n orderId: orderToCreate.id,\n walletAddress: wallet.address,\n });\n\n return {\n order: response.order,\n proposalHash: \"\",\n };\n\n } catch (err: any) {\n console.error(err);\n throw err;\n }\n }\n\n /**\n * Reject Solana order\n */\n async rejectOrder(params: RejectOrderParams): Promise<{ rejectionHash: string; order: unknown }> {\n const { orderId, wallet, deviceShare, networkType } = params;\n const currentDeviceShare = deviceShare || '-';\n\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructSolanaKey(currentDeviceShare, wallet.address, forceUpdate)\n );\n\n const { keypair: signer, newDeviceShare } = result;\n\n const orderResponse = await this.apiClient.get<{\n order: { params: { multisigPda: string; transactionIndex: string } };\n }>(`/order/${orderId}`);\n\n const { multisigPda, transactionIndex } = orderResponse.order.params || {};\n if (!multisigPda || !transactionIndex) {\n throw new Error('Order missing multisig parameters');\n }\n\n const connection = this.getProvider();\n const multisigPdaKey = new PublicKey(multisigPda);\n const txIndex = BigInt(transactionIndex);\n\n const tx = new Transaction();\n const ix = Squads.instructions.proposalReject({\n member: signer.publicKey,\n multisigPda: multisigPdaKey,\n transactionIndex: txIndex,\n memo: orderId,\n });\n tx.add(ix);\n tx.feePayer = signer.publicKey;\n\n const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.recentBlockhash = recentBlockhash;\n tx.partialSign(signer);\n\n const serializedTx = tx.serialize().toString('base64');\n\n const response = await this.apiClient.post<{ order: unknown }>('/order/reject/sol', {\n orderId,\n walletAddress: wallet.address,\n transaction: serializedTx,\n });\n\n return {\n rejectionHash: serializedTx,\n order: response.order,\n };\n }\n\n async executeTransaction(params: ExecuteTransactionParams): Promise<unknown> {\n const { input, actualWallet, networkType } = params;\n\n if (!actualWallet) {\n throw new Error('Wallet is not connected.');\n }\n\n if (input.type === TransactionExecutionType.Send) {\n return this.executeSolSend(input.data as SendData, actualWallet as TWallet, networkType);\n }\n\n throw new Error(`Transaction type ${input.type} not yet implemented for Solana`);\n }\n\n private async executeSolSend(\n data: SendData,\n wallet: TWallet,\n networkType: string\n ): Promise<{ hash: string }> {\n const deviceShare = wallet.share;\n if (!deviceShare) {\n throw new Error('Device share missing');\n }\n\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructSolanaKey(deviceShare, wallet.address, forceUpdate)\n );\n\n const { keypair: signer } = result;\n const connection = this.getProvider();\n const { to, amount, isNativeToken } = data;\n\n if (!isNativeToken) {\n throw new Error('SPL token transfers not yet implemented');\n }\n\n const lamports = BigInt(Math.round(parseFloat(String(amount)) * LAMPORTS_PER_SOL));\n const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: signer.publicKey,\n toPubkey: new PublicKey(to),\n lamports,\n })\n );\n\n tx.feePayer = signer.publicKey;\n const { blockhash } = await connection.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n tx.sign(signer);\n\n const serializedTx = tx.serialize().toString('base64');\n return this.broadcastTransaction(connection, serializedTx);\n }\n\n async estimateFee(params: EstimateFeeParams): Promise<EstimatedFee> {\n const { input } = params;\n\n if (input.type === TransactionEstimatingType.Send) {\n return this.estimateSolanaRegularFee();\n }\n\n throw new Error(`Fee estimation not implemented for type: ${input.type}`);\n }\n\n private async estimateSolanaRegularFee(): Promise<EstimatedFee> {\n const connection = this.getProvider();\n\n let feeLamports = FALLBACK_FEE_LAMPORTS;\n let rentExemptionLamports = 0;\n\n try {\n const { blockhash } = await connection.getLatestBlockhash();\n const dummyTx = new Transaction();\n dummyTx.recentBlockhash = blockhash;\n dummyTx.feePayer = new PublicKey('11111111111111111111111111111111');\n dummyTx.add(\n SystemProgram.transfer({\n fromPubkey: new PublicKey('11111111111111111111111111111111'),\n toPubkey: new PublicKey('11111111111111111111111111111111'),\n lamports: 1000,\n })\n );\n\n const feeCalculation = await connection.getFeeForMessage(\n dummyTx.compileMessage(),\n 'confirmed'\n );\n\n if (feeCalculation.value !== null) {\n feeLamports = feeCalculation.value;\n }\n\n rentExemptionLamports = await connection.getMinimumBalanceForRentExemption(\n SQUADS_MULTISIG_ACCOUNT_SIZE,\n 'confirmed'\n );\n } catch {\n rentExemptionLamports = 2300000;\n }\n\n const totalLamports = feeLamports + rentExemptionLamports;\n const feeSol = totalLamports / LAMPORTS_PER_SOL;\n\n return {\n estimatedFee: String(feeSol),\n gasLimit: String(0),\n gasPrice: String(feeLamports),\n };\n }\n}\n","import { Connection, Keypair, PublicKey, Transaction } from \"@solana/web3.js\";\nimport { type IframeTxResponse } from \"../../types\";\nimport * as Squads from \"@sqds/multisig\";\nimport { reconstructAndVerifySolKey } from \"./utils/reconstructAndVerifySolKey\";\n\ninterface IframeSignSolanaMultisigOrderInput {\n deviceShare?: string;\n address: string;\n accessToken: string;\n multisigParams: {\n multisigPda: string;\n orderId: string;\n rpcUrl: string;\n index: string;\n };\n}\n\nexport const signSolanaMultisigOrder = async ({\n deviceShare,\n address,\n accessToken,\n multisigParams,\n}: IframeSignSolanaMultisigOrderInput): Promise<IframeTxResponse> => {\n const currentDeviceShare = deviceShare || \"-\";\n\n let signer: Keypair;\n let updatedDeviceShare: string | null = null;\n\n try {\n const result = await reconstructAndVerifySolKey(\n currentDeviceShare,\n address,\n accessToken,\n false\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (error: any) {\n if (error.message !== \"KEY_MISMATCH\") {\n throw error;\n }\n\n try {\n const result = await reconstructAndVerifySolKey(\n currentDeviceShare,\n address,\n accessToken,\n true\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (retryError: any) {\n throw new Error(\n \"Wallet key verification failed, even after forcing a share update. The account may be corrupted.\"\n );\n }\n }\n\n try {\n const EXPECTED_RPC_URL_PREFIX = \"https://\";\n if (!multisigParams.rpcUrl.startsWith(EXPECTED_RPC_URL_PREFIX)) {\n throw new Error(\"Invalid or unsecure RPC URL provided.\");\n }\n\n let multisigPda: PublicKey;\n try {\n multisigPda = new PublicKey(multisigParams.multisigPda);\n } catch (e) {\n throw new Error(\"Invalid Multisig PDA format.\");\n }\n\n let transactionIndex: bigint;\n try {\n transactionIndex = BigInt(multisigParams.index);\n if (transactionIndex < 0n) {\n throw new Error(\"Transaction index cannot be negative.\");\n }\n } catch (e) {\n throw new Error(\"Invalid transaction index format.\");\n }\n\n const connection = new Connection(multisigParams.rpcUrl, \"confirmed\");\n\n const tx = new Transaction();\n const ix = Squads.instructions.proposalApprove({\n member: signer.publicKey,\n multisigPda,\n transactionIndex,\n memo: multisigParams.orderId,\n });\n tx.add(ix);\n tx.feePayer = signer.publicKey;\n const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.recentBlockhash = recentBlockhash;\n tx.partialSign(signer);\n\n const vaultTransaction = tx.serialize().toString(\"base64\");\n console.log(\"🚀 ~ approve:\", vaultTransaction);\n\n return {\n tx: vaultTransaction,\n updatedDeviceShare,\n };\n } catch (error) {\n console.error(\"signSolanaMultisigOrder failed:\", error);\n throw error;\n }\n};\n","\n\nimport { ec as EC } from 'elliptic';\nimport * as hashjs from 'hash.js';\nimport { Buffer } from 'buffer';\nimport { TronWeb } from 'tronweb';\nimport type { ApiClient } from '../api/client';\nimport { KeyReconstructor } from '../services/key-reconstructor';\nimport {\n TransactionExecutionType,\n TransactionEstimatingType,\n ETronOrderType, // Ensure this is imported\n} from './types';\nimport type {\n ChainStrategy,\n SignOrderParams,\n CreateOrderParams,\n RejectOrderParams,\n ExecuteTransactionParams,\n EstimateFeeParams,\n IframeTxResponse,\n SendData,\n} from './types';\nimport type { EstimatedFee, Order, TWallet } from '../core/types';\n\n\nconst TRON_FULL_HOST_MAINNET = 'https://api.trongrid.io';\nconst TRON_FULL_HOST_TESTNET = 'https://api.shasta.trongrid.io';\n\nconst BANDWIDTH_PRICE_SUN = 1000;\nconst SUN_PER_TRX = 1_000_000;\nconst FALLBACK_TRX_FEE = 0.3;\nconst FALLBACK_TRC20_FEE = 3.5;\nconst ACCOUNT_ACTIVATION_FEE_TRX = 1.1;\nconst ENERGY_PRICE_SUN = 420;\nconst TRC20_TRANSFER_ENERGY = 14000;\n\nconst ec = new EC('secp256k1');\n\nfunction signRawData(rawBytes: Uint8Array, privateKey: string) {\n const hash = Buffer.from(hashjs.sha256().update(rawBytes).digest());\n const key = ec.keyFromPrivate(privateKey, 'hex');\n const sig = key.sign(hash, { canonical: true });\n\n const r = sig.r.toArrayLike(Buffer, 'be', 32);\n const s = sig.s.toArrayLike(Buffer, 'be', 32);\n const v = Buffer.from([sig.recoveryParam as number]);\n\n return Buffer.concat([r, s, v]).toString('hex');\n}\n\nexport class TronStrategy implements ChainStrategy<TronWeb> {\n private apiClient: ApiClient;\n private keyReconstructor: KeyReconstructor;\n private isMainnet: boolean;\n\n constructor(apiClient: ApiClient, isMainnet: boolean = false) {\n this.apiClient = apiClient;\n this.keyReconstructor = new KeyReconstructor(apiClient, isMainnet ? 'mainnet' : 'testnet');\n this.isMainnet = isMainnet;\n }\n\n getProvider(): TronWeb {\n const fullHost = this.isMainnet ? TRON_FULL_HOST_MAINNET : TRON_FULL_HOST_TESTNET;\n return new TronWeb({ fullHost });\n }\n\n async getBalance(address: string, provider: TronWeb): Promise<string> {\n const sunBalance = await provider.trx.getBalance(address);\n const trxBalance = Number(sunBalance) / SUN_PER_TRX;\n return trxBalance.toString();\n }\n\n /**\n * Sign Tron order\n * Refactored to fetch transaction from API, sign locally (with retry), and submit signature.\n */\n async signOrder(params: SignOrderParams): Promise<IframeTxResponse> {\n const { order, wallet, deviceShare } = params;\n\n if (!order) {\n throw new Error('Order data is missing.');\n }\n\n // 1. Fetch transaction details from backend\n // mirrors: const orderTxResponse = await $api.get(orderTxEndpoint);\n const orderTxResponse = await this.apiClient.get<{ transaction: any; version: any; order: { multisigId: string } }>(\n `/order/tx/tron/${order.id}`\n );\n const { transaction, version, order: backendOrder } = orderTxResponse;\n\n if (!transaction) {\n throw new Error('No transaction found in the response.');\n }\n\n const currentDeviceShare = deviceShare || '-';\n\n // 2. Reconstruct key with retry\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructTronKey(currentDeviceShare, wallet.address, forceUpdate)\n );\n const { privateKey, newDeviceShare } = result;\n\n const tronWeb = this.getProvider();\n\n // 3. Determine if this is a multisig params update\n // logic: method !== 'native' && method !== 'trc'\n // Note: The user code uses order.method.toLowerCase(), check type definition\n // ETronOrderType values: 'native', 'trc', 'addOwner', etc.\n const method = (order.method || '').toLowerCase();\n const isUpdateMultisigParams = method !== 'native' && method !== 'trc';\n\n // 4. Sign transaction\n let txSignedByOwner: { signature: string[] };\n if (isUpdateMultisigParams) {\n txSignedByOwner = await this.signMultisigTxManually(tronWeb, transaction, privateKey);\n } else {\n // standard multisig sign\n txSignedByOwner = await (tronWeb.trx as any).multiSign(transaction, privateKey, 2);\n }\n\n const signature = txSignedByOwner.signature[txSignedByOwner.signature.length - 1];\n\n if (!signature) {\n throw new Error('Failed to extract signature from signed transaction.');\n }\n\n return {\n tx: signature,\n updatedDeviceShare: newDeviceShare,\n version,\n };\n }\n\n /**\n * Verified manual signing for multisig structure changes\n */\n private async signMultisigTxManually(\n tronWeb: TronWeb,\n unsignedTx: any,\n privateKey: string\n ): Promise<{ signature: string[] }> {\n const tx = JSON.parse(JSON.stringify(unsignedTx));\n\n const txPb = (tronWeb as any).utils.transaction.txJsonToPb(tx);\n const rawBytes = txPb.getRawData().serializeBinary();\n\n const signature = signRawData(rawBytes, privateKey);\n\n if (!tx.signature) tx.signature = [];\n tx.signature.push(signature);\n\n tx.txID = (tronWeb as any).utils.transaction.txPbToTxID(txPb);\n tx.raw_data_hex = Buffer.from(rawBytes).toString('hex');\n\n return tx;\n }\n\n async createOrder(params: CreateOrderParams): Promise<{ order: Order; proposalHash: string }> {\n const { multisigId, wallet, method, instructions } = params;\n\n const actions = method === 'native' || method === 'trc'\n ? [{\n amount: instructions[0]?.amount,\n to: instructions[0]?.toPubkey,\n type: instructions[0]?.type,\n tokenAddress: instructions[0]?.tokenAddress,\n }]\n : instructions;\n\n const response = await this.apiClient.post<{ order: Order }>('/order/create/tron', {\n multisigId,\n walletAddress: wallet.address,\n actions,\n });\n\n return {\n order: response.order,\n proposalHash: (response.order as any).hashToSing || '',\n };\n }\n\n async rejectOrder(params: RejectOrderParams): Promise<{ rejectionHash: string; order: unknown }> {\n const { orderId, multisigId, wallet } = params;\n\n if (!multisigId) {\n throw new Error('Vault id missing');\n }\n\n const response = await this.apiClient.post<{ order: unknown }>('/order/reject/tron', {\n orderId,\n multisigId,\n walletAddress: wallet.address,\n });\n\n return {\n rejectionHash: '',\n order: response.order,\n };\n }\n\n async executeTransaction(params: ExecuteTransactionParams): Promise<unknown> {\n const { input, actualWallet } = params;\n\n if (!actualWallet) {\n throw new Error('Wallet is not connected.');\n }\n\n if (input.type === TransactionExecutionType.Send) {\n return this.executeTronSend(input.data as SendData, actualWallet as TWallet);\n }\n\n if (input.type === TransactionExecutionType.ExecOrder) {\n const { order } = input.data as { order: Order };\n return this.executeTronOrder(order, actualWallet as TWallet);\n }\n\n throw new Error(`Transaction type ${input.type} not yet implemented for Tron`);\n }\n\n private async executeTronSend(\n data: SendData,\n wallet: TWallet\n ): Promise<{ hash: string }> {\n const deviceShare = wallet.share;\n if (!deviceShare) {\n throw new Error('Device share missing');\n }\n\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructTronKey(deviceShare, wallet.address, forceUpdate)\n );\n\n const { privateKey } = result;\n const tronWeb = this.getProvider();\n const { to, amount, isNativeToken, tokenAddress, decimals } = data;\n\n let unsignedTx: unknown;\n\n if (isNativeToken) {\n const amountInSun = Math.round(Number(amount) * SUN_PER_TRX);\n unsignedTx = await tronWeb.transactionBuilder.sendTrx(to, amountInSun, wallet.address);\n } else {\n if (!tokenAddress) {\n throw new Error('Token address is required for TRC20 transfers.');\n }\n if (decimals === undefined) {\n throw new Error('Token decimals are required for TRC20 transfers.');\n }\n\n const amountInSmallestUnit = Math.round(Number(amount) * Math.pow(10, decimals));\n const parameter = [\n { type: 'address', value: to },\n { type: 'uint256', value: amountInSmallestUnit.toString() },\n ];\n const options = { feeLimit: 100_000_000, callValue: 0 };\n\n const contractResult = await tronWeb.transactionBuilder.triggerSmartContract(\n tokenAddress,\n 'transfer(address,uint256)',\n options,\n parameter,\n wallet.address\n );\n unsignedTx = contractResult.transaction;\n }\n\n const signedTx = await tronWeb.trx.sign(unsignedTx, privateKey);\n const broadcastResult = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if ((broadcastResult as any).result === false || (broadcastResult as any).code) {\n throw new Error((broadcastResult as any).message || 'Transaction failed');\n }\n\n return { hash: broadcastResult.txid };\n }\n\n private async executeTronOrder(order: Order, wallet: TWallet): Promise<{ order: unknown }> {\n const response = await this.apiClient.patch<{ order: unknown }>('/order/execute/tron', {\n orderId: order.id,\n walletAddress: wallet.address,\n });\n\n return { order: response.order };\n }\n\n async estimateFee(params: EstimateFeeParams): Promise<EstimatedFee> {\n const { input, actualWallet } = params;\n\n if (input.type === TransactionEstimatingType.Send) {\n return this.estimateTronRegularFee(input.data as SendData, actualWallet);\n }\n\n throw new Error(`Fee estimation not implemented for type: ${input.type}`);\n }\n\n /**\n * Estimate Tron transaction fee\n */\n private async estimateTronRegularFee(\n data: SendData,\n wallet: { address: string }\n ): Promise<EstimatedFee> {\n const { to, amount, tokenAddress, isNativeToken = true, decimals = 6 } = data;\n const tronWeb = this.getProvider();\n const senderAddress = wallet.address;\n\n let estimatedFeeTRX = isNativeToken ? FALLBACK_TRX_FEE : FALLBACK_TRC20_FEE;\n\n try {\n if (isNativeToken) {\n const sunAmount = Math.ceil(Number(amount) * SUN_PER_TRX);\n\n let accountActivationFee = 0;\n try {\n const recipientAccount = await tronWeb.trx.getAccount(to);\n if (!recipientAccount || !recipientAccount.address) {\n accountActivationFee = ACCOUNT_ACTIVATION_FEE_TRX;\n }\n } catch {\n accountActivationFee = ACCOUNT_ACTIVATION_FEE_TRX;\n }\n\n const transaction = await tronWeb.transactionBuilder.sendTrx(to, sunAmount, senderAddress);\n const rawDataHex = (transaction as any).raw_data_hex;\n const requiredBP = rawDataHex.length / 2;\n\n const accountResources = await tronWeb.trx.getAccountResources(senderAddress) as any;\n const netLimit = accountResources.NetLimit || 0;\n const netUsed = accountResources.NetUsed || 0;\n const freeNetLimit = accountResources.freeNetLimit || 0;\n const freeNetUsed = accountResources.freeNetUsed || 0;\n\n const availableBP = netLimit - netUsed + (freeNetLimit - freeNetUsed);\n\n let bandwidthFeeTRX = 0;\n if (availableBP < requiredBP) {\n const BPCosted = requiredBP - availableBP;\n const costInSUN = BPCosted * BANDWIDTH_PRICE_SUN;\n bandwidthFeeTRX = costInSUN / SUN_PER_TRX;\n }\n\n estimatedFeeTRX = bandwidthFeeTRX + accountActivationFee;\n } else {\n if (!tokenAddress) {\n throw new Error('Token address is required for TRC20 transfers.');\n }\n\n const accountResources = await tronWeb.trx.getAccountResources(senderAddress) as any;\n const energyLimit = accountResources.EnergyLimit || 0;\n const energyUsed = accountResources.EnergyUsed || 0;\n const availableEnergy = energyLimit - energyUsed;\n\n const amountInSmallestUnit = Math.round(Number(amount) * Math.pow(10, decimals));\n const parameter = [\n { type: 'address', value: to },\n { type: 'uint256', value: amountInSmallestUnit.toString() },\n ];\n const options = { feeLimit: 100_000_000, callValue: 0 };\n\n const txResult = await tronWeb.transactionBuilder.triggerSmartContract(\n tokenAddress,\n 'transfer(address,uint256)',\n options,\n parameter,\n senderAddress\n );\n const transaction = txResult.transaction as any;\n\n const rawDataHex = transaction.raw_data_hex;\n const requiredBP = rawDataHex.length / 2;\n\n const netLimit = accountResources.NetLimit || 0;\n const netUsed = accountResources.NetUsed || 0;\n const freeNetLimit = accountResources.freeNetLimit || 0;\n const freeNetUsed = accountResources.freeNetUsed || 0;\n\n const availableBP = netLimit - netUsed + (freeNetLimit - freeNetUsed);\n\n let bandwidthFeeTRX = 0;\n if (availableBP < requiredBP) {\n const BPCosted = requiredBP - availableBP;\n const costInSUN = BPCosted * BANDWIDTH_PRICE_SUN;\n bandwidthFeeTRX = costInSUN / SUN_PER_TRX;\n }\n\n let energyFeeTRX = 0;\n const estimatedEnergy = TRC20_TRANSFER_ENERGY;\n if (availableEnergy < estimatedEnergy) {\n const energyToBuy = estimatedEnergy - availableEnergy;\n const energyCostSUN = energyToBuy * ENERGY_PRICE_SUN;\n energyFeeTRX = energyCostSUN / SUN_PER_TRX;\n }\n\n estimatedFeeTRX = (bandwidthFeeTRX + energyFeeTRX) * 1.1;\n }\n } catch {\n estimatedFeeTRX = isNativeToken ? FALLBACK_TRX_FEE : FALLBACK_TRC20_FEE;\n }\n\n return {\n estimatedFee: estimatedFeeTRX.toFixed(6),\n gasLimit: 'N/A',\n gasPrice: 'N/A',\n };\n }\n}\n","\n\nimport type { ApiClient } from '../api/client';\nimport { Buffer } from 'buffer';\nimport { KeyReconstructor } from '../services/key-reconstructor';\nimport {\n TransactionExecutionType,\n TransactionEstimatingType,\n} from './types';\nimport type {\n ChainStrategy,\n SignOrderParams,\n CreateOrderParams,\n RejectOrderParams,\n ExecuteTransactionParams,\n EstimateFeeParams,\n IframeTxResponse,\n SendData,\n} from './types';\nimport type { EstimatedFee, Order, TWallet, BtcUtxo } from '../core/types';\n\nconst LEGACY_INPUT_VBYTES = 148;\nconst NESTED_INPUT_VBYTES = 74;\nconst NATIVE_INPUT_VBYTES = 57.5;\nconst BASE_VBYTES = 10;\nconst OUTPUT_VBYTES = 31;\nconst ASSUMED_INPUTS = 1;\nconst ASSUMED_OUTPUTS = 2;\nconst SATOSHIS_PER_BTC = 100_000_000;\nconst FALLBACK_FEE_RATE = 20;\n\nconst BTC_API_MAINNET = 'https://mempool.space/api';\nconst BTC_API_TESTNET = 'https://mempool.space/testnet/api';\n\nexport class BtcStrategy implements ChainStrategy<undefined> {\n private apiClient: ApiClient;\n private keyReconstructor: KeyReconstructor;\n private isMainnet: boolean;\n\n constructor(apiClient: ApiClient, isMainnet: boolean = false) {\n this.apiClient = apiClient;\n this.keyReconstructor = new KeyReconstructor(apiClient);\n this.isMainnet = isMainnet;\n }\n\n getProvider(): undefined {\n return undefined;\n }\n\n private getMempoolApiUrl(): string {\n return this.isMainnet ? BTC_API_MAINNET : BTC_API_TESTNET;\n }\n\n private detectScriptType(address: string): 'p2pkh' | 'p2sh' | 'p2wpkh' | 'p2tr' {\n if (address.startsWith('1')) {\n return 'p2pkh';\n } else if (address.startsWith('3') || address.startsWith('2')) {\n return 'p2sh';\n } else if (address.startsWith('bc1q') || address.startsWith('tb1q')) {\n return 'p2wpkh';\n } else if (address.startsWith('bc1p') || address.startsWith('tb1p')) {\n return 'p2tr';\n }\n return 'p2wpkh';\n }\n\n async getBalance(address: string): Promise<string> {\n const response = await fetch(`${this.getMempoolApiUrl()}/address/${address}`);\n const data = await response.json();\n const satoshis = data.chain_stats.funded_txo_sum - data.chain_stats.spent_txo_sum;\n return (satoshis / SATOSHIS_PER_BTC).toString();\n }\n\n /**\n * Sign BTC order (PSBT signing)\n * Ported from iframe-afridax/src/services/btc/signBtcTransaction.ts\n */\n /**\n * Sign BTC order (PSBT signing)\n */\n async signOrder(params: SignOrderParams): Promise<IframeTxResponse> {\n const { wallet, deviceShare, order } = params;\n const currentDeviceShare = deviceShare || '-';\n\n if (!wallet) {\n throw new Error('Wallet address missing');\n }\n\n if (!order) {\n throw new Error('There is no order');\n }\n\n if (!order?.data) {\n throw new Error('Order missing PSBT data');\n }\n\n if (!order?.to) {\n throw new Error('Order missing recipient address');\n }\n\n if (!order?.value) {\n throw new Error('Order missing value');\n }\n\n if (!order?.params?.feeSats) {\n throw new Error('Order missing fee');\n }\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructBtcKey(\n currentDeviceShare,\n wallet.address,\n forceUpdate,\n this.isMainnet\n )\n );\n\n const { privateKeyWif, newDeviceShare } = result;\n const receivedPsbtBase64 = order.data;\n\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 = this.isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n\n\n let psbt: ReturnType<typeof bitcoin.Psbt.fromBase64>;\n try {\n psbt = bitcoin.Psbt.fromBase64(receivedPsbtBase64, { network });\n } catch (e) {\n console.error(\"PSBT parsing failed:\", e);\n throw new Error('Invalid PSBT format or Base64 encoding.');\n }\n\n const expectedValueSats = Math.round(parseFloat(order?.value) * SATOSHIS_PER_BTC);\n let outputVerified = false;\n\n for (const output of psbt.txOutputs) {\n const outputAddress = bitcoin.address.fromOutputScript(output.script, network);\n if (outputAddress === order.to && Number(output.value) === expectedValueSats) {\n outputVerified = true;\n break;\n }\n }\n\n if (!outputVerified) {\n console.error(\n `PSBT Output verification failed. Expected TO: ${order.to}, Value: ${order.value} BTC`\n );\n throw new Error('Transaction outputs do not match expected recipient or amount.');\n }\n\n const expectedFeeSats = parseInt(order.params?.feeSats, 10);\n const MAX_ALLOWED_FEE_SATS = 10000;\n if (expectedFeeSats > MAX_ALLOWED_FEE_SATS || expectedFeeSats <= 0) {\n console.error(\n `Fee sanity check failed. Received fee: ${expectedFeeSats} sats.`\n );\n throw new Error('Transaction fee is outside the allowed range.');\n }\n\n const signedPsbtBase64 = await this.signBtcBase64TX(\n receivedPsbtBase64,\n privateKeyWif,\n network\n );\n\n return {\n tx: signedPsbtBase64,\n updatedDeviceShare: newDeviceShare,\n };\n }\n\n private async signBtcBase64TX(\n receivedPsbtBase64: string,\n pk: string,\n network: typeof import('bitcoinjs-lib').networks.bitcoin,\n ): Promise<string> {\n const bitcoin = await import('bitcoinjs-lib');\n const { ECPairFactory } = await import('ecpair');\n const ecc = await import('tiny-secp256k1');\n const ECPair = ECPairFactory(ecc);\n\n const psbt2 = bitcoin.Psbt.fromBase64(receivedPsbtBase64, { network });\n const keyPair = ECPair.fromWIF(pk, network);\n\n const signer = {\n publicKey: Buffer.from(keyPair.publicKey),\n sign: (hash: Buffer) => Buffer.from(keyPair.sign(hash)),\n };\n\n psbt2.data.inputs.forEach((_input, index) => {\n try {\n psbt2.signInput(index, signer);\n } catch (err) {\n console.warn(`Cannot sign input #${index}:`, err);\n }\n });\n\n return psbt2.toBase64();\n }\n\n async createOrder(params: CreateOrderParams): Promise<{ order: Order; proposalHash: string }> {\n const { multisigId, wallet, instructions } = params;\n\n const response = await this.apiClient.post<{ order: Order }>('/order/create/btc', {\n multisigId,\n walletAddress: wallet.address,\n instructions: {\n amount: instructions[0]?.amount,\n to: instructions[0]?.toPubkey,\n type: instructions[0]?.type,\n },\n });\n\n return {\n order: response.order,\n proposalHash: (response.order as unknown as { hashToSing?: string }).hashToSing || '',\n };\n }\n\n async rejectOrder(params: RejectOrderParams): Promise<{ rejectionHash: string; order: unknown }> {\n const { orderId, multisigId, wallet } = params;\n\n if (!multisigId) {\n throw new Error('Vault id missing');\n }\n\n const response = await this.apiClient.post<{ order: unknown }>('/order/reject/btc', {\n orderId,\n multisigId,\n walletAddress: wallet.address,\n });\n\n return {\n rejectionHash: '',\n order: response.order,\n };\n }\n\n async executeTransaction(params: ExecuteTransactionParams): Promise<unknown> {\n const { input, actualWallet } = params;\n\n if (!actualWallet?.address || !actualWallet.share) {\n throw new Error('Wallet not connected or share missing');\n }\n\n if (input.type === TransactionExecutionType.Send) {\n return this.executeBtcSend(input.data as SendData & { utxos?: BtcUtxo[] }, actualWallet as TWallet);\n }\n\n if (input.type === TransactionExecutionType.ExecOrder) {\n const { order } = input.data as { order: Order };\n return this.executeBtcOrder(order, actualWallet as TWallet);\n }\n\n throw new Error('Unsupported transaction execution type');\n }\n\n private async executeBtcSend(\n data: SendData & { utxos?: BtcUtxo[]; estimatedFee?: { feeRate?: number } },\n wallet: TWallet\n ): Promise<{ hash: string }> {\n const deviceShare = wallet.share;\n if (!deviceShare) {\n throw new Error('Device share missing');\n }\n\n const { to, amount, utxos, estimatedFee } = data;\n if (!utxos || utxos.length === 0) {\n throw new Error('UTXOs required for BTC transaction');\n }\n\n const result = await this.keyReconstructor.reconstructWithRetry(\n (forceUpdate) => this.keyReconstructor.reconstructBtcKey(\n deviceShare,\n wallet.address,\n forceUpdate,\n this.isMainnet\n )\n );\n\n const { privateKeyWif } = result;\n\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 = this.isMainnet ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n const keyPair = ECPair.fromWIF(privateKeyWif, network);\n\n const amountSats = BigInt(Math.round(parseFloat(String(amount)) * SATOSHIS_PER_BTC));\n const feeRate = estimatedFee?.feeRate || FALLBACK_FEE_RATE;\n\n const psbt = new bitcoin.Psbt({ network });\n let totalInputAmount = 0n;\n\n for (const utxo of utxos) {\n const inputData: any = {\n hash: utxo.txid,\n index: utxo.vout,\n };\n\n const scriptType = utxo.scriptType || this.detectScriptType(wallet.address);\n\n if (scriptType === 'p2pkh') {\n if (utxo.nonWitnessUtxo) {\n inputData.nonWitnessUtxo = Buffer.from(utxo.nonWitnessUtxo, 'hex');\n } else {\n inputData.witnessUtxo = {\n script: utxo.script\n ? Buffer.from(utxo.script, 'hex')\n : bitcoin.address.toOutputScript(wallet.address, network),\n value: utxo.value,\n };\n }\n } else if (scriptType === 'p2sh') {\n const pubkey = Buffer.from(keyPair.publicKey);\n const p2wpkh = bitcoin.payments.p2wpkh({ pubkey, network });\n const p2sh = bitcoin.payments.p2sh({ redeem: p2wpkh, network });\n inputData.witnessUtxo = {\n script: p2sh.output!,\n value: utxo.value,\n };\n inputData.redeemScript = p2wpkh.output;\n } else {\n inputData.witnessUtxo = {\n script: utxo.script\n ? Buffer.from(utxo.script, 'hex')\n : bitcoin.address.toOutputScript(wallet.address, network),\n value: utxo.value,\n };\n }\n\n psbt.addInput(inputData);\n totalInputAmount += BigInt(utxo.value);\n }\n\n psbt.addOutput({\n address: to,\n value: Number(amountSats),\n });\n\n const estimatedSize = BASE_VBYTES + utxos.length * NATIVE_INPUT_VBYTES + 2 * OUTPUT_VBYTES;\n const estimatedFeeSats = BigInt(Math.ceil(estimatedSize * feeRate));\n const changeAmount = totalInputAmount - amountSats - estimatedFeeSats;\n\n const DUST_LIMIT_SATS = 546n;\n if (changeAmount < 0n) {\n throw new Error('Insufficient funds to cover amount and fee.');\n }\n if (changeAmount > 0n && changeAmount < DUST_LIMIT_SATS) {\n throw new Error(`Change amount is below the dust limit.`);\n }\n if (changeAmount > 0n) {\n psbt.addOutput({\n address: wallet.address,\n value: Number(changeAmount),\n });\n }\n\n const pubkey = Buffer.from(keyPair.publicKey);\n for (let i = 0; i < utxos.length; i++) {\n psbt.signInput(i, {\n publicKey: pubkey,\n sign: (hash: Buffer) => Buffer.from(keyPair.sign(hash)),\n });\n }\n psbt.finalizeAllInputs();\n\n const txHex = psbt.extractTransaction().toHex();\n const txHash = await this.broadcastBtcTransaction(txHex);\n\n return { hash: txHash };\n }\n\n private async executeBtcOrder(order: Order, wallet: TWallet): Promise<{ order: unknown }> {\n const response = await this.apiClient.patch<{ order: unknown }>('/order/execute/btc', {\n orderId: order.id,\n walletAddress: wallet.address,\n });\n\n return { order: response.order };\n }\n\n private async broadcastBtcTransaction(txHex: string): Promise<string> {\n const response = await fetch(`${this.getMempoolApiUrl()}/tx`, {\n method: 'POST',\n body: txHex,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to broadcast BTC transaction: ${error}`);\n }\n\n return await response.text();\n }\n\n async estimateFee(params: EstimateFeeParams): Promise<EstimatedFee> {\n const { input, actualWallet } = params;\n\n if (input.type === TransactionEstimatingType.Send) {\n return this.estimateBitcoinNativeFee(actualWallet);\n }\n\n throw new Error(`Fee estimation not implemented for type: ${input.type}`);\n }\n\n /**\n * Estimate Bitcoin transaction fee\n */\n private async estimateBitcoinNativeFee(\n wallet: { address: string }\n ): Promise<EstimatedFee> {\n const currentFeeRate = FALLBACK_FEE_RATE;\n const address = wallet.address;\n\n let inputSize = NATIVE_INPUT_VBYTES;\n if (address.startsWith('1')) {\n inputSize = LEGACY_INPUT_VBYTES;\n } else if (address.startsWith('3')) {\n inputSize = NESTED_INPUT_VBYTES;\n }\n\n const totalVBytes = BASE_VBYTES + ASSUMED_INPUTS * inputSize + ASSUMED_OUTPUTS * OUTPUT_VBYTES;\n const totalFeeSatoshis = Math.ceil(totalVBytes * currentFeeRate);\n const estimatedFeeBTC = totalFeeSatoshis / SATOSHIS_PER_BTC;\n\n return {\n estimatedFee: estimatedFeeBTC.toFixed(8),\n gasLimit: totalVBytes.toFixed(2),\n gasPrice: currentFeeRate.toString(),\n feeRate: currentFeeRate,\n };\n }\n}\n","import type { ApiClient } from \"../api/client\";\nimport { EvmStrategy } from \"./evm.strategy\";\nimport { SolanaStrategy } from \"./solana.strategy\";\nimport { TronStrategy } from \"./tron.strategy\";\nimport { BtcStrategy } from \"./btc.strategy\";\nimport type {\n ChainStrategy,\n SignOrderParams,\n CreateOrderParams,\n RejectOrderParams,\n ExecuteTransactionParams,\n EstimateFeeParams,\n IframeTxResponse,\n EChainTypeValue,\n} from \"./types\";\nimport { EChainType } from \"./types\";\nimport {\n type EstimatedFee,\n type Order,\n type ChainIdValue,\n TestnetChainId,\n MainnetChainId,\n} from \"../core/types\";\n\nexport interface NetworkInfo {\n type: EChainTypeValue;\n networkType: string;\n chainId: ChainIdValue;\n}\n\nexport interface ChainConfig {\n chainId: ChainIdValue;\n type: EChainTypeValue;\n networkType: string;\n rpcUrl?: string;\n}\n\ninterface ChainMetadata {\n name: string;\n type: EChainTypeValue;\n mainnetId: MainnetChainId;\n testnetId: TestnetChainId;\n mainnetAliases: string[];\n testnetAliases: string[];\n}\n\nconst CHAIN_METADATA: ChainMetadata[] = [\n // EVM Chains\n {\n name: \"Ethereum\",\n type: EChainType.EVM,\n mainnetId: MainnetChainId.ETH,\n testnetId: TestnetChainId.ETH_SEPOLIA,\n mainnetAliases: [\"ethereum\", \"eth\", \"evm\"],\n testnetAliases: [\"sepolia\"],\n },\n {\n name: \"Polygon\",\n type: EChainType.EVM,\n mainnetId: MainnetChainId.POL,\n testnetId: TestnetChainId.POL,\n mainnetAliases: [\"polygon\", \"matic\"],\n testnetAliases: [\"pol-test\"],\n },\n {\n name: \"Base\",\n type: EChainType.EVM,\n mainnetId: MainnetChainId.BASE,\n testnetId: TestnetChainId.BASE_SEPOLIA,\n mainnetAliases: [\"base\"],\n testnetAliases: [\"base-sepolia\"],\n },\n {\n name: \"Arbitrum\",\n type: EChainType.EVM,\n mainnetId: MainnetChainId.ARBITRUM,\n testnetId: TestnetChainId.ARBITRUM_SEPOLIA,\n mainnetAliases: [\"arbitrum\", \"arb\"],\n testnetAliases: [\"arb-sepolia\"],\n },\n {\n name: \"Optimism\",\n type: EChainType.EVM,\n mainnetId: MainnetChainId.OPTIMISM,\n testnetId: TestnetChainId.OPTIMISM_SEPOLIA,\n mainnetAliases: [\"optimism\", \"op\"],\n testnetAliases: [\"op-sepolia\"],\n },\n {\n name: \"BNB\",\n type: EChainType.EVM,\n mainnetId: MainnetChainId.BNB,\n testnetId: TestnetChainId.BNB,\n mainnetAliases: [\"bsc\", \"bnb\"],\n testnetAliases: [\"bnb-test\"],\n },\n // Non-EVM Chains\n {\n name: \"Solana\",\n type: EChainType.SOL,\n mainnetId: MainnetChainId.SOLANA,\n testnetId: TestnetChainId.SOLANA_DEVNET,\n mainnetAliases: [\"solana\", \"sol\", \"mainnet-beta\"],\n testnetAliases: [\"solana-devnet\", \"devnet\"],\n },\n {\n name: \"Tron\",\n type: EChainType.TRON,\n mainnetId: MainnetChainId.TRON,\n testnetId: TestnetChainId.TRON, // Value is 'tron_shasta'\n mainnetAliases: [\"tron\", \"trx\", \"tron-mainnet\"],\n testnetAliases: [\"shasta\", \"tron-shasta\"],\n },\n {\n name: \"Bitcoin\",\n type: EChainType.BTC,\n mainnetId: MainnetChainId.BTC,\n testnetId: TestnetChainId.BTC, // Value is 'btc_t3'\n mainnetAliases: [\"bitcoin\", \"btc\", \"btc-mainnet\"],\n testnetAliases: [\"bitcoin_testnet\", \"btc_testnet\", \"btc_t3\", \"testnet\"],\n },\n];\n\n// 2. Generator function to build the final lookup map\nconst generateChainConfigs = (): Record<string, ChainConfig> => {\n const configs: Record<string, ChainConfig> = {};\n\n for (const chain of CHAIN_METADATA) {\n const mainnetConfig: ChainConfig = {\n chainId: chain.mainnetId,\n type: chain.type,\n networkType: \"mainnet\",\n };\n\n const testnetConfig: ChainConfig = {\n chainId: chain.testnetId,\n type: chain.type,\n // Special handling for BTC_T3 as it uses EChainType.BTC_T3 internally\n networkType:\n chain.type === EChainType.BTC && chain.testnetId === TestnetChainId.BTC\n ? \"testnet\"\n : chain.testnetId.replace(/_/g, \"-\").split(\"-\")[1] || \"testnet\",\n };\n\n // Override type for BTC Testnet to use the BTC_T3 strategy\n if (chain.name === \"Bitcoin\" && chain.testnetId === TestnetChainId.BTC) {\n (testnetConfig.type as EChainTypeValue) =\n EChainType.BTC_T3 as EChainTypeValue;\n }\n\n // Add all Mainnet aliases and the ID itself\n configs[chain.mainnetId] = mainnetConfig;\n for (const alias of chain.mainnetAliases) {\n configs[alias] = mainnetConfig;\n }\n\n // Add all Testnet aliases and the ID itself\n configs[chain.testnetId] = testnetConfig;\n for (const alias of chain.testnetAliases) {\n configs[alias] = testnetConfig;\n }\n }\n\n return configs;\n};\n\n// 3. Set the final constant\nconst DEFAULT_CHAIN_CONFIGS: Record<string, ChainConfig> =\n generateChainConfigs();\n\n// .\n\n/**\n * BlockchainAdapter - Unified interface for all blockchain operations\n *\n * This class implements the adapter pattern from useBlockchainAdapter,\n * providing a consistent API for:\n * - Transaction execution\n * - Order management (create, sign, reject, execute)\n * - Fee estimation\n * - Balance queries\n * - Multisig operations (Gnosis Safe, Squads, Tron multisig, BTC taproot)\n */\nexport class BlockchainAdapter {\n private apiClient: ApiClient;\n private strategies: Map<EChainTypeValue, ChainStrategy<any>>;\n private chainConfigs: Map<string, ChainConfig>;\n private isMainnet: boolean;\n\n constructor(apiClient: ApiClient, isMainnet: boolean = false) {\n this.apiClient = apiClient;\n this.isMainnet = isMainnet;\n this.strategies = new Map();\n this.chainConfigs = new Map(Object.entries(DEFAULT_CHAIN_CONFIGS));\n\n this.initializeStrategies();\n }\n\n private initializeStrategies(): void {\n this.strategies.set(\n EChainType.EVM,\n new EvmStrategy(this.apiClient) as ChainStrategy<any>\n );\n this.strategies.set(\n EChainType.SOL,\n new SolanaStrategy(this.apiClient, this.isMainnet) as ChainStrategy<any>\n );\n this.strategies.set(\n EChainType.TRON,\n new TronStrategy(this.apiClient, this.isMainnet) as ChainStrategy<any>\n );\n this.strategies.set(\n EChainType.BTC,\n new BtcStrategy(this.apiClient, this.isMainnet) as ChainStrategy<any>\n );\n this.strategies.set(\n EChainType.BTC_T3,\n new BtcStrategy(this.apiClient, false) as ChainStrategy<any>\n );\n }\n\n /**\n * Get the chain strategy for a given chain ID\n */\n getStrategy(chainId: ChainIdValue): ChainStrategy<any> | null {\n const config = this.getChainConfig(chainId);\n if (!config) {\n console.warn(`BlockchainAdapter: unsupported chainId ${chainId}`);\n return null;\n }\n return this.strategies.get(config.type) || null;\n }\n\n /**\n * Get chain configuration for a chain ID\n */\n getChainConfig(chainId: ChainIdValue): ChainConfig | null {\n const key = String(chainId).toLowerCase();\n return this.chainConfigs.get(key) || null;\n }\n\n /**\n * Get network info for a chain ID\n */\n getNetworkInfo(chainId: ChainIdValue): NetworkInfo | null {\n const config = this.getChainConfig(chainId);\n if (!config) return null;\n return {\n type: config.type,\n networkType: config.networkType,\n chainId: config.chainId,\n };\n }\n\n /**\n * Register a custom chain configuration\n */\n registerChain(key: string, config: ChainConfig): void {\n this.chainConfigs.set(key.toLowerCase(), config);\n }\n\n /**\n * Get balance for an address on a specific chain\n */\n async getBalance(chainId: ChainIdValue, address: string): Promise<string> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.getBalance) {\n throw new Error(`getBalance not supported for chain ${chainId}`);\n }\n\n const config = this.getChainConfig(chainId);\n const provider = strategy.getProvider?.(\n config?.type === EChainType.EVM ? config?.chainId : config?.networkType\n );\n return strategy.getBalance(address, provider);\n }\n\n /**\n * Estimate transaction fee\n */\n async estimateFee(\n chainId: ChainIdValue,\n params: EstimateFeeParams\n ): Promise<EstimatedFee> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.estimateFee) {\n throw new Error(`estimateFee not supported for chain ${chainId}`);\n }\n return strategy.estimateFee({ ...params, chainId });\n }\n\n /**\n * Create an order (multisig transaction proposal)\n */\n async createOrder(\n chainId: ChainIdValue,\n params: CreateOrderParams\n ): Promise<{ order: Order; proposalHash: string }> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.createOrder) {\n throw new Error(`createOrder not supported for chain ${chainId}`);\n }\n\n const config = this.getChainConfig(chainId);\n return strategy.createOrder({\n ...params,\n networkType: config?.networkType || \"\",\n });\n }\n\n /**\n * Sign an order\n */\n async signOrder(\n chainId: ChainIdValue,\n params: SignOrderParams\n ): Promise<IframeTxResponse> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.signOrder) {\n throw new Error(`signOrder not supported for chain ${chainId}`);\n }\n\n const config = this.getChainConfig(chainId);\n return strategy.signOrder({\n ...params,\n networkType: config?.networkType || \"\",\n });\n }\n\n /**\n * Reject an order\n */\n async rejectOrder(\n chainId: ChainIdValue,\n params: RejectOrderParams\n ): Promise<{ rejectionHash: string; order: unknown }> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.rejectOrder) {\n throw new Error(`rejectOrder not supported for chain ${chainId}`);\n }\n\n const config = this.getChainConfig(chainId);\n return strategy.rejectOrder({\n ...params,\n networkType: config?.networkType || \"\",\n });\n }\n\n /**\n * Execute a transaction\n */\n async executeTransaction(\n chainId: ChainIdValue,\n params: ExecuteTransactionParams\n ): Promise<unknown> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.executeTransaction) {\n throw new Error(`executeTransaction not supported for chain ${chainId}`);\n }\n\n const config = this.getChainConfig(chainId);\n return strategy.executeTransaction({\n ...params,\n networkType: config?.networkType || \"\",\n chainId,\n });\n }\n\n /**\n * Broadcast a signed transaction\n */\n async broadcastTransaction(\n chainId: ChainIdValue,\n signedTx: string\n ): Promise<unknown> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.broadcastTransaction) {\n throw new Error(\n `broadcastTransaction not supported for chain ${chainId}`\n );\n }\n\n const config = this.getChainConfig(chainId);\n const provider = strategy.getProvider?.(\n config?.type === EChainType.EVM ? config?.chainId : config?.networkType\n );\n return strategy.broadcastTransaction(provider, signedTx);\n }\n\n /**\n * Get transaction hash from signed transaction\n */\n async getTransactionHash(\n chainId: ChainIdValue,\n signedTx: string\n ): Promise<string> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.getTransactionHash) {\n throw new Error(`getTransactionHash not supported for chain ${chainId}`);\n }\n return strategy.getTransactionHash(signedTx);\n }\n\n /**\n * EVM-specific: Get owners of a Gnosis Safe\n */\n async getOwners(\n chainId: ChainIdValue,\n multisigAddress: string\n ): Promise<string[]> {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.getOwners) {\n throw new Error(`getOwners not supported for chain ${chainId}`);\n }\n\n const config = this.getChainConfig(chainId);\n const provider = strategy.getProvider?.(\n config?.type === EChainType.EVM ? config?.chainId : config?.networkType\n );\n return strategy.getOwners(multisigAddress, provider);\n }\n\n /**\n * EVM-specific: Encode remove owner transaction\n */\n encodeRemoveOwner(\n chainId: ChainIdValue,\n owners: string[],\n ownerToRemove: string,\n newThreshold: number\n ): string {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.encodeRemoveOwner) {\n throw new Error(`encodeRemoveOwner not supported for chain ${chainId}`);\n }\n return strategy.encodeRemoveOwner(owners, ownerToRemove, newThreshold);\n }\n\n /**\n * EVM-specific: Encode change threshold transaction\n */\n encodeChangeThreshold(chainId: ChainIdValue, newThreshold: number): string {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.encodeChangeThreshold) {\n throw new Error(\n `encodeChangeThreshold not supported for chain ${chainId}`\n );\n }\n return strategy.encodeChangeThreshold(newThreshold);\n }\n\n /**\n * EVM-specific: Encode add owner with threshold transaction\n */\n encodeAddOwnerWithThreshold(\n chainId: ChainIdValue,\n newOwner: string,\n threshold: number\n ): string {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.encodeAddOwnerWithThreshold) {\n throw new Error(\n `encodeAddOwnerWithThreshold not supported for chain ${chainId}`\n );\n }\n return strategy.encodeAddOwnerWithThreshold(newOwner, threshold);\n }\n\n /**\n * EVM-specific: Encode exec transaction data\n */\n encodeExecTransaction(\n chainId: ChainIdValue,\n to: string,\n value: string,\n data: string,\n operation: number,\n signature: string\n ): string {\n const strategy = this.getStrategy(chainId);\n if (!strategy?.encodeExecTransaction) {\n throw new Error(\n `encodeExecTransaction not supported for chain ${chainId}`\n );\n }\n return strategy.encodeExecTransaction(\n to,\n value,\n data,\n operation,\n signature\n );\n }\n}\n"],"mappings":"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","names":["EChainType","MultisigStatus","OrderStatus","StatusFilterEnum","address","ECPairFactory","bytesToHex","hexToBytes","ethers","EChainType","init_types","GNOSIS_SAFE_ABI","SENTINEL_OWNERS","GNOSIS_SAFE_ABI","SENTINEL_OWNERS","ownerToRemove","ownerToRemoveLower","index","prevOwner","erc20Interface","instructions","import_ethers","EChainType","init_types","import_ethers","import_shamir_secret_sharing","import_web3","ecc","import_buffer","import_ecpair","bitcoin","ECPair","IS_MAINNET","combineShares","import_ethers","fetchServerShare","fetchRecoveryShare","fetchShares","SHAMIR_SHARES_NUM","splitPrivateKey","createShares","updateShares","combine","split","ethers","getReconstructionShares","fetchShares","updateShares","fetchServerShare","import_web3","init_types","address","getReconstructionShares","EChainType","combineShares","import_web3","init_types","instructions","solToLamports","import_web3","import_spl_token","Squads","init_types","address","instructions","solToLamports","import_ethers","import_buffer","import_ethers","import_ethers","import_web3","import_tronweb","import_buffer","address","bytesToHex","bitcoin","ecc","ECPairFactory","ECPair","types","Transaction","PublicKey","Connection","Squads","init_types","address","instructions","combineShares","TronWeb","TRON_FULL_HOST","address","WalletApi","import_ethers","import_web3","instructions","getChangeMethod","isSendOrder","createEvmSendAction","createEvmActions","createSolanaInstructions","createSolanaMultisigOrder","Connection","DEFAULT_RPC_ENDPOINTS","createTronInstruction","iface","SHAMIR_THRESHOLD","combineShares","address","import_ethers","import_web3","import_spl_token","import_tronweb","bitcoin","import_ecpair","ecc","import_buffer","ECPair","ECPairFactory","ERC20_TRANSFER_ABI","erc20Interface","instructions","address","validateEvmTransaction","inputCount","estimatedSize","estimatedFee","import_buffer","address","import_web3","import_buffer","Squads","import_web3","Squads","address","init_types","MINIMUM_AMOUNT_ON_WALLET_TO_CREATE_SOL_TX","parseTokenAmount","address","instructions","solToLamports","import_buffer","import_tronweb","init_types","EC","address","instructions","import_buffer","init_types","address","bitcoin","ecc","ECPairFactory","ECPair","instructions","pubkey","init_types","EChainType","address"]}