@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.
- package/CHANGELOG.md +7 -4
- package/lib/@types/auth.d.ts +7 -5
- package/lib/@types/auth.d.ts.map +1 -1
- package/lib/@types/auth.js.map +1 -1
- package/lib/@types/event.d.ts +3 -32
- 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 +1 -0
- package/lib/briij.d.ts.map +1 -1
- package/lib/briij.js +1 -0
- package/lib/briij.js.map +1 -1
- package/lib/client.d.ts +72 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +369 -196
- package/lib/client.js.map +1 -1
- package/lib/wallet-recovery.d.ts +1 -1
- package/lib/wallet-recovery.d.ts.map +1 -1
- package/lib/wallet-recovery.js +32 -8
- package/lib/wallet-recovery.js.map +1 -1
- 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 +127 -129
- package/src/@types/auth.ts +6 -7
- package/src/@types/event.ts +3 -32
- package/src/@types/synapse.ts +77 -0
- package/src/briij.ts +1 -0
- package/src/client.ts +261 -36
- package/src/wallet-recovery.ts +101 -26
- package/src/xrpl/identity.ts +66 -39
- package/src/xrpl/trust.ts +35 -18
- package/src/xrpl/verification.ts +19 -6
package/lib/wallet-recovery.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|
package/lib/wallet-recovery.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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":[]}
|
package/lib/xrpl/identity.d.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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"}
|
package/lib/xrpl/identity.js
CHANGED
|
@@ -34,16 +34,20 @@ export function setXamanWalletForXrplIdentity(xamanWallet) {
|
|
|
34
34
|
xamanWallet
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
export function
|
|
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
|
-
} =
|
|
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
|
|
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
|
|
76
|
-
|
|
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(
|
|
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 (
|
|
106
|
-
return yield
|
|
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
|
|
119
|
-
if (
|
|
120
|
-
var 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(
|
|
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(
|
|
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(
|
|
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$
|
|
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$
|
|
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
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
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"}
|