@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.
- package/CHANGELOG.md +7 -4
- package/README.md +71 -0
- package/lib/@types/auth.d.ts +57 -2
- package/lib/@types/auth.d.ts.map +1 -1
- package/lib/@types/auth.js +2 -0
- package/lib/@types/auth.js.map +1 -1
- package/lib/@types/event.d.ts +3 -0
- package/lib/@types/event.d.ts.map +1 -1
- package/lib/@types/event.js.map +1 -1
- package/lib/@types/synapse.d.ts +64 -0
- package/lib/@types/synapse.d.ts.map +1 -1
- package/lib/@types/synapse.js.map +1 -1
- package/lib/briij.d.ts +2 -0
- package/lib/briij.d.ts.map +1 -1
- package/lib/briij.js +2 -0
- package/lib/briij.js.map +1 -1
- package/lib/client.d.ts +100 -7
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +469 -213
- package/lib/client.js.map +1 -1
- package/lib/wallet-recovery.d.ts +24 -0
- package/lib/wallet-recovery.d.ts.map +1 -0
- package/lib/wallet-recovery.js +256 -0
- package/lib/wallet-recovery.js.map +1 -0
- package/lib/xrpl/identity.d.ts +2 -1
- package/lib/xrpl/identity.d.ts.map +1 -1
- package/lib/xrpl/identity.js +70 -47
- package/lib/xrpl/identity.js.map +1 -1
- package/lib/xrpl/trust.d.ts +4 -2
- package/lib/xrpl/trust.d.ts.map +1 -1
- package/lib/xrpl/trust.js +31 -19
- package/lib/xrpl/trust.js.map +1 -1
- package/lib/xrpl/verification.js +17 -6
- package/lib/xrpl/verification.js.map +1 -1
- package/package.json +1 -1
- package/src/@types/auth.ts +61 -2
- package/src/@types/event.ts +3 -0
- package/src/@types/synapse.ts +77 -0
- package/src/briij.ts +2 -0
- package/src/client.ts +344 -46
- package/src/wallet-recovery.ts +327 -0
- package/src/xrpl/identity.ts +66 -39
- package/src/xrpl/trust.ts +35 -18
- package/src/xrpl/verification.ts +19 -6
package/lib/xrpl/identity.js.map
CHANGED
|
@@ -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":[]}
|
package/lib/xrpl/trust.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export interface XrplTrustConfig {
|
|
|
3
3
|
accessToken: string;
|
|
4
4
|
trustPath?: string;
|
|
5
5
|
}
|
|
6
|
-
export
|
|
7
|
-
|
|
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
|
package/lib/xrpl/trust.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/xrpl/trust.ts"],"names":[],"mappings":"
|
|
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
|
|
23
|
-
export function
|
|
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
|
|
32
|
-
var
|
|
33
|
-
|
|
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 = (
|
|
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
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
}
|
package/lib/xrpl/trust.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trust.js","names":["DEFAULT_TRUST_PATH","
|
|
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":[]}
|
package/lib/xrpl/verification.js
CHANGED
|
@@ -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:
|
|
99
|
-
accepter_xrpl_address:
|
|
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 =
|
|
148
|
-
|
|
149
|
-
|
|
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
package/src/@types/auth.ts
CHANGED
|
@@ -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?:
|
|
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
|
-
|
|
277
|
+
address: string;
|
|
219
278
|
signature: string;
|
|
220
279
|
challenge: string | XrplWalletChallengePayload;
|
|
221
280
|
network?: string;
|
package/src/@types/event.ts
CHANGED
|
@@ -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
|
/**
|
package/src/@types/synapse.ts
CHANGED
|
@@ -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";
|