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"],"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"],"mappings":";AAKO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,YAAS;AALC,SAAAA;AAAA,GAAA;AAQZ,IAAI,qBAAkC;AAC/B,SAAS,sBAAsB,SAA4B;AAChE,uBAAqB;AACvB;AAYO,SAAS,kBAAsD;AACpE,SAAO,uBAAuB,YAAY,kBAAiB;AAC7D;AAMO,SAAS,mBACd,OACQ;AAER,MAAI,UAAU,UAAU;AACtB,WAAO;AAAA,EACT;AAGA,SAAO,OAAO,KAAK,EAAE,YAAY;AACnC;AAmEO,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,cAAW;AAHD,SAAAA;AAAA,GAAA;AA2DL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,eAAY;AACZ,EAAAA,aAAA,YAAS;AANC,SAAAA;AAAA,GAAA;AA4eL,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,SAAM;AACN,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,cAAW;AAJD,SAAAA;AAAA,GAAA;","names":["EChainType","MultisigStatus","OrderStatus","StatusFilterEnum"]}
@@ -0,0 +1,122 @@
1
+ import {
2
+ encryptRsaOaep
3
+ } from "./chunk-KXIOGAV2.js";
4
+
5
+ // src/crypto/shares.ts
6
+ import { combine, split } from "shamir-secret-sharing";
7
+ var SHAMIR_THRESHOLD = 2;
8
+ var SHAMIR_SHARES_NUM = 3;
9
+ function hexToBytes(hex) {
10
+ const cleanHex = hex.startsWith("0x") ? hex.slice(2) : hex;
11
+ const bytes = new Uint8Array(cleanHex.length / 2);
12
+ for (let i = 0; i < bytes.length; i++) {
13
+ bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);
14
+ }
15
+ return bytes;
16
+ }
17
+ function bytesToHex(bytes) {
18
+ return "0x" + Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
19
+ }
20
+ function normalizeHexStrings(hexStrings) {
21
+ if (hexStrings.length === 0) return hexStrings;
22
+ const cleanHexStrings = hexStrings.map((hex) => hex.startsWith("0x") ? hex.slice(2) : hex);
23
+ const maxLength = Math.max(...cleanHexStrings.map((s) => s.length));
24
+ return cleanHexStrings.map((hex) => hex.padStart(maxLength, "0"));
25
+ }
26
+ async function combineShares(shares) {
27
+ const normalizedHexStrings = normalizeHexStrings(shares);
28
+ const shareBuffers = normalizedHexStrings.map((hex) => hexToBytes("0x" + hex));
29
+ const reconstructed = await combine(shareBuffers);
30
+ return new Uint8Array(reconstructed);
31
+ }
32
+ async function splitPrivateKey(privateKeyBytes) {
33
+ const shares = await split(privateKeyBytes, SHAMIR_SHARES_NUM, SHAMIR_THRESHOLD);
34
+ const { ethers } = await import("ethers");
35
+ return {
36
+ deviceShare: ethers.hexlify(shares[0]),
37
+ serverShare: ethers.hexlify(shares[1]),
38
+ recoveryShare: ethers.hexlify(shares[2])
39
+ };
40
+ }
41
+ async function createShares(privateKeyBytes) {
42
+ if (!privateKeyBytes || privateKeyBytes.length === 0) {
43
+ throw new Error("Cannot create shares from empty private key");
44
+ }
45
+ return splitPrivateKey(privateKeyBytes);
46
+ }
47
+ async function fetchServerShare(apiClient, walletAddress, chainType) {
48
+ const response = await apiClient.get(
49
+ `/sdk/wallets/share/c/${chainType}/${walletAddress}`
50
+ );
51
+ return response.share;
52
+ }
53
+ async function fetchRecoveryShare(apiClient, walletAddress, chainType) {
54
+ const response = await apiClient.get(
55
+ `/sdk/wallets/share/s/${chainType}/${walletAddress}`
56
+ );
57
+ return response.share;
58
+ }
59
+ async function fetchShares(apiClient, walletAddress, chainType) {
60
+ const [recovery, server] = await Promise.all([
61
+ fetchRecoveryShare(apiClient, walletAddress, chainType),
62
+ fetchServerShare(apiClient, walletAddress, chainType)
63
+ ]);
64
+ return { recovery, server };
65
+ }
66
+ async function updateShares(apiClient, walletAddress, serverShare, recoveryShare) {
67
+ const reconstructed = await combineShares([recoveryShare, serverShare]);
68
+ const shares = await createShares(reconstructed);
69
+ const pubkeyResponse = await apiClient.get("/sdk/wallets/pubkey");
70
+ const encryptedRecoveryShare = await encryptRsaOaep(pubkeyResponse.pubkey, shares.recoveryShare);
71
+ await apiClient.post("/sdk/wallets/update", {
72
+ walletAddress,
73
+ serverShare: shares.serverShare,
74
+ encryptedRecoveryShare
75
+ });
76
+ return {
77
+ recovery: "",
78
+ server: shares.serverShare,
79
+ device: shares.deviceShare
80
+ };
81
+ }
82
+ async function getReconstructionShares(apiClient, deviceShare, walletAddress, chainType, forceUpdate) {
83
+ let mainShare;
84
+ let additionalShare;
85
+ let newDeviceShare = null;
86
+ if (forceUpdate || !deviceShare || deviceShare === "-") {
87
+ const shares = await fetchShares(apiClient, walletAddress, chainType);
88
+ const updated = await updateShares(
89
+ apiClient,
90
+ walletAddress,
91
+ shares.server,
92
+ shares.recovery
93
+ );
94
+ mainShare = updated.device;
95
+ additionalShare = updated.server;
96
+ newDeviceShare = updated.device;
97
+ } else {
98
+ const serverShare = await fetchServerShare(apiClient, walletAddress, chainType);
99
+ mainShare = deviceShare;
100
+ additionalShare = serverShare;
101
+ }
102
+ if (!mainShare || !additionalShare) {
103
+ throw new Error("Failed to retrieve key shares.");
104
+ }
105
+ return { mainShare, additionalShare, newDeviceShare };
106
+ }
107
+
108
+ export {
109
+ SHAMIR_THRESHOLD,
110
+ SHAMIR_SHARES_NUM,
111
+ hexToBytes,
112
+ bytesToHex,
113
+ combineShares,
114
+ splitPrivateKey,
115
+ createShares,
116
+ fetchServerShare,
117
+ fetchRecoveryShare,
118
+ fetchShares,
119
+ updateShares,
120
+ getReconstructionShares
121
+ };
122
+ //# sourceMappingURL=chunk-OTW5PZKP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crypto/shares.ts"],"sourcesContent":["\n\nimport { combine, split } from 'shamir-secret-sharing';\nimport { encryptRsaOaep } from './util';\nimport type { ApiClient } from '../api/client';\n\nexport const SHAMIR_THRESHOLD = 2;\nexport const SHAMIR_SHARES_NUM = 3;\n\nexport interface SplitPrivateKey {\n 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"],"mappings":"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","names":[]}
@@ -0,0 +1,217 @@
1
+ // src/core/errors.ts
2
+ var AfridaxBaseError = class extends Error {
3
+ code;
4
+ chain;
5
+ operation;
6
+ details;
7
+ cause;
8
+ constructor(code, message, options) {
9
+ super(message);
10
+ this.name = this.constructor.name;
11
+ this.code = code;
12
+ this.chain = options?.chain;
13
+ this.operation = options?.operation;
14
+ this.details = options?.details;
15
+ this.cause = options?.cause;
16
+ Object.setPrototypeOf(this, new.target.prototype);
17
+ if (Error.captureStackTrace) {
18
+ Error.captureStackTrace(this, this.constructor);
19
+ }
20
+ }
21
+ /**
22
+ * Converts the error to a plain SDKError object for serialization
23
+ */
24
+ toJSON() {
25
+ return {
26
+ code: this.code,
27
+ message: this.message,
28
+ chain: this.chain,
29
+ operation: this.operation,
30
+ details: this.details,
31
+ cause: this.cause
32
+ };
33
+ }
34
+ /**
35
+ * Returns a formatted string representation of the error
36
+ */
37
+ toString() {
38
+ let str = `[${this.code}] ${this.message}`;
39
+ if (this.chain) {
40
+ str += ` (chain: ${this.chain})`;
41
+ }
42
+ if (this.operation) {
43
+ str += ` (operation: ${this.operation})`;
44
+ }
45
+ return str;
46
+ }
47
+ };
48
+ var ApiError = class extends AfridaxBaseError {
49
+ statusCode;
50
+ responseBody;
51
+ constructor(message, options) {
52
+ super("API_ERROR" /* API_ERROR */, message, options);
53
+ this.statusCode = options?.statusCode;
54
+ this.responseBody = options?.responseBody;
55
+ }
56
+ toJSON() {
57
+ return {
58
+ ...super.toJSON(),
59
+ statusCode: this.statusCode
60
+ };
61
+ }
62
+ };
63
+ var KeyMismatchError = class extends AfridaxBaseError {
64
+ expectedAddress;
65
+ derivedAddress;
66
+ constructor(message, options) {
67
+ super("KEY_MISMATCH" /* KEY_MISMATCH */, message, options);
68
+ this.expectedAddress = options.expectedAddress;
69
+ this.derivedAddress = options.derivedAddress;
70
+ }
71
+ toJSON() {
72
+ return {
73
+ ...super.toJSON(),
74
+ expectedAddress: this.expectedAddress,
75
+ derivedAddress: this.derivedAddress
76
+ };
77
+ }
78
+ };
79
+ var InsufficientBalanceError = class extends AfridaxBaseError {
80
+ requiredAmount;
81
+ availableAmount;
82
+ currency;
83
+ constructor(message, options) {
84
+ super("INSUFFICIENT_BALANCE" /* INSUFFICIENT_BALANCE */, message, options);
85
+ this.requiredAmount = options.requiredAmount;
86
+ this.availableAmount = options.availableAmount;
87
+ this.currency = options.currency;
88
+ }
89
+ toJSON() {
90
+ return {
91
+ ...super.toJSON(),
92
+ requiredAmount: this.requiredAmount,
93
+ availableAmount: this.availableAmount,
94
+ currency: this.currency
95
+ };
96
+ }
97
+ };
98
+ var ChainNotSupportedError = class extends AfridaxBaseError {
99
+ requestedChain;
100
+ supportedChains;
101
+ constructor(message, options) {
102
+ super("CHAIN_NOT_SUPPORTED" /* CHAIN_NOT_SUPPORTED */, message, {
103
+ operation: options.operation,
104
+ details: options.details,
105
+ cause: options.cause
106
+ });
107
+ this.requestedChain = options.requestedChain;
108
+ this.supportedChains = options.supportedChains;
109
+ }
110
+ toJSON() {
111
+ return {
112
+ ...super.toJSON(),
113
+ requestedChain: this.requestedChain,
114
+ supportedChains: this.supportedChains
115
+ };
116
+ }
117
+ };
118
+ var NetworkError = class extends AfridaxBaseError {
119
+ endpoint;
120
+ isTimeout;
121
+ constructor(message, options) {
122
+ super("NETWORK_ERROR" /* NETWORK_ERROR */, message, options);
123
+ this.endpoint = options?.endpoint;
124
+ this.isTimeout = options?.isTimeout ?? false;
125
+ }
126
+ toJSON() {
127
+ return {
128
+ ...super.toJSON(),
129
+ endpoint: this.endpoint,
130
+ isTimeout: this.isTimeout
131
+ };
132
+ }
133
+ };
134
+ var TransactionError = class extends AfridaxBaseError {
135
+ txHash;
136
+ constructor(message, options) {
137
+ super("TRANSACTION_FAILED" /* TRANSACTION_FAILED */, message, options);
138
+ this.txHash = options?.txHash;
139
+ }
140
+ };
141
+ var BroadcastError = class extends AfridaxBaseError {
142
+ signedTx;
143
+ constructor(message, options) {
144
+ super("BROADCAST_FAILED" /* BROADCAST_FAILED */, message, options);
145
+ this.signedTx = options?.signedTx;
146
+ }
147
+ };
148
+ var InvalidInputError = class extends AfridaxBaseError {
149
+ field;
150
+ value;
151
+ constructor(message, options) {
152
+ super("INVALID_INPUT" /* INVALID_INPUT */, message, options);
153
+ this.field = options?.field;
154
+ this.value = options?.value;
155
+ }
156
+ };
157
+ var UnauthorizedError = class extends AfridaxBaseError {
158
+ constructor(message, options) {
159
+ super("UNAUTHORIZED" /* UNAUTHORIZED */, message, options);
160
+ }
161
+ };
162
+ var RateLimitError = class extends AfridaxBaseError {
163
+ retryAfter;
164
+ constructor(message, options) {
165
+ super("RATE_LIMITED" /* RATE_LIMITED */, message, options);
166
+ this.retryAfter = options?.retryAfter;
167
+ }
168
+ };
169
+ var TimeoutError = class extends AfridaxBaseError {
170
+ timeoutMs;
171
+ constructor(message, options) {
172
+ super("TIMEOUT" /* TIMEOUT */, message, options);
173
+ this.timeoutMs = options.timeoutMs;
174
+ }
175
+ };
176
+ var NotFoundError = class extends AfridaxBaseError {
177
+ resourceType;
178
+ resourceId;
179
+ constructor(message, options) {
180
+ let code;
181
+ switch (options.resourceType) {
182
+ case "order":
183
+ code = "ORDER_NOT_FOUND" /* ORDER_NOT_FOUND */;
184
+ break;
185
+ case "multisig":
186
+ code = "MULTISIG_NOT_FOUND" /* MULTISIG_NOT_FOUND */;
187
+ break;
188
+ case "wallet":
189
+ code = "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */;
190
+ break;
191
+ }
192
+ super(code, message, options);
193
+ this.resourceType = options.resourceType;
194
+ this.resourceId = options.resourceId;
195
+ }
196
+ };
197
+ function isAfridaxError(error) {
198
+ return error instanceof AfridaxBaseError;
199
+ }
200
+
201
+ export {
202
+ AfridaxBaseError,
203
+ ApiError,
204
+ KeyMismatchError,
205
+ InsufficientBalanceError,
206
+ ChainNotSupportedError,
207
+ NetworkError,
208
+ TransactionError,
209
+ BroadcastError,
210
+ InvalidInputError,
211
+ UnauthorizedError,
212
+ RateLimitError,
213
+ TimeoutError,
214
+ NotFoundError,
215
+ isAfridaxError
216
+ };
217
+ //# sourceMappingURL=chunk-VM6L5X3N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}