@textrp/briij-js-sdk 42.0.0 → 43.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +7 -4
  2. package/README.md +71 -0
  3. package/lib/@types/auth.d.ts +57 -2
  4. package/lib/@types/auth.d.ts.map +1 -1
  5. package/lib/@types/auth.js +2 -0
  6. package/lib/@types/auth.js.map +1 -1
  7. package/lib/@types/event.d.ts +3 -0
  8. package/lib/@types/event.d.ts.map +1 -1
  9. package/lib/@types/event.js.map +1 -1
  10. package/lib/@types/synapse.d.ts +64 -0
  11. package/lib/@types/synapse.d.ts.map +1 -1
  12. package/lib/@types/synapse.js.map +1 -1
  13. package/lib/briij.d.ts +2 -0
  14. package/lib/briij.d.ts.map +1 -1
  15. package/lib/briij.js +2 -0
  16. package/lib/briij.js.map +1 -1
  17. package/lib/client.d.ts +100 -7
  18. package/lib/client.d.ts.map +1 -1
  19. package/lib/client.js +469 -213
  20. package/lib/client.js.map +1 -1
  21. package/lib/wallet-recovery.d.ts +24 -0
  22. package/lib/wallet-recovery.d.ts.map +1 -0
  23. package/lib/wallet-recovery.js +256 -0
  24. package/lib/wallet-recovery.js.map +1 -0
  25. package/lib/xrpl/identity.d.ts +2 -1
  26. package/lib/xrpl/identity.d.ts.map +1 -1
  27. package/lib/xrpl/identity.js +70 -47
  28. package/lib/xrpl/identity.js.map +1 -1
  29. package/lib/xrpl/trust.d.ts +4 -2
  30. package/lib/xrpl/trust.d.ts.map +1 -1
  31. package/lib/xrpl/trust.js +31 -19
  32. package/lib/xrpl/trust.js.map +1 -1
  33. package/lib/xrpl/verification.js +17 -6
  34. package/lib/xrpl/verification.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/@types/auth.ts +61 -2
  37. package/src/@types/event.ts +3 -0
  38. package/src/@types/synapse.ts +77 -0
  39. package/src/briij.ts +2 -0
  40. package/src/client.ts +344 -46
  41. package/src/wallet-recovery.ts +327 -0
  42. package/src/xrpl/identity.ts +66 -39
  43. package/src/xrpl/trust.ts +35 -18
  44. package/src/xrpl/verification.ts +19 -6
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","names":["Client","XrplClient","NFTokenMintFlags","sha256","logger","XRPL_IDENTITY_ACCOUNT_DATA_TYPE","DEFAULT_XRPL_NETWORK","DEFAULT_XRPL_TESTNET_WS","DEFAULT_XRPL_MAINNET_WS","mintingConfig","configureXrplIdentityMinting","config","_objectSpread","setXamanWalletForXrplIdentity","xamanWallet","mintSoulboundIdentityNFT","_x","_mintSoulboundIdentityNFT","apply","arguments","_asyncToGenerator","matrixUserId","homeserverBaseUrl","accessToken","warn","existing","getIdentityAccountData","nftTokenId","xrplAddress","minted","getAddress","ipfsUri","buildIpfsUri","encodedUri","toHex","xrplClient","resolveXrplWebSocketUrl","connect","_extractNftTokenId","_txResult$result","mintTransaction","TransactionType","Account","NFTokenTaxon","URI","Flags","tfMutable","tfBurnable","autofilled","autofill","hash","txHash","signAndSubmit","txResult","request","command","transaction","extractNftTokenId","result","meta","findAccountNftByUri","Error","concat","accountData","mintedAt","Date","toISOString","setIdentityAccountData","disconnect","catch","undefined","_x2","_x3","_buildIpfsUri","ipfsUriFactory","payload","JSON","stringify","digest","slice","_mintingConfig$networ","websocketUrl","network","accountDataUrl","baseUrl","trimmedBaseUrl","replace","encodeURIComponent","_x4","_x5","_x6","_getIdentityAccountData","response","fetch","method","headers","Authorization","status","ok","json","_x7","_x8","_x9","_x0","_setIdentityAccountData","body","_x1","_x10","_x11","_findAccountNftByUri","_response$result","_nft$NFTokenID","account","targetUri","toUpperCase","nft","account_nfts","find","candidate","_candidate$URI","NFTokenID","_AffectedNodes","affectedNodes","AffectedNodes","nodeWrapper","_tokensContainer$NFTo","nodeValue","Object","values","newFields","NewFields","finalFields","FinalFields","tokensContainer","container","Array","isArray","NFTokens","nftokens","tokenEntry","token","NFToken","input","bytes","TextEncoder","encode","from","map","value","toString","padStart","join"],"sources":["../../src/xrpl/identity.ts"],"sourcesContent":["/*\nCopyright 2026 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { Client as XrplClient, NFTokenMintFlags, type NFTokenMint } from \"xrpl\";\n\nimport { sha256 } from \"../digest.ts\";\nimport { logger } from \"../logger.ts\";\n\nconst XRPL_IDENTITY_ACCOUNT_DATA_TYPE = \"io.textrp.xrpl.identity_nft\";\nconst DEFAULT_XRPL_NETWORK = \"testnet\";\nconst DEFAULT_XRPL_TESTNET_WS = \"wss://s.altnet.rippletest.net:51233\";\nconst DEFAULT_XRPL_MAINNET_WS = \"wss://s1.ripple.com\";\n\nexport interface XrplIdentityAccountData {\n nftTokenId: string;\n xrplAddress: string;\n ipfsUri: string;\n txHash: string;\n mintedAt: string;\n}\n\nexport interface XamanWalletAdapter {\n getAddress(): Promise<string>;\n signAndSubmit(tx: Record<string, unknown>): Promise<{ hash: string }>;\n}\n\nexport interface XrplIdentityMintingConfig {\n homeserverBaseUrl: string;\n accessToken: string;\n websocketUrl?: string;\n network?: \"mainnet\" | \"testnet\";\n xamanWallet: XamanWalletAdapter;\n ipfsUriFactory?: (matrixUserId: string, xrplAddress: string) => Promise<string> | string;\n}\n\nexport interface XrplIdentityMintResult extends XrplIdentityAccountData {\n minted: boolean;\n}\n\nlet mintingConfig: Partial<XrplIdentityMintingConfig> = {};\n\nexport function configureXrplIdentityMinting(config: Partial<XrplIdentityMintingConfig>): void {\n mintingConfig = {\n ...mintingConfig,\n ...config,\n };\n}\n\nexport function setXamanWalletForXrplIdentity(xamanWallet: XamanWalletAdapter): void {\n mintingConfig = {\n ...mintingConfig,\n xamanWallet,\n };\n}\n\nexport async function mintSoulboundIdentityNFT(matrixUserId: string): Promise<XrplIdentityMintResult | null> {\n const { homeserverBaseUrl, accessToken, xamanWallet } = mintingConfig;\n if (!homeserverBaseUrl || !accessToken || !xamanWallet) {\n logger.warn(\n \"Skipping XRPL identity mint for %s: missing homeserver auth and/or Xaman wallet adapter\",\n matrixUserId,\n );\n return null;\n }\n\n const existing = await getIdentityAccountData(homeserverBaseUrl, accessToken, matrixUserId);\n if (existing?.nftTokenId && existing.xrplAddress) {\n return {\n ...existing,\n minted: false,\n };\n }\n\n const xrplAddress = await xamanWallet.getAddress();\n const ipfsUri = await buildIpfsUri(matrixUserId, xrplAddress);\n const encodedUri = toHex(ipfsUri);\n\n const xrplClient = new XrplClient(resolveXrplWebSocketUrl());\n await xrplClient.connect();\n\n try {\n const mintTransaction: NFTokenMint = {\n TransactionType: \"NFTokenMint\",\n Account: xrplAddress,\n NFTokenTaxon: 0,\n URI: encodedUri,\n Flags: NFTokenMintFlags.tfMutable | NFTokenMintFlags.tfBurnable,\n };\n\n const autofilled = await xrplClient.autofill(mintTransaction);\n const { hash: txHash } = await xamanWallet.signAndSubmit(autofilled as unknown as Record<string, unknown>);\n const txResult = await xrplClient.request({\n command: \"tx\",\n transaction: txHash,\n });\n\n const nftTokenId =\n extractNftTokenId(txResult.result?.meta) ??\n (await findAccountNftByUri(xrplClient, xrplAddress, encodedUri));\n if (!nftTokenId) {\n throw new Error(`Unable to resolve NFTokenID for transaction ${txHash}`);\n }\n\n const accountData: XrplIdentityAccountData = {\n nftTokenId,\n xrplAddress,\n ipfsUri,\n txHash,\n mintedAt: new Date().toISOString(),\n };\n\n await setIdentityAccountData(homeserverBaseUrl, accessToken, matrixUserId, accountData);\n\n return {\n ...accountData,\n minted: true,\n };\n } finally {\n await xrplClient.disconnect().catch(() => undefined);\n }\n}\n\nasync function buildIpfsUri(matrixUserId: string, xrplAddress: string): Promise<string> {\n if (mintingConfig.ipfsUriFactory) {\n return await mintingConfig.ipfsUriFactory(matrixUserId, xrplAddress);\n }\n\n const payload = JSON.stringify({ matrixUserId, xrplAddress });\n const digest = await sha256(payload);\n return `ipfs://textrp-briij/${toHex(digest).slice(0, 46)}`;\n}\n\nfunction resolveXrplWebSocketUrl(): string {\n if (mintingConfig.websocketUrl) return mintingConfig.websocketUrl;\n const network = mintingConfig.network ?? DEFAULT_XRPL_NETWORK;\n return network === \"mainnet\" ? DEFAULT_XRPL_MAINNET_WS : DEFAULT_XRPL_TESTNET_WS;\n}\n\nfunction accountDataUrl(baseUrl: string, matrixUserId: string): string {\n const trimmedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n return `${trimmedBaseUrl}/_matrix/client/v3/user/${encodeURIComponent(matrixUserId)}/account_data/${encodeURIComponent(XRPL_IDENTITY_ACCOUNT_DATA_TYPE)}`;\n}\n\nasync function getIdentityAccountData(\n homeserverBaseUrl: string,\n accessToken: string,\n matrixUserId: string,\n): Promise<XrplIdentityAccountData | null> {\n const response = await fetch(accountDataUrl(homeserverBaseUrl, matrixUserId), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (response.status === 404) return null;\n if (!response.ok) {\n throw new Error(`Failed to read XRPL identity account_data: HTTP ${response.status}`);\n }\n\n return (await response.json()) as XrplIdentityAccountData;\n}\n\nasync function setIdentityAccountData(\n homeserverBaseUrl: string,\n accessToken: string,\n matrixUserId: string,\n payload: XrplIdentityAccountData,\n): Promise<void> {\n const response = await fetch(accountDataUrl(homeserverBaseUrl, matrixUserId), {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to persist XRPL identity account_data: HTTP ${response.status}`);\n }\n}\n\nasync function findAccountNftByUri(xrplClient: XrplClient, xrplAddress: string, encodedUri: string): Promise<string | null> {\n const response = await xrplClient.request({\n command: \"account_nfts\",\n account: xrplAddress,\n });\n\n const targetUri = encodedUri.toUpperCase();\n const nft = response.result?.account_nfts?.find((candidate: { URI?: string }) => {\n return candidate.URI?.toUpperCase() === targetUri;\n }) as { NFTokenID?: string } | undefined;\n\n return nft?.NFTokenID ?? null;\n}\n\nfunction extractNftTokenId(meta: unknown): string | null {\n if (!meta || typeof meta !== \"object\") return null;\n const affectedNodes = (meta as { AffectedNodes?: unknown[] }).AffectedNodes ?? [];\n\n for (const nodeWrapper of affectedNodes) {\n if (!nodeWrapper || typeof nodeWrapper !== \"object\") continue;\n const [nodeValue] = Object.values(nodeWrapper as Record<string, unknown>);\n if (!nodeValue || typeof nodeValue !== \"object\") continue;\n\n const newFields = (nodeValue as { NewFields?: unknown }).NewFields;\n const finalFields = (nodeValue as { FinalFields?: unknown }).FinalFields;\n const tokensContainer = [newFields, finalFields].find((container) => {\n if (!container || typeof container !== \"object\") return false;\n return Array.isArray((container as { NFTokens?: unknown[] }).NFTokens);\n }) as { NFTokens?: unknown[] } | undefined;\n\n const nftokens = tokensContainer?.NFTokens ?? [];\n for (const tokenEntry of nftokens) {\n if (!tokenEntry || typeof tokenEntry !== \"object\") continue;\n const token = (tokenEntry as { NFToken?: { NFTokenID?: string } }).NFToken;\n if (token?.NFTokenID) return token.NFTokenID;\n }\n }\n\n return null;\n}\n\nfunction toHex(input: string | Uint8Array): string {\n const bytes = typeof input === \"string\" ? new TextEncoder().encode(input) : input;\n return Array.from(bytes)\n .map((value) => value.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"identity.js","names":["Client","XrplClient","NFTokenMintFlags","sha256","logger","XRPL_IDENTITY_ACCOUNT_DATA_TYPE","DEFAULT_XRPL_NETWORK","DEFAULT_XRPL_TESTNET_WS","DEFAULT_XRPL_MAINNET_WS","mintingConfig","configureXrplIdentityMinting","config","_objectSpread","setXamanWalletForXrplIdentity","xamanWallet","getConfiguredXrplIdentityMintingConfig","mintSoulboundIdentityNFT","_x","_x2","_mintSoulboundIdentityNFT","apply","arguments","_asyncToGenerator","matrixUserId","effectiveConfig","homeserverBaseUrl","accessToken","warn","existing","getIdentityAccountData","nftTokenId","xrplAddress","minted","getAddress","ipfsUri","buildIpfsUri","encodedUri","toHex","xrplClient","resolveXrplWebSocketUrl","connect","_extractTxScopedNftTo","mintTransaction","TransactionType","Account","NFTokenTaxon","URI","Flags","tfMutable","tfBurnable","autofilled","autofill","hash","txHash","signAndSubmit","txResult","waitForValidation","extractTxScopedNftTokenId","result","findAccountNftByUri","Error","concat","accountData","mintedAt","Date","toISOString","setIdentityAccountData","disconnect","catch","undefined","_x3","_x4","_x5","_buildIpfsUri","ipfsUriFactory","payload","JSON","stringify","digest","slice","_config$network","websocketUrl","network","_x6","_x7","_waitForValidation","attempt","_response$result","response","request","command","transaction","validated","sleep","accountDataUrl","baseUrl","trimmedBaseUrl","replace","encodeURIComponent","_x8","_x9","_x0","_getIdentityAccountData","fetch","method","headers","status","ok","json","_x1","_x10","_x11","_x12","_setIdentityAccountData","body","_x13","_x14","_x15","_findAccountNftByUri","_response$result2","_nft$NFTokenID","account","targetUri","toUpperCase","nft","account_nfts","find","candidate","_candidate$URI","NFTokenID","directTokenId","length","directAlternate","input","bytes","TextEncoder","encode","Array","from","map","value","toString","padStart","join","_x16","_sleep","ms","Promise","resolve","setTimeout"],"sources":["../../src/xrpl/identity.ts"],"sourcesContent":["/*\nCopyright 2026 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { Client as XrplClient, NFTokenMintFlags, type NFTokenMint } from \"xrpl\";\n\nimport { sha256 } from \"../digest.ts\";\nimport { logger } from \"../logger.ts\";\n\nconst XRPL_IDENTITY_ACCOUNT_DATA_TYPE = \"io.textrp.xrpl.identity_nft\";\nconst DEFAULT_XRPL_NETWORK = \"testnet\";\nconst DEFAULT_XRPL_TESTNET_WS = \"wss://s.altnet.rippletest.net:51233\";\nconst DEFAULT_XRPL_MAINNET_WS = \"wss://s1.ripple.com\";\n\nexport interface XrplIdentityAccountData {\n nftTokenId: string;\n xrplAddress: string;\n ipfsUri: string;\n txHash: string;\n mintedAt: string;\n}\n\nexport interface XamanWalletAdapter {\n getAddress(): Promise<string>;\n signAndSubmit(tx: Record<string, unknown>): Promise<{ hash: string }>;\n}\n\nexport interface XrplIdentityMintingConfig {\n homeserverBaseUrl: string;\n accessToken: string;\n websocketUrl?: string;\n network?: \"mainnet\" | \"testnet\";\n xamanWallet: XamanWalletAdapter;\n ipfsUriFactory?: (matrixUserId: string, xrplAddress: string) => Promise<string> | string;\n}\n\nexport interface XrplIdentityMintResult extends XrplIdentityAccountData {\n minted: boolean;\n}\n\nlet mintingConfig: Partial<XrplIdentityMintingConfig> = {};\n\nexport function configureXrplIdentityMinting(config: Partial<XrplIdentityMintingConfig>): void {\n mintingConfig = {\n ...mintingConfig,\n ...config,\n };\n}\n\nexport function setXamanWalletForXrplIdentity(xamanWallet: XamanWalletAdapter): void {\n mintingConfig = {\n ...mintingConfig,\n xamanWallet,\n };\n}\n\nexport function getConfiguredXrplIdentityMintingConfig(): Partial<XrplIdentityMintingConfig> {\n return { ...mintingConfig };\n}\n\nexport async function mintSoulboundIdentityNFT(\n matrixUserId: string,\n config?: Partial<XrplIdentityMintingConfig>,\n): Promise<XrplIdentityMintResult | null> {\n const effectiveConfig = {\n ...mintingConfig,\n ...config,\n };\n const { homeserverBaseUrl, accessToken, xamanWallet } = effectiveConfig;\n if (!homeserverBaseUrl || !accessToken || !xamanWallet) {\n logger.warn(\n \"Skipping XRPL identity mint for %s: missing homeserver auth and/or Xaman wallet adapter\",\n matrixUserId,\n );\n return null;\n }\n\n const existing = await getIdentityAccountData(homeserverBaseUrl, accessToken, matrixUserId);\n if (existing?.nftTokenId && existing.xrplAddress) {\n return {\n ...existing,\n minted: false,\n };\n }\n\n const xrplAddress = await xamanWallet.getAddress();\n const ipfsUri = await buildIpfsUri(matrixUserId, xrplAddress, effectiveConfig);\n const encodedUri = toHex(ipfsUri);\n\n const xrplClient = new XrplClient(resolveXrplWebSocketUrl(effectiveConfig));\n await xrplClient.connect();\n\n try {\n const mintTransaction: NFTokenMint = {\n TransactionType: \"NFTokenMint\",\n Account: xrplAddress,\n NFTokenTaxon: 0,\n URI: encodedUri,\n Flags: NFTokenMintFlags.tfMutable | NFTokenMintFlags.tfBurnable,\n };\n\n const autofilled = await xrplClient.autofill(mintTransaction);\n const { hash: txHash } = await xamanWallet.signAndSubmit(autofilled as unknown as Record<string, unknown>);\n const txResult = await waitForValidation(xrplClient, txHash);\n const nftTokenId =\n extractTxScopedNftTokenId(txResult.result) ??\n (await findAccountNftByUri(xrplClient, xrplAddress, encodedUri));\n if (!nftTokenId) {\n throw new Error(`Unable to resolve NFTokenID for transaction ${txHash}`);\n }\n\n const accountData: XrplIdentityAccountData = {\n nftTokenId,\n xrplAddress,\n ipfsUri,\n txHash,\n mintedAt: new Date().toISOString(),\n };\n\n await setIdentityAccountData(homeserverBaseUrl, accessToken, matrixUserId, accountData);\n\n return {\n ...accountData,\n minted: true,\n };\n } finally {\n await xrplClient.disconnect().catch(() => undefined);\n }\n}\n\nasync function buildIpfsUri(\n matrixUserId: string,\n xrplAddress: string,\n config: Partial<XrplIdentityMintingConfig>,\n): Promise<string> {\n if (config.ipfsUriFactory) {\n return await config.ipfsUriFactory(matrixUserId, xrplAddress);\n }\n\n const payload = JSON.stringify({ matrixUserId, xrplAddress });\n const digest = await sha256(payload);\n return `ipfs://textrp-briij/${toHex(digest).slice(0, 46)}`;\n}\n\nfunction resolveXrplWebSocketUrl(config: Partial<XrplIdentityMintingConfig>): string {\n if (config.websocketUrl) return config.websocketUrl;\n const network = config.network ?? DEFAULT_XRPL_NETWORK;\n return network === \"mainnet\" ? DEFAULT_XRPL_MAINNET_WS : DEFAULT_XRPL_TESTNET_WS;\n}\n\nasync function waitForValidation(xrplClient: XrplClient, txHash: string): Promise<{ result?: unknown }> {\n for (let attempt = 0; attempt < 15; attempt += 1) {\n const response = await xrplClient.request({\n command: \"tx\",\n transaction: txHash,\n });\n if (response.result?.validated === true) {\n return response as unknown as { result?: unknown };\n }\n await sleep(1000);\n }\n throw new Error(`Timed out waiting for XRPL tx validation: ${txHash}`);\n}\n\nfunction accountDataUrl(baseUrl: string, matrixUserId: string): string {\n const trimmedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n return `${trimmedBaseUrl}/_matrix/client/v3/user/${encodeURIComponent(matrixUserId)}/account_data/${encodeURIComponent(XRPL_IDENTITY_ACCOUNT_DATA_TYPE)}`;\n}\n\nasync function getIdentityAccountData(\n homeserverBaseUrl: string,\n accessToken: string,\n matrixUserId: string,\n): Promise<XrplIdentityAccountData | null> {\n const response = await fetch(accountDataUrl(homeserverBaseUrl, matrixUserId), {\n method: \"GET\",\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (response.status === 404) return null;\n if (!response.ok) {\n throw new Error(`Failed to read XRPL identity account_data: HTTP ${response.status}`);\n }\n\n return (await response.json()) as XrplIdentityAccountData;\n}\n\nasync function setIdentityAccountData(\n homeserverBaseUrl: string,\n accessToken: string,\n matrixUserId: string,\n payload: XrplIdentityAccountData,\n): Promise<void> {\n const response = await fetch(accountDataUrl(homeserverBaseUrl, matrixUserId), {\n method: \"PUT\",\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to persist XRPL identity account_data: HTTP ${response.status}`);\n }\n}\n\nasync function findAccountNftByUri(\n xrplClient: XrplClient,\n xrplAddress: string,\n encodedUri: string,\n): Promise<string | null> {\n const response = await xrplClient.request({\n command: \"account_nfts\",\n account: xrplAddress,\n });\n\n const targetUri = encodedUri.toUpperCase();\n const nft = response.result?.account_nfts?.find((candidate: { URI?: string }) => {\n return candidate.URI?.toUpperCase() === targetUri;\n }) as { NFTokenID?: string } | undefined;\n\n return nft?.NFTokenID ?? null;\n}\n\nfunction extractTxScopedNftTokenId(result: unknown): string | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n\n const payload = result as Record<string, unknown>;\n const directTokenId = payload[\"nftoken_id\"];\n if (typeof directTokenId === \"string\" && directTokenId.length > 0) {\n return directTokenId;\n }\n\n const directAlternate = payload[\"NFTokenID\"];\n if (typeof directAlternate === \"string\" && directAlternate.length > 0) {\n return directAlternate;\n }\n\n return null;\n}\n\nfunction toHex(input: string | Uint8Array): string {\n const bytes = typeof input === \"string\" ? new TextEncoder().encode(input) : input;\n return Array.from(bytes)\n .map((value) => value.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,6 +3,8 @@ export interface XrplTrustConfig {
3
3
  accessToken: string;
4
4
  trustPath?: string;
5
5
  }
6
- export declare function configureXrplTrust(config: Partial<XrplTrustConfig>): void;
7
- export declare function getTrustScore(payer: string, payee: string): Promise<number>;
6
+ export interface XrplTrustRequestOptions {
7
+ timeoutMs?: number;
8
+ }
9
+ export declare function getTrustScore(payer: string, payee: string, config: XrplTrustConfig, options?: XrplTrustRequestOptions): Promise<number>;
8
10
  //# sourceMappingURL=trust.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/xrpl/trust.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAKzE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BjF"}
1
+ {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/xrpl/trust.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAClC,OAAO,CAAC,MAAM,CAAC,CA8CjB"}
package/lib/xrpl/trust.js CHANGED
@@ -1,7 +1,4 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
2
  /*
6
3
  Copyright 2026 The Matrix.org Foundation C.I.C.
7
4
 
@@ -19,34 +16,49 @@ limitations under the License.
19
16
  */
20
17
 
21
18
  var DEFAULT_TRUST_PATH = "/_matrix/client/v3/org.textrp.xrpl/trust";
22
- var xrplTrustConfig = {};
23
- export function configureXrplTrust(config) {
24
- xrplTrustConfig = _objectSpread(_objectSpread({}, xrplTrustConfig), config);
25
- }
26
- export function getTrustScore(_x, _x2) {
19
+ var DEFAULT_TRUST_TIMEOUT_MS = 10000;
20
+ export function getTrustScore(_x, _x2, _x3, _x4) {
27
21
  return _getTrustScore.apply(this, arguments);
28
22
  }
29
23
  function _getTrustScore() {
30
- _getTrustScore = _asyncToGenerator(function* (payer, payee) {
31
- var _xrplTrustConfig$trus;
32
- var homeserverBaseUrl = xrplTrustConfig.homeserverBaseUrl;
33
- var accessToken = xrplTrustConfig.accessToken;
24
+ _getTrustScore = _asyncToGenerator(function* (payer, payee, config, options) {
25
+ var _config$trustPath, _options$timeoutMs;
26
+ var {
27
+ homeserverBaseUrl,
28
+ accessToken
29
+ } = config;
34
30
  if (!homeserverBaseUrl || !accessToken) {
35
31
  throw new Error("XRPL trust config is incomplete");
36
32
  }
37
33
  var trimmedBaseUrl = homeserverBaseUrl.replace(/\/+$/, "");
38
- var trustPath = (_xrplTrustConfig$trus = xrplTrustConfig.trustPath) !== null && _xrplTrustConfig$trus !== void 0 ? _xrplTrustConfig$trus : DEFAULT_TRUST_PATH;
34
+ var trustPath = (_config$trustPath = config.trustPath) !== null && _config$trustPath !== void 0 ? _config$trustPath : DEFAULT_TRUST_PATH;
39
35
  var query = new URLSearchParams({
40
36
  payer,
41
37
  payee
42
38
  });
43
- var response = yield fetch("".concat(trimmedBaseUrl).concat(trustPath, "?").concat(query.toString()), {
44
- method: "GET",
45
- headers: {
46
- Authorization: "Bearer ".concat(accessToken),
47
- "Content-Type": "application/json"
39
+ var timeoutMs = (_options$timeoutMs = options === null || options === void 0 ? void 0 : options.timeoutMs) !== null && _options$timeoutMs !== void 0 ? _options$timeoutMs : DEFAULT_TRUST_TIMEOUT_MS;
40
+ var controller = new AbortController();
41
+ var timeoutId = setTimeout(() => {
42
+ controller.abort();
43
+ }, timeoutMs);
44
+ var response;
45
+ try {
46
+ response = yield fetch("".concat(trimmedBaseUrl).concat(trustPath, "?").concat(query.toString()), {
47
+ method: "GET",
48
+ headers: {
49
+ "Authorization": "Bearer ".concat(accessToken),
50
+ "Content-Type": "application/json"
51
+ },
52
+ signal: controller.signal
53
+ });
54
+ } catch (error) {
55
+ if (error instanceof Error && error.name === "AbortError") {
56
+ throw new Error("Timed out fetching trust score after ".concat(timeoutMs, "ms"));
48
57
  }
49
- });
58
+ throw error;
59
+ } finally {
60
+ clearTimeout(timeoutId);
61
+ }
50
62
  if (!response.ok) {
51
63
  throw new Error("Failed to fetch trust score: HTTP ".concat(response.status));
52
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"trust.js","names":["DEFAULT_TRUST_PATH","xrplTrustConfig","configureXrplTrust","config","_objectSpread","getTrustScore","_x","_x2","_getTrustScore","apply","arguments","_asyncToGenerator","payer","payee","_xrplTrustConfig$trus","homeserverBaseUrl","accessToken","Error","trimmedBaseUrl","replace","trustPath","query","URLSearchParams","response","fetch","concat","toString","method","headers","Authorization","ok","status","payload","json","score","trusted"],"sources":["../../src/xrpl/trust.ts"],"sourcesContent":["/*\nCopyright 2026 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nconst DEFAULT_TRUST_PATH = \"/_matrix/client/v3/org.textrp.xrpl/trust\";\n\nexport interface XrplTrustConfig {\n homeserverBaseUrl: string;\n accessToken: string;\n trustPath?: string;\n}\n\nlet xrplTrustConfig: Partial<XrplTrustConfig> = {};\n\nexport function configureXrplTrust(config: Partial<XrplTrustConfig>): void {\n xrplTrustConfig = {\n ...xrplTrustConfig,\n ...config,\n };\n}\n\nexport async function getTrustScore(payer: string, payee: string): Promise<number> {\n const homeserverBaseUrl = xrplTrustConfig.homeserverBaseUrl;\n const accessToken = xrplTrustConfig.accessToken;\n if (!homeserverBaseUrl || !accessToken) {\n throw new Error(\"XRPL trust config is incomplete\");\n }\n\n const trimmedBaseUrl = homeserverBaseUrl.replace(/\\/+$/, \"\");\n const trustPath = xrplTrustConfig.trustPath ?? DEFAULT_TRUST_PATH;\n const query = new URLSearchParams({\n payer,\n payee,\n });\n const response = await fetch(`${trimmedBaseUrl}${trustPath}?${query.toString()}`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch trust score: HTTP ${response.status}`);\n }\n\n const payload = (await response.json()) as { score?: number; trusted?: boolean };\n if (typeof payload.score === \"number\") {\n return payload.score;\n }\n return payload.trusted ? 1 : 0;\n}\n"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAMA,kBAAkB,GAAG,0CAA0C;AAQrE,IAAIC,eAAyC,GAAG,CAAC,CAAC;AAElD,OAAO,SAASC,kBAAkBA,CAACC,MAAgC,EAAQ;EACvEF,eAAe,GAAAG,aAAA,CAAAA,aAAA,KACRH,eAAe,GACfE,MAAM,CACZ;AACL;AAEA,gBAAsBE,aAAaA,CAAAC,EAAA,EAAAC,GAAA;EAAA,OAAAC,cAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AA8BlC,SAAAF,eAAA;EAAAA,cAAA,GAAAG,iBAAA,CA9BM,WAA6BC,KAAa,EAAEC,KAAa,EAAmB;IAAA,IAAAC,qBAAA;IAC/E,IAAMC,iBAAiB,GAAGd,eAAe,CAACc,iBAAiB;IAC3D,IAAMC,WAAW,GAAGf,eAAe,CAACe,WAAW;IAC/C,IAAI,CAACD,iBAAiB,IAAI,CAACC,WAAW,EAAE;MACpC,MAAM,IAAIC,KAAK,CAAC,iCAAiC,CAAC;IACtD;IAEA,IAAMC,cAAc,GAAGH,iBAAiB,CAACI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAC5D,IAAMC,SAAS,IAAAN,qBAAA,GAAGb,eAAe,CAACmB,SAAS,cAAAN,qBAAA,cAAAA,qBAAA,GAAId,kBAAkB;IACjE,IAAMqB,KAAK,GAAG,IAAIC,eAAe,CAAC;MAC9BV,KAAK;MACLC;IACJ,CAAC,CAAC;IACF,IAAMU,QAAQ,SAASC,KAAK,IAAAC,MAAA,CAAIP,cAAc,EAAAO,MAAA,CAAGL,SAAS,OAAAK,MAAA,CAAIJ,KAAK,CAACK,QAAQ,CAAC,CAAC,GAAI;MAC9EC,MAAM,EAAE,KAAK;MACbC,OAAO,EAAE;QACLC,aAAa,YAAAJ,MAAA,CAAYT,WAAW,CAAE;QACtC,cAAc,EAAE;MACpB;IACJ,CAAC,CAAC;IAEF,IAAI,CAACO,QAAQ,CAACO,EAAE,EAAE;MACd,MAAM,IAAIb,KAAK,sCAAAQ,MAAA,CAAsCF,QAAQ,CAACQ,MAAM,CAAE,CAAC;IAC3E;IAEA,IAAMC,OAAO,SAAUT,QAAQ,CAACU,IAAI,CAAC,CAA2C;IAChF,IAAI,OAAOD,OAAO,CAACE,KAAK,KAAK,QAAQ,EAAE;MACnC,OAAOF,OAAO,CAACE,KAAK;IACxB;IACA,OAAOF,OAAO,CAACG,OAAO,GAAG,CAAC,GAAG,CAAC;EAClC,CAAC;EAAA,OAAA3B,cAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"trust.js","names":["DEFAULT_TRUST_PATH","DEFAULT_TRUST_TIMEOUT_MS","getTrustScore","_x","_x2","_x3","_x4","_getTrustScore","apply","arguments","_asyncToGenerator","payer","payee","config","options","_config$trustPath","_options$timeoutMs","homeserverBaseUrl","accessToken","Error","trimmedBaseUrl","replace","trustPath","query","URLSearchParams","timeoutMs","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","concat","toString","method","headers","signal","error","name","clearTimeout","ok","status","payload","json","score","trusted"],"sources":["../../src/xrpl/trust.ts"],"sourcesContent":["/*\nCopyright 2026 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nconst DEFAULT_TRUST_PATH = \"/_matrix/client/v3/org.textrp.xrpl/trust\";\nconst DEFAULT_TRUST_TIMEOUT_MS = 10_000;\n\nexport interface XrplTrustConfig {\n homeserverBaseUrl: string;\n accessToken: string;\n trustPath?: string;\n}\n\nexport interface XrplTrustRequestOptions {\n timeoutMs?: number;\n}\n\nexport async function getTrustScore(\n payer: string,\n payee: string,\n config: XrplTrustConfig,\n options?: XrplTrustRequestOptions,\n): Promise<number> {\n const { homeserverBaseUrl, accessToken } = config;\n if (!homeserverBaseUrl || !accessToken) {\n throw new Error(\"XRPL trust config is incomplete\");\n }\n\n const trimmedBaseUrl = homeserverBaseUrl.replace(/\\/+$/, \"\");\n const trustPath = config.trustPath ?? DEFAULT_TRUST_PATH;\n const query = new URLSearchParams({\n payer,\n payee,\n });\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TRUST_TIMEOUT_MS;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(`${trimmedBaseUrl}${trustPath}?${query.toString()}`, {\n method: \"GET\",\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Timed out fetching trust score after ${timeoutMs}ms`);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch trust score: HTTP ${response.status}`);\n }\n\n const payload = (await response.json()) as { score?: number; trusted?: boolean };\n if (typeof payload.score === \"number\") {\n return payload.score;\n }\n return payload.trusted ? 1 : 0;\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAMA,kBAAkB,GAAG,0CAA0C;AACrE,IAAMC,wBAAwB,GAAG,KAAM;AAYvC,gBAAsBC,aAAaA,CAAAC,EAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,cAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAmDlC,SAAAF,eAAA;EAAAA,cAAA,GAAAG,iBAAA,CAnDM,WACHC,KAAa,EACbC,KAAa,EACbC,MAAuB,EACvBC,OAAiC,EAClB;IAAA,IAAAC,iBAAA,EAAAC,kBAAA;IACf,IAAM;MAAEC,iBAAiB;MAAEC;IAAY,CAAC,GAAGL,MAAM;IACjD,IAAI,CAACI,iBAAiB,IAAI,CAACC,WAAW,EAAE;MACpC,MAAM,IAAIC,KAAK,CAAC,iCAAiC,CAAC;IACtD;IAEA,IAAMC,cAAc,GAAGH,iBAAiB,CAACI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAC5D,IAAMC,SAAS,IAAAP,iBAAA,GAAGF,MAAM,CAACS,SAAS,cAAAP,iBAAA,cAAAA,iBAAA,GAAIf,kBAAkB;IACxD,IAAMuB,KAAK,GAAG,IAAIC,eAAe,CAAC;MAC9Bb,KAAK;MACLC;IACJ,CAAC,CAAC;IACF,IAAMa,SAAS,IAAAT,kBAAA,GAAGF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEW,SAAS,cAAAT,kBAAA,cAAAA,kBAAA,GAAIf,wBAAwB;IAChE,IAAMyB,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;IACxC,IAAMC,SAAS,GAAGC,UAAU,CAAC,MAAM;MAC/BH,UAAU,CAACI,KAAK,CAAC,CAAC;IACtB,CAAC,EAAEL,SAAS,CAAC;IAEb,IAAIM,QAAkB;IACtB,IAAI;MACAA,QAAQ,SAASC,KAAK,IAAAC,MAAA,CAAIb,cAAc,EAAAa,MAAA,CAAGX,SAAS,OAAAW,MAAA,CAAIV,KAAK,CAACW,QAAQ,CAAC,CAAC,GAAI;QACxEC,MAAM,EAAE,KAAK;QACbC,OAAO,EAAE;UACL,eAAe,YAAAH,MAAA,CAAYf,WAAW,CAAE;UACxC,cAAc,EAAE;QACpB,CAAC;QACDmB,MAAM,EAAEX,UAAU,CAACW;MACvB,CAAC,CAAC;IACN,CAAC,CAAC,OAAOC,KAAK,EAAE;MACZ,IAAIA,KAAK,YAAYnB,KAAK,IAAImB,KAAK,CAACC,IAAI,KAAK,YAAY,EAAE;QACvD,MAAM,IAAIpB,KAAK,yCAAAc,MAAA,CAAyCR,SAAS,OAAI,CAAC;MAC1E;MACA,MAAMa,KAAK;IACf,CAAC,SAAS;MACNE,YAAY,CAACZ,SAAS,CAAC;IAC3B;IAEA,IAAI,CAACG,QAAQ,CAACU,EAAE,EAAE;MACd,MAAM,IAAItB,KAAK,sCAAAc,MAAA,CAAsCF,QAAQ,CAACW,MAAM,CAAE,CAAC;IAC3E;IAEA,IAAMC,OAAO,SAAUZ,QAAQ,CAACa,IAAI,CAAC,CAA2C;IAChF,IAAI,OAAOD,OAAO,CAACE,KAAK,KAAK,QAAQ,EAAE;MACnC,OAAOF,OAAO,CAACE,KAAK;IACxB;IACA,OAAOF,OAAO,CAACG,OAAO,GAAG,CAAC,GAAG,CAAC;EAClC,CAAC;EAAA,OAAAvC,cAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA","ignoreList":[]}
@@ -95,8 +95,8 @@ function _acceptVerification() {
95
95
  }());
96
96
  yield matrixClient.sendEvent(roomId, XRPL_VERIFY_ACCEPT_EVENT, {
97
97
  tx_hash: txHash,
98
- issuer_xrpl_address: signerAddress,
99
- accepter_xrpl_address: issuerXrplAddress,
98
+ issuer_xrpl_address: issuerXrplAddress,
99
+ accepter_xrpl_address: signerAddress,
100
100
  nft_token_id: identity.nftTokenId,
101
101
  ipfs_uri: updatedUri,
102
102
  trust_model: NFT_TRUST_TAG
@@ -144,10 +144,21 @@ function _waitForValidation() {
144
144
  _waitForValidation = _asyncToGenerator(function* (xrplClient, txHash) {
145
145
  for (var attempt = 0; attempt < 15; attempt += 1) {
146
146
  var _response$result;
147
- var response = yield xrplClient.request({
148
- command: "tx",
149
- transaction: txHash
150
- });
147
+ var response = void 0;
148
+ try {
149
+ response = yield xrplClient.request({
150
+ command: "tx",
151
+ transaction: txHash
152
+ });
153
+ } catch (error) {
154
+ var _data$error, _data;
155
+ var errorCode = error instanceof Error && "data" in error ? (_data$error = (_data = error.data) === null || _data === void 0 ? void 0 : _data.error) !== null && _data$error !== void 0 ? _data$error : error.error : undefined;
156
+ if (errorCode === "txnNotFound") {
157
+ yield sleep(1000);
158
+ continue;
159
+ }
160
+ throw error;
161
+ }
151
162
  if (((_response$result = response.result) === null || _response$result === void 0 ? void 0 : _response$result.validated) === true) return;
152
163
  yield sleep(1000);
153
164
  }
@@ -1 +1 @@
1
- {"version":3,"file":"verification.js","names":["Client","XrplClient","EventType","XRPL_VERIFY_REQUEST_EVENT","UserVerifyRequest","XRPL_VERIFY_ACCEPT_EVENT","UserVerifyAccept","XRPL_VERIFIED_EVENT","UserVerified","NFT_TRUST_TAG","XRPL_IDENTITY_ACCOUNT_DATA_TYPE","DEFAULT_XRPL_NETWORK","DEFAULT_XRPL_TESTNET_WS","DEFAULT_XRPL_MAINNET_WS","verificationConfig","configureXrplVerification","config","_objectSpread","requestVerification","_x","_requestVerification","apply","arguments","_asyncToGenerator","targetXrplAddress","matrixClient","xamanWallet","Error","issuerXrplAddress","getAddress","roomId","getVerificationRoomId","sendEvent","tx_hash","issuer_xrpl_address","target_xrpl_address","trust_model","txHash","credentialTypeHex","acceptVerification","_x2","_acceptVerification","signerAddress","identity","getIdentityAccountData","metadata","loadTrustMetadata","ipfsUri","currentVerifiers","Set","Array","isArray","verifiers","filter","value","Boolean","trim","map","add","updatedUri","pinTrustMetadata","from","signAndValidateOnXrpl","TransactionType","Account","NFTokenID","nftTokenId","URI","toHex","_ref","xrplClient","assertAccountOwnsToken","_x13","accepter_xrpl_address","nft_token_id","ipfs_uri","_x3","_x4","_signAndValidateOnXrpl","transaction","preflight","resolveXrplWebSocketUrl","connect","autofilled","autofill","hash","signAndSubmit","waitForValidation","disconnect","catch","undefined","_x5","_x6","_waitForValidation","attempt","_response$result","response","request","command","result","validated","sleep","concat","_x7","_getVerificationRoomId","counterpartyXrplAddress","verificationRoomId","resolveVerificationRoomId","_verificationConfig$n","websocketUrl","network","input","bytes","TextEncoder","encode","toString","padStart","join","toUpperCase","_x8","_getIdentityAccountData","userId","getUserId","accessToken","getAccessToken","accountDataUrl","baseUrl","replace","encodeURIComponent","fetch","method","headers","ok","status","json","_x9","_x0","_x1","_assertAccountOwnsToken","account","tokenId","_response$result2","found","account_nfts","some","entry","_x10","_loadTrustMetadata","uri","startsWith","JSON","parse","_uri$split$","payload","decodeURIComponent","split","cidPath","_x11","_pinTrustMetadata","pinJsonToIpfs","jwt","pinataJwt","body","stringify","pinataContent","IpfsHash","_x12","_sleep","ms","Promise","resolve","setTimeout"],"sources":["../../src/xrpl/verification.ts"],"sourcesContent":["/*\nCopyright 2026 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { Client as XrplClient, type SubmittableTransaction } from \"xrpl\";\n\nimport { EventType } from \"../@types/event.ts\";\nimport type { BriijClient } from \"../client.ts\";\nimport { type XamanWalletAdapter, type XrplIdentityAccountData } from \"./identity.ts\";\n\nexport const XRPL_VERIFY_REQUEST_EVENT: EventType.UserVerifyRequest = EventType.UserVerifyRequest;\nexport const XRPL_VERIFY_ACCEPT_EVENT: EventType.UserVerifyAccept = EventType.UserVerifyAccept;\nexport const XRPL_VERIFIED_EVENT: EventType.UserVerified = EventType.UserVerified;\n\nconst NFT_TRUST_TAG = \"nft_metadata\";\nconst XRPL_IDENTITY_ACCOUNT_DATA_TYPE = \"io.textrp.xrpl.identity_nft\";\n\nconst DEFAULT_XRPL_NETWORK = \"testnet\";\nconst DEFAULT_XRPL_TESTNET_WS = \"wss://s.altnet.rippletest.net:51233\";\nconst DEFAULT_XRPL_MAINNET_WS = \"wss://s1.ripple.com\";\n\nexport interface XrplVerificationConfig {\n matrixClient: Pick<BriijClient, \"sendEvent\" | \"getUserId\" | \"getAccessToken\"> & { baseUrl: string };\n xamanWallet: XamanWalletAdapter;\n verificationRoomId?: string;\n resolveVerificationRoomId?: (counterpartyXrplAddress: string) => Promise<string> | string;\n pinJsonToIpfs?: (payload: Record<string, unknown>) => Promise<string>;\n pinataJwt?: string;\n websocketUrl?: string;\n network?: \"mainnet\" | \"testnet\";\n}\n\nexport interface XrplVerificationTxResult {\n txHash: string;\n credentialTypeHex: string;\n}\n\nlet verificationConfig: Partial<XrplVerificationConfig> = {};\n\nexport function configureXrplVerification(config: Partial<XrplVerificationConfig>): void {\n verificationConfig = {\n ...verificationConfig,\n ...config,\n };\n}\n\nexport async function requestVerification(targetXrplAddress: string): Promise<XrplVerificationTxResult> {\n const { matrixClient, xamanWallet } = verificationConfig;\n if (!matrixClient || !xamanWallet) {\n throw new Error(\"XRPL verification is not configured with matrixClient and xamanWallet\");\n }\n\n const issuerXrplAddress = await xamanWallet.getAddress();\n const roomId = await getVerificationRoomId(targetXrplAddress);\n await matrixClient.sendEvent(roomId, XRPL_VERIFY_REQUEST_EVENT, {\n tx_hash: \"\",\n issuer_xrpl_address: issuerXrplAddress,\n target_xrpl_address: targetXrplAddress,\n trust_model: NFT_TRUST_TAG,\n });\n\n return {\n txHash: \"\",\n credentialTypeHex: NFT_TRUST_TAG,\n };\n}\n\nexport async function acceptVerification(issuerXrplAddress: string): Promise<XrplVerificationTxResult> {\n const { matrixClient, xamanWallet } = verificationConfig;\n if (!matrixClient || !xamanWallet) {\n throw new Error(\"XRPL verification is not configured with matrixClient and xamanWallet\");\n }\n\n const signerAddress = await xamanWallet.getAddress();\n const identity = await getIdentityAccountData(matrixClient);\n const metadata = await loadTrustMetadata(identity.ipfsUri);\n const currentVerifiers = new Set(\n Array.isArray(metadata.verifiers)\n ? metadata.verifiers\n .filter((value): value is string => typeof value === \"string\" && Boolean(value.trim()))\n .map((value) => value.trim())\n : [],\n );\n currentVerifiers.add(issuerXrplAddress);\n const updatedUri = await pinTrustMetadata({\n ...metadata,\n verifiers: Array.from(currentVerifiers),\n });\n\n const roomId = await getVerificationRoomId(issuerXrplAddress);\n const txHash = await signAndValidateOnXrpl(\n {\n TransactionType: \"NFTokenModify\",\n Account: signerAddress,\n NFTokenID: identity.nftTokenId,\n URI: toHex(updatedUri),\n },\n async (xrplClient) => {\n await assertAccountOwnsToken(xrplClient, signerAddress, identity.nftTokenId);\n },\n );\n\n await matrixClient.sendEvent(roomId, XRPL_VERIFY_ACCEPT_EVENT, {\n tx_hash: txHash,\n issuer_xrpl_address: signerAddress,\n accepter_xrpl_address: issuerXrplAddress,\n nft_token_id: identity.nftTokenId,\n ipfs_uri: updatedUri,\n trust_model: NFT_TRUST_TAG,\n });\n\n return {\n txHash,\n credentialTypeHex: NFT_TRUST_TAG,\n };\n}\n\nasync function signAndValidateOnXrpl(\n transaction: Record<string, unknown>,\n preflight?: (xrplClient: XrplClient) => Promise<void>,\n): Promise<string> {\n const { xamanWallet } = verificationConfig;\n if (!xamanWallet) {\n throw new Error(\"Missing Xaman wallet adapter\");\n }\n\n const xrplClient = new XrplClient(resolveXrplWebSocketUrl());\n await xrplClient.connect();\n\n try {\n if (preflight) {\n await preflight(xrplClient);\n }\n const autofilled = await xrplClient.autofill(transaction as unknown as SubmittableTransaction);\n const { hash: txHash } = await xamanWallet.signAndSubmit(autofilled as Record<string, unknown>);\n await waitForValidation(xrplClient, txHash);\n return txHash;\n } finally {\n await xrplClient.disconnect().catch(() => undefined);\n }\n}\n\nasync function waitForValidation(xrplClient: XrplClient, txHash: string): Promise<void> {\n for (let attempt = 0; attempt < 15; attempt += 1) {\n const response = await xrplClient.request({\n command: \"tx\",\n transaction: txHash,\n });\n\n if (response.result?.validated === true) return;\n await sleep(1000);\n }\n\n throw new Error(`Timed out waiting for XRPL tx validation: ${txHash}`);\n}\n\nasync function getVerificationRoomId(counterpartyXrplAddress: string): Promise<string> {\n if (verificationConfig.verificationRoomId) {\n return verificationConfig.verificationRoomId;\n }\n if (verificationConfig.resolveVerificationRoomId) {\n return await verificationConfig.resolveVerificationRoomId(counterpartyXrplAddress);\n }\n throw new Error(\"No verification room configured\");\n}\n\nfunction resolveXrplWebSocketUrl(): string {\n if (verificationConfig.websocketUrl) return verificationConfig.websocketUrl;\n const network = verificationConfig.network ?? DEFAULT_XRPL_NETWORK;\n return network === \"mainnet\" ? DEFAULT_XRPL_MAINNET_WS : DEFAULT_XRPL_TESTNET_WS;\n}\n\nfunction toHex(input: string | Uint8Array): string {\n const bytes = typeof input === \"string\" ? new TextEncoder().encode(input) : input;\n return Array.from(bytes)\n .map((value) => value.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n}\n\nasync function getIdentityAccountData(\n matrixClient: Pick<BriijClient, \"getUserId\" | \"getAccessToken\"> & { baseUrl: string },\n): Promise<XrplIdentityAccountData> {\n const userId = matrixClient.getUserId();\n const accessToken = matrixClient.getAccessToken();\n if (!userId || !accessToken) {\n throw new Error(\"Missing Matrix session for XRPL verification\");\n }\n\n const accountDataUrl =\n `${matrixClient.baseUrl.replace(/\\/+$/, \"\")}` +\n `/_matrix/client/v3/user/${encodeURIComponent(userId)}/account_data/${encodeURIComponent(XRPL_IDENTITY_ACCOUNT_DATA_TYPE)}`;\n const response = await fetch(accountDataUrl, {\n method: \"GET\",\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n if (!response.ok) {\n throw new Error(`Unable to fetch identity NFT account_data: HTTP ${response.status}`);\n }\n return (await response.json()) as XrplIdentityAccountData;\n}\n\nasync function assertAccountOwnsToken(xrplClient: XrplClient, account: string, tokenId: string): Promise<void> {\n const response = await xrplClient.request({\n command: \"account_nfts\",\n account,\n });\n const found = response.result?.account_nfts?.some((entry: { NFTokenID?: string }) => entry.NFTokenID === tokenId);\n if (!found) {\n throw new Error(`Identity NFT ${tokenId} not found on account ${account}`);\n }\n}\n\nasync function loadTrustMetadata(uri: string): Promise<Record<string, unknown>> {\n if (!uri) return {};\n if (uri.startsWith(\"{\")) {\n return JSON.parse(uri) as Record<string, unknown>;\n }\n\n if (uri.startsWith(\"data:application/json,\")) {\n const payload = decodeURIComponent(uri.split(\",\", 2)[1] ?? \"{}\");\n return JSON.parse(payload) as Record<string, unknown>;\n }\n\n if (uri.startsWith(\"ipfs://\")) {\n const cidPath = uri.replace(\"ipfs://\", \"\");\n const response = await fetch(`https://ipfs.io/ipfs/${cidPath}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch IPFS metadata: HTTP ${response.status}`);\n }\n return (await response.json()) as Record<string, unknown>;\n }\n\n return {};\n}\n\nasync function pinTrustMetadata(payload: Record<string, unknown>): Promise<string> {\n if (verificationConfig.pinJsonToIpfs) {\n return await verificationConfig.pinJsonToIpfs(payload);\n }\n\n const jwt = verificationConfig.pinataJwt;\n if (!jwt) {\n throw new Error(\"Set pinJsonToIpfs or pinataJwt before acceptVerification()\");\n }\n\n const response = await fetch(\"https://api.pinata.cloud/pinning/pinJSONToIPFS\", {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${jwt}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ pinataContent: payload }),\n });\n if (!response.ok) {\n throw new Error(`Pinata pin failed: HTTP ${response.status}`);\n }\n const body = (await response.json()) as { IpfsHash?: string };\n if (!body.IpfsHash) {\n throw new Error(\"Pinata response missing IpfsHash\");\n }\n return `ipfs://${body.IpfsHash}`;\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"verification.js","names":["Client","XrplClient","EventType","XRPL_VERIFY_REQUEST_EVENT","UserVerifyRequest","XRPL_VERIFY_ACCEPT_EVENT","UserVerifyAccept","XRPL_VERIFIED_EVENT","UserVerified","NFT_TRUST_TAG","XRPL_IDENTITY_ACCOUNT_DATA_TYPE","DEFAULT_XRPL_NETWORK","DEFAULT_XRPL_TESTNET_WS","DEFAULT_XRPL_MAINNET_WS","verificationConfig","configureXrplVerification","config","_objectSpread","requestVerification","_x","_requestVerification","apply","arguments","_asyncToGenerator","targetXrplAddress","matrixClient","xamanWallet","Error","issuerXrplAddress","getAddress","roomId","getVerificationRoomId","sendEvent","tx_hash","issuer_xrpl_address","target_xrpl_address","trust_model","txHash","credentialTypeHex","acceptVerification","_x2","_acceptVerification","signerAddress","identity","getIdentityAccountData","metadata","loadTrustMetadata","ipfsUri","currentVerifiers","Set","Array","isArray","verifiers","filter","value","Boolean","trim","map","add","updatedUri","pinTrustMetadata","from","signAndValidateOnXrpl","TransactionType","Account","NFTokenID","nftTokenId","URI","toHex","_ref","xrplClient","assertAccountOwnsToken","_x13","accepter_xrpl_address","nft_token_id","ipfs_uri","_x3","_x4","_signAndValidateOnXrpl","transaction","preflight","resolveXrplWebSocketUrl","connect","autofilled","autofill","hash","signAndSubmit","waitForValidation","disconnect","catch","undefined","_x5","_x6","_waitForValidation","attempt","_response$result","response","request","command","error","_data$error","_data","errorCode","data","sleep","result","validated","concat","_x7","_getVerificationRoomId","counterpartyXrplAddress","verificationRoomId","resolveVerificationRoomId","_verificationConfig$n","websocketUrl","network","input","bytes","TextEncoder","encode","toString","padStart","join","toUpperCase","_x8","_getIdentityAccountData","userId","getUserId","accessToken","getAccessToken","accountDataUrl","baseUrl","replace","encodeURIComponent","fetch","method","headers","ok","status","json","_x9","_x0","_x1","_assertAccountOwnsToken","account","tokenId","_response$result2","found","account_nfts","some","entry","_x10","_loadTrustMetadata","uri","startsWith","JSON","parse","_uri$split$","payload","decodeURIComponent","split","cidPath","_x11","_pinTrustMetadata","pinJsonToIpfs","jwt","pinataJwt","body","stringify","pinataContent","IpfsHash","_x12","_sleep","ms","Promise","resolve","setTimeout"],"sources":["../../src/xrpl/verification.ts"],"sourcesContent":["/*\nCopyright 2026 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { Client as XrplClient, type SubmittableTransaction } from \"xrpl\";\n\nimport { EventType } from \"../@types/event.ts\";\nimport type { BriijClient } from \"../client.ts\";\nimport { type XamanWalletAdapter, type XrplIdentityAccountData } from \"./identity.ts\";\n\nexport const XRPL_VERIFY_REQUEST_EVENT: EventType.UserVerifyRequest = EventType.UserVerifyRequest;\nexport const XRPL_VERIFY_ACCEPT_EVENT: EventType.UserVerifyAccept = EventType.UserVerifyAccept;\nexport const XRPL_VERIFIED_EVENT: EventType.UserVerified = EventType.UserVerified;\n\nconst NFT_TRUST_TAG = \"nft_metadata\";\nconst XRPL_IDENTITY_ACCOUNT_DATA_TYPE = \"io.textrp.xrpl.identity_nft\";\n\nconst DEFAULT_XRPL_NETWORK = \"testnet\";\nconst DEFAULT_XRPL_TESTNET_WS = \"wss://s.altnet.rippletest.net:51233\";\nconst DEFAULT_XRPL_MAINNET_WS = \"wss://s1.ripple.com\";\n\nexport interface XrplVerificationConfig {\n matrixClient: Pick<BriijClient, \"sendEvent\" | \"getUserId\" | \"getAccessToken\"> & { baseUrl: string };\n xamanWallet: XamanWalletAdapter;\n verificationRoomId?: string;\n resolveVerificationRoomId?: (counterpartyXrplAddress: string) => Promise<string> | string;\n pinJsonToIpfs?: (payload: Record<string, unknown>) => Promise<string>;\n pinataJwt?: string;\n websocketUrl?: string;\n network?: \"mainnet\" | \"testnet\";\n}\n\nexport interface XrplVerificationTxResult {\n txHash: string;\n credentialTypeHex: string;\n}\n\nlet verificationConfig: Partial<XrplVerificationConfig> = {};\n\nexport function configureXrplVerification(config: Partial<XrplVerificationConfig>): void {\n verificationConfig = {\n ...verificationConfig,\n ...config,\n };\n}\n\nexport async function requestVerification(targetXrplAddress: string): Promise<XrplVerificationTxResult> {\n const { matrixClient, xamanWallet } = verificationConfig;\n if (!matrixClient || !xamanWallet) {\n throw new Error(\"XRPL verification is not configured with matrixClient and xamanWallet\");\n }\n\n const issuerXrplAddress = await xamanWallet.getAddress();\n const roomId = await getVerificationRoomId(targetXrplAddress);\n await matrixClient.sendEvent(roomId, XRPL_VERIFY_REQUEST_EVENT, {\n tx_hash: \"\",\n issuer_xrpl_address: issuerXrplAddress,\n target_xrpl_address: targetXrplAddress,\n trust_model: NFT_TRUST_TAG,\n });\n\n return {\n txHash: \"\",\n credentialTypeHex: NFT_TRUST_TAG,\n };\n}\n\nexport async function acceptVerification(issuerXrplAddress: string): Promise<XrplVerificationTxResult> {\n const { matrixClient, xamanWallet } = verificationConfig;\n if (!matrixClient || !xamanWallet) {\n throw new Error(\"XRPL verification is not configured with matrixClient and xamanWallet\");\n }\n\n const signerAddress = await xamanWallet.getAddress();\n const identity = await getIdentityAccountData(matrixClient);\n const metadata = await loadTrustMetadata(identity.ipfsUri);\n const currentVerifiers = new Set(\n Array.isArray(metadata.verifiers)\n ? metadata.verifiers\n .filter((value): value is string => typeof value === \"string\" && Boolean(value.trim()))\n .map((value) => value.trim())\n : [],\n );\n currentVerifiers.add(issuerXrplAddress);\n const updatedUri = await pinTrustMetadata({\n ...metadata,\n verifiers: Array.from(currentVerifiers),\n });\n\n const roomId = await getVerificationRoomId(issuerXrplAddress);\n const txHash = await signAndValidateOnXrpl(\n {\n TransactionType: \"NFTokenModify\",\n Account: signerAddress,\n NFTokenID: identity.nftTokenId,\n URI: toHex(updatedUri),\n },\n async (xrplClient) => {\n await assertAccountOwnsToken(xrplClient, signerAddress, identity.nftTokenId);\n },\n );\n\n await matrixClient.sendEvent(roomId, XRPL_VERIFY_ACCEPT_EVENT, {\n tx_hash: txHash,\n issuer_xrpl_address: issuerXrplAddress,\n accepter_xrpl_address: signerAddress,\n nft_token_id: identity.nftTokenId,\n ipfs_uri: updatedUri,\n trust_model: NFT_TRUST_TAG,\n });\n\n return {\n txHash,\n credentialTypeHex: NFT_TRUST_TAG,\n };\n}\n\nasync function signAndValidateOnXrpl(\n transaction: Record<string, unknown>,\n preflight?: (xrplClient: XrplClient) => Promise<void>,\n): Promise<string> {\n const { xamanWallet } = verificationConfig;\n if (!xamanWallet) {\n throw new Error(\"Missing Xaman wallet adapter\");\n }\n\n const xrplClient = new XrplClient(resolveXrplWebSocketUrl());\n await xrplClient.connect();\n\n try {\n if (preflight) {\n await preflight(xrplClient);\n }\n const autofilled = await xrplClient.autofill(transaction as unknown as SubmittableTransaction);\n const { hash: txHash } = await xamanWallet.signAndSubmit(autofilled as Record<string, unknown>);\n await waitForValidation(xrplClient, txHash);\n return txHash;\n } finally {\n await xrplClient.disconnect().catch(() => undefined);\n }\n}\n\nasync function waitForValidation(xrplClient: XrplClient, txHash: string): Promise<void> {\n for (let attempt = 0; attempt < 15; attempt += 1) {\n let response: { result?: { validated?: boolean } };\n try {\n response = (await xrplClient.request({\n command: \"tx\",\n transaction: txHash,\n })) as { result?: { validated?: boolean } };\n } catch (error) {\n const errorCode =\n error instanceof Error && \"data\" in error\n ? ((error as { data?: { error?: string } }).data?.error ?? (error as { error?: string }).error)\n : undefined;\n if (errorCode === \"txnNotFound\") {\n await sleep(1000);\n continue;\n }\n throw error;\n }\n\n if (response.result?.validated === true) return;\n await sleep(1000);\n }\n\n throw new Error(`Timed out waiting for XRPL tx validation: ${txHash}`);\n}\n\nasync function getVerificationRoomId(counterpartyXrplAddress: string): Promise<string> {\n if (verificationConfig.verificationRoomId) {\n return verificationConfig.verificationRoomId;\n }\n if (verificationConfig.resolveVerificationRoomId) {\n return await verificationConfig.resolveVerificationRoomId(counterpartyXrplAddress);\n }\n throw new Error(\"No verification room configured\");\n}\n\nfunction resolveXrplWebSocketUrl(): string {\n if (verificationConfig.websocketUrl) return verificationConfig.websocketUrl;\n const network = verificationConfig.network ?? DEFAULT_XRPL_NETWORK;\n return network === \"mainnet\" ? DEFAULT_XRPL_MAINNET_WS : DEFAULT_XRPL_TESTNET_WS;\n}\n\nfunction toHex(input: string | Uint8Array): string {\n const bytes = typeof input === \"string\" ? new TextEncoder().encode(input) : input;\n return Array.from(bytes)\n .map((value) => value.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n}\n\nasync function getIdentityAccountData(\n matrixClient: Pick<BriijClient, \"getUserId\" | \"getAccessToken\"> & { baseUrl: string },\n): Promise<XrplIdentityAccountData> {\n const userId = matrixClient.getUserId();\n const accessToken = matrixClient.getAccessToken();\n if (!userId || !accessToken) {\n throw new Error(\"Missing Matrix session for XRPL verification\");\n }\n\n const accountDataUrl =\n `${matrixClient.baseUrl.replace(/\\/+$/, \"\")}` +\n `/_matrix/client/v3/user/${encodeURIComponent(userId)}/account_data/${encodeURIComponent(XRPL_IDENTITY_ACCOUNT_DATA_TYPE)}`;\n const response = await fetch(accountDataUrl, {\n method: \"GET\",\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n });\n if (!response.ok) {\n throw new Error(`Unable to fetch identity NFT account_data: HTTP ${response.status}`);\n }\n return (await response.json()) as XrplIdentityAccountData;\n}\n\nasync function assertAccountOwnsToken(xrplClient: XrplClient, account: string, tokenId: string): Promise<void> {\n const response = await xrplClient.request({\n command: \"account_nfts\",\n account,\n });\n const found = response.result?.account_nfts?.some((entry: { NFTokenID?: string }) => entry.NFTokenID === tokenId);\n if (!found) {\n throw new Error(`Identity NFT ${tokenId} not found on account ${account}`);\n }\n}\n\nasync function loadTrustMetadata(uri: string): Promise<Record<string, unknown>> {\n if (!uri) return {};\n if (uri.startsWith(\"{\")) {\n return JSON.parse(uri) as Record<string, unknown>;\n }\n\n if (uri.startsWith(\"data:application/json,\")) {\n const payload = decodeURIComponent(uri.split(\",\", 2)[1] ?? \"{}\");\n return JSON.parse(payload) as Record<string, unknown>;\n }\n\n if (uri.startsWith(\"ipfs://\")) {\n const cidPath = uri.replace(\"ipfs://\", \"\");\n const response = await fetch(`https://ipfs.io/ipfs/${cidPath}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch IPFS metadata: HTTP ${response.status}`);\n }\n return (await response.json()) as Record<string, unknown>;\n }\n\n return {};\n}\n\nasync function pinTrustMetadata(payload: Record<string, unknown>): Promise<string> {\n if (verificationConfig.pinJsonToIpfs) {\n return await verificationConfig.pinJsonToIpfs(payload);\n }\n\n const jwt = verificationConfig.pinataJwt;\n if (!jwt) {\n throw new Error(\"Set pinJsonToIpfs or pinataJwt before acceptVerification()\");\n }\n\n const response = await fetch(\"https://api.pinata.cloud/pinning/pinJSONToIPFS\", {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${jwt}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ pinataContent: payload }),\n });\n if (!response.ok) {\n throw new Error(`Pinata pin failed: HTTP ${response.status}`);\n }\n const body = (await response.json()) as { IpfsHash?: string };\n if (!body.IpfsHash) {\n throw new Error(\"Pinata response missing IpfsHash\");\n }\n return `ipfs://${body.IpfsHash}`;\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textrp/briij-js-sdk",
3
- "version": "42.0.0",
3
+ "version": "43.1.0",
4
4
  "description": "Briij Client-Server SDK for JavaScript and TypeScript",
5
5
  "engines": {
6
6
  "node": ">=22.0.0"
@@ -39,6 +39,10 @@ export interface ILoginFlowsResponse {
39
39
  }
40
40
 
41
41
  export const XRPL_WALLET_LOGIN_TYPE = "io.briij.login.xrpl";
42
+ export const WALLET_E2EE_RECOVERY_ACCOUNT_DATA_TYPE = "org.textrp.wallet.e2ee_recovery.v1";
43
+ export const WALLET_IDENTITY_ACCOUNT_DATA_TYPE = "org.textrp.wallet.identity";
44
+ export type KnownXrplAlgorithm = "secp256k1" | "ed25519";
45
+ export type XrplAlgorithm = KnownXrplAlgorithm | (string & { __brand?: "XrplAlgorithm" });
42
46
 
43
47
  export type LoginFlow = ISSOFlow | IPasswordFlow | IXrplWalletLoginFlow | ILoginFlow;
44
48
 
@@ -206,16 +210,71 @@ export interface LoginRequest {
206
210
  export type ILoginParams = LoginRequest;
207
211
 
208
212
  export interface XrplWalletChallengePayload {
213
+ session?: string;
209
214
  nonce: string;
210
215
  timestamp: number | string;
211
216
  message: string;
212
217
  public_key: string;
213
- algorithm?: "secp256k1" | "ed25519" | string;
218
+ algorithm?: XrplAlgorithm;
219
+ }
220
+
221
+ export interface XrplAuthChallengeRequest extends Omit<LoginRequest, "type"> {
222
+ type: typeof XRPL_WALLET_LOGIN_TYPE;
223
+ address: string;
224
+ network: string;
225
+ preferred_localpart?: string;
226
+ username?: string;
227
+ display_name?: string;
228
+ }
229
+
230
+ export interface XrplAuthChallengeResponse {
231
+ session: string;
232
+ challenge: string;
233
+ }
234
+
235
+ export interface XrplAuthCompleteRequest extends Omit<LoginRequest, "type"> {
236
+ type: typeof XRPL_WALLET_LOGIN_TYPE;
237
+ session: string;
238
+ address: string;
239
+ signature: string;
240
+ public_key?: string;
241
+ network?: string;
242
+ wallet_e2ee_recovery?: WalletE2eeRecoveryEnvelope;
243
+ }
244
+
245
+ export interface WalletRecoveryWrap {
246
+ alg: string;
247
+ kdf: string;
248
+ salt: string;
249
+ nonce: string;
250
+ ciphertext: string;
251
+ aad?: string;
252
+ params?: Record<string, unknown>;
253
+ }
254
+
255
+ export interface WalletRecoveryPasswordWrap extends WalletRecoveryWrap {}
256
+
257
+ export interface WalletE2eeRecoveryEnvelope {
258
+ envelope_version: number;
259
+ chain_id: string;
260
+ account_id: string;
261
+ created_at_ms: number;
262
+ key_id: string;
263
+ wallet_wrap: WalletRecoveryWrap;
264
+ password_wrap: WalletRecoveryPasswordWrap;
265
+ }
266
+
267
+ export interface WalletIdentityAccountData {
268
+ chain_id: string;
269
+ account_id: string;
270
+ public_key?: string | null;
271
+ network?: string | null;
272
+ key_type?: string | null;
214
273
  }
215
274
 
216
275
  export interface XrplWalletLoginRequest extends Omit<LoginRequest, "type"> {
217
276
  type: typeof XRPL_WALLET_LOGIN_TYPE;
218
- wallet_address: string;
277
+ address: string;
219
278
  signature: string;
220
279
  challenge: string | XrplWalletChallengePayload;
221
280
  network?: string;
@@ -65,6 +65,7 @@ import { type LocalNotificationSettings } from "./local_notifications.ts";
65
65
  import { type IPushRules } from "./PushRules.ts";
66
66
  import { type SecretInfo, type SecretStorageKeyDescription } from "../secret-storage.ts";
67
67
  import { type POLICIES_ACCOUNT_EVENT_TYPE } from "../models/invites-ignorer-types.ts";
68
+ import { type WalletE2eeRecoveryEnvelope, type WalletIdentityAccountData } from "./auth.ts";
68
69
 
69
70
  export enum EventType {
70
71
  // Room state events
@@ -455,6 +456,8 @@ export interface AccountDataEvents extends SecretStorageAccountDataEvents {
455
456
  [POLICIES_ACCOUNT_EVENT_TYPE.altName]: { [key: string]: any };
456
457
 
457
458
  [EventType.InvitePermissionConfig]: { default_action?: string };
459
+ "org.textrp.wallet.e2ee_recovery.v1": WalletE2eeRecoveryEnvelope;
460
+ "org.textrp.wallet.identity": WalletIdentityAccountData;
458
461
  }
459
462
 
460
463
  /**
@@ -37,4 +37,81 @@ export interface ISynapseAdminWhoisResponse {
37
37
  export interface ISynapseAdminDeactivateResponse {
38
38
  id_server_unbind_result: IdServerUnbindResult;
39
39
  }
40
+
41
+ export interface IBriijPremiumFeature {
42
+ feature_id: number;
43
+ feature_key: string;
44
+ name: string;
45
+ description: string | null;
46
+ mcredits_cost: number;
47
+ category: string | null;
48
+ is_active: boolean;
49
+ created_ts: number;
50
+ }
51
+
52
+ export interface IBriijMcreditsFeature {
53
+ feature_key: string;
54
+ name: string;
55
+ description: string | null;
56
+ mcredits_cost: number;
57
+ category: string | null;
58
+ is_active: boolean;
59
+ }
60
+
61
+ export interface IBriijMcreditsFeaturesResponse {
62
+ features: IBriijMcreditsFeature[];
63
+ }
64
+
65
+ export interface IBriijMcreditsBalanceResponse {
66
+ balance: number;
67
+ }
68
+
69
+ export interface IBriijMcreditsSpendResponse {
70
+ feature_key: string;
71
+ balance: number;
72
+ }
73
+
74
+ export interface IBriijLegacyMyAddressUserCredit {
75
+ balance?: string;
76
+ }
77
+
78
+ export interface IBriijLegacyMyAddressUser {
79
+ address?: string;
80
+ discount?: Record<string, unknown>;
81
+ subscriptions?: unknown[];
82
+ credit?: IBriijLegacyMyAddressUserCredit;
83
+ }
84
+
85
+ export interface IBriijLegacyMyAddressResponse {
86
+ user: IBriijLegacyMyAddressUser;
87
+ address: string;
88
+ }
89
+
90
+ export interface IBriijLegacyEnabledFeature {
91
+ feature: string;
92
+ [key: string]: unknown;
93
+ }
94
+
95
+ export interface IBriijLegacyEnabledFeaturesResponse {
96
+ nfts?: IBriijLegacyEnabledFeature[];
97
+ [key: string]: unknown;
98
+ }
99
+
100
+ export interface IBriijAdminPremiumFeaturesResponse {
101
+ premium_features: IBriijPremiumFeature[];
102
+ }
103
+
104
+ export interface IBriijAdminCreatePremiumFeatureRequest {
105
+ feature_key: string;
106
+ name: string;
107
+ description?: string | null;
108
+ mcredits_cost: number;
109
+ category?: string | null;
110
+ }
111
+
112
+ export interface IBriijAdminUpdatePremiumFeatureRequest {
113
+ mcredits_cost?: number;
114
+ description?: string | null;
115
+ is_active?: boolean;
116
+ }
40
117
  /* eslint-enable camelcase */
package/src/briij.ts CHANGED
@@ -52,6 +52,7 @@ export * from "./interactive-auth.ts";
52
52
  export * from "./xrpl/identity.ts";
53
53
  export * from "./xrpl/trust.ts";
54
54
  export * from "./xrpl/verification.ts";
55
+ export * from "./wallet-recovery.ts";
55
56
  export * from "./version-support.ts";
56
57
  export * from "./service-types.ts";
57
58
  export * from "./store/memory.ts";
@@ -73,6 +74,7 @@ export * from "./@types/topic.ts";
73
74
  export * from "./@types/location.ts";
74
75
  export * from "./@types/threepids.ts";
75
76
  export * from "./@types/auth.ts";
77
+ export * from "./@types/synapse.ts";
76
78
  export * from "./@types/polls.ts";
77
79
  export type * from "./@types/local_notifications.ts";
78
80
  export type * from "./@types/registration.ts";