@veridex/sdk 1.1.0 → 1.1.2

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.
Files changed (93) hide show
  1. package/dist/{EVMClient-DtqvdfUP.d.mts → EVMClient-Bmy9czkE.d.mts} +2 -0
  2. package/dist/auth/prepareAuth.js +107 -32
  3. package/dist/auth/prepareAuth.js.map +1 -1
  4. package/dist/auth/prepareAuth.mjs +6 -6
  5. package/dist/chains/aptos/index.js.map +1 -1
  6. package/dist/chains/aptos/index.mjs +3 -3
  7. package/dist/chains/avalanche/index.d.mts +1 -1
  8. package/dist/chains/avalanche/index.js +59 -11
  9. package/dist/chains/avalanche/index.js.map +1 -1
  10. package/dist/chains/avalanche/index.mjs +4 -4
  11. package/dist/chains/evm/index.d.mts +3 -3
  12. package/dist/chains/evm/index.js +59 -11
  13. package/dist/chains/evm/index.js.map +1 -1
  14. package/dist/chains/evm/index.mjs +3 -3
  15. package/dist/chains/solana/index.js.map +1 -1
  16. package/dist/chains/solana/index.mjs +3 -3
  17. package/dist/chains/stacks/index.d.mts +1 -1
  18. package/dist/chains/stacks/index.js.map +1 -1
  19. package/dist/chains/stacks/index.mjs +3 -3
  20. package/dist/chains/starknet/index.d.mts +1 -1
  21. package/dist/chains/starknet/index.js.map +1 -1
  22. package/dist/chains/starknet/index.mjs +3 -3
  23. package/dist/chains/stellar/index.d.mts +312 -0
  24. package/dist/chains/stellar/index.js +300 -0
  25. package/dist/chains/stellar/index.js.map +1 -0
  26. package/dist/chains/stellar/index.mjs +260 -0
  27. package/dist/chains/stellar/index.mjs.map +1 -0
  28. package/dist/chains/sui/index.d.mts +1 -1
  29. package/dist/chains/sui/index.js.map +1 -1
  30. package/dist/chains/sui/index.mjs +3 -3
  31. package/dist/{chunk-Q5O3M5LP.mjs → chunk-2TS375ET.mjs} +2 -2
  32. package/dist/{chunk-QT4ZZ4GM.mjs → chunk-5FDOTI5G.mjs} +2 -2
  33. package/dist/{chunk-N4A2RMUN.mjs → chunk-AFHWA4CZ.mjs} +2 -2
  34. package/dist/{chunk-5T6KPH7A.mjs → chunk-CSU4IV2F.mjs} +2 -2
  35. package/dist/{chunk-YCUJZ6Z7.mjs → chunk-CTYDGO6E.mjs} +63 -6
  36. package/dist/chunk-CTYDGO6E.mjs.map +1 -0
  37. package/dist/{chunk-USDA5JTN.mjs → chunk-DZUNCSI5.mjs} +61 -13
  38. package/dist/chunk-DZUNCSI5.mjs.map +1 -0
  39. package/dist/{chunk-SXXGTQIR.mjs → chunk-E3SU36C2.mjs} +2 -2
  40. package/dist/{chunk-NUWSMJFJ.mjs → chunk-EFIXFA6V.mjs} +2 -2
  41. package/dist/{chunk-MLXQHIH2.mjs → chunk-GM5DKEHD.mjs} +2 -2
  42. package/dist/{chunk-GWJRKDSA.mjs → chunk-GOWXQPTW.mjs} +3 -3
  43. package/dist/{chunk-OVMMTL6H.mjs → chunk-ICGB3AHI.mjs} +2 -2
  44. package/dist/{chunk-QDO6NQ7P.mjs → chunk-M3GUNREX.mjs} +20 -3
  45. package/dist/{chunk-QDO6NQ7P.mjs.map → chunk-M3GUNREX.mjs.map} +1 -1
  46. package/dist/{chunk-X7BZMSPQ.mjs → chunk-RD6ZYUVG.mjs} +52 -30
  47. package/dist/chunk-RD6ZYUVG.mjs.map +1 -0
  48. package/dist/{chunk-F3YAGZSW.mjs → chunk-TPEP6XUA.mjs} +2 -2
  49. package/dist/{chunk-M3MM4YMF.mjs → chunk-UPO55SBK.mjs} +2 -2
  50. package/dist/{chunk-PDHZ5X5O.mjs → chunk-YYT3V7CI.mjs} +2 -2
  51. package/dist/constants.d.mts +2 -2
  52. package/dist/constants.js +51 -29
  53. package/dist/constants.js.map +1 -1
  54. package/dist/constants.mjs +1 -1
  55. package/dist/{index-DDalBhAm.d.mts → index-CKKUV4J7.d.mts} +10 -7
  56. package/dist/index.d.mts +43 -14
  57. package/dist/index.js +512 -159
  58. package/dist/index.js.map +1 -1
  59. package/dist/index.mjs +335 -128
  60. package/dist/index.mjs.map +1 -1
  61. package/dist/passkey.js +57 -4
  62. package/dist/passkey.js.map +1 -1
  63. package/dist/passkey.mjs +3 -3
  64. package/dist/payload.js.map +1 -1
  65. package/dist/payload.mjs +2 -2
  66. package/dist/portfolio-JA4OTF7Y.mjs +13 -0
  67. package/dist/queries/index.js +49 -27
  68. package/dist/queries/index.js.map +1 -1
  69. package/dist/queries/index.mjs +5 -5
  70. package/dist/{types-B7V5VNbO.d.mts → types-C564CfsE.d.mts} +33 -4
  71. package/dist/utils.js +49 -27
  72. package/dist/utils.js.map +1 -1
  73. package/dist/utils.mjs +2 -2
  74. package/dist/wormhole.js.map +1 -1
  75. package/dist/wormhole.mjs +2 -2
  76. package/package.json +8 -1
  77. package/dist/chunk-USDA5JTN.mjs.map +0 -1
  78. package/dist/chunk-X7BZMSPQ.mjs.map +0 -1
  79. package/dist/chunk-YCUJZ6Z7.mjs.map +0 -1
  80. package/dist/portfolio-V347KZOL.mjs +0 -13
  81. /package/dist/{chunk-Q5O3M5LP.mjs.map → chunk-2TS375ET.mjs.map} +0 -0
  82. /package/dist/{chunk-QT4ZZ4GM.mjs.map → chunk-5FDOTI5G.mjs.map} +0 -0
  83. /package/dist/{chunk-N4A2RMUN.mjs.map → chunk-AFHWA4CZ.mjs.map} +0 -0
  84. /package/dist/{chunk-5T6KPH7A.mjs.map → chunk-CSU4IV2F.mjs.map} +0 -0
  85. /package/dist/{chunk-SXXGTQIR.mjs.map → chunk-E3SU36C2.mjs.map} +0 -0
  86. /package/dist/{chunk-NUWSMJFJ.mjs.map → chunk-EFIXFA6V.mjs.map} +0 -0
  87. /package/dist/{chunk-MLXQHIH2.mjs.map → chunk-GM5DKEHD.mjs.map} +0 -0
  88. /package/dist/{chunk-GWJRKDSA.mjs.map → chunk-GOWXQPTW.mjs.map} +0 -0
  89. /package/dist/{chunk-OVMMTL6H.mjs.map → chunk-ICGB3AHI.mjs.map} +0 -0
  90. /package/dist/{chunk-F3YAGZSW.mjs.map → chunk-TPEP6XUA.mjs.map} +0 -0
  91. /package/dist/{chunk-M3MM4YMF.mjs.map → chunk-UPO55SBK.mjs.map} +0 -0
  92. /package/dist/{chunk-PDHZ5X5O.mjs.map → chunk-YYT3V7CI.mjs.map} +0 -0
  93. /package/dist/{portfolio-V347KZOL.mjs.map → portfolio-JA4OTF7Y.mjs.map} +0 -0
package/dist/wormhole.mjs CHANGED
@@ -21,8 +21,8 @@ import {
21
21
  supportsRelayer,
22
22
  validateEmitter,
23
23
  waitForGuardianSignatures
24
- } from "./chunk-M3MM4YMF.mjs";
25
- import "./chunk-X7BZMSPQ.mjs";
24
+ } from "./chunk-UPO55SBK.mjs";
25
+ import "./chunk-RD6ZYUVG.mjs";
26
26
  export {
27
27
  CONSISTENCY_LEVELS,
28
28
  GUARDIAN_CONFIG,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veridex/sdk",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Veridex Protocol SDK - Client library for Passkey-based cross-chain authentication",
5
5
  "author": "Veridex Protocol <team@veridex.network>",
6
6
  "license": "MIT",
@@ -89,6 +89,11 @@
89
89
  "import": "./dist/chains/avalanche/index.mjs",
90
90
  "require": "./dist/chains/avalanche/index.js"
91
91
  },
92
+ "./chains/stellar": {
93
+ "types": "./dist/chains/stellar/index.d.ts",
94
+ "import": "./dist/chains/stellar/index.mjs",
95
+ "require": "./dist/chains/stellar/index.js"
96
+ },
92
97
  "./passkey": {
93
98
  "types": "./dist/passkey.d.ts",
94
99
  "import": "./dist/passkey.mjs",
@@ -156,6 +161,8 @@
156
161
  "passkey",
157
162
  "webauthn",
158
163
  "ethereum",
164
+ "stellar",
165
+ "soroban",
159
166
  "solana",
160
167
  "aptos",
161
168
  "sui",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/chains/evm/EVMClient.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - EVM Chain Client\n * \n * Implementation of ChainClient interface for EVM-compatible chains\n */\n\nimport { ethers } from 'ethers';\nimport type {\n ChainClient,\n ChainConfig,\n TransferParams,\n ExecuteParams,\n BridgeParams,\n DispatchResult,\n WebAuthnSignature,\n VaultCreationResult,\n} from '../../core/types.js';\nimport { encodeTransferAction, encodeExecuteAction, encodeBridgeAction } from '../../payload.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface EVMClientConfig {\n chainId: number;\n wormholeChainId: number;\n rpcUrl: string;\n hubContractAddress: string;\n wormholeCoreBridge: string;\n name?: string;\n explorerUrl?: string;\n vaultFactory?: string;\n vaultImplementation?: string;\n tokenBridge?: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * EIP-1167 minimal proxy bytecode prefix (before implementation address)\n */\nconst PROXY_BYTECODE_PREFIX = '0x3d602d80600a3d3981f3363d3d373d3d3d363d73';\n\n/**\n * EIP-1167 minimal proxy bytecode suffix (after implementation address)\n */\nconst PROXY_BYTECODE_SUFFIX = '5af43d82803e903d91602b57fd5bf3';\n\n/**\n * ERC20 ABI for balance and transfer operations\n */\nconst ERC20_ABI = [\n 'function balanceOf(address owner) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function symbol() view returns (string)',\n 'function name() view returns (string)',\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function transfer(address to, uint256 amount) returns (bool)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n];\n\n// ============================================================================\n// Hub Contract ABI (minimal)\n// ============================================================================\n\nconst HUB_ABI = [\n 'function dispatch(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) signature, uint256 publicKeyX, uint256 publicKeyY, uint16 targetChain, bytes actionPayload, uint256 nonce) payable returns (uint64 sequence)',\n 'function userNonces(bytes32 userKeyHash) view returns (uint256)',\n 'function getMessageFee() view returns (uint256)',\n 'function getVaultAddress(bytes32 userKeyHash) view returns (address)',\n 'function vaultExists(bytes32 userKeyHash) view returns (bool)',\n 'function createVault(bytes32 userKeyHash) returns (address)',\n // Issue #9/#10: New Hub methods for Query-based execution\n 'function getUserState(bytes32 userKeyHash) view returns (bytes32 keyHash, uint256 nonce, bytes32 lastActionHash)',\n 'function getUserLastActionHash(bytes32 userKeyHash) view returns (bytes32)',\n // Issue #13: Session key management\n 'function registerSession(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 sessionKeyHash, uint256 duration, uint256 maxValue, bool requireUV) external',\n 'function isSessionActive(bytes32 userKeyHash, bytes32 sessionKeyHash) view returns (bool active, uint256 expiry, uint256 maxValue, uint256 sessionIndex)',\n 'function revokeSession(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 sessionKeyHash, bool requireUV) external',\n 'function getUserSessions(bytes32 userKeyHash) view returns (tuple(bytes32 sessionKeyHash, uint256 expiry, uint256 maxValue, bool revoked)[])',\n 'function getUserSessionCount(bytes32 userKeyHash) view returns (uint256)',\n // Issue #22: Backup Passkey / Multi-Key Identity management\n 'function registerIdentity(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY) external',\n 'function addBackupKey(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, uint256 newPublicKeyX, uint256 newPublicKeyY, uint256 nonce) external payable returns (uint64 sequence)',\n 'function removeKey(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 keyToRemove, uint256 nonce) external payable returns (uint64 sequence)',\n 'function getIdentityForKey(bytes32 keyHash) view returns (bytes32)',\n 'function getAuthorizedKeys(bytes32 identity) view returns (bytes32[])',\n 'function getAuthorizedKeyCount(bytes32 identity) view returns (uint256)',\n 'function isAuthorizedForIdentity(bytes32 identity, bytes32 keyHash) view returns (bool)',\n 'function isIdentityRoot(bytes32 keyHash) view returns (bool)',\n 'function getIdentityState(bytes32 keyHash) view returns (bytes32 identity, uint256 keyCount, uint256 maxKeys, bool isRoot)',\n \n // Issue #23: Social Recovery / Guardian Management\n 'function setupGuardians(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32[] guardians, uint256 threshold) external payable returns (uint64 sequence)',\n 'function addGuardian(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 guardianKeyHash) external payable returns (uint64 sequence)',\n 'function removeGuardian(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 guardianKeyHash) external payable returns (uint64 sequence)',\n 'function initiateRecovery(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 identityToRecover, bytes32 newOwnerKeyHash) external payable returns (uint64 sequence)',\n 'function approveRecovery(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 identityToRecover) external payable returns (uint64 sequence)',\n 'function executeRecovery(bytes32 identityToRecover, uint256 newPublicKeyX, uint256 newPublicKeyY) external payable returns (uint64 sequence)',\n 'function cancelRecovery(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY) external payable returns (uint64 sequence)',\n 'function getGuardians(bytes32 identityKeyHash) view returns (bytes32[] guardians, uint256 threshold, bool isConfigured)',\n 'function getRecoveryStatus(bytes32 identityKeyHash) view returns (bool isActive, bytes32 newOwnerKeyHash, uint256 initiatedAt, uint256 approvalCount, uint256 threshold, uint256 canExecuteAt, uint256 expiresAt)',\n 'function hasGuardianApproved(bytes32 identityKeyHash, bytes32 guardianKeyHash) view returns (bool hasApproved)',\n \n // ADR-0037: Threshold Multisig\n 'function configureTransactionPolicy(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, uint256 threshold, uint256 protectedActionMask, uint256 proposalTtl, bool disableSessions) external',\n 'function createTransactionProposal(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, uint16 targetChain, bytes actionPayload) external returns (bytes32 proposalId)',\n 'function approveTransactionProposal(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 proposalId) external returns (uint256 approvalCount, bool thresholdReached)',\n 'function cancelTransactionProposal(tuple(bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, bytes32 proposalId) external',\n 'function executeTransactionProposal(bytes32 proposalId) external payable returns (uint64 sequence)',\n 'function getTransactionPolicy(bytes32 identityKeyHash) view returns (bool enabled, uint256 threshold, uint256 protectedActionMask, uint256 proposalTtl, bool disableSessions)',\n 'function getTransactionProposal(bytes32 proposalId) view returns (bytes32 identityKeyHash, bytes32 proposerKeyHash, uint16 targetChain, uint8 actionType, bytes32 actionHash, uint256 createdAt, uint256 expiresAt, uint256 approvalCount, uint256 requiredThreshold, uint8 state)',\n 'function hasApprovedTransactionProposal(bytes32 proposalId, bytes32 keyHash) view returns (bool)',\n];\n\n// ============================================================================\n// Factory Contract ABI (minimal)\n// ============================================================================\n\nconst FACTORY_ABI = [\n 'function createVault(bytes32 ownerKeyHash) returns (address vault)',\n 'function getVault(bytes32 ownerKeyHash) view returns (address)',\n 'function computeVaultAddress(bytes32 ownerKeyHash) view returns (address vault)',\n 'function vaultExists(bytes32 ownerKeyHash) view returns (bool)',\n 'function implementation() view returns (address)',\n];\n\n// ============================================================================\n// EVMClient Class\n// ============================================================================\n\n/**\n * EVM implementation of the ChainClient interface\n */\nexport class EVMClient implements ChainClient {\n private config: ChainConfig;\n private provider: ethers.JsonRpcProvider;\n private hubContract: ethers.Contract;\n private factoryContract: ethers.Contract | null = null;\n private cachedImplementation: string | null = null;\n\n constructor(config: EVMClientConfig) {\n this.config = {\n name: config.name ?? `EVM Chain ${config.chainId}`,\n chainId: config.chainId,\n wormholeChainId: config.wormholeChainId,\n rpcUrl: config.rpcUrl,\n explorerUrl: config.explorerUrl ?? '',\n isEvm: true,\n contracts: {\n hub: config.hubContractAddress,\n vaultFactory: config.vaultFactory,\n vaultImplementation: config.vaultImplementation,\n wormholeCoreBridge: config.wormholeCoreBridge,\n tokenBridge: config.tokenBridge,\n },\n };\n\n this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.hubContract = new ethers.Contract(\n config.hubContractAddress,\n HUB_ABI,\n this.provider\n );\n\n // Initialize factory contract if address is provided\n if (config.vaultFactory) {\n this.factoryContract = new ethers.Contract(\n config.vaultFactory,\n FACTORY_ABI,\n this.provider\n );\n }\n\n // Cache implementation address if provided\n if (config.vaultImplementation) {\n this.cachedImplementation = config.vaultImplementation;\n }\n }\n\n getConfig(): ChainConfig {\n return this.config;\n }\n\n async getNonce(userKeyHash: string): Promise<bigint> {\n const nonce = await this.hubContract.userNonces(userKeyHash);\n return BigInt(nonce.toString());\n }\n\n /**\n * Get user state from Hub (Issue #9/#10)\n * Returns comprehensive state including last action hash\n */\n async getUserState(userKeyHash: string): Promise<{\n keyHash: string;\n nonce: bigint;\n lastActionHash: string;\n }> {\n try {\n const result = await this.hubContract.getUserState(userKeyHash);\n return {\n keyHash: result[0],\n nonce: BigInt(result[1].toString()),\n lastActionHash: result[2],\n };\n } catch (error) {\n // Fallback for older Hub deployments without getUserState\n const nonce = await this.getNonce(userKeyHash);\n return {\n keyHash: userKeyHash,\n nonce,\n lastActionHash: ethers.ZeroHash,\n };\n }\n }\n\n /**\n * Get user's last action hash from Hub (Issue #9/#10)\n * Returns zero hash if user has no actions yet\n */\n async getUserLastActionHash(userKeyHash: string): Promise<string> {\n try {\n return await this.hubContract.getUserLastActionHash(userKeyHash);\n } catch (error) {\n // Fallback for older Hub deployments\n return ethers.ZeroHash;\n }\n }\n\n // ==========================================================================\n // Session Management Methods (Issue #13)\n // ==========================================================================\n\n /**\n * Register a new session key for temporary authentication\n * Enables native L1 speed for repeat transactions without biometric auth\n * \n * @param params Session registration parameters\n * @param signer Ethereum signer to pay gas\n * @returns Transaction receipt\n */\n async registerSession(\n params: import('../../types.js').RegisterSessionParams,\n signer: ethers.Signer\n ): Promise<ethers.TransactionReceipt> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: params.signature.authenticatorData,\n clientDataJSON: params.signature.clientDataJSON,\n challengeIndex: params.signature.challengeIndex,\n typeIndex: params.signature.typeIndex,\n r: params.signature.r,\n s: params.signature.s,\n };\n\n const tx = await hubWithSigner.registerSession(\n authTuple,\n params.publicKeyX,\n params.publicKeyY,\n params.sessionKeyHash,\n params.duration,\n params.maxValue,\n params.requireUV\n );\n\n return await tx.wait();\n }\n\n /**\n * Check if a session is currently active (queryable via Wormhole CCQ)\n * \n * @param userKeyHash Hash of the user's Passkey public key\n * @param sessionKeyHash Hash of the session key to check\n * @returns Session validation result\n */\n async isSessionActive(\n userKeyHash: string,\n sessionKeyHash: string\n ): Promise<import('../../types.js').SessionValidationResult> {\n const result = await this.hubContract.isSessionActive(userKeyHash, sessionKeyHash);\n \n return {\n active: result[0],\n expiry: Number(result[1]),\n maxValue: BigInt(result[2].toString()),\n sessionIndex: Number(result[3]),\n };\n }\n\n /**\n * Revoke a session key immediately\n * \n * @param params Session revocation parameters\n * @param signer Ethereum signer to pay gas\n * @returns Transaction receipt\n */\n async revokeSession(\n params: import('../../types.js').RevokeSessionParams,\n signer: ethers.Signer\n ): Promise<ethers.TransactionReceipt> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: params.signature.authenticatorData,\n clientDataJSON: params.signature.clientDataJSON,\n challengeIndex: params.signature.challengeIndex,\n typeIndex: params.signature.typeIndex,\n r: params.signature.r,\n s: params.signature.s,\n };\n\n const tx = await hubWithSigner.revokeSession(\n authTuple,\n params.publicKeyX,\n params.publicKeyY,\n params.sessionKeyHash,\n params.requireUV\n );\n\n return await tx.wait();\n }\n\n /**\n * Get all sessions for a user\n * \n * @param userKeyHash Hash of the user's Passkey public key\n * @returns Array of all sessions (active and expired/revoked)\n */\n async getUserSessions(userKeyHash: string): Promise<import('../../types.js').SessionKey[]> {\n const sessions = await this.hubContract.getUserSessions(userKeyHash);\n \n return sessions.map((s: any) => ({\n sessionKeyHash: s.sessionKeyHash,\n expiry: Number(s.expiry),\n maxValue: BigInt(s.maxValue.toString()),\n revoked: s.revoked,\n }));\n }\n\n /**\n * Get the number of sessions for a user\n * \n * @param userKeyHash Hash of the user's Passkey public key\n * @returns Number of sessions\n */\n async getUserSessionCount(userKeyHash: string): Promise<number> {\n const count = await this.hubContract.getUserSessionCount(userKeyHash);\n return Number(count);\n }\n\n async getMessageFee(): Promise<bigint> {\n const fee = await this.hubContract.getMessageFee();\n return BigInt(fee.toString());\n }\n\n async buildTransferPayload(params: TransferParams): Promise<string> {\n return encodeTransferAction(\n params.token,\n params.recipient,\n params.amount\n );\n }\n\n async buildExecutePayload(params: ExecuteParams): Promise<string> {\n return encodeExecuteAction(\n params.target,\n params.value,\n params.data\n );\n }\n\n async buildBridgePayload(params: BridgeParams): Promise<string> {\n return encodeBridgeAction(\n params.token,\n params.amount,\n params.destinationChain,\n params.recipient\n );\n }\n\n async dispatch(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n targetChain: number,\n actionPayload: string,\n nonce: bigint,\n signer: ethers.Signer\n ): Promise<DispatchResult> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const signatureTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.dispatch(\n signatureTuple,\n publicKeyX,\n publicKeyY,\n targetChain,\n actionPayload,\n nonce,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n\n // Extract sequence from event logs\n const dispatchEvent = receipt.logs.find((log: any) => {\n try {\n const parsed = hubWithSigner.interface.parseLog(log);\n return parsed?.name === 'ActionDispatched';\n } catch {\n return false;\n }\n });\n\n let sequence = 0n;\n if (dispatchEvent) {\n const parsed = hubWithSigner.interface.parseLog(dispatchEvent);\n sequence = BigInt(parsed?.args?.sequence?.toString() ?? '0');\n }\n\n const keyHash = ethers.keccak256(\n ethers.AbiCoder.defaultAbiCoder().encode(\n ['uint256', 'uint256'],\n [publicKeyX, publicKeyY]\n )\n );\n\n return {\n transactionHash: receipt.hash,\n sequence,\n userKeyHash: keyHash,\n targetChain,\n blockNumber: receipt.blockNumber,\n };\n }\n\n /**\n * Dispatch an action to the Hub via relayer (gasless)\n * The relayer pays for gas and submits the transaction on behalf of the user\n */\n async dispatchGasless(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n targetChain: number,\n actionPayload: string,\n nonce: bigint,\n relayerUrl: string\n ): Promise<DispatchResult> {\n // Compute message hash that was signed\n // This should match how the WebAuthn signature was generated\n const keyHash = ethers.keccak256(\n ethers.AbiCoder.defaultAbiCoder().encode(\n ['uint256', 'uint256'],\n [publicKeyX, publicKeyY]\n )\n );\n\n // Build the message that was signed\n const message = ethers.keccak256(\n ethers.AbiCoder.defaultAbiCoder().encode(\n ['bytes32', 'uint16', 'bytes', 'uint256'],\n [keyHash, targetChain, actionPayload, nonce]\n )\n );\n\n // Prepare request for relayer\n const request = {\n messageHash: message,\n r: '0x' + signature.r.toString(16).padStart(64, '0'),\n s: '0x' + signature.s.toString(16).padStart(64, '0'),\n publicKeyX: '0x' + publicKeyX.toString(16).padStart(64, '0'),\n publicKeyY: '0x' + publicKeyY.toString(16).padStart(64, '0'),\n targetChain,\n actionPayload,\n nonce: Number(nonce),\n };\n\n // Submit to relayer\n const response = await fetch(`${relayerUrl}/api/v1/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: response.statusText }));\n throw new Error(`Relayer submission failed: ${error.error || response.statusText}`);\n }\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(`Relayer submission failed: ${result.error}`);\n }\n\n return {\n transactionHash: result.txHash,\n sequence: BigInt(result.sequence || '0'),\n userKeyHash: keyHash,\n targetChain,\n };\n }\n\n async getVaultAddress(userKeyHash: string): Promise<string | null> {\n try {\n // Try factory first if available\n if (this.factoryContract) {\n const address = await this.factoryContract.getVault(userKeyHash);\n if (address !== ethers.ZeroAddress) {\n return address;\n }\n }\n\n // Fallback to hub contract\n const address = await this.hubContract.getVaultAddress(userKeyHash);\n if (address === ethers.ZeroAddress) {\n return null;\n }\n return address;\n } catch (error) {\n console.error('Error getting vault address:', error);\n return null;\n }\n }\n\n /**\n * Compute vault address deterministically without querying the chain\n * Uses CREATE2 with EIP-1167 minimal proxy pattern\n */\n computeVaultAddress(userKeyHash: string): string {\n const factoryAddress = this.getFactoryAddress();\n const implementationAddress = this.getImplementationAddress();\n\n if (!factoryAddress || !implementationAddress) {\n throw new Error('Factory and implementation addresses required for address computation');\n }\n\n // Compute salt: keccak256(abi.encodePacked(factory, keyHash))\n const salt = ethers.keccak256(\n ethers.solidityPacked(\n ['address', 'bytes32'],\n [factoryAddress, userKeyHash]\n )\n );\n\n // Build EIP-1167 initcode\n const initCode = this.buildProxyInitCode(implementationAddress);\n const initCodeHash = ethers.keccak256(initCode);\n\n // CREATE2 address computation:\n // address = keccak256(0xff ++ factory ++ salt ++ initCodeHash)[12:]\n const create2Data = ethers.solidityPacked(\n ['bytes1', 'address', 'bytes32', 'bytes32'],\n ['0xff', factoryAddress, salt, initCodeHash]\n );\n\n const hash = ethers.keccak256(create2Data);\n // Take last 20 bytes as address\n return ethers.getAddress('0x' + hash.slice(26));\n }\n\n /**\n * Build EIP-1167 minimal proxy initcode\n */\n private buildProxyInitCode(implementationAddress: string): string {\n const impl = implementationAddress.toLowerCase().replace('0x', '');\n return PROXY_BYTECODE_PREFIX + impl + PROXY_BYTECODE_SUFFIX;\n }\n\n async vaultExists(userKeyHash: string): Promise<boolean> {\n try {\n // Try factory first if available\n if (this.factoryContract) {\n return await this.factoryContract.vaultExists(userKeyHash);\n }\n // Hub chains may not have vaultExists, silently return false\n if (this.hubContract.vaultExists) {\n try {\n return await this.hubContract.vaultExists(userKeyHash);\n } catch {\n // Hub contract doesn't have vaultExists - this is expected on hub-only chains\n return false;\n }\n }\n return false;\n } catch {\n // Silently return false - vault existence check is non-critical\n return false;\n }\n }\n\n async createVault(userKeyHash: string, signer: ethers.Signer): Promise<VaultCreationResult> {\n // Check if vault already exists\n const exists = await this.vaultExists(userKeyHash);\n if (exists) {\n const address = await this.getVaultAddress(userKeyHash);\n if (address) {\n return {\n address,\n transactionHash: '',\n blockNumber: 0,\n gasUsed: 0n,\n alreadyExisted: true,\n };\n }\n }\n\n // Create vault using factory or hub\n let tx: ethers.TransactionResponse;\n\n if (this.factoryContract) {\n const factoryWithSigner = this.factoryContract.connect(signer) as ethers.Contract;\n tx = await factoryWithSigner.createVault(userKeyHash);\n } else {\n const hubWithSigner = this.hubContract.connect(signer) as ethers.Contract;\n tx = await hubWithSigner.createVault(userKeyHash);\n }\n\n const receipt = await tx.wait();\n if (!receipt) {\n throw new Error('Transaction failed - no receipt');\n }\n\n const vaultAddress = await this.getVaultAddress(userKeyHash);\n if (!vaultAddress) {\n throw new Error('Failed to create vault - address not found after creation');\n }\n\n return {\n address: vaultAddress,\n transactionHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n alreadyExisted: false,\n };\n }\n\n /**\n * Create a vault with a sponsor wallet paying for gas\n * \n * @param userKeyHash - The user's passkey hash\n * @param sponsorPrivateKey - Private key of the wallet that will pay gas\n * @param rpcUrl - Optional RPC URL to use (defaults to client's RPC)\n * @returns VaultCreationResult with address and transaction details\n */\n async createVaultSponsored(\n userKeyHash: string,\n sponsorPrivateKey: string,\n rpcUrl?: string\n ): Promise<VaultCreationResult> {\n // Check if vault already exists\n const exists = await this.vaultExists(userKeyHash);\n if (exists) {\n const address = await this.getVaultAddress(userKeyHash);\n if (address) {\n return {\n address,\n transactionHash: '',\n blockNumber: 0,\n gasUsed: 0n,\n alreadyExisted: true,\n };\n }\n }\n\n // Create sponsor signer\n const provider = rpcUrl\n ? new ethers.JsonRpcProvider(rpcUrl)\n : this.provider;\n const sponsorWallet = new ethers.Wallet(sponsorPrivateKey, provider);\n\n // Check sponsor balance\n const sponsorBalance = await provider.getBalance(sponsorWallet.address);\n const estimatedGas = await this.estimateVaultCreationGas(userKeyHash);\n const feeData = await provider.getFeeData();\n const estimatedCost = estimatedGas * (feeData.gasPrice ?? 1000000000n);\n\n if (sponsorBalance < estimatedCost) {\n throw new Error(\n `Sponsor wallet has insufficient funds. ` +\n `Balance: ${ethers.formatEther(sponsorBalance)} ETH, ` +\n `Estimated cost: ${ethers.formatEther(estimatedCost)} ETH`\n );\n }\n\n // Create vault using factory or hub with sponsor wallet\n let tx: ethers.TransactionResponse;\n\n if (this.factoryContract) {\n const factoryWithSponsor = this.factoryContract.connect(sponsorWallet) as ethers.Contract;\n tx = await factoryWithSponsor.createVault(userKeyHash);\n } else {\n const hubWithSponsor = this.hubContract.connect(sponsorWallet) as ethers.Contract;\n tx = await hubWithSponsor.createVault(userKeyHash);\n }\n\n const receipt = await tx.wait();\n if (!receipt) {\n throw new Error('Transaction failed - no receipt');\n }\n\n const vaultAddress = await this.getVaultAddress(userKeyHash);\n if (!vaultAddress) {\n throw new Error('Failed to create vault - address not found after creation');\n }\n\n return {\n address: vaultAddress,\n transactionHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n alreadyExisted: false,\n sponsoredBy: sponsorWallet.address,\n };\n }\n\n async estimateVaultCreationGas(userKeyHash: string): Promise<bigint> {\n try {\n if (this.factoryContract) {\n return await this.factoryContract.createVault.estimateGas(userKeyHash);\n }\n return await this.hubContract.createVault.estimateGas(userKeyHash);\n } catch (error) {\n // Return a default estimate if estimation fails (vault might already exist)\n console.warn('Gas estimation failed, returning default:', error);\n return 150000n; // Default estimate for vault creation\n }\n }\n\n getFactoryAddress(): string | undefined {\n return this.config.contracts.vaultFactory;\n }\n\n getImplementationAddress(): string | undefined {\n return this.config.contracts.vaultImplementation ?? this.cachedImplementation ?? undefined;\n }\n\n /**\n * Fetch implementation address from factory contract\n */\n async fetchImplementationAddress(): Promise<string | null> {\n if (this.cachedImplementation) {\n return this.cachedImplementation;\n }\n\n if (!this.factoryContract) {\n return null;\n }\n\n try {\n this.cachedImplementation = await this.factoryContract.implementation();\n return this.cachedImplementation;\n } catch (error) {\n console.error('Error fetching implementation address:', error);\n return null;\n }\n }\n\n /**\n * Get the provider instance\n */\n getProvider(): ethers.JsonRpcProvider {\n return this.provider;\n }\n\n // ========================================================================\n // Balance Methods (Phase 2)\n // ========================================================================\n\n /**\n * Get native token balance for an address\n */\n async getNativeBalance(address: string): Promise<bigint> {\n return await this.provider.getBalance(address);\n }\n\n /**\n * Get ERC20 token balance for an address\n */\n async getTokenBalance(tokenAddress: string, ownerAddress: string): Promise<bigint> {\n const contract = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider);\n return await contract.balanceOf(ownerAddress);\n }\n\n /**\n * Get token allowance\n */\n async getTokenAllowance(\n tokenAddress: string,\n ownerAddress: string,\n spenderAddress: string\n ): Promise<bigint> {\n const contract = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider);\n return await contract.allowance(ownerAddress, spenderAddress);\n }\n\n /**\n * Estimate gas for a dispatch transaction\n */\n async estimateDispatchGas(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n targetChain: number,\n actionPayload: string,\n nonce: bigint\n ): Promise<bigint> {\n const signatureTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n try {\n const gasEstimate = await this.hubContract.dispatch.estimateGas(\n signatureTuple,\n publicKeyX,\n publicKeyY,\n targetChain,\n actionPayload,\n nonce,\n { value: messageFee }\n );\n return gasEstimate;\n } catch (error) {\n console.warn('Gas estimation failed, using default:', error);\n return 500000n; // Default estimate for dispatch\n }\n }\n\n /**\n * Get current gas price\n */\n async getGasPrice(): Promise<bigint> {\n const feeData = await this.provider.getFeeData();\n return feeData.gasPrice ?? feeData.maxFeePerGas ?? 0n;\n }\n\n /**\n * Get current block number\n */\n async getBlockNumber(): Promise<number> {\n return await this.provider.getBlockNumber();\n }\n\n /**\n * Get transaction receipt\n */\n async getTransactionReceipt(hash: string): Promise<ethers.TransactionReceipt | null> {\n return await this.provider.getTransactionReceipt(hash);\n }\n\n /**\n * Wait for transaction confirmation\n */\n async waitForTransaction(\n hash: string,\n confirmations: number = 1\n ): Promise<ethers.TransactionReceipt | null> {\n return await this.provider.waitForTransaction(hash, confirmations);\n }\n\n // ==========================================================================\n // Backup Passkey / Multi-Key Identity Methods (Issue #22)\n // ==========================================================================\n\n /**\n * Get the identity for a given key hash\n * Returns zero hash if key is not registered to any identity\n * \n * @param keyHash Hash of the passkey to look up\n * @returns Identity (first passkey's keyHash) or zero hash\n */\n async getIdentityForKey(keyHash: string): Promise<string> {\n try {\n return await this.hubContract.getIdentityForKey(keyHash);\n } catch (error) {\n return ethers.ZeroHash;\n }\n }\n\n /**\n * Get all authorized keys for an identity\n * \n * @param identity The identity key hash (first passkey's keyHash)\n * @returns Array of authorized key hashes\n */\n async getAuthorizedKeys(identity: string): Promise<string[]> {\n try {\n return await this.hubContract.getAuthorizedKeys(identity);\n } catch (error) {\n return [];\n }\n }\n\n /**\n * Get count of authorized keys for an identity\n * \n * @param identity The identity key hash\n * @returns Number of authorized keys\n */\n async getAuthorizedKeyCount(identity: string): Promise<number> {\n try {\n const count = await this.hubContract.getAuthorizedKeyCount(identity);\n return Number(count);\n } catch (error) {\n return 0;\n }\n }\n\n /**\n * Check if a key is authorized for an identity\n * \n * @param identity The identity key hash\n * @param keyHash The key hash to check\n * @returns Whether the key is authorized\n */\n async isAuthorizedForIdentity(identity: string, keyHash: string): Promise<boolean> {\n try {\n return await this.hubContract.isAuthorizedForIdentity(identity, keyHash);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Check if a key is the root identity key\n * \n * @param keyHash The key hash to check\n * @returns Whether the key is a root identity\n */\n async isIdentityRootKey(keyHash: string): Promise<boolean> {\n try {\n return await this.hubContract.isIdentityRoot(keyHash);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Get comprehensive identity state for a key\n * \n * @param keyHash Hash of any key in the identity\n * @returns Identity state including count, max, and root status\n */\n async getIdentityState(keyHash: string): Promise<import('../../types.js').IdentityState> {\n try {\n const result = await this.hubContract.getIdentityState(keyHash);\n return {\n identity: result[0],\n keyCount: Number(result[1]),\n maxKeys: Number(result[2]),\n isRoot: result[3],\n };\n } catch (error) {\n // Fallback for keys not registered\n return {\n identity: ethers.ZeroHash,\n keyCount: 0,\n maxKeys: 5,\n isRoot: false,\n };\n }\n }\n\n /**\n * Register a new identity with the first passkey\n * This makes the passkey the root identity key\n * \n * @param signature WebAuthn signature\n * @param publicKeyX Passkey public key X coordinate\n * @param publicKeyY Passkey public key Y coordinate\n * @param signer Ethereum signer to pay gas\n * @returns Transaction receipt and identity hash\n */\n async registerIdentity(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; identity: string }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const tx = await hubWithSigner.registerIdentity(\n authTuple,\n publicKeyX,\n publicKeyY\n );\n\n const receipt = await tx.wait();\n \n // Compute identity (keyHash of the registered key)\n const keyHash = ethers.keccak256(\n ethers.solidityPacked(['uint256', 'uint256'], [publicKeyX, publicKeyY])\n );\n\n return { receipt, identity: keyHash };\n }\n\n /**\n * Add a backup passkey to an existing identity\n * Requires WebAuthn signature from an authorized key\n * \n * @param signature WebAuthn signature from existing authorized key\n * @param publicKeyX Existing key's X coordinate\n * @param publicKeyY Existing key's Y coordinate\n * @param newPublicKeyX New backup key's X coordinate\n * @param newPublicKeyY New backup key's Y coordinate\n * @param nonce Current nonce for the signing key\n * @param signer Ethereum signer to pay gas\n * @returns Transaction receipt and sequence number\n */\n async addBackupKey(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n newPublicKeyX: bigint,\n newPublicKeyY: bigint,\n nonce: bigint,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.addBackupKey(\n authTuple,\n publicKeyX,\n publicKeyY,\n newPublicKeyX,\n newPublicKeyY,\n nonce,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n\n // Extract sequence from Dispatch event\n let sequence = 0n;\n for (const log of receipt.logs) {\n try {\n const parsed = this.hubContract.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (parsed?.name === 'Dispatched') {\n sequence = BigInt(parsed.args[3]); // sequence is 4th arg\n break;\n }\n } catch {\n // Not a Hub event, skip\n }\n }\n\n return { receipt, sequence };\n }\n\n /**\n * Remove a passkey from an identity\n * Cannot remove the last remaining key\n * \n * @param signature WebAuthn signature from an authorized key\n * @param publicKeyX Signing key's X coordinate\n * @param publicKeyY Signing key's Y coordinate\n * @param keyToRemove Hash of the key to remove\n * @param nonce Current nonce for the signing key\n * @param signer Ethereum signer to pay gas\n * @returns Transaction receipt and sequence number\n */\n async removeKey(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n keyToRemove: string,\n nonce: bigint,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.removeKey(\n authTuple,\n publicKeyX,\n publicKeyY,\n keyToRemove,\n nonce,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n\n // Extract sequence from Dispatch event\n let sequence = 0n;\n for (const log of receipt.logs) {\n try {\n const parsed = this.hubContract.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (parsed?.name === 'Dispatched') {\n sequence = BigInt(parsed.args[3]);\n break;\n }\n } catch {\n // Not a Hub event, skip\n }\n }\n\n return { receipt, sequence };\n }\n\n // =========================================================================\n // SOCIAL RECOVERY METHODS (Issue #23)\n // =========================================================================\n\n /**\n * Setup guardians for an identity\n * @param signature WebAuthn signature from owner\n * @param publicKeyX Owner's public key X coordinate\n * @param publicKeyY Owner's public key Y coordinate\n * @param guardians Array of guardian key hashes\n * @param threshold Required approvals for recovery\n * @param signer Ethers signer for transaction\n */\n async setupGuardians(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n guardians: string[],\n threshold: bigint,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.setupGuardians(\n authTuple,\n publicKeyX,\n publicKeyY,\n guardians,\n threshold,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Add a guardian to an identity\n */\n async addGuardian(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n guardianKeyHash: string,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.addGuardian(\n authTuple,\n publicKeyX,\n publicKeyY,\n guardianKeyHash,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Remove a guardian from an identity\n */\n async removeGuardian(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n guardianKeyHash: string,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.removeGuardian(\n authTuple,\n publicKeyX,\n publicKeyY,\n guardianKeyHash,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Initiate recovery as a guardian\n */\n async initiateRecovery(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n identityToRecover: string,\n newOwnerKeyHash: string,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.initiateRecovery(\n authTuple,\n publicKeyX,\n publicKeyY,\n identityToRecover,\n newOwnerKeyHash,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Approve recovery as a guardian\n */\n async approveRecovery(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n identityToRecover: string,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.approveRecovery(\n authTuple,\n publicKeyX,\n publicKeyY,\n identityToRecover,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Execute recovery after timelock (anyone can call)\n */\n async executeRecovery(\n identityToRecover: string,\n newPublicKeyX: bigint,\n newPublicKeyY: bigint,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.executeRecovery(\n identityToRecover,\n newPublicKeyX,\n newPublicKeyY,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Cancel recovery as owner\n */\n async cancelRecovery(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n signer: ethers.Signer\n ): Promise<{ receipt: ethers.TransactionReceipt; sequence: bigint }> {\n const hubWithSigner = this.hubContract.connect(signer) as any;\n\n const authTuple = {\n authenticatorData: signature.authenticatorData,\n clientDataJSON: signature.clientDataJSON,\n challengeIndex: signature.challengeIndex,\n typeIndex: signature.typeIndex,\n r: signature.r,\n s: signature.s,\n };\n\n const messageFee = await this.getMessageFee();\n\n const tx = await hubWithSigner.cancelRecovery(\n authTuple,\n publicKeyX,\n publicKeyY,\n { value: messageFee }\n );\n\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n\n return { receipt, sequence };\n }\n\n /**\n * Get guardians for an identity\n */\n async getGuardians(identityKeyHash: string): Promise<{\n guardians: string[];\n threshold: bigint;\n isConfigured: boolean;\n }> {\n const result = await this.hubContract.getGuardians(identityKeyHash);\n return {\n guardians: result.guardians,\n threshold: result.threshold,\n isConfigured: result.isConfigured,\n };\n }\n\n /**\n * Get recovery status for an identity\n */\n async getRecoveryStatus(identityKeyHash: string): Promise<{\n isActive: boolean;\n newOwnerKeyHash: string;\n initiatedAt: bigint;\n approvalCount: bigint;\n threshold: bigint;\n canExecuteAt: bigint;\n expiresAt: bigint;\n }> {\n const result = await this.hubContract.getRecoveryStatus(identityKeyHash);\n return {\n isActive: result.isActive,\n newOwnerKeyHash: result.newOwnerKeyHash,\n initiatedAt: result.initiatedAt,\n approvalCount: result.approvalCount,\n threshold: result.threshold,\n canExecuteAt: result.canExecuteAt,\n expiresAt: result.expiresAt,\n };\n }\n\n /**\n * Check if a guardian has approved recovery\n */\n async hasGuardianApproved(\n identityKeyHash: string,\n guardianKeyHash: string\n ): Promise<boolean> {\n return this.hubContract.hasGuardianApproved(identityKeyHash, guardianKeyHash);\n }\n\n // ========================================================================\n // Threshold Multisig (ADR-0037)\n // ========================================================================\n\n async configureTransactionPolicy(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n threshold: number,\n protectedActionMask: number,\n proposalTtl: number,\n disableSessions: boolean,\n signer: unknown,\n ): Promise<{ receipt: unknown }> {\n const s = signer as ethers.Signer;\n const hub = this.hubContract.connect(s) as ethers.Contract;\n const authTuple = this._toAuthTuple(signature);\n const tx = await hub.configureTransactionPolicy(\n authTuple,\n publicKeyX,\n publicKeyY,\n threshold,\n protectedActionMask,\n proposalTtl,\n disableSessions,\n );\n const receipt = await tx.wait();\n return { receipt };\n }\n\n async getTransactionPolicy(identityKeyHash: string): Promise<{\n enabled: boolean;\n threshold: number;\n protectedActionMask: number;\n proposalTtl: number;\n disableSessions: boolean;\n }> {\n const result = await this.hubContract.getTransactionPolicy(identityKeyHash);\n return {\n enabled: result.enabled,\n threshold: Number(result.threshold),\n protectedActionMask: Number(result.protectedActionMask),\n proposalTtl: Number(result.proposalTtl),\n disableSessions: result.disableSessions,\n };\n }\n\n async createTransactionProposal(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n targetChain: number,\n actionPayload: string,\n signer: unknown,\n ): Promise<{ proposalId: string; receipt: unknown; sequence: bigint }> {\n const s = signer as ethers.Signer;\n const hub = this.hubContract.connect(s) as ethers.Contract;\n const authTuple = this._toAuthTuple(signature);\n const tx = await hub.createTransactionProposal(\n authTuple,\n publicKeyX,\n publicKeyY,\n targetChain,\n actionPayload,\n );\n const receipt = await tx.wait();\n\n // Extract proposalId from logs\n let proposalId = ethers.ZeroHash;\n for (const log of receipt.logs) {\n try {\n const parsed = this.hubContract.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (parsed?.name === 'ProposalCreated') {\n proposalId = parsed.args.proposalId;\n break;\n }\n } catch {\n // Not our event\n }\n }\n\n return { proposalId, receipt, sequence: 0n };\n }\n\n async approveTransactionProposal(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n proposalId: string,\n signer: unknown,\n ): Promise<{ receipt: unknown; approvalCount: number; thresholdReached: boolean }> {\n const s = signer as ethers.Signer;\n const hub = this.hubContract.connect(s) as ethers.Contract;\n const authTuple = this._toAuthTuple(signature);\n const tx = await hub.approveTransactionProposal(\n authTuple,\n publicKeyX,\n publicKeyY,\n proposalId,\n );\n const receipt = await tx.wait();\n\n // Extract approval info from logs\n let approvalCount = 0;\n let thresholdReached = false;\n for (const log of receipt.logs) {\n try {\n const parsed = this.hubContract.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (parsed?.name === 'ProposalApproved') {\n approvalCount = Number(parsed.args.currentApprovals);\n thresholdReached = Number(parsed.args.currentApprovals) >= Number(parsed.args.requiredThreshold);\n break;\n }\n } catch {\n // Not our event\n }\n }\n\n return { receipt, approvalCount, thresholdReached };\n }\n\n async cancelTransactionProposal(\n signature: WebAuthnSignature,\n publicKeyX: bigint,\n publicKeyY: bigint,\n proposalId: string,\n signer: unknown,\n ): Promise<{ receipt: unknown }> {\n const s = signer as ethers.Signer;\n const hub = this.hubContract.connect(s) as ethers.Contract;\n const authTuple = this._toAuthTuple(signature);\n const tx = await hub.cancelTransactionProposal(\n authTuple,\n publicKeyX,\n publicKeyY,\n proposalId,\n );\n const receipt = await tx.wait();\n return { receipt };\n }\n\n async executeTransactionProposal(\n proposalId: string,\n signer: unknown,\n ): Promise<{ receipt: unknown; sequence: bigint }> {\n const s = signer as ethers.Signer;\n const hub = this.hubContract.connect(s) as ethers.Contract;\n const fee = await this.hubContract.getMessageFee();\n const tx = await hub.executeTransactionProposal(proposalId, { value: fee });\n const receipt = await tx.wait();\n const sequence = this._extractSequenceFromReceipt(receipt);\n return { receipt, sequence };\n }\n\n async getTransactionProposal(proposalId: string): Promise<{\n identityKeyHash: string;\n proposerKeyHash: string;\n targetChain: number;\n actionType: number;\n actionHash: string;\n createdAt: bigint;\n expiresAt: bigint;\n approvalCount: number;\n requiredThreshold: number;\n state: number;\n }> {\n const result = await this.hubContract.getTransactionProposal(proposalId);\n return {\n identityKeyHash: result.identityKeyHash,\n proposerKeyHash: result.proposerKeyHash,\n targetChain: Number(result.targetChain),\n actionType: Number(result.actionType),\n actionHash: result.actionHash,\n createdAt: result.createdAt,\n expiresAt: result.expiresAt,\n approvalCount: Number(result.approvalCount),\n requiredThreshold: Number(result.requiredThreshold),\n state: Number(result.state),\n };\n }\n\n async hasApprovedTransactionProposal(\n proposalId: string,\n keyHash: string,\n ): Promise<boolean> {\n return this.hubContract.hasApprovedTransactionProposal(proposalId, keyHash);\n }\n\n /**\n * Convert a WebAuthnSignature to the struct tuple expected by the Hub contract\n */\n private _toAuthTuple(sig: WebAuthnSignature) {\n return {\n authenticatorData: sig.authenticatorData,\n clientDataJSON: sig.clientDataJSON,\n challengeIndex: sig.challengeIndex,\n typeIndex: sig.typeIndex,\n r: sig.r,\n s: sig.s,\n };\n }\n\n /**\n * Helper to extract sequence from transaction receipt\n */\n private _extractSequenceFromReceipt(receipt: ethers.TransactionReceipt): bigint {\n for (const log of receipt.logs) {\n try {\n const parsed = this.hubContract.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (parsed?.name === 'Dispatch') {\n return BigInt(parsed.args.sequence);\n }\n } catch {\n // Not a Hub event, skip\n }\n }\n return 0n;\n }\n}\n"],"mappings":"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","names":["address"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Constants and Chain Configurations\n */\n\nimport type { ChainConfig } from './types.js';\n\n// ============================================================================\n// Action Type Constants\n// ============================================================================\n\nexport const ACTION_TYPES = {\n TRANSFER: 1,\n EXECUTE: 2,\n CONFIG: 3,\n BRIDGE: 4,\n} as const;\n\nexport const ACTION_TRANSFER = 1;\nexport const ACTION_EXECUTE = 2;\nexport const ACTION_CONFIG = 3;\nexport const ACTION_BRIDGE = 4;\n\n// Protocol version\nexport const PROTOCOL_VERSION = 1;\n\n// ============================================================================\n// Wormhole Chain IDs\n// ============================================================================\n\n/**\n * Wormhole Chain IDs organized by network\n * @see https://docs.wormhole.com/wormhole/reference/constants\n */\nexport const WORMHOLE_CHAIN_IDS = {\n MAINNET: {\n SOLANA: 1,\n ETHEREUM: 2,\n TERRA: 3,\n BSC: 4,\n POLYGON: 5,\n AVALANCHE: 6,\n OASIS: 7,\n ALGORAND: 8,\n AURORA: 9,\n FANTOM: 10,\n KARURA: 11,\n ACALA: 12,\n KLAYTN: 13,\n CELO: 14,\n NEAR: 15,\n MOONBEAM: 16,\n NEON: 17,\n TERRA2: 18,\n INJECTIVE: 19,\n OSMOSIS: 20,\n SUI: 21,\n APTOS: 22,\n ARBITRUM: 23,\n OPTIMISM: 24,\n GNOSIS: 25,\n PYTHNET: 26,\n XPLA: 28,\n BASE: 30,\n SEI: 32,\n ROOTSTOCK: 33,\n SCROLL: 34,\n MANTLE: 35,\n BLAST: 36,\n XLAYER: 37,\n LINEA: 38,\n BERACHAIN: 39,\n SEIEVM: 40,\n },\n TESTNET: {\n SOLANA_DEVNET: 1,\n GOERLI: 2,\n BSC_TESTNET: 4,\n POLYGON_MUMBAI: 5,\n AVALANCHE_FUJI: 6,\n FANTOM_TESTNET: 10,\n CELO_ALFAJORES: 14,\n MOONBASE_ALPHA: 16,\n SUI_TESTNET: 21,\n APTOS_TESTNET: 22,\n SEPOLIA: 10002,\n ARBITRUM_SEPOLIA: 10003,\n BASE_SEPOLIA: 10004,\n OPTIMISM_SEPOLIA: 10005,\n HOLESKY: 10006,\n POLYGON_SEPOLIA: 10007,\n SEI_ATLANTIC_2: 10066, // Sei Arctic-1 testnet (EVM)\n STARKNET_SEPOLIA: 50001, // Custom bridge (non-Wormhole, relayer-attested)\n },\n} as const;\n\n// Legacy flat exports for backward compatibility\nexport const WORMHOLE_CHAIN_IDS_FLAT = {\n // Mainnets\n SOLANA: 1,\n ETHEREUM: 2,\n TERRA: 3,\n BSC: 4,\n POLYGON: 5,\n AVALANCHE: 6,\n OASIS: 7,\n ALGORAND: 8,\n AURORA: 9,\n FANTOM: 10,\n KARURA: 11,\n ACALA: 12,\n KLAYTN: 13,\n CELO: 14,\n NEAR: 15,\n MOONBEAM: 16,\n NEON: 17,\n TERRA2: 18,\n INJECTIVE: 19,\n OSMOSIS: 20,\n SUI: 21,\n APTOS: 22,\n ARBITRUM: 23,\n OPTIMISM: 24,\n GNOSIS: 25,\n PYTHNET: 26,\n XPLA: 28,\n BASE: 30,\n SEI: 32,\n ROOTSTOCK: 33,\n SCROLL: 34,\n MANTLE: 35,\n BLAST: 36,\n XLAYER: 37,\n LINEA: 38,\n BERACHAIN: 39,\n SEIEVM: 40,\n\n // Testnets\n SOLANA_DEVNET: 1,\n GOERLI: 2,\n BSC_TESTNET: 4,\n POLYGON_MUMBAI: 5,\n AVALANCHE_FUJI: 6,\n FANTOM_TESTNET: 10,\n CELO_ALFAJORES: 14,\n MOONBASE_ALPHA: 16,\n SUI_TESTNET: 21,\n APTOS_TESTNET: 22,\n ARBITRUM_SEPOLIA: 10003,\n BASE_SEPOLIA: 10004,\n OPTIMISM_SEPOLIA: 10005,\n POLYGON_SEPOLIA: 10007,\n HOLESKY: 10006,\n STARKNET_SEPOLIA: 50001, // Custom bridge (non-Wormhole)\n} as const;\n\n// ============================================================================\n// Testnet Chain Configurations\n// ============================================================================\n\nexport const TESTNET_CHAINS: Record<string, ChainConfig> = {\n baseSepolia: {\n name: 'Base Sepolia',\n chainId: 84532,\n wormholeChainId: 10004,\n rpcUrl: 'https://sepolia.base.org', // Public CORS-friendly RPC\n explorerUrl: 'https://sepolia.basescan.org',\n isEvm: true,\n contracts: {\n hub: '0x23a39c294891703146c3607e1FEEB5Fe78F7F28d',\n vaultFactory: '0x31e8dc9428575334739754Ab2bdB0E8b9Dc707FD',\n vaultImplementation: '0xD65E996CD6d5B01689dc54ad30B51f1D88a100f5',\n wormholeCoreBridge: '0x79A1027a6A159502049F10906D333EC57E95F083',\n tokenBridge: '0x86F55A04690fd7815A3D802bD587e83eA888B239',\n },\n },\n ethereumSepolia: {\n name: 'Ethereum Sepolia',\n chainId: 11155111,\n wormholeChainId: 10002,\n rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n explorerUrl: 'https://sepolia.etherscan.io',\n isEvm: true,\n contracts: {\n vaultFactory: '0x52a6dc19C11b3B53B434Fc7f6D31F8b62ed18F0a',\n vaultImplementation: '0xfab72dd1fd3AD79f738B49506f32251B60c95f01',\n wormholeCoreBridge: '0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78',\n tokenBridge: '0xDB5492265f6038831E89f495670FF909aDe94bd9',\n },\n },\n optimismSepolia: {\n name: 'Optimism Sepolia',\n chainId: 11155420,\n wormholeChainId: 10005,\n rpcUrl: 'https://sepolia.optimism.io',\n explorerUrl: 'https://sepolia-optimism.etherscan.io',\n isEvm: true,\n contracts: {\n vaultFactory: '0x347feeaBB5655a7a80b56D8D554DA30BE6c28225',\n vaultImplementation: '0x26C4FD8fC66150ef5964562F7A69271fB0cd02A4',\n wormholeCoreBridge: '0x31377888146f3253211EFEf5c676D41ECe7D58Fe',\n tokenBridge: '0x99737Ec4B815d816c49A385943baf0380e75c0Ac',\n },\n },\n arbitrumSepolia: {\n name: 'Arbitrum Sepolia',\n chainId: 421614,\n wormholeChainId: 10003,\n rpcUrl: 'https://sepolia-rollup.arbitrum.io/rpc',\n explorerUrl: 'https://sepolia.arbiscan.io',\n isEvm: true,\n contracts: {\n vaultFactory: '0x708eEE22621A64CDF51d98d3e8D97902D7dF52dD',\n vaultImplementation: '0x9f74Dc14A98E59df7AEC5571a2B9E329153dF5Cd',\n wormholeCoreBridge: '0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35',\n tokenBridge: '0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e',\n },\n },\n seiTestnet: {\n name: 'Sei Atlantic-2',\n chainId: 1328,\n wormholeChainId: 40,\n rpcUrl: 'https://evm-rpc-testnet.sei-apis.com',\n explorerUrl: 'https://seitrace.com/?chain=atlantic-2',\n isEvm: true,\n contracts: {\n vaultFactory: '0x07F608AFf6d63b68029488b726d895c4Bb593038',\n vaultImplementation: '0xD66153fccFB6731fB6c4944FbD607ba86A76a1f6',\n wormholeCoreBridge: '0x0000000000000000000000000000000000000000', // Mock - not yet deployed\n },\n },\n solanaDevnet: {\n name: 'Solana Devnet',\n chainId: 0,\n wormholeChainId: 1,\n rpcUrl: 'https://api.devnet.solana.com',\n explorerUrl: 'https://explorer.solana.com',\n isEvm: false,\n contracts: {\n hub: 'AnyXHsqq9c2BiW4WgBcj6Aye7Ua7a7L7iSuwpfJxECJM',\n wormholeCoreBridge: '3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5',\n tokenBridge: 'DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe',\n },\n },\n aptosTestnet: {\n name: 'Aptos Testnet',\n chainId: 0,\n wormholeChainId: 22,\n rpcUrl: 'https://fullnode.testnet.aptoslabs.com/v1',\n explorerUrl: 'https://explorer.aptoslabs.com',\n isEvm: false,\n contracts: {\n hub: '0x2935e5d434c383c8f8b8af3b9596aa78b7238c308b5b0fe2bbd19e248b6f018f',\n wormholeCoreBridge: '0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625',\n tokenBridge: '0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f',\n },\n },\n suiTestnet: {\n name: 'Sui Testnet',\n chainId: 0,\n wormholeChainId: 21,\n rpcUrl: 'https://fullnode.testnet.sui.io:443',\n explorerUrl: 'https://suiscan.xyz/testnet',\n isEvm: false,\n contracts: {\n hub: '0x7f6b9a3f9dba7ac6b20d180a9274f525c23a2a9f7e5445218c595c3696c55667',\n wormholeCoreBridge: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790',\n },\n },\n starknetSepolia: {\n name: 'Starknet Sepolia',\n chainId: 0, // Native Starknet chain ID (SN_SEPOLIA = 0x534e5f5345504f4c4941)\n wormholeChainId: 50001, // Custom chain ID (50000+ reserved for non-Wormhole chains)\n rpcUrl: 'https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_7/tsOnfTBZDKMXcUA26OED-',\n explorerUrl: 'https://sepolia.starkscan.co',\n isEvm: false,\n contracts: {\n // Starknet spoke contract\n hub: '0x46139177b8a1d7187cf35fbcddca637882a1d6f50d91f048c59d1322eee9ede',\n // Custom bridge contract (NOT Wormhole)\n wormholeCoreBridge: '0x700488242f8f03248b2311edddc394f0408a18c36181446eabd265067809c83',\n },\n // Hub chain ID that Starknet bridge validates (Base Sepolia = 10004)\n hubChainId: 10004,\n },\n};\n\n// ============================================================================\n// Mainnet Chain Configurations\n// ============================================================================\n\nexport const MAINNET_CHAINS: Record<string, ChainConfig> = {\n ethereum: {\n name: 'Ethereum',\n chainId: 1,\n wormholeChainId: 2,\n rpcUrl: 'https://eth.llamarpc.com',\n explorerUrl: 'https://etherscan.io',\n isEvm: true,\n contracts: {\n wormholeCoreBridge: '0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B',\n tokenBridge: '0x3ee18B2214AFF97000D974cf647E7C347E8fa585',\n },\n },\n base: {\n name: 'Base',\n chainId: 8453,\n wormholeChainId: 30,\n rpcUrl: 'https://mainnet.base.org',\n explorerUrl: 'https://basescan.org',\n isEvm: true,\n contracts: {\n wormholeCoreBridge: '0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6',\n tokenBridge: '0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627',\n },\n },\n optimism: {\n name: 'Optimism',\n chainId: 10,\n wormholeChainId: 24,\n rpcUrl: 'https://mainnet.optimism.io',\n explorerUrl: 'https://optimistic.etherscan.io',\n isEvm: true,\n contracts: {\n wormholeCoreBridge: '0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722',\n tokenBridge: '0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b',\n },\n },\n arbitrum: {\n name: 'Arbitrum',\n chainId: 42161,\n wormholeChainId: 23,\n rpcUrl: 'https://arb1.arbitrum.io/rpc',\n explorerUrl: 'https://arbiscan.io',\n isEvm: true,\n contracts: {\n wormholeCoreBridge: '0xa5f208e072434bC67592E4C49C1B991BA79BCA46',\n tokenBridge: '0x0b2402144Bb366A632D14B83F244D2e0e21bD39c',\n },\n },\n polygon: {\n name: 'Polygon',\n chainId: 137,\n wormholeChainId: 5,\n rpcUrl: 'https://polygon-rpc.com',\n explorerUrl: 'https://polygonscan.com',\n isEvm: true,\n contracts: {\n wormholeCoreBridge: '0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7',\n tokenBridge: '0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE',\n },\n },\n solana: {\n name: 'Solana',\n chainId: 0,\n wormholeChainId: 1,\n rpcUrl: 'https://api.mainnet-beta.solana.com',\n explorerUrl: 'https://explorer.solana.com',\n isEvm: false,\n contracts: {\n wormholeCoreBridge: 'worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth',\n tokenBridge: 'wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb',\n },\n },\n aptos: {\n name: 'Aptos',\n chainId: 0,\n wormholeChainId: 22,\n rpcUrl: 'https://fullnode.mainnet.aptoslabs.com/v1',\n explorerUrl: 'https://explorer.aptoslabs.com',\n isEvm: false,\n contracts: {\n wormholeCoreBridge: '0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625',\n tokenBridge: '0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f',\n },\n },\n sui: {\n name: 'Sui',\n chainId: 0,\n wormholeChainId: 21,\n rpcUrl: 'https://fullnode.mainnet.sui.io:443',\n explorerUrl: 'https://suiscan.xyz/mainnet',\n isEvm: false,\n contracts: {\n wormholeCoreBridge: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n },\n },\n};\n\n// ============================================================================\n// Wormhole API Endpoints\n// ============================================================================\n\nexport const WORMHOLE_API = {\n MAINNET: 'https://api.wormholescan.io',\n TESTNET: 'https://api.testnet.wormholescan.io',\n GUARDIAN_RPC_MAINNET: 'https://wormhole-v2-mainnet-api.certus.one',\n GUARDIAN_RPC_TESTNET: 'https://wormhole-v2-testnet-api.certus.one',\n} as const;\n\n// ============================================================================\n// Hub Contract ABI (minimal)\n// ============================================================================\n\nexport const HUB_ABI = [\n 'function authenticateAndDispatch((bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, uint16 targetChain, bytes actionPayload) external payable returns (uint64 sequence)',\n 'function authenticateRawAndDispatch(uint256 r, uint256 s, bytes32 messageHash, uint256 publicKeyX, uint256 publicKeyY, uint16 targetChain, bytes actionPayload, uint256 nonce) external payable returns (uint64 sequence)',\n 'function userNonces(bytes32 userKeyHash) external view returns (uint256)',\n 'function encodeTransferAction(address token, address recipient, uint256 amount) external pure returns (bytes)',\n 'function encodeExecuteAction(address target, uint256 value, bytes data) external pure returns (bytes)',\n 'function encodeBridgeAction(bytes32 token, uint256 amount, uint16 targetChain, bytes32 recipient) external pure returns (bytes)',\n 'function messageFee() external view returns (uint256)',\n 'event Dispatched(bytes32 indexed userKeyHash, uint16 targetChain, uint256 nonce, uint64 sequence, bytes actionPayload)',\n] as const;\n\n// ============================================================================\n// Vault Factory ABI (minimal)\n// ============================================================================\n\nexport const VAULT_FACTORY_ABI = [\n 'function createVault(bytes32 userKeyHash) external returns (address)',\n 'function getVault(bytes32 userKeyHash) external view returns (address)',\n 'function vaultExists(bytes32 userKeyHash) external view returns (bool)',\n 'event VaultCreated(bytes32 indexed userKeyHash, address vault)',\n] as const;\n\n// ============================================================================\n// Vault ABI (minimal)\n// ============================================================================\n\nexport const VAULT_ABI = [\n 'function execute(address target, uint256 value, bytes data) external returns (bytes)',\n 'function executeFromHub(bytes32 vaaHash, uint16 emitterChain, bytes32 emitterAddress, bytes payload) external',\n 'function owner() external view returns (bytes32)',\n 'function hub() external view returns (address)',\n 'receive() external payable',\n] as const;\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/PasskeyManager.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Passkey Manager\n * \n * Chain-agnostic WebAuthn/Passkey credential management\n */\n\nimport {\n startRegistration,\n startAuthentication,\n browserSupportsWebAuthn,\n} from '@simplewebauthn/browser';\nimport type {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON,\n RegistrationResponseJSON,\n AuthenticationResponseJSON,\n} from '@simplewebauthn/types';\nimport { ethers } from 'ethers';\nimport { base64URLEncode, base64URLDecode, parseDERSignature, computeKeyHash } from '../utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PasskeyCredential {\n credentialId: string;\n publicKeyX: bigint;\n publicKeyY: bigint;\n keyHash: string;\n}\n\nexport interface WebAuthnSignature {\n authenticatorData: string;\n clientDataJSON: string;\n challengeIndex: number;\n typeIndex: number;\n r: bigint;\n s: bigint;\n}\n\nexport interface PasskeyManagerConfig {\n rpName?: string;\n rpId?: string;\n timeout?: number;\n userVerification?: 'required' | 'preferred' | 'discouraged';\n authenticatorAttachment?: 'platform' | 'cross-platform';\n /** Relayer API URL for cross-device credential recovery */\n relayerUrl?: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * The canonical Veridex RP ID for cross-domain passkey sharing.\n * All Veridex SDK instances should use this RP ID to enable passkey\n * portability across different applications and domains.\n * \n * This works via W3C Related Origin Requests (ROR) - veridex.network\n * hosts a .well-known/webauthn file that lists allowed origins.\n */\nexport const VERIDEX_RP_ID = 'veridex.network';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Detects the appropriate RP ID for passkey sharing.\n * \n * For production: Returns VERIDEX_RP_ID ('veridex.network') to enable\n * cross-domain passkey sharing via Related Origin Requests (ROR).\n * \n * For local development:\n * - localhost/127.0.0.1 → returns as-is\n * - IP addresses → returns as-is\n * \n * @param forceLocal - If true, uses local domain detection instead of canonical RP ID\n */\nfunction detectRpId(forceLocal?: boolean): string {\n if (typeof window === 'undefined') return 'localhost';\n\n const hostname = window.location.hostname;\n\n // For local development, always use the actual hostname\n if (hostname === 'localhost' || hostname === '127.0.0.1' || /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(hostname)) {\n return hostname;\n }\n\n // If forceLocal is true, detect from hostname (legacy behavior)\n if (forceLocal) {\n const parts = hostname.split('.');\n if (parts.length <= 2) {\n return hostname;\n }\n return parts.slice(-2).join('.');\n }\n\n // Default: Use canonical Veridex RP ID for cross-domain passkey sharing\n return VERIDEX_RP_ID;\n}\n\n/**\n * Check if the browser supports Related Origin Requests (ROR).\n * This is a WebAuthn Level 3 feature that allows using passkeys\n * across different domains listed in the RP's .well-known/webauthn file.\n * \n * @returns true if ROR is supported, false otherwise\n */\nexport async function supportsRelatedOrigins(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.PublicKeyCredential) {\n return false;\n }\n\n // Check for getClientCapabilities (WebAuthn L3)\n if ('getClientCapabilities' in PublicKeyCredential) {\n try {\n const getCapabilities = (PublicKeyCredential as unknown as {\n getClientCapabilities: () => Promise<{ relatedOrigins?: boolean }>\n }).getClientCapabilities;\n const capabilities = await getCapabilities();\n return capabilities?.relatedOrigins === true;\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\n/** \n * Export the detectRpId function for external use.\n * Apps can call this to see what RP ID will be used.\n */\nexport { detectRpId };\n\n// ============================================================================\n// PasskeyManager Class\n// ============================================================================\n\n/**\n * Manages WebAuthn passkey credentials for Veridex Protocol\n */\nexport class PasskeyManager {\n private config: Required<PasskeyManagerConfig>;\n private credential: PasskeyCredential | null = null;\n\n constructor(config: PasskeyManagerConfig = {}) {\n this.config = {\n rpName: config.rpName ?? 'Veridex Protocol',\n rpId: config.rpId ?? detectRpId(),\n timeout: config.timeout ?? 60000,\n userVerification: config.userVerification ?? 'required',\n authenticatorAttachment: config.authenticatorAttachment ?? 'platform',\n relayerUrl: config.relayerUrl ?? '',\n };\n }\n\n static isSupported(): boolean {\n return browserSupportsWebAuthn();\n }\n\n static async isPlatformAuthenticatorAvailable(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.PublicKeyCredential) {\n return false;\n }\n return await window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n\n async register(username: string, displayName: string): Promise<PasskeyCredential> {\n if (!PasskeyManager.isSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const challenge = ethers.randomBytes(32);\n const challengeBase64 = base64URLEncode(challenge);\n\n const options: PublicKeyCredentialCreationOptionsJSON = {\n challenge: challengeBase64,\n rp: {\n name: this.config.rpName,\n id: this.config.rpId,\n },\n user: {\n id: base64URLEncode(ethers.toUtf8Bytes(username)),\n name: username,\n displayName: displayName,\n },\n pubKeyCredParams: [\n { alg: -7, type: 'public-key' }, // ES256 (P-256) - WebAuthn default\n { alg: -257, type: 'public-key' }, // RS256 - Widely supported\n { alg: -8, type: 'public-key' }, // EdDSA - Modern, efficient\n { alg: -35, type: 'public-key' }, // ES384 (P-384)\n { alg: -36, type: 'public-key' }, // ES512 (P-521)\n { alg: -37, type: 'public-key' }, // PS256 - RSA PSS\n ],\n authenticatorSelection: {\n authenticatorAttachment: this.config.authenticatorAttachment,\n userVerification: this.config.userVerification,\n residentKey: 'required',\n requireResidentKey: true,\n },\n timeout: this.config.timeout,\n attestation: 'none',\n };\n\n const response = await startRegistration(options);\n const publicKey = this.extractPublicKeyFromAttestation(response);\n const keyHash = computeKeyHash(publicKey.x, publicKey.y);\n\n this.credential = {\n credentialId: response.id,\n publicKeyX: publicKey.x,\n publicKeyY: publicKey.y,\n keyHash,\n };\n\n return this.credential;\n }\n\n async sign(challenge: Uint8Array): Promise<WebAuthnSignature> {\n if (!this.credential) {\n throw new Error('No credential set. Call register() or setCredential() first.');\n }\n\n const challengeBase64 = base64URLEncode(challenge);\n\n const options: PublicKeyCredentialRequestOptionsJSON = {\n challenge: challengeBase64,\n rpId: this.config.rpId,\n allowCredentials: [\n {\n id: this.credential.credentialId,\n type: 'public-key',\n transports: ['internal'],\n },\n ],\n userVerification: this.config.userVerification,\n timeout: this.config.timeout,\n };\n\n const response = await startAuthentication(options);\n return this.parseAuthenticationResponse(response);\n }\n\n\n\n /**\n * Authenticate using a discoverable credential (passkey)\n * This allows sign-in without knowing the credential ID ahead of time.\n * The authenticator will show all available passkeys for this RP.\n * \n * @param challenge - Optional challenge bytes. If not provided, a random challenge is used.\n * @returns The credential that was used to authenticate, along with the signature\n */\n async authenticate(challenge?: Uint8Array): Promise<{\n credential: PasskeyCredential;\n signature: WebAuthnSignature;\n }> {\n if (!PasskeyManager.isSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const actualChallenge = challenge ?? ethers.randomBytes(32);\n const challengeBase64 = base64URLEncode(actualChallenge);\n\n // Allow any registered credential (discoverable or not)\n const options: PublicKeyCredentialRequestOptionsJSON = {\n challenge: challengeBase64,\n rpId: this.config.rpId,\n userVerification: this.config.userVerification,\n timeout: this.config.timeout,\n };\n\n const response = await startAuthentication(options);\n const credentialId = response.id;\n const signature = this.parseAuthenticationResponse(response);\n\n // 1. Try to find the credential in our local cache (could be one of many)\n let storedCredential = this.findCredentialById(credentialId);\n\n if (storedCredential) {\n this.credential = storedCredential;\n return { credential: storedCredential, signature };\n }\n\n // 2. Try to fetch from the Relayer/API if configured\n if (this.config.relayerUrl) {\n storedCredential = await this.loadCredentialFromRelayer(credentialId);\n if (storedCredential) {\n this.credential = storedCredential;\n this.addCredentialToStorage(storedCredential);\n return { credential: storedCredential, signature };\n }\n }\n\n // 3. If we still don't have it, we can't verify signatures or derive the keyHash\n const hasRelayer = !!this.config.relayerUrl;\n throw new Error(\n 'Credential not found. ' +\n 'This passkey was registered on a different device or the data was cleared. ' +\n (hasRelayer\n ? 'The credential was not found. Please register a new passkey.'\n : 'Please register a new passkey or ensure the relayer URL is configured.')\n );\n }\n\n /**\n * Find a credential by ID in the list of stored credentials\n */\n private findCredentialById(credentialId: string): PasskeyCredential | null {\n if (typeof window === 'undefined') return null;\n\n const stored = this.getAllStoredCredentials();\n return stored.find(c => c.credentialId === credentialId) || null;\n }\n\n /**\n * Get all credentials stored in localStorage\n */\n getAllStoredCredentials(key = 'veridex_credentials'): PasskeyCredential[] {\n if (typeof window === 'undefined') return [];\n\n const stored = localStorage.getItem(key);\n if (!stored) {\n // Fallback to legacy single key for backward compatibility\n const legacy = localStorage.getItem('veridex_credential');\n if (legacy) {\n try {\n const data = JSON.parse(legacy);\n // Migrate to new format\n const cred = this.parseStoredCredential(data);\n if (cred) {\n this.saveCredentials([cred], key);\n localStorage.removeItem('veridex_credential');\n return [cred];\n }\n } catch (e) { /* ignore */ }\n }\n return [];\n }\n\n try {\n const data = JSON.parse(stored);\n if (Array.isArray(data)) {\n return data.map(item => this.parseStoredCredential(item)).filter((c): c is PasskeyCredential => c !== null);\n }\n return [];\n } catch (error) {\n console.error('Failed to load credentials:', error);\n return [];\n }\n }\n\n private parseStoredCredential(data: any): PasskeyCredential | null {\n try {\n return {\n credentialId: data.credentialId,\n publicKeyX: BigInt(data.publicKeyX),\n publicKeyY: BigInt(data.publicKeyY),\n keyHash: data.keyHash,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Save a list of credentials to localStorage\n */\n saveCredentials(credentials: PasskeyCredential[], key = 'veridex_credentials'): void {\n if (typeof window === 'undefined') return;\n\n const data = credentials.map(c => ({\n credentialId: c.credentialId,\n publicKeyX: c.publicKeyX.toString(),\n publicKeyY: c.publicKeyY.toString(),\n keyHash: c.keyHash,\n }));\n\n localStorage.setItem(key, JSON.stringify(data));\n }\n\n /**\n * Add a single credential to storage (append or update)\n */\n addCredentialToStorage(credential: PasskeyCredential, key = 'veridex_credentials'): void {\n const stored = this.getAllStoredCredentials(key);\n const existingIndex = stored.findIndex(c => c.credentialId === credential.credentialId);\n\n if (existingIndex >= 0) {\n stored[existingIndex] = credential;\n } else {\n stored.push(credential);\n }\n\n this.saveCredentials(stored, key);\n }\n\n /**\n * Check if there's ANY stored credential for this RP\n */\n hasStoredCredential(): boolean {\n return this.getAllStoredCredentials().length > 0;\n }\n\n getCredential(): PasskeyCredential | null {\n return this.credential;\n }\n\n setCredential(credential: PasskeyCredential): void {\n this.credential = credential;\n }\n\n createCredentialFromPublicKey(\n credentialId: string,\n publicKeyX: bigint,\n publicKeyY: bigint\n ): PasskeyCredential {\n const keyHash = computeKeyHash(publicKeyX, publicKeyY);\n this.credential = {\n credentialId,\n publicKeyX,\n publicKeyY,\n keyHash,\n };\n return this.credential;\n }\n\n clearCredential(): void {\n this.credential = null;\n }\n\n /**\n * Save the current credential to localStorage (appends to list)\n */\n saveToLocalStorage(key = 'veridex_credentials'): void {\n if (!this.credential) {\n throw new Error('No credential to save');\n }\n this.addCredentialToStorage(this.credential, key);\n }\n\n loadFromLocalStorage(key = 'veridex_credentials'): PasskeyCredential | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n // Return the most recently used credential, or the last one added\n const stored = this.getAllStoredCredentials(key);\n if (stored.length > 0) {\n // Use the last one as default\n this.credential = stored[stored.length - 1];\n return this.credential;\n }\n\n return null;\n }\n\n removeFromLocalStorage(key = 'veridex_credentials'): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(key);\n // Also remove legacy key\n localStorage.removeItem('veridex_credential');\n }\n }\n\n // =========================================================================\n // Relayer-based Credential Storage (Cross-Device Recovery)\n // =========================================================================\n\n /**\n * Save the current credential to the relayer for cross-device recovery.\n * This should be called after registration.\n */\n async saveCredentialToRelayer(): Promise<boolean> {\n if (!this.credential) {\n throw new Error('No credential to save');\n }\n if (!this.config.relayerUrl) {\n console.warn('Relayer URL not configured; skipping remote credential storage');\n return false;\n }\n\n try {\n const response = await fetch(`${this.config.relayerUrl}/api/v1/credential`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n keyHash: this.credential.keyHash,\n credentialId: this.credential.credentialId,\n publicKeyX: this.credential.publicKeyX.toString(),\n publicKeyY: this.credential.publicKeyY.toString(),\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n console.error('Failed to save credential to relayer:', errorData);\n return false;\n }\n\n console.log('Credential saved to relayer for cross-device recovery');\n return true;\n } catch (error) {\n console.error('Failed to save credential to relayer:', error);\n return false;\n }\n }\n\n /**\n * Load a credential from the relayer by credential ID.\n * Used during discoverable credential authentication when localStorage is empty.\n */\n async loadCredentialFromRelayer(credentialId: string): Promise<PasskeyCredential | null> {\n if (!this.config.relayerUrl) {\n return null;\n }\n\n try {\n const response = await fetch(\n `${this.config.relayerUrl}/api/v1/credential/by-id/${encodeURIComponent(credentialId)}`\n );\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n if (!data.exists) {\n return null;\n }\n\n // Validate required fields before attempting BigInt conversion\n if (!data.credentialId || !data.publicKeyX || !data.publicKeyY || !data.keyHash) {\n console.warn('Relayer returned incomplete credential data:', {\n hasCredentialId: !!data.credentialId,\n hasPublicKeyX: !!data.publicKeyX,\n hasPublicKeyY: !!data.publicKeyY,\n hasKeyHash: !!data.keyHash,\n });\n return null;\n }\n\n return {\n credentialId: data.credentialId,\n publicKeyX: BigInt(data.publicKeyX),\n publicKeyY: BigInt(data.publicKeyY),\n keyHash: data.keyHash,\n };\n } catch (error) {\n console.error('Failed to load credential from relayer:', error);\n return null;\n }\n }\n\n /**\n * Load a credential from the relayer by keyHash.\n * Useful when you know the user's keyHash but not their credential ID.\n */\n async loadCredentialFromRelayerByKeyHash(keyHash: string): Promise<PasskeyCredential | null> {\n if (!this.config.relayerUrl) {\n return null;\n }\n\n try {\n const response = await fetch(\n `${this.config.relayerUrl}/api/v1/credential/${encodeURIComponent(keyHash)}`\n );\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n if (!data.exists) {\n return null;\n }\n\n // Validate required fields before attempting BigInt conversion\n if (!data.credentialId || !data.publicKeyX || !data.publicKeyY || !data.keyHash) {\n console.warn('Relayer returned incomplete credential data for keyHash:', {\n hasCredentialId: !!data.credentialId,\n hasPublicKeyX: !!data.publicKeyX,\n hasPublicKeyY: !!data.publicKeyY,\n hasKeyHash: !!data.keyHash,\n });\n return null;\n }\n\n return {\n credentialId: data.credentialId,\n publicKeyX: BigInt(data.publicKeyX),\n publicKeyY: BigInt(data.publicKeyY),\n keyHash: data.keyHash,\n };\n } catch (error) {\n console.error('Failed to load credential from relayer:', error);\n return null;\n }\n }\n\n // =========================================================================\n // Backup Passkey & Device Migration (Phase 3)\n // =========================================================================\n\n /**\n * Register a backup passkey for the current identity.\n *\n * This creates a new WebAuthn credential on this device/platform that becomes\n * an additional authorized key for the same Veridex identity. The caller\n * must submit the returned credential to VeridexHub.addKey() for on-chain registration.\n *\n * Use cases:\n * - \"Add this device\" flow when signing in on a new machine\n * - Proactive backup creation on a separate authenticator\n * - Cross-ecosystem redundancy (iCloud + Google Password Manager)\n *\n * @param username - Username for the new credential (typically same as primary)\n * @param displayName - Display name for the backup (e.g., \"MacBook Pro Backup\")\n * @param excludeCredentialIds - Credential IDs to exclude (prevents re-registering same authenticator)\n * @returns The newly registered backup credential\n */\n async registerBackupPasskey(\n username: string,\n displayName: string,\n excludeCredentialIds?: string[]\n ): Promise<PasskeyCredential> {\n if (!PasskeyManager.isSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const challenge = ethers.randomBytes(32);\n const challengeBase64 = base64URLEncode(challenge);\n\n // Build exclude list: prevent re-registering on the same authenticator\n const excludeList = excludeCredentialIds ?? this.getAllStoredCredentials().map(c => c.credentialId);\n\n const options: PublicKeyCredentialCreationOptionsJSON = {\n challenge: challengeBase64,\n rp: {\n name: this.config.rpName,\n id: this.config.rpId,\n },\n user: {\n id: base64URLEncode(ethers.toUtf8Bytes(username)),\n name: username,\n displayName: displayName,\n },\n pubKeyCredParams: [\n { alg: -7, type: 'public-key' }, // ES256 (P-256)\n { alg: -257, type: 'public-key' }, // RS256\n { alg: -8, type: 'public-key' }, // EdDSA\n ],\n excludeCredentials: excludeList.map(id => ({\n id,\n type: 'public-key' as const,\n transports: ['internal' as const, 'hybrid' as const],\n })),\n authenticatorSelection: {\n // Allow cross-platform for backup on security keys\n userVerification: this.config.userVerification,\n residentKey: 'required',\n requireResidentKey: true,\n },\n timeout: this.config.timeout,\n attestation: 'none',\n };\n\n const response = await startRegistration(options);\n const publicKey = this.extractPublicKeyFromAttestation(response);\n const keyHash = computeKeyHash(publicKey.x, publicKey.y);\n\n const backupCredential: PasskeyCredential = {\n credentialId: response.id,\n publicKeyX: publicKey.x,\n publicKeyY: publicKey.y,\n keyHash,\n };\n\n // Store locally alongside existing credentials\n this.addCredentialToStorage(backupCredential);\n\n return backupCredential;\n }\n\n /**\n * Get registration info for backup state from a registration response.\n *\n * This extracts the backup eligibility (BE) and backup state (BS) flags\n * from the authenticator data, which indicate whether the credential\n * is eligible for cloud sync and whether it is currently synced.\n *\n * @param authenticatorData - Hex-encoded authenticator data from registration\n * @returns Backup flags, or null if not determinable\n */\n static parseBackupFlags(authenticatorData: string): {\n backupEligible: boolean;\n backupState: boolean;\n } | null {\n try {\n const data = ethers.getBytes(authenticatorData);\n if (data.length < 37) return null;\n\n // Flags byte is at offset 32 (after the 32-byte rpIdHash)\n const flags = data[32];\n\n // Bit 3 (0x08) = Backup Eligible (BE)\n // Bit 4 (0x10) = Backup State (BS)\n return {\n backupEligible: (flags & 0x08) !== 0,\n backupState: (flags & 0x10) !== 0,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get the number of credentials stored locally.\n */\n getStoredCredentialCount(): number {\n return this.getAllStoredCredentials().length;\n }\n\n /**\n * Get all credential IDs stored locally (for exclude lists).\n */\n getStoredCredentialIds(): string[] {\n return this.getAllStoredCredentials().map(c => c.credentialId);\n }\n\n private extractPublicKeyFromAttestation(\n response: RegistrationResponseJSON\n ): { x: bigint; y: bigint } {\n const attestationObject = base64URLDecode(response.response.attestationObject);\n\n // Parse CBOR attestation object\n // The attestation object is a CBOR map with keys: fmt, authData, attStmt\n // We need to extract the authData which contains the credential public key\n\n let offset = 0;\n\n // Skip the CBOR map header (usually 0xa3 for 3-item map or 0xa2 for 2-item map)\n if (attestationObject[offset] >= 0xa0 && attestationObject[offset] <= 0xbf) {\n offset++;\n }\n\n // Find the authData field in the CBOR map\n // Look for the text string \"authData\" (0x68 followed by \"authData\")\n while (offset < attestationObject.length - 37) {\n if (attestationObject[offset] === 0x68 && // text string, 8 bytes\n attestationObject[offset + 1] === 0x61 && // 'a'\n attestationObject[offset + 2] === 0x75 && // 'u'\n attestationObject[offset + 3] === 0x74 && // 't'\n attestationObject[offset + 4] === 0x68 && // 'h'\n attestationObject[offset + 5] === 0x44 && // 'D'\n attestationObject[offset + 6] === 0x61 && // 'a'\n attestationObject[offset + 7] === 0x74 && // 't'\n attestationObject[offset + 8] === 0x61) { // 'a'\n offset += 9;\n break;\n }\n offset++;\n }\n\n // Skip the byte string header for authData\n if (attestationObject[offset] === 0x58 || attestationObject[offset] === 0x59) {\n // 0x58 = 1-byte length, 0x59 = 2-byte length\n const lengthBytes = attestationObject[offset] === 0x58 ? 1 : 2;\n offset += 1 + lengthBytes;\n }\n\n // Now we're at the start of authData\n // authData structure:\n // - rpIdHash: 32 bytes\n // - flags: 1 byte\n // - signCount: 4 bytes\n // - attestedCredentialData (if AT flag is set):\n // - aaguid: 16 bytes\n // - credentialIdLength: 2 bytes\n // - credentialId: credentialIdLength bytes\n // - credentialPublicKey: CBOR-encoded COSE_Key\n\n offset += 32; // Skip rpIdHash\n offset += 1; // Skip flags\n offset += 4; // Skip signCount\n offset += 16; // Skip aaguid\n\n // Read credential ID length\n const credIdLen = (attestationObject[offset] << 8) | attestationObject[offset + 1];\n offset += 2;\n offset += credIdLen; // Skip credential ID\n\n // Now we're at the COSE public key\n const coseKey = attestationObject.slice(offset);\n\n console.log('COSE key length:', coseKey.length);\n console.log('COSE key hex:', this.bytesToHex(coseKey.slice(0, Math.min(100, coseKey.length))));\n\n const { x, y } = this.parseCOSEKey(coseKey);\n return { x, y };\n }\n\n private parseCOSEKey(coseKey: Uint8Array): { x: bigint; y: bigint } {\n console.log('COSE key length:', coseKey.length);\n console.log('COSE key hex:', this.bytesToHex(coseKey));\n\n // Try multiple parsing strategies\n const parsed = this.tryParseCOSEKeyStrategies(coseKey);\n if (parsed) {\n return parsed;\n }\n\n // If all strategies fail, try using a CBOR parser approach\n return this.parseCOSEKeyWithCBORStructure(coseKey);\n }\n\n private tryParseCOSEKeyStrategies(coseKey: Uint8Array): { x: bigint; y: bigint } | null {\n // Strategy 1: Look for the specific pattern of EC2 keys\n const keyBytes = new Uint8Array(coseKey);\n\n // Common pattern for EC2 keys with P-256 curve\n for (let i = 0; i < keyBytes.length - 40; i++) {\n // Check for potential x coordinate (32 bytes preceded by key marker)\n if (keyBytes[i] === 0x58 && keyBytes[i + 1] === 0x20) {\n const potentialX = keyBytes.slice(i + 2, i + 34);\n\n // Look for y coordinate after x\n for (let j = i + 34; j < keyBytes.length - 34; j++) {\n if (keyBytes[j] === 0x58 && keyBytes[j + 1] === 0x20) {\n const potentialY = keyBytes.slice(j + 2, j + 34);\n\n // Verify these look like valid coordinates\n if (this.isValidCoordinate(potentialX) && this.isValidCoordinate(potentialY)) {\n console.log('Found coordinates via pattern matching');\n return {\n x: this.bytesToBigInt(potentialX),\n y: this.bytesToBigInt(potentialY)\n };\n }\n }\n }\n }\n }\n\n // Strategy 2: Look for ASN.1 structure\n return this.tryParseASN1Structure(keyBytes);\n }\n\n private parseCOSEKeyWithCBORStructure(coseKey: Uint8Array): { x: bigint; y: bigint } {\n // More flexible parsing that handles different CBOR structures\n const bytes = new Uint8Array(coseKey);\n let xBytes: Uint8Array | null = null;\n let yBytes: Uint8Array | null = null;\n\n // Look for x and y coordinates by scanning for byte strings\n let i = 0;\n while (i < bytes.length) {\n // Check for byte string markers\n if (bytes[i] === 0x58) { // Byte string with length byte\n const length = bytes[i + 1];\n if (length === 0x20) { // 32 bytes - likely a coordinate\n const start = i + 2;\n const end = start + 32;\n\n if (end <= bytes.length) {\n const coordinate = bytes.slice(start, end);\n\n // Assign to x or y based on position or previous assignments\n if (!xBytes) {\n xBytes = coordinate;\n console.log('Found x at offset', i);\n } else if (!yBytes) {\n yBytes = coordinate;\n console.log('Found y at offset', i);\n break; // Found both, exit loop\n }\n }\n i = end;\n } else {\n i += length + 2;\n }\n } else if (bytes[i] === 0x42) { // Byte string with 2-byte length\n if (i + 3 < bytes.length) {\n const length = (bytes[i + 1] << 8) | bytes[i + 2];\n if (length === 32) {\n const start = i + 3;\n const end = start + 32;\n\n if (end <= bytes.length) {\n const coordinate = bytes.slice(start, end);\n\n if (!xBytes) {\n xBytes = coordinate;\n console.log('Found x at offset', i);\n } else if (!yBytes) {\n yBytes = coordinate;\n console.log('Found y at offset', i);\n break;\n }\n }\n i = end;\n } else {\n i += length + 3;\n }\n } else {\n i++;\n }\n } else if (bytes[i] === 0x40) { // Byte string with indefinite length\n // Skip indefinite length marker\n i++;\n // Look for 0x04 marker (uncompressed point) or direct coordinates\n while (i < bytes.length && bytes[i] !== 0xFF) { // 0xFF is break marker\n if (bytes[i] === 0x04 && i + 65 <= bytes.length) {\n // Uncompressed EC point format\n const x = bytes.slice(i + 1, i + 33);\n const y = bytes.slice(i + 33, i + 65);\n\n if (this.isValidCoordinate(x) && this.isValidCoordinate(y)) {\n xBytes = x;\n yBytes = y;\n console.log('Found coordinates in uncompressed point format');\n break;\n }\n }\n i++;\n }\n if (xBytes && yBytes) break;\n } else {\n i++;\n }\n }\n\n if (!xBytes || !yBytes) {\n // Fallback: Try to find any 32-byte sequences\n const potentialCoords = this.find32ByteSequences(bytes);\n if (potentialCoords.length >= 2) {\n xBytes = potentialCoords[0];\n yBytes = potentialCoords[1];\n console.log('Fallback: Using first two 32-byte sequences as coordinates');\n }\n }\n\n if (!xBytes || !yBytes) {\n console.error('Failed to find coordinates in COSE key. Full dump:');\n console.error('Hex:', this.bytesToHex(bytes));\n console.error('Structure analysis:');\n this.analyzeCOSEStructure(bytes);\n throw new Error('Failed to extract public key coordinates from COSE key. Check console for details.');\n }\n\n return {\n x: this.bytesToBigInt(xBytes),\n y: this.bytesToBigInt(yBytes)\n };\n }\n\n private tryParseASN1Structure(bytes: Uint8Array): { x: bigint; y: bigint } | null {\n // ASN.1 SEQUENCE for EC public key\n if (bytes[0] === 0x30) { // SEQUENCE tag\n let offset = 2; // Skip tag and length\n\n // Look for BIT STRING (0x03)\n if (bytes[offset] === 0x03) {\n offset += 2; // Skip BIT STRING tag and unused bits\n\n // Look for another SEQUENCE\n if (bytes[offset] === 0x30) {\n offset += 2;\n\n // Should now have OID for P-256: 1.2.840.10045.3.1.7\n // Skip OID (usually 10 bytes: 06 08 2A 86 48 CE 3D 03 01 07)\n offset += 12;\n\n // BIT STRING containing the raw public key\n if (bytes[offset] === 0x03 && bytes[offset + 2] === 0x04) {\n offset += 3; // Skip to uncompressed point (0x04)\n\n const x = bytes.slice(offset, offset + 32);\n const y = bytes.slice(offset + 32, offset + 64);\n\n if (x.length === 32 && y.length === 32) {\n console.log('Found coordinates via ASN.1 parsing');\n return {\n x: this.bytesToBigInt(x),\n y: this.bytesToBigInt(y)\n };\n }\n }\n }\n }\n }\n return null;\n }\n\n private find32ByteSequences(bytes: Uint8Array): Uint8Array[] {\n const sequences: Uint8Array[] = [];\n\n for (let i = 0; i <= bytes.length - 32; i++) {\n // Check if this 32-byte sequence looks like a valid coordinate\n const sequence = bytes.slice(i, i + 32);\n if (this.isValidCoordinate(sequence)) {\n sequences.push(sequence);\n }\n }\n\n return sequences;\n }\n\n private isValidCoordinate(bytes: Uint8Array): boolean {\n if (bytes.length !== 32) return false;\n\n // Basic validation: not all zeros, not all FF\n let allZeros = true;\n let allOnes = true;\n\n for (const byte of bytes) {\n if (byte !== 0) allZeros = false;\n if (byte !== 0xFF) allOnes = false;\n }\n\n return !allZeros && !allOnes;\n }\n\n private bytesToBigInt(bytes: Uint8Array): bigint {\n return BigInt('0x' + this.bytesToHex(bytes));\n }\n\n private bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n private analyzeCOSEStructure(bytes: Uint8Array): void {\n console.log('COSE Structure Analysis:');\n console.log('First 20 bytes:', this.bytesToHex(bytes.slice(0, 20)));\n\n // Check for known COSE key structure markers\n const firstByte = bytes[0];\n console.log('First byte (0x' + firstByte.toString(16) + '):');\n\n if (firstByte >= 0xa0 && firstByte <= 0xbf) {\n console.log('- Definite length map with', (firstByte & 0x1f), 'pairs');\n } else if (firstByte === 0xbf) {\n console.log('- Indefinite length map');\n } else if (firstByte === 0x04) {\n console.log('- Byte string');\n } else if (firstByte === 0x02) {\n console.log('- Negative integer');\n }\n\n // Count occurrences of 32-byte sequences\n let count32 = 0;\n for (let i = 0; i <= bytes.length - 32; i++) {\n const chunk = bytes.slice(i, i + 32);\n if (this.isValidCoordinate(chunk)) {\n console.log(`Found valid 32-byte sequence at offset ${i}:`,\n this.bytesToHex(chunk.slice(0, 8)) + '...');\n count32++;\n }\n }\n console.log(`Total valid 32-byte sequences: ${count32}`);\n\n // Look for specific markers\n console.log('Looking for known markers:');\n const markers = [\n { byte: 0x04, name: 'Uncompressed point marker' },\n { byte: 0x03, name: 'BIT STRING' },\n { byte: 0x30, name: 'SEQUENCE' },\n { byte: 0x02, name: 'INTEGER' },\n { byte: 0x06, name: 'OBJECT IDENTIFIER' },\n { byte: 0x58, name: 'Byte string with length byte' },\n { byte: 0x42, name: 'Byte string with 2-byte length' },\n { byte: 0x40, name: 'Byte string indefinite length' },\n { byte: 0xA0, name: 'Map start' },\n { byte: 0xBF, name: 'Indefinite map start' },\n ];\n\n for (const marker of markers) {\n const indices = [];\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i] === marker.byte) {\n indices.push(i);\n }\n }\n if (indices.length > 0) {\n console.log(` ${marker.name} (0x${marker.byte.toString(16)}) at positions:`, indices.slice(0, 5).join(', '));\n }\n }\n }\n\n private parseAuthenticationResponse(response: AuthenticationResponseJSON): WebAuthnSignature {\n const authenticatorData = base64URLDecode(response.response.authenticatorData);\n const clientDataJSON = response.response.clientDataJSON;\n const signature = base64URLDecode(response.response.signature);\n\n const { r, s } = parseDERSignature(signature);\n\n // Normalize signature to low-S form.\n // The on-chain WebAuthn verifier rejects signatures with s > n/2.\n // WebAuthn authenticators are not guaranteed to produce low-S signatures,\n // so without this normalization, valid signatures can intermittently fail.\n const P256_N = BigInt('0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551');\n const P256_N_DIV_2 = BigInt(\n '0x7FFFFFFF800000007FFFFFFFFFFFFFFFDE737D56D38BCF4279DCE5617E3192A8'\n );\n\n const clientDataStr = new TextDecoder().decode(base64URLDecode(clientDataJSON));\n const challengeIndex = clientDataStr.indexOf('\"challenge\"');\n const typeIndex = clientDataStr.indexOf('\"type\"');\n\n if (challengeIndex === -1 || typeIndex === -1) {\n throw new Error('Invalid clientDataJSON format');\n }\n\n return {\n authenticatorData: ethers.hexlify(authenticatorData),\n clientDataJSON: clientDataStr,\n challengeIndex,\n typeIndex,\n r: this.bytesToBigInt(r),\n s: (() => {\n const sBig = this.bytesToBigInt(s);\n return sBig > P256_N_DIV_2 ? P256_N - sBig : sBig;\n })(),\n };\n }\n}"],"mappings":"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","names":[]}
@@ -1,13 +0,0 @@
1
- import {
2
- QueryPortfolioError,
3
- queryPortfolio
4
- } from "./chunk-GWJRKDSA.mjs";
5
- import "./chunk-72ZA3OYQ.mjs";
6
- import "./chunk-PDHZ5X5O.mjs";
7
- import "./chunk-NUWSMJFJ.mjs";
8
- import "./chunk-X7BZMSPQ.mjs";
9
- export {
10
- QueryPortfolioError,
11
- queryPortfolio
12
- };
13
- //# sourceMappingURL=portfolio-V347KZOL.mjs.map