@textrp/briij-js-sdk 43.0.0 → 43.1.1

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 (42) hide show
  1. package/CHANGELOG.md +7 -4
  2. package/lib/@types/auth.d.ts +7 -5
  3. package/lib/@types/auth.d.ts.map +1 -1
  4. package/lib/@types/auth.js.map +1 -1
  5. package/lib/@types/event.d.ts +3 -32
  6. package/lib/@types/event.d.ts.map +1 -1
  7. package/lib/@types/event.js.map +1 -1
  8. package/lib/@types/synapse.d.ts +64 -0
  9. package/lib/@types/synapse.d.ts.map +1 -1
  10. package/lib/@types/synapse.js.map +1 -1
  11. package/lib/briij.d.ts +1 -0
  12. package/lib/briij.d.ts.map +1 -1
  13. package/lib/briij.js +1 -0
  14. package/lib/briij.js.map +1 -1
  15. package/lib/client.d.ts +72 -1
  16. package/lib/client.d.ts.map +1 -1
  17. package/lib/client.js +369 -196
  18. package/lib/client.js.map +1 -1
  19. package/lib/wallet-recovery.d.ts +1 -1
  20. package/lib/wallet-recovery.d.ts.map +1 -1
  21. package/lib/wallet-recovery.js +32 -8
  22. package/lib/wallet-recovery.js.map +1 -1
  23. package/lib/xrpl/identity.d.ts +2 -1
  24. package/lib/xrpl/identity.d.ts.map +1 -1
  25. package/lib/xrpl/identity.js +70 -47
  26. package/lib/xrpl/identity.js.map +1 -1
  27. package/lib/xrpl/trust.d.ts +4 -2
  28. package/lib/xrpl/trust.d.ts.map +1 -1
  29. package/lib/xrpl/trust.js +31 -19
  30. package/lib/xrpl/trust.js.map +1 -1
  31. package/lib/xrpl/verification.js +17 -6
  32. package/lib/xrpl/verification.js.map +1 -1
  33. package/package.json +127 -129
  34. package/src/@types/auth.ts +6 -7
  35. package/src/@types/event.ts +3 -32
  36. package/src/@types/synapse.ts +77 -0
  37. package/src/briij.ts +1 -0
  38. package/src/client.ts +261 -36
  39. package/src/wallet-recovery.ts +101 -26
  40. package/src/xrpl/identity.ts +66 -39
  41. package/src/xrpl/trust.ts +35 -18
  42. package/src/xrpl/verification.ts +19 -6
@@ -20,5 +20,5 @@ export declare function deriveWalletWrapKeyFromSecret(walletSecret: string, chai
20
20
  export declare function validateRecoveryEnvelopeShape(value: unknown): asserts value is WalletE2eeRecoveryEnvelope;
21
21
  export declare function createDualWrapEnvelope(params: CreateDualWrapEnvelopeParams): Promise<WalletE2eeRecoveryEnvelope>;
22
22
  export declare function unwrapWithWallet({ envelope, walletWrapKey }: UnwrapWithWalletParams): Promise<Uint8Array>;
23
- export declare function unwrapWithPassword({ envelope, backupPassword, }: UnwrapWithPasswordParams): Promise<Uint8Array>;
23
+ export declare function unwrapWithPassword({ envelope, backupPassword }: UnwrapWithPasswordParams): Promise<Uint8Array>;
24
24
  //# sourceMappingURL=wallet-recovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-recovery.d.ts","sourceRoot":"","sources":["../src/wallet-recovery.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,0BAA0B,EAA2B,MAAM,kBAAkB,CAAC;AAQ5F,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,UAAU,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,aAAa,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACrC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;CAC1B;AAuHD,wBAAsB,6BAA6B,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,OAAO,GACf,OAAO,CAAC,KAAK,IAAI,0BAA0B,CAiB7C;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAwCtH;AAED,wBAAsB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAG/G;AAED,wBAAsB,kBAAkB,CAAC,EACrC,QAAQ,EACR,cAAc,GACjB,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC,CAKhD"}
1
+ {"version":3,"file":"wallet-recovery.d.ts","sourceRoot":"","sources":["../src/wallet-recovery.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,0BAA0B,EAA2B,MAAM,kBAAkB,CAAC;AAW5F,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,UAAU,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,aAAa,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACrC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;CAC1B;AAgID,wBAAsB,6BAA6B,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,0BAA0B,CAuEzG;AAED,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,4BAA4B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CAwCrC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAG/G;AAED,wBAAsB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC,CAKpH"}
@@ -20,6 +20,9 @@ var KEY_BYTES = 32;
20
20
  var NONCE_BYTES = 12;
21
21
  var SALT_BYTES = 16;
22
22
  var PASSWORD_KDF_ITERATIONS = 210000;
23
+ var SUPPORTED_WRAP_ALG = "aes-256-gcm";
24
+ var SUPPORTED_WALLET_WRAP_KDF = "sha256-context-v1";
25
+ var SUPPORTED_PASSWORD_WRAP_KDF = "pbkdf2-sha256-v1";
23
26
  function assert(condition, message) {
24
27
  if (!condition) throw new Error(message);
25
28
  }
@@ -96,6 +99,8 @@ function decryptWrap(_x4, _x5) {
96
99
  }
97
100
  function _decryptWrap() {
98
101
  _decryptWrap = _asyncToGenerator(function* (wrap, key) {
102
+ assert(wrap.alg === SUPPORTED_WRAP_ALG, "Unsupported recovery wrap alg '".concat(wrap.alg, "', expected '").concat(SUPPORTED_WRAP_ALG, "'"));
103
+ assert(wrap.kdf === SUPPORTED_WALLET_WRAP_KDF || wrap.kdf === SUPPORTED_PASSWORD_WRAP_KDF, "Unsupported recovery wrap kdf '".concat(wrap.kdf, "'"));
99
104
  var nonce = fromBase64(wrap.nonce);
100
105
  var aad = wrap.aad ? fromBase64(wrap.aad) : new Uint8Array();
101
106
  var ciphertext = fromBase64(wrap.ciphertext);
@@ -131,7 +136,8 @@ export function deriveWalletWrapKeyFromSecret(_x8, _x9, _x0, _x1) {
131
136
  }
132
137
  function _deriveWalletWrapKeyFromSecret() {
133
138
  _deriveWalletWrapKeyFromSecret = _asyncToGenerator(function* (walletSecret, chainId, accountId, homeserver) {
134
- var context = "briij-wallet-auth-wrap-v1:".concat(homeserver, ":").concat(chainId, ":").concat(accountId);
139
+ var canonicalHomeserver = canonicalizeHomeserver(homeserver);
140
+ var context = "briij-wallet-auth-wrap-v1:".concat(canonicalHomeserver, ":").concat(chainId, ":").concat(accountId);
135
141
  var digest = yield globalThis.crypto.subtle.digest("SHA-256", toArrayBuffer(toUtf8("".concat(context, ":").concat(walletSecret))));
136
142
  return new Uint8Array(digest);
137
143
  });
@@ -141,19 +147,27 @@ export function validateRecoveryEnvelopeShape(value) {
141
147
  assert(!!value && typeof value === "object", "recovery envelope must be an object");
142
148
  var envelope = value;
143
149
  assert(typeof envelope.envelope_version === "number", "envelope_version must be a number");
150
+ assert(envelope.envelope_version === ENVELOPE_VERSION, "Unsupported envelope_version '".concat(envelope.envelope_version, "', expected '").concat(ENVELOPE_VERSION, "'"));
144
151
  assert(typeof envelope.chain_id === "string" && envelope.chain_id.length > 0, "chain_id is required");
145
152
  assert(typeof envelope.account_id === "string" && envelope.account_id.length > 0, "account_id is required");
146
153
  assert(typeof envelope.created_at_ms === "number", "created_at_ms must be a number");
147
154
  assert(typeof envelope.key_id === "string" && envelope.key_id.length > 0, "key_id is required");
148
155
  assert(!!envelope.wallet_wrap && typeof envelope.wallet_wrap === "object", "wallet_wrap is required");
149
156
  assert(!!envelope.password_wrap && typeof envelope.password_wrap === "object", "password_wrap is required");
150
- for (var wrap of [envelope.wallet_wrap, envelope.password_wrap]) {
151
- assert(typeof wrap.alg === "string" && wrap.alg.length > 0, "wrap.alg is required");
152
- assert(typeof wrap.kdf === "string" && wrap.kdf.length > 0, "wrap.kdf is required");
153
- assert(typeof wrap.salt === "string" && wrap.salt.length > 0, "wrap.salt is required");
154
- assert(typeof wrap.nonce === "string" && wrap.nonce.length > 0, "wrap.nonce is required");
155
- assert(typeof wrap.ciphertext === "string" && wrap.ciphertext.length > 0, "wrap.ciphertext is required");
156
- }
157
+ assert(typeof envelope.wallet_wrap.alg === "string" && envelope.wallet_wrap.alg.length > 0, "wallet_wrap.alg is required");
158
+ assert(typeof envelope.wallet_wrap.kdf === "string" && envelope.wallet_wrap.kdf.length > 0, "wallet_wrap.kdf is required");
159
+ assert(envelope.wallet_wrap.alg === SUPPORTED_WRAP_ALG, "Unsupported wallet_wrap.alg '".concat(envelope.wallet_wrap.alg, "', expected '").concat(SUPPORTED_WRAP_ALG, "'"));
160
+ assert(envelope.wallet_wrap.kdf === SUPPORTED_WALLET_WRAP_KDF, "Unsupported wallet_wrap.kdf '".concat(envelope.wallet_wrap.kdf, "', expected '").concat(SUPPORTED_WALLET_WRAP_KDF, "'"));
161
+ assert(typeof envelope.wallet_wrap.salt === "string" && envelope.wallet_wrap.salt.length > 0, "wallet_wrap.salt is required");
162
+ assert(typeof envelope.wallet_wrap.nonce === "string" && envelope.wallet_wrap.nonce.length > 0, "wallet_wrap.nonce is required");
163
+ assert(typeof envelope.wallet_wrap.ciphertext === "string" && envelope.wallet_wrap.ciphertext.length > 0, "wallet_wrap.ciphertext is required");
164
+ assert(typeof envelope.password_wrap.alg === "string" && envelope.password_wrap.alg.length > 0, "password_wrap.alg is required");
165
+ assert(typeof envelope.password_wrap.kdf === "string" && envelope.password_wrap.kdf.length > 0, "password_wrap.kdf is required");
166
+ assert(envelope.password_wrap.alg === SUPPORTED_WRAP_ALG, "Unsupported password_wrap.alg '".concat(envelope.password_wrap.alg, "', expected '").concat(SUPPORTED_WRAP_ALG, "'"));
167
+ assert(envelope.password_wrap.kdf === SUPPORTED_PASSWORD_WRAP_KDF, "Unsupported password_wrap.kdf '".concat(envelope.password_wrap.kdf, "', expected '").concat(SUPPORTED_PASSWORD_WRAP_KDF, "'"));
168
+ assert(typeof envelope.password_wrap.salt === "string" && envelope.password_wrap.salt.length > 0, "password_wrap.salt is required");
169
+ assert(typeof envelope.password_wrap.nonce === "string" && envelope.password_wrap.nonce.length > 0, "password_wrap.nonce is required");
170
+ assert(typeof envelope.password_wrap.ciphertext === "string" && envelope.password_wrap.ciphertext.length > 0, "password_wrap.ciphertext is required");
157
171
  }
158
172
  export function createDualWrapEnvelope(_x10) {
159
173
  return _createDualWrapEnvelope.apply(this, arguments);
@@ -229,4 +243,14 @@ function _unwrapWithPassword() {
229
243
  });
230
244
  return _unwrapWithPassword.apply(this, arguments);
231
245
  }
246
+ function canonicalizeHomeserver(homeserver) {
247
+ var trimmed = homeserver.trim().replace(/\/+$/, "");
248
+ try {
249
+ var parsed = new URL(trimmed);
250
+ parsed.hostname = parsed.hostname.toLowerCase();
251
+ return parsed.toString().replace(/\/+$/, "");
252
+ } catch (_unused) {
253
+ return trimmed.toLowerCase();
254
+ }
255
+ }
232
256
  //# sourceMappingURL=wallet-recovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-recovery.js","names":["ENVELOPE_VERSION","KEY_BYTES","NONCE_BYTES","SALT_BYTES","PASSWORD_KDF_ITERATIONS","assert","condition","message","Error","toBase64","bytes","Buffer","from","toString","binary","forEach","b","String","fromCodePoint","btoa","fromBase64","value","Uint8Array","atob","out","length","i","codePointAt","toUtf8","TextEncoder","encode","toArrayBuffer","buffer","slice","byteOffset","byteLength","randomBytes","len","globalThis","crypto","getRandomValues","importAesGcmKey","_x","_importAesGcmKey","apply","arguments","_asyncToGenerator","key","subtle","importKey","name","encryptWrap","_x2","_x3","_encryptWrap","plaintext","_ref","aad","kdf","params","salt","nonce","cryptoKey","ciphertext","encrypt","iv","additionalData","tagLength","alg","decryptWrap","_x4","_x5","_decryptWrap","wrap","decrypt","derivePasswordWrapKey","_x6","_x7","_derivePasswordWrapKey","password","keyMaterial","bits","deriveBits","hash","iterations","deriveWalletWrapKeyFromSecret","_x8","_x9","_x0","_x1","_deriveWalletWrapKeyFromSecret","walletSecret","chainId","accountId","homeserver","context","concat","digest","validateRecoveryEnvelopeShape","envelope","envelope_version","chain_id","account_id","created_at_ms","key_id","wallet_wrap","password_wrap","createDualWrapEnvelope","_x10","_createDualWrapEnvelope","_params$createdAtMs","_params$keyId","_params$recoveryKey","backupPassword","walletWrapKey","createdAtMs","Date","now","keyId","replace","recoveryKey","walletWrap","passwordSalt","passwordWrapKey","passwordWrap","unwrapWithWallet","_x11","_unwrapWithWallet","_ref2","unwrapWithPassword","_x12","_unwrapWithPassword","_ref3"],"sources":["../src/wallet-recovery.ts"],"sourcesContent":["/*\nCopyright 2026 TextRP\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 { type WalletE2eeRecoveryEnvelope, type WalletRecoveryWrap } from \"./@types/auth.ts\";\n\nconst ENVELOPE_VERSION = 1;\nconst KEY_BYTES = 32;\nconst NONCE_BYTES = 12;\nconst SALT_BYTES = 16;\nconst PASSWORD_KDF_ITERATIONS = 210_000;\n\nexport interface CreateDualWrapEnvelopeParams {\n chainId: string;\n accountId: string;\n backupPassword: string;\n walletWrapKey: Uint8Array;\n createdAtMs?: number;\n keyId?: string;\n recoveryKey?: Uint8Array;\n}\n\nexport interface UnwrapWithWalletParams {\n envelope: WalletE2eeRecoveryEnvelope;\n walletWrapKey: Uint8Array;\n}\n\nexport interface UnwrapWithPasswordParams {\n envelope: WalletE2eeRecoveryEnvelope;\n backupPassword: string;\n}\n\nfunction assert(condition: boolean, message: string): asserts condition {\n if (!condition) throw new Error(message);\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") return Buffer.from(bytes).toString(\"base64\");\n let binary = \"\";\n bytes.forEach((b) => (binary += String.fromCodePoint(b)));\n return btoa(binary);\n}\n\nfunction fromBase64(value: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(value, \"base64\"));\n const binary = atob(value);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.codePointAt(i)!;\n return out;\n}\n\nfunction toUtf8(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nfunction toArrayBuffer(value: Uint8Array): ArrayBuffer {\n return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength) as ArrayBuffer;\n}\n\nfunction randomBytes(len: number): Uint8Array {\n const out = new Uint8Array(len);\n globalThis.crypto.getRandomValues(out);\n return out;\n}\n\nasync function importAesGcmKey(key: Uint8Array): Promise<CryptoKey> {\n return await globalThis.crypto.subtle.importKey(\n \"raw\",\n toArrayBuffer(key),\n { name: \"AES-GCM\" },\n false,\n [\"encrypt\", \"decrypt\"],\n );\n}\n\nasync function encryptWrap(\n plaintext: Uint8Array,\n {\n key,\n aad,\n kdf,\n params,\n }: {\n key: Uint8Array;\n aad: Uint8Array;\n kdf: string;\n params?: Record<string, unknown>;\n },\n): Promise<WalletRecoveryWrap> {\n assert(key.length >= KEY_BYTES, \"wallet recovery key must be at least 32 bytes\");\n const salt = randomBytes(SALT_BYTES);\n const nonce = randomBytes(NONCE_BYTES);\n const cryptoKey = await importAesGcmKey(key.slice(0, KEY_BYTES));\n const ciphertext = await globalThis.crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: toArrayBuffer(nonce),\n additionalData: toArrayBuffer(aad),\n tagLength: 128,\n },\n cryptoKey,\n toArrayBuffer(plaintext),\n );\n return {\n alg: \"aes-256-gcm\",\n kdf,\n salt: toBase64(salt),\n nonce: toBase64(nonce),\n ciphertext: toBase64(new Uint8Array(ciphertext)),\n aad: toBase64(aad),\n params,\n };\n}\n\nasync function decryptWrap(wrap: WalletRecoveryWrap, key: Uint8Array): Promise<Uint8Array> {\n const nonce = fromBase64(wrap.nonce);\n const aad = wrap.aad ? fromBase64(wrap.aad) : new Uint8Array();\n const ciphertext = fromBase64(wrap.ciphertext);\n const cryptoKey = await importAesGcmKey(key.slice(0, KEY_BYTES));\n const plaintext = await globalThis.crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: toArrayBuffer(nonce),\n additionalData: toArrayBuffer(aad),\n tagLength: 128,\n },\n cryptoKey,\n toArrayBuffer(ciphertext),\n );\n return new Uint8Array(plaintext);\n}\n\nasync function derivePasswordWrapKey(password: string, salt: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await globalThis.crypto.subtle.importKey(\"raw\", toArrayBuffer(toUtf8(password)), \"PBKDF2\", false, [\n \"deriveBits\",\n ]);\n const bits = await globalThis.crypto.subtle.deriveBits(\n {\n name: \"PBKDF2\",\n hash: \"SHA-256\",\n salt: toArrayBuffer(salt),\n iterations: PASSWORD_KDF_ITERATIONS,\n },\n keyMaterial,\n KEY_BYTES * 8,\n );\n return new Uint8Array(bits);\n}\n\nexport async function deriveWalletWrapKeyFromSecret(\n walletSecret: string,\n chainId: string,\n accountId: string,\n homeserver: string,\n): Promise<Uint8Array> {\n const context = `briij-wallet-auth-wrap-v1:${homeserver}:${chainId}:${accountId}`;\n const digest = await globalThis.crypto.subtle.digest(\n \"SHA-256\",\n toArrayBuffer(toUtf8(`${context}:${walletSecret}`)),\n );\n return new Uint8Array(digest);\n}\n\nexport function validateRecoveryEnvelopeShape(\n value: unknown,\n): asserts value is WalletE2eeRecoveryEnvelope {\n assert(!!value && typeof value === \"object\", \"recovery envelope must be an object\");\n const envelope = value as WalletE2eeRecoveryEnvelope;\n assert(typeof envelope.envelope_version === \"number\", \"envelope_version must be a number\");\n assert(typeof envelope.chain_id === \"string\" && envelope.chain_id.length > 0, \"chain_id is required\");\n assert(typeof envelope.account_id === \"string\" && envelope.account_id.length > 0, \"account_id is required\");\n assert(typeof envelope.created_at_ms === \"number\", \"created_at_ms must be a number\");\n assert(typeof envelope.key_id === \"string\" && envelope.key_id.length > 0, \"key_id is required\");\n assert(!!envelope.wallet_wrap && typeof envelope.wallet_wrap === \"object\", \"wallet_wrap is required\");\n assert(!!envelope.password_wrap && typeof envelope.password_wrap === \"object\", \"password_wrap is required\");\n for (const wrap of [envelope.wallet_wrap, envelope.password_wrap]) {\n assert(typeof wrap.alg === \"string\" && wrap.alg.length > 0, \"wrap.alg is required\");\n assert(typeof wrap.kdf === \"string\" && wrap.kdf.length > 0, \"wrap.kdf is required\");\n assert(typeof wrap.salt === \"string\" && wrap.salt.length > 0, \"wrap.salt is required\");\n assert(typeof wrap.nonce === \"string\" && wrap.nonce.length > 0, \"wrap.nonce is required\");\n assert(typeof wrap.ciphertext === \"string\" && wrap.ciphertext.length > 0, \"wrap.ciphertext is required\");\n }\n}\n\nexport async function createDualWrapEnvelope(params: CreateDualWrapEnvelopeParams): Promise<WalletE2eeRecoveryEnvelope> {\n assert(params.chainId.length > 0, \"chainId is required\");\n assert(params.accountId.length > 0, \"accountId is required\");\n assert(params.backupPassword.length > 0, \"backupPassword is required\");\n assert(params.walletWrapKey.length >= KEY_BYTES, \"walletWrapKey must be at least 32 bytes\");\n\n const createdAtMs = params.createdAtMs ?? Date.now();\n const keyId = params.keyId ?? `k-${toBase64(randomBytes(8)).replace(/=+$/g, \"\")}`;\n const recoveryKey = params.recoveryKey ?? randomBytes(KEY_BYTES);\n assert(recoveryKey.length === KEY_BYTES, \"recoveryKey must be 32 bytes\");\n\n const aad = toUtf8(`briij-recovery-envelope-v1:${params.chainId}:${params.accountId}:${keyId}:${createdAtMs}`);\n const walletWrap = await encryptWrap(recoveryKey, {\n key: params.walletWrapKey,\n aad,\n kdf: \"sha256-context-v1\",\n });\n\n const passwordSalt = randomBytes(SALT_BYTES);\n const passwordWrapKey = await derivePasswordWrapKey(params.backupPassword, passwordSalt);\n const passwordWrap = await encryptWrap(recoveryKey, {\n key: passwordWrapKey,\n aad,\n kdf: \"pbkdf2-sha256-v1\",\n params: {\n iterations: PASSWORD_KDF_ITERATIONS,\n hash: \"SHA-256\",\n },\n });\n passwordWrap.salt = toBase64(passwordSalt);\n\n return {\n envelope_version: ENVELOPE_VERSION,\n chain_id: params.chainId,\n account_id: params.accountId,\n created_at_ms: createdAtMs,\n key_id: keyId,\n wallet_wrap: walletWrap,\n password_wrap: passwordWrap,\n };\n}\n\nexport async function unwrapWithWallet({ envelope, walletWrapKey }: UnwrapWithWalletParams): Promise<Uint8Array> {\n validateRecoveryEnvelopeShape(envelope);\n return await decryptWrap(envelope.wallet_wrap, walletWrapKey);\n}\n\nexport async function unwrapWithPassword({\n envelope,\n backupPassword,\n}: UnwrapWithPasswordParams): Promise<Uint8Array> {\n validateRecoveryEnvelopeShape(envelope);\n const passwordSalt = fromBase64(envelope.password_wrap.salt);\n const passwordWrapKey = await derivePasswordWrapKey(backupPassword, passwordSalt);\n return await decryptWrap(envelope.password_wrap, passwordWrapKey);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"wallet-recovery.js","names":["ENVELOPE_VERSION","KEY_BYTES","NONCE_BYTES","SALT_BYTES","PASSWORD_KDF_ITERATIONS","SUPPORTED_WRAP_ALG","SUPPORTED_WALLET_WRAP_KDF","SUPPORTED_PASSWORD_WRAP_KDF","assert","condition","message","Error","toBase64","bytes","Buffer","from","toString","binary","forEach","b","String","fromCodePoint","btoa","fromBase64","value","Uint8Array","atob","out","length","i","codePointAt","toUtf8","TextEncoder","encode","toArrayBuffer","buffer","slice","byteOffset","byteLength","randomBytes","len","globalThis","crypto","getRandomValues","importAesGcmKey","_x","_importAesGcmKey","apply","arguments","_asyncToGenerator","key","subtle","importKey","name","encryptWrap","_x2","_x3","_encryptWrap","plaintext","_ref","aad","kdf","params","salt","nonce","cryptoKey","ciphertext","encrypt","iv","additionalData","tagLength","alg","decryptWrap","_x4","_x5","_decryptWrap","wrap","concat","decrypt","derivePasswordWrapKey","_x6","_x7","_derivePasswordWrapKey","password","keyMaterial","bits","deriveBits","hash","iterations","deriveWalletWrapKeyFromSecret","_x8","_x9","_x0","_x1","_deriveWalletWrapKeyFromSecret","walletSecret","chainId","accountId","homeserver","canonicalHomeserver","canonicalizeHomeserver","context","digest","validateRecoveryEnvelopeShape","envelope","envelope_version","chain_id","account_id","created_at_ms","key_id","wallet_wrap","password_wrap","createDualWrapEnvelope","_x10","_createDualWrapEnvelope","_params$createdAtMs","_params$keyId","_params$recoveryKey","backupPassword","walletWrapKey","createdAtMs","Date","now","keyId","replace","recoveryKey","walletWrap","passwordSalt","passwordWrapKey","passwordWrap","unwrapWithWallet","_x11","_unwrapWithWallet","_ref2","unwrapWithPassword","_x12","_unwrapWithPassword","_ref3","trimmed","trim","parsed","URL","hostname","toLowerCase","_unused"],"sources":["../src/wallet-recovery.ts"],"sourcesContent":["/*\nCopyright 2026 TextRP\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 { type WalletE2eeRecoveryEnvelope, type WalletRecoveryWrap } from \"./@types/auth.ts\";\n\nconst ENVELOPE_VERSION = 1;\nconst KEY_BYTES = 32;\nconst NONCE_BYTES = 12;\nconst SALT_BYTES = 16;\nconst PASSWORD_KDF_ITERATIONS = 210_000;\nconst SUPPORTED_WRAP_ALG = \"aes-256-gcm\";\nconst SUPPORTED_WALLET_WRAP_KDF = \"sha256-context-v1\";\nconst SUPPORTED_PASSWORD_WRAP_KDF = \"pbkdf2-sha256-v1\";\n\nexport interface CreateDualWrapEnvelopeParams {\n chainId: string;\n accountId: string;\n backupPassword: string;\n walletWrapKey: Uint8Array;\n createdAtMs?: number;\n keyId?: string;\n recoveryKey?: Uint8Array;\n}\n\nexport interface UnwrapWithWalletParams {\n envelope: WalletE2eeRecoveryEnvelope;\n walletWrapKey: Uint8Array;\n}\n\nexport interface UnwrapWithPasswordParams {\n envelope: WalletE2eeRecoveryEnvelope;\n backupPassword: string;\n}\n\nfunction assert(condition: boolean, message: string): asserts condition {\n if (!condition) throw new Error(message);\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") return Buffer.from(bytes).toString(\"base64\");\n let binary = \"\";\n bytes.forEach((b) => (binary += String.fromCodePoint(b)));\n return btoa(binary);\n}\n\nfunction fromBase64(value: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(value, \"base64\"));\n const binary = atob(value);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.codePointAt(i)!;\n return out;\n}\n\nfunction toUtf8(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nfunction toArrayBuffer(value: Uint8Array): ArrayBuffer {\n return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength) as ArrayBuffer;\n}\n\nfunction randomBytes(len: number): Uint8Array {\n const out = new Uint8Array(len);\n globalThis.crypto.getRandomValues(out);\n return out;\n}\n\nasync function importAesGcmKey(key: Uint8Array): Promise<CryptoKey> {\n return await globalThis.crypto.subtle.importKey(\"raw\", toArrayBuffer(key), { name: \"AES-GCM\" }, false, [\n \"encrypt\",\n \"decrypt\",\n ]);\n}\n\nasync function encryptWrap(\n plaintext: Uint8Array,\n {\n key,\n aad,\n kdf,\n params,\n }: {\n key: Uint8Array;\n aad: Uint8Array;\n kdf: string;\n params?: Record<string, unknown>;\n },\n): Promise<WalletRecoveryWrap> {\n assert(key.length >= KEY_BYTES, \"wallet recovery key must be at least 32 bytes\");\n const salt = randomBytes(SALT_BYTES);\n const nonce = randomBytes(NONCE_BYTES);\n const cryptoKey = await importAesGcmKey(key.slice(0, KEY_BYTES));\n const ciphertext = await globalThis.crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: toArrayBuffer(nonce),\n additionalData: toArrayBuffer(aad),\n tagLength: 128,\n },\n cryptoKey,\n toArrayBuffer(plaintext),\n );\n return {\n alg: \"aes-256-gcm\",\n kdf,\n salt: toBase64(salt),\n nonce: toBase64(nonce),\n ciphertext: toBase64(new Uint8Array(ciphertext)),\n aad: toBase64(aad),\n params,\n };\n}\n\nasync function decryptWrap(wrap: WalletRecoveryWrap, key: Uint8Array): Promise<Uint8Array> {\n assert(\n wrap.alg === SUPPORTED_WRAP_ALG,\n `Unsupported recovery wrap alg '${wrap.alg}', expected '${SUPPORTED_WRAP_ALG}'`,\n );\n assert(\n wrap.kdf === SUPPORTED_WALLET_WRAP_KDF || wrap.kdf === SUPPORTED_PASSWORD_WRAP_KDF,\n `Unsupported recovery wrap kdf '${wrap.kdf}'`,\n );\n const nonce = fromBase64(wrap.nonce);\n const aad = wrap.aad ? fromBase64(wrap.aad) : new Uint8Array();\n const ciphertext = fromBase64(wrap.ciphertext);\n const cryptoKey = await importAesGcmKey(key.slice(0, KEY_BYTES));\n const plaintext = await globalThis.crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: toArrayBuffer(nonce),\n additionalData: toArrayBuffer(aad),\n tagLength: 128,\n },\n cryptoKey,\n toArrayBuffer(ciphertext),\n );\n return new Uint8Array(plaintext);\n}\n\nasync function derivePasswordWrapKey(password: string, salt: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await globalThis.crypto.subtle.importKey(\n \"raw\",\n toArrayBuffer(toUtf8(password)),\n \"PBKDF2\",\n false,\n [\"deriveBits\"],\n );\n const bits = await globalThis.crypto.subtle.deriveBits(\n {\n name: \"PBKDF2\",\n hash: \"SHA-256\",\n salt: toArrayBuffer(salt),\n iterations: PASSWORD_KDF_ITERATIONS,\n },\n keyMaterial,\n KEY_BYTES * 8,\n );\n return new Uint8Array(bits);\n}\n\nexport async function deriveWalletWrapKeyFromSecret(\n walletSecret: string,\n chainId: string,\n accountId: string,\n homeserver: string,\n): Promise<Uint8Array> {\n const canonicalHomeserver = canonicalizeHomeserver(homeserver);\n const context = `briij-wallet-auth-wrap-v1:${canonicalHomeserver}:${chainId}:${accountId}`;\n const digest = await globalThis.crypto.subtle.digest(\n \"SHA-256\",\n toArrayBuffer(toUtf8(`${context}:${walletSecret}`)),\n );\n return new Uint8Array(digest);\n}\n\nexport function validateRecoveryEnvelopeShape(value: unknown): asserts value is WalletE2eeRecoveryEnvelope {\n assert(!!value && typeof value === \"object\", \"recovery envelope must be an object\");\n const envelope = value as WalletE2eeRecoveryEnvelope;\n assert(typeof envelope.envelope_version === \"number\", \"envelope_version must be a number\");\n assert(\n envelope.envelope_version === ENVELOPE_VERSION,\n `Unsupported envelope_version '${envelope.envelope_version}', expected '${ENVELOPE_VERSION}'`,\n );\n assert(typeof envelope.chain_id === \"string\" && envelope.chain_id.length > 0, \"chain_id is required\");\n assert(typeof envelope.account_id === \"string\" && envelope.account_id.length > 0, \"account_id is required\");\n assert(typeof envelope.created_at_ms === \"number\", \"created_at_ms must be a number\");\n assert(typeof envelope.key_id === \"string\" && envelope.key_id.length > 0, \"key_id is required\");\n assert(!!envelope.wallet_wrap && typeof envelope.wallet_wrap === \"object\", \"wallet_wrap is required\");\n assert(!!envelope.password_wrap && typeof envelope.password_wrap === \"object\", \"password_wrap is required\");\n assert(\n typeof envelope.wallet_wrap.alg === \"string\" && envelope.wallet_wrap.alg.length > 0,\n \"wallet_wrap.alg is required\",\n );\n assert(\n typeof envelope.wallet_wrap.kdf === \"string\" && envelope.wallet_wrap.kdf.length > 0,\n \"wallet_wrap.kdf is required\",\n );\n assert(\n envelope.wallet_wrap.alg === SUPPORTED_WRAP_ALG,\n `Unsupported wallet_wrap.alg '${envelope.wallet_wrap.alg}', expected '${SUPPORTED_WRAP_ALG}'`,\n );\n assert(\n envelope.wallet_wrap.kdf === SUPPORTED_WALLET_WRAP_KDF,\n `Unsupported wallet_wrap.kdf '${envelope.wallet_wrap.kdf}', expected '${SUPPORTED_WALLET_WRAP_KDF}'`,\n );\n assert(\n typeof envelope.wallet_wrap.salt === \"string\" && envelope.wallet_wrap.salt.length > 0,\n \"wallet_wrap.salt is required\",\n );\n assert(\n typeof envelope.wallet_wrap.nonce === \"string\" && envelope.wallet_wrap.nonce.length > 0,\n \"wallet_wrap.nonce is required\",\n );\n assert(\n typeof envelope.wallet_wrap.ciphertext === \"string\" && envelope.wallet_wrap.ciphertext.length > 0,\n \"wallet_wrap.ciphertext is required\",\n );\n\n assert(\n typeof envelope.password_wrap.alg === \"string\" && envelope.password_wrap.alg.length > 0,\n \"password_wrap.alg is required\",\n );\n assert(\n typeof envelope.password_wrap.kdf === \"string\" && envelope.password_wrap.kdf.length > 0,\n \"password_wrap.kdf is required\",\n );\n assert(\n envelope.password_wrap.alg === SUPPORTED_WRAP_ALG,\n `Unsupported password_wrap.alg '${envelope.password_wrap.alg}', expected '${SUPPORTED_WRAP_ALG}'`,\n );\n assert(\n envelope.password_wrap.kdf === SUPPORTED_PASSWORD_WRAP_KDF,\n `Unsupported password_wrap.kdf '${envelope.password_wrap.kdf}', expected '${SUPPORTED_PASSWORD_WRAP_KDF}'`,\n );\n assert(\n typeof envelope.password_wrap.salt === \"string\" && envelope.password_wrap.salt.length > 0,\n \"password_wrap.salt is required\",\n );\n assert(\n typeof envelope.password_wrap.nonce === \"string\" && envelope.password_wrap.nonce.length > 0,\n \"password_wrap.nonce is required\",\n );\n assert(\n typeof envelope.password_wrap.ciphertext === \"string\" && envelope.password_wrap.ciphertext.length > 0,\n \"password_wrap.ciphertext is required\",\n );\n}\n\nexport async function createDualWrapEnvelope(\n params: CreateDualWrapEnvelopeParams,\n): Promise<WalletE2eeRecoveryEnvelope> {\n assert(params.chainId.length > 0, \"chainId is required\");\n assert(params.accountId.length > 0, \"accountId is required\");\n assert(params.backupPassword.length > 0, \"backupPassword is required\");\n assert(params.walletWrapKey.length >= KEY_BYTES, \"walletWrapKey must be at least 32 bytes\");\n\n const createdAtMs = params.createdAtMs ?? Date.now();\n const keyId = params.keyId ?? `k-${toBase64(randomBytes(8)).replace(/=+$/g, \"\")}`;\n const recoveryKey = params.recoveryKey ?? randomBytes(KEY_BYTES);\n assert(recoveryKey.length === KEY_BYTES, \"recoveryKey must be 32 bytes\");\n\n const aad = toUtf8(`briij-recovery-envelope-v1:${params.chainId}:${params.accountId}:${keyId}:${createdAtMs}`);\n const walletWrap = await encryptWrap(recoveryKey, {\n key: params.walletWrapKey,\n aad,\n kdf: \"sha256-context-v1\",\n });\n\n const passwordSalt = randomBytes(SALT_BYTES);\n const passwordWrapKey = await derivePasswordWrapKey(params.backupPassword, passwordSalt);\n const passwordWrap = await encryptWrap(recoveryKey, {\n key: passwordWrapKey,\n aad,\n kdf: \"pbkdf2-sha256-v1\",\n params: {\n iterations: PASSWORD_KDF_ITERATIONS,\n hash: \"SHA-256\",\n },\n });\n passwordWrap.salt = toBase64(passwordSalt);\n\n return {\n envelope_version: ENVELOPE_VERSION,\n chain_id: params.chainId,\n account_id: params.accountId,\n created_at_ms: createdAtMs,\n key_id: keyId,\n wallet_wrap: walletWrap,\n password_wrap: passwordWrap,\n };\n}\n\nexport async function unwrapWithWallet({ envelope, walletWrapKey }: UnwrapWithWalletParams): Promise<Uint8Array> {\n validateRecoveryEnvelopeShape(envelope);\n return await decryptWrap(envelope.wallet_wrap, walletWrapKey);\n}\n\nexport async function unwrapWithPassword({ envelope, backupPassword }: UnwrapWithPasswordParams): Promise<Uint8Array> {\n validateRecoveryEnvelopeShape(envelope);\n const passwordSalt = fromBase64(envelope.password_wrap.salt);\n const passwordWrapKey = await derivePasswordWrapKey(backupPassword, passwordSalt);\n return await decryptWrap(envelope.password_wrap, passwordWrapKey);\n}\n\nfunction canonicalizeHomeserver(homeserver: string): string {\n const trimmed = homeserver.trim().replace(/\\/+$/, \"\");\n try {\n const parsed = new URL(trimmed);\n parsed.hostname = parsed.hostname.toLowerCase();\n return parsed.toString().replace(/\\/+$/, \"\");\n } catch {\n return trimmed.toLowerCase();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -24,5 +24,6 @@ export interface XrplIdentityMintResult extends XrplIdentityAccountData {
24
24
  }
25
25
  export declare function configureXrplIdentityMinting(config: Partial<XrplIdentityMintingConfig>): void;
26
26
  export declare function setXamanWalletForXrplIdentity(xamanWallet: XamanWalletAdapter): void;
27
- export declare function mintSoulboundIdentityNFT(matrixUserId: string): Promise<XrplIdentityMintResult | null>;
27
+ export declare function getConfiguredXrplIdentityMintingConfig(): Partial<XrplIdentityMintingConfig>;
28
+ export declare function mintSoulboundIdentityNFT(matrixUserId: string, config?: Partial<XrplIdentityMintingConfig>): Promise<XrplIdentityMintResult | null>;
28
29
  //# sourceMappingURL=identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/xrpl/identity.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,uBAAuB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IAC/B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,yBAAyB;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC5F;AAED,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACnE,MAAM,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAK7F;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAKnF;AAED,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAiE3G"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/xrpl/identity.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,uBAAuB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IAC/B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,yBAAyB;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC5F;AAED,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACnE,MAAM,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAK7F;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAKnF;AAED,wBAAgB,sCAAsC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAE3F;AAED,wBAAsB,wBAAwB,CAC1C,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAC5C,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAiExC"}
@@ -34,16 +34,20 @@ export function setXamanWalletForXrplIdentity(xamanWallet) {
34
34
  xamanWallet
35
35
  });
36
36
  }
37
- export function mintSoulboundIdentityNFT(_x) {
37
+ export function getConfiguredXrplIdentityMintingConfig() {
38
+ return _objectSpread({}, mintingConfig);
39
+ }
40
+ export function mintSoulboundIdentityNFT(_x, _x2) {
38
41
  return _mintSoulboundIdentityNFT.apply(this, arguments);
39
42
  }
40
43
  function _mintSoulboundIdentityNFT() {
41
- _mintSoulboundIdentityNFT = _asyncToGenerator(function* (matrixUserId) {
44
+ _mintSoulboundIdentityNFT = _asyncToGenerator(function* (matrixUserId, config) {
45
+ var effectiveConfig = _objectSpread(_objectSpread({}, mintingConfig), config);
42
46
  var {
43
47
  homeserverBaseUrl,
44
48
  accessToken,
45
49
  xamanWallet
46
- } = mintingConfig;
50
+ } = effectiveConfig;
47
51
  if (!homeserverBaseUrl || !accessToken || !xamanWallet) {
48
52
  logger.warn("Skipping XRPL identity mint for %s: missing homeserver auth and/or Xaman wallet adapter", matrixUserId);
49
53
  return null;
@@ -55,12 +59,12 @@ function _mintSoulboundIdentityNFT() {
55
59
  });
56
60
  }
57
61
  var xrplAddress = yield xamanWallet.getAddress();
58
- var ipfsUri = yield buildIpfsUri(matrixUserId, xrplAddress);
62
+ var ipfsUri = yield buildIpfsUri(matrixUserId, xrplAddress, effectiveConfig);
59
63
  var encodedUri = toHex(ipfsUri);
60
- var xrplClient = new XrplClient(resolveXrplWebSocketUrl());
64
+ var xrplClient = new XrplClient(resolveXrplWebSocketUrl(effectiveConfig));
61
65
  yield xrplClient.connect();
62
66
  try {
63
- var _extractNftTokenId, _txResult$result;
67
+ var _extractTxScopedNftTo;
64
68
  var mintTransaction = {
65
69
  TransactionType: "NFTokenMint",
66
70
  Account: xrplAddress,
@@ -72,11 +76,8 @@ function _mintSoulboundIdentityNFT() {
72
76
  var {
73
77
  hash: txHash
74
78
  } = yield xamanWallet.signAndSubmit(autofilled);
75
- var txResult = yield xrplClient.request({
76
- command: "tx",
77
- transaction: txHash
78
- });
79
- var nftTokenId = (_extractNftTokenId = extractNftTokenId((_txResult$result = txResult.result) === null || _txResult$result === void 0 ? void 0 : _txResult$result.meta)) !== null && _extractNftTokenId !== void 0 ? _extractNftTokenId : yield findAccountNftByUri(xrplClient, xrplAddress, encodedUri);
79
+ var txResult = yield waitForValidation(xrplClient, txHash);
80
+ var nftTokenId = (_extractTxScopedNftTo = extractTxScopedNftTokenId(txResult.result)) !== null && _extractTxScopedNftTo !== void 0 ? _extractTxScopedNftTo : yield findAccountNftByUri(xrplClient, xrplAddress, encodedUri);
80
81
  if (!nftTokenId) {
81
82
  throw new Error("Unable to resolve NFTokenID for transaction ".concat(txHash));
82
83
  }
@@ -97,13 +98,13 @@ function _mintSoulboundIdentityNFT() {
97
98
  });
98
99
  return _mintSoulboundIdentityNFT.apply(this, arguments);
99
100
  }
100
- function buildIpfsUri(_x2, _x3) {
101
+ function buildIpfsUri(_x3, _x4, _x5) {
101
102
  return _buildIpfsUri.apply(this, arguments);
102
103
  }
103
104
  function _buildIpfsUri() {
104
- _buildIpfsUri = _asyncToGenerator(function* (matrixUserId, xrplAddress) {
105
- if (mintingConfig.ipfsUriFactory) {
106
- return yield mintingConfig.ipfsUriFactory(matrixUserId, xrplAddress);
105
+ _buildIpfsUri = _asyncToGenerator(function* (matrixUserId, xrplAddress, config) {
106
+ if (config.ipfsUriFactory) {
107
+ return yield config.ipfsUriFactory(matrixUserId, xrplAddress);
107
108
  }
108
109
  var payload = JSON.stringify({
109
110
  matrixUserId,
@@ -114,17 +115,37 @@ function _buildIpfsUri() {
114
115
  });
115
116
  return _buildIpfsUri.apply(this, arguments);
116
117
  }
117
- function resolveXrplWebSocketUrl() {
118
- var _mintingConfig$networ;
119
- if (mintingConfig.websocketUrl) return mintingConfig.websocketUrl;
120
- var network = (_mintingConfig$networ = mintingConfig.network) !== null && _mintingConfig$networ !== void 0 ? _mintingConfig$networ : DEFAULT_XRPL_NETWORK;
118
+ function resolveXrplWebSocketUrl(config) {
119
+ var _config$network;
120
+ if (config.websocketUrl) return config.websocketUrl;
121
+ var network = (_config$network = config.network) !== null && _config$network !== void 0 ? _config$network : DEFAULT_XRPL_NETWORK;
121
122
  return network === "mainnet" ? DEFAULT_XRPL_MAINNET_WS : DEFAULT_XRPL_TESTNET_WS;
122
123
  }
124
+ function waitForValidation(_x6, _x7) {
125
+ return _waitForValidation.apply(this, arguments);
126
+ }
127
+ function _waitForValidation() {
128
+ _waitForValidation = _asyncToGenerator(function* (xrplClient, txHash) {
129
+ for (var attempt = 0; attempt < 15; attempt += 1) {
130
+ var _response$result;
131
+ var response = yield xrplClient.request({
132
+ command: "tx",
133
+ transaction: txHash
134
+ });
135
+ if (((_response$result = response.result) === null || _response$result === void 0 ? void 0 : _response$result.validated) === true) {
136
+ return response;
137
+ }
138
+ yield sleep(1000);
139
+ }
140
+ throw new Error("Timed out waiting for XRPL tx validation: ".concat(txHash));
141
+ });
142
+ return _waitForValidation.apply(this, arguments);
143
+ }
123
144
  function accountDataUrl(baseUrl, matrixUserId) {
124
145
  var trimmedBaseUrl = baseUrl.replace(/\/+$/, "");
125
146
  return "".concat(trimmedBaseUrl, "/_matrix/client/v3/user/").concat(encodeURIComponent(matrixUserId), "/account_data/").concat(encodeURIComponent(XRPL_IDENTITY_ACCOUNT_DATA_TYPE));
126
147
  }
127
- function getIdentityAccountData(_x4, _x5, _x6) {
148
+ function getIdentityAccountData(_x8, _x9, _x0) {
128
149
  return _getIdentityAccountData.apply(this, arguments);
129
150
  }
130
151
  function _getIdentityAccountData() {
@@ -132,7 +153,7 @@ function _getIdentityAccountData() {
132
153
  var response = yield fetch(accountDataUrl(homeserverBaseUrl, matrixUserId), {
133
154
  method: "GET",
134
155
  headers: {
135
- Authorization: "Bearer ".concat(accessToken),
156
+ "Authorization": "Bearer ".concat(accessToken),
136
157
  "Content-Type": "application/json"
137
158
  }
138
159
  });
@@ -144,7 +165,7 @@ function _getIdentityAccountData() {
144
165
  });
145
166
  return _getIdentityAccountData.apply(this, arguments);
146
167
  }
147
- function setIdentityAccountData(_x7, _x8, _x9, _x0) {
168
+ function setIdentityAccountData(_x1, _x10, _x11, _x12) {
148
169
  return _setIdentityAccountData.apply(this, arguments);
149
170
  }
150
171
  function _setIdentityAccountData() {
@@ -152,7 +173,7 @@ function _setIdentityAccountData() {
152
173
  var response = yield fetch(accountDataUrl(homeserverBaseUrl, matrixUserId), {
153
174
  method: "PUT",
154
175
  headers: {
155
- Authorization: "Bearer ".concat(accessToken),
176
+ "Authorization": "Bearer ".concat(accessToken),
156
177
  "Content-Type": "application/json"
157
178
  },
158
179
  body: JSON.stringify(payload)
@@ -163,18 +184,18 @@ function _setIdentityAccountData() {
163
184
  });
164
185
  return _setIdentityAccountData.apply(this, arguments);
165
186
  }
166
- function findAccountNftByUri(_x1, _x10, _x11) {
187
+ function findAccountNftByUri(_x13, _x14, _x15) {
167
188
  return _findAccountNftByUri.apply(this, arguments);
168
189
  }
169
190
  function _findAccountNftByUri() {
170
191
  _findAccountNftByUri = _asyncToGenerator(function* (xrplClient, xrplAddress, encodedUri) {
171
- var _response$result, _nft$NFTokenID;
192
+ var _response$result2, _nft$NFTokenID;
172
193
  var response = yield xrplClient.request({
173
194
  command: "account_nfts",
174
195
  account: xrplAddress
175
196
  });
176
197
  var targetUri = encodedUri.toUpperCase();
177
- var nft = (_response$result = response.result) === null || _response$result === void 0 || (_response$result = _response$result.account_nfts) === null || _response$result === void 0 ? void 0 : _response$result.find(candidate => {
198
+ var nft = (_response$result2 = response.result) === null || _response$result2 === void 0 || (_response$result2 = _response$result2.account_nfts) === null || _response$result2 === void 0 ? void 0 : _response$result2.find(candidate => {
178
199
  var _candidate$URI;
179
200
  return ((_candidate$URI = candidate.URI) === null || _candidate$URI === void 0 ? void 0 : _candidate$URI.toUpperCase()) === targetUri;
180
201
  });
@@ -182,27 +203,18 @@ function _findAccountNftByUri() {
182
203
  });
183
204
  return _findAccountNftByUri.apply(this, arguments);
184
205
  }
185
- function extractNftTokenId(meta) {
186
- var _AffectedNodes;
187
- if (!meta || typeof meta !== "object") return null;
188
- var affectedNodes = (_AffectedNodes = meta.AffectedNodes) !== null && _AffectedNodes !== void 0 ? _AffectedNodes : [];
189
- for (var nodeWrapper of affectedNodes) {
190
- var _tokensContainer$NFTo;
191
- if (!nodeWrapper || typeof nodeWrapper !== "object") continue;
192
- var [nodeValue] = Object.values(nodeWrapper);
193
- if (!nodeValue || typeof nodeValue !== "object") continue;
194
- var newFields = nodeValue.NewFields;
195
- var finalFields = nodeValue.FinalFields;
196
- var tokensContainer = [newFields, finalFields].find(container => {
197
- if (!container || typeof container !== "object") return false;
198
- return Array.isArray(container.NFTokens);
199
- });
200
- var nftokens = (_tokensContainer$NFTo = tokensContainer === null || tokensContainer === void 0 ? void 0 : tokensContainer.NFTokens) !== null && _tokensContainer$NFTo !== void 0 ? _tokensContainer$NFTo : [];
201
- for (var tokenEntry of nftokens) {
202
- if (!tokenEntry || typeof tokenEntry !== "object") continue;
203
- var token = tokenEntry.NFToken;
204
- if (token !== null && token !== void 0 && token.NFTokenID) return token.NFTokenID;
205
- }
206
+ function extractTxScopedNftTokenId(result) {
207
+ if (!result || typeof result !== "object") {
208
+ return null;
209
+ }
210
+ var payload = result;
211
+ var directTokenId = payload["nftoken_id"];
212
+ if (typeof directTokenId === "string" && directTokenId.length > 0) {
213
+ return directTokenId;
214
+ }
215
+ var directAlternate = payload["NFTokenID"];
216
+ if (typeof directAlternate === "string" && directAlternate.length > 0) {
217
+ return directAlternate;
206
218
  }
207
219
  return null;
208
220
  }
@@ -210,4 +222,15 @@ function toHex(input) {
210
222
  var bytes = typeof input === "string" ? new TextEncoder().encode(input) : input;
211
223
  return Array.from(bytes).map(value => value.toString(16).padStart(2, "0")).join("").toUpperCase();
212
224
  }
225
+ function sleep(_x16) {
226
+ return _sleep.apply(this, arguments);
227
+ }
228
+ function _sleep() {
229
+ _sleep = _asyncToGenerator(function* (ms) {
230
+ yield new Promise(resolve => {
231
+ setTimeout(resolve, ms);
232
+ });
233
+ });
234
+ return _sleep.apply(this, arguments);
235
+ }
213
236
  //# sourceMappingURL=identity.js.map
@@ -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"}