@volr/react 0.1.113 → 0.1.114
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/dist/index.cjs +17 -161
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -161
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -19425,11 +19425,6 @@ function useDepositListener(input) {
|
|
|
19425
19425
|
}, [getRpcUrl, input.chainId, input.address, JSON.stringify(input.asset)]);
|
|
19426
19426
|
return status;
|
|
19427
19427
|
}
|
|
19428
|
-
function debugLog(step, data) {
|
|
19429
|
-
{
|
|
19430
|
-
console.log(`[PasskeyEnrollment] ${step}`, data !== void 0 ? data : "");
|
|
19431
|
-
}
|
|
19432
|
-
}
|
|
19433
19428
|
function blobToBase64(blob) {
|
|
19434
19429
|
return new Promise((resolve, reject) => {
|
|
19435
19430
|
const reader = new FileReader();
|
|
@@ -19477,14 +19472,6 @@ function buildDisplayName(userEmail, userEvmAddress, userId) {
|
|
|
19477
19472
|
return userId || "Volr Wallet";
|
|
19478
19473
|
}
|
|
19479
19474
|
async function enrollPasskey(params) {
|
|
19480
|
-
debugLog("Starting enrollment with params:", {
|
|
19481
|
-
userId: params.userId,
|
|
19482
|
-
projectId: params.projectId,
|
|
19483
|
-
rpId: params.rpId,
|
|
19484
|
-
rpName: params.rpName,
|
|
19485
|
-
userEmail: params.userEmail,
|
|
19486
|
-
userEvmAddress: params.userEvmAddress
|
|
19487
|
-
});
|
|
19488
19475
|
const {
|
|
19489
19476
|
client,
|
|
19490
19477
|
baseUrl,
|
|
@@ -19496,7 +19483,6 @@ async function enrollPasskey(params) {
|
|
|
19496
19483
|
rpId = typeof window !== "undefined" ? window.location.hostname : "localhost",
|
|
19497
19484
|
rpName
|
|
19498
19485
|
} = params;
|
|
19499
|
-
debugLog("Step 0: Validating parameters");
|
|
19500
19486
|
if (!userId) {
|
|
19501
19487
|
throw new Error("userId is required");
|
|
19502
19488
|
}
|
|
@@ -19512,27 +19498,19 @@ async function enrollPasskey(params) {
|
|
|
19512
19498
|
if (!apiKey) {
|
|
19513
19499
|
throw new Error("apiKey is required");
|
|
19514
19500
|
}
|
|
19515
|
-
debugLog("Step 0: Parameters validated", { rpId, rpName });
|
|
19516
|
-
debugLog("Step 1: Checking WebAuthn support");
|
|
19517
19501
|
if (!navigator.credentials || !navigator.credentials.create) {
|
|
19518
19502
|
throw new Error("WebAuthn API is not supported");
|
|
19519
19503
|
}
|
|
19520
|
-
debugLog("Step 1: WebAuthn API is supported");
|
|
19521
19504
|
const challenge2 = new Uint8Array(32);
|
|
19522
19505
|
crypto.getRandomValues(challenge2);
|
|
19523
|
-
debugLog("Step 1: Challenge generated", { challengeLength: challenge2.length });
|
|
19524
19506
|
const userHandle = new TextEncoder().encode(userId);
|
|
19525
|
-
debugLog("Step 1: User handle created", { userHandleLength: userHandle.length });
|
|
19526
19507
|
const tempCredentialId = "temp-" + Date.now();
|
|
19527
19508
|
const tempPrfInput = {
|
|
19528
19509
|
projectId,
|
|
19529
19510
|
credentialId: tempCredentialId
|
|
19530
19511
|
};
|
|
19531
|
-
debugLog("Step 1: Temp PRF input created", tempPrfInput);
|
|
19532
19512
|
const prfSalt = sdkCore.deriveWrapKey(tempPrfInput);
|
|
19533
|
-
debugLog("Step 1: PRF salt derived", { prfSaltLength: prfSalt.length });
|
|
19534
19513
|
const displayName = buildDisplayName(userEmail, userEvmAddress, userId);
|
|
19535
|
-
debugLog("Step 1: Display name built", { displayName });
|
|
19536
19514
|
const publicKeyCredentialCreationOptions = {
|
|
19537
19515
|
challenge: challenge2,
|
|
19538
19516
|
rp: {
|
|
@@ -19556,105 +19534,37 @@ async function enrollPasskey(params) {
|
|
|
19556
19534
|
}
|
|
19557
19535
|
}
|
|
19558
19536
|
};
|
|
19559
|
-
|
|
19560
|
-
|
|
19561
|
-
rpName: publicKeyCredentialCreationOptions.rp.name,
|
|
19562
|
-
timeout: publicKeyCredentialCreationOptions.timeout,
|
|
19563
|
-
attestation: publicKeyCredentialCreationOptions.attestation,
|
|
19564
|
-
authenticatorSelection: publicKeyCredentialCreationOptions.authenticatorSelection,
|
|
19565
|
-
pubKeyCredParams: publicKeyCredentialCreationOptions.pubKeyCredParams
|
|
19537
|
+
const credential = await navigator.credentials.create({
|
|
19538
|
+
publicKey: publicKeyCredentialCreationOptions
|
|
19566
19539
|
});
|
|
19567
|
-
debugLog("Step 1: Calling navigator.credentials.create()...");
|
|
19568
|
-
let credential;
|
|
19569
|
-
try {
|
|
19570
|
-
credential = await navigator.credentials.create({
|
|
19571
|
-
publicKey: publicKeyCredentialCreationOptions
|
|
19572
|
-
});
|
|
19573
|
-
debugLog("Step 1: Credential creation completed", {
|
|
19574
|
-
hasCredential: !!credential,
|
|
19575
|
-
credentialId: credential ? Array.from(new Uint8Array(credential.rawId)).slice(0, 8).join(",") + "..." : null
|
|
19576
|
-
});
|
|
19577
|
-
} catch (err) {
|
|
19578
|
-
debugLog("Step 1: Credential creation FAILED", {
|
|
19579
|
-
error: err,
|
|
19580
|
-
errorMessage: err instanceof Error ? err.message : String(err),
|
|
19581
|
-
errorName: err instanceof Error ? err.name : "Unknown"
|
|
19582
|
-
});
|
|
19583
|
-
throw err;
|
|
19584
|
-
}
|
|
19585
19540
|
if (!credential || !("response" in credential)) {
|
|
19586
|
-
debugLog("Step 1: Invalid credential response", { credential });
|
|
19587
19541
|
throw new Error("Failed to create passkey credential");
|
|
19588
19542
|
}
|
|
19589
19543
|
const credentialId = Array.from(new Uint8Array(credential.rawId)).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
19590
|
-
debugLog("Step 2: Credential ID extracted", { credentialIdLength: credentialId.length, credentialIdPrefix: credentialId.slice(0, 16) });
|
|
19591
|
-
debugLog("Step 2: Extracting PRF output");
|
|
19592
19544
|
const extensionResults = credential.getClientExtensionResults();
|
|
19593
|
-
debugLog("Step 2: Extension results", {
|
|
19594
|
-
hasExtensionResults: !!extensionResults,
|
|
19595
|
-
hasPrf: !!extensionResults.prf,
|
|
19596
|
-
hasPrfResults: !!(extensionResults.prf && extensionResults.prf.results),
|
|
19597
|
-
hasPrfFirst: !!(extensionResults.prf && extensionResults.prf.results && extensionResults.prf.results.first),
|
|
19598
|
-
allKeys: Object.keys(extensionResults)
|
|
19599
|
-
});
|
|
19600
19545
|
if (!extensionResults.prf || !extensionResults.prf.results || !extensionResults.prf.results.first) {
|
|
19601
|
-
debugLog("Step 2: PRF extension not supported or missing", extensionResults);
|
|
19602
19546
|
throw new Error("PRF extension not supported or PRF output missing. Please use a browser that supports WebAuthn PRF extension.");
|
|
19603
19547
|
}
|
|
19604
19548
|
const prfOutputBuffer = extensionResults.prf.results.first;
|
|
19605
19549
|
const prfOutput = new Uint8Array(prfOutputBuffer);
|
|
19606
|
-
debugLog("Step 2: PRF output extracted", { prfOutputLength: prfOutput.length });
|
|
19607
19550
|
const prfInput = {
|
|
19608
19551
|
projectId,
|
|
19609
19552
|
credentialId
|
|
19610
19553
|
};
|
|
19611
|
-
debugLog("Step 3: PRF input built", prfInput);
|
|
19612
19554
|
const wrapKey = prfOutput;
|
|
19613
|
-
debugLog("Step 4: Wrap key created from PRF output", { wrapKeyLength: wrapKey.length });
|
|
19614
|
-
debugLog("Step 4: Generating master key...");
|
|
19615
19555
|
const masterKeyProvider = sdkCore.createMasterKeyProvider();
|
|
19616
|
-
|
|
19617
|
-
try {
|
|
19618
|
-
masterKeyHandle = await masterKeyProvider.generate();
|
|
19619
|
-
debugLog("Step 4: Master key generated", {
|
|
19620
|
-
hasEntropy: !!masterKeyHandle.entropy,
|
|
19621
|
-
entropyLength: masterKeyHandle.entropy?.length,
|
|
19622
|
-
hasSeed: !!masterKeyHandle.seed,
|
|
19623
|
-
seedLength: masterKeyHandle.seed?.length
|
|
19624
|
-
});
|
|
19625
|
-
} catch (err) {
|
|
19626
|
-
debugLog("Step 4: Master key generation FAILED", {
|
|
19627
|
-
error: err,
|
|
19628
|
-
errorMessage: err instanceof Error ? err.message : String(err)
|
|
19629
|
-
});
|
|
19630
|
-
throw err;
|
|
19631
|
-
}
|
|
19556
|
+
const masterKeyHandle = await masterKeyProvider.generate();
|
|
19632
19557
|
try {
|
|
19633
19558
|
const keyStorageType = "passkey";
|
|
19634
19559
|
const version5 = "v1";
|
|
19635
19560
|
const aadBytes = new TextEncoder().encode(
|
|
19636
19561
|
`volr/master-seed/v1|${userId}|${keyStorageType}|${version5}`
|
|
19637
19562
|
);
|
|
19638
|
-
|
|
19639
|
-
|
|
19640
|
-
|
|
19641
|
-
|
|
19642
|
-
|
|
19643
|
-
masterKeyHandle.entropy,
|
|
19644
|
-
wrapKey,
|
|
19645
|
-
aadBytes
|
|
19646
|
-
);
|
|
19647
|
-
debugLog("Step 4: Entropy encrypted", {
|
|
19648
|
-
cipherLength: encryptedBlob.cipher.length,
|
|
19649
|
-
nonceLength: encryptedBlob.nonce.length
|
|
19650
|
-
});
|
|
19651
|
-
} catch (err) {
|
|
19652
|
-
debugLog("Step 4: Encryption FAILED", {
|
|
19653
|
-
error: err,
|
|
19654
|
-
errorMessage: err instanceof Error ? err.message : String(err)
|
|
19655
|
-
});
|
|
19656
|
-
throw err;
|
|
19657
|
-
}
|
|
19563
|
+
const encryptedBlob = await sdkCore.sealMasterSeed(
|
|
19564
|
+
masterKeyHandle.entropy,
|
|
19565
|
+
wrapKey,
|
|
19566
|
+
aadBytes
|
|
19567
|
+
);
|
|
19658
19568
|
const blob = new Blob(
|
|
19659
19569
|
[
|
|
19660
19570
|
encryptedBlob.cipher,
|
|
@@ -19664,81 +19574,28 @@ async function enrollPasskey(params) {
|
|
|
19664
19574
|
type: "application/octet-stream"
|
|
19665
19575
|
}
|
|
19666
19576
|
);
|
|
19667
|
-
debugLog("Step 5: Blob prepared", { blobSize: blob.size });
|
|
19668
|
-
debugLog("Step 6: Converting blob to base64...");
|
|
19669
19577
|
const blobB64 = await blobToBase64(blob);
|
|
19670
|
-
|
|
19671
|
-
|
|
19672
|
-
|
|
19673
|
-
try {
|
|
19674
|
-
uploadResponse = await client.post("/blob/upload", {
|
|
19675
|
-
blobB64
|
|
19676
|
-
});
|
|
19677
|
-
debugLog("Step 6: Upload response", uploadResponse);
|
|
19678
|
-
} catch (err) {
|
|
19679
|
-
debugLog("Step 6: Blob upload FAILED", {
|
|
19680
|
-
error: err,
|
|
19681
|
-
errorMessage: err instanceof Error ? err.message : String(err)
|
|
19682
|
-
});
|
|
19683
|
-
throw err;
|
|
19684
|
-
}
|
|
19578
|
+
const uploadResponse = await client.post("/blob/upload", {
|
|
19579
|
+
blobB64
|
|
19580
|
+
});
|
|
19685
19581
|
const blobUrl = uploadResponse?.key;
|
|
19686
19582
|
if (!blobUrl) {
|
|
19687
|
-
debugLog("Step 6: Missing blob URL in response", uploadResponse);
|
|
19688
19583
|
throw new Error("Failed to upload blob: missing key");
|
|
19689
19584
|
}
|
|
19690
|
-
|
|
19691
|
-
debugLog("Step 7: Deriving address from seed...");
|
|
19692
|
-
let keypair;
|
|
19693
|
-
try {
|
|
19694
|
-
keypair = sdkCore.deriveEvmKey({ masterSeed: masterKeyHandle.seed });
|
|
19695
|
-
debugLog("Step 7: Keypair derived", { address: keypair.address });
|
|
19696
|
-
} catch (err) {
|
|
19697
|
-
debugLog("Step 7: Key derivation FAILED", {
|
|
19698
|
-
error: err,
|
|
19699
|
-
errorMessage: err instanceof Error ? err.message : String(err)
|
|
19700
|
-
});
|
|
19701
|
-
throw err;
|
|
19702
|
-
}
|
|
19585
|
+
const keypair = sdkCore.deriveEvmKey({ masterSeed: masterKeyHandle.seed });
|
|
19703
19586
|
const address = keypair.address;
|
|
19704
19587
|
const platform = detectPlatform();
|
|
19705
|
-
|
|
19588
|
+
const registerResponse = await client.post("/wallet/provider/register", {
|
|
19706
19589
|
keyStorageType: "passkey",
|
|
19707
19590
|
credentialId,
|
|
19708
19591
|
blobUrl,
|
|
19592
|
+
prfInput: {
|
|
19593
|
+
projectId,
|
|
19594
|
+
credentialId
|
|
19595
|
+
},
|
|
19709
19596
|
address,
|
|
19710
19597
|
platform
|
|
19711
19598
|
});
|
|
19712
|
-
let registerResponse;
|
|
19713
|
-
try {
|
|
19714
|
-
registerResponse = await client.post("/wallet/provider/register", {
|
|
19715
|
-
keyStorageType: "passkey",
|
|
19716
|
-
credentialId,
|
|
19717
|
-
blobUrl,
|
|
19718
|
-
prfInput: {
|
|
19719
|
-
projectId,
|
|
19720
|
-
credentialId
|
|
19721
|
-
},
|
|
19722
|
-
address,
|
|
19723
|
-
platform
|
|
19724
|
-
// For UX hints when authenticating on different devices
|
|
19725
|
-
});
|
|
19726
|
-
debugLog("Step 8: Provider registered", {
|
|
19727
|
-
providerId: registerResponse?.id,
|
|
19728
|
-
hasUser: !!registerResponse?.user
|
|
19729
|
-
});
|
|
19730
|
-
} catch (err) {
|
|
19731
|
-
debugLog("Step 8: Provider registration FAILED", {
|
|
19732
|
-
error: err,
|
|
19733
|
-
errorMessage: err instanceof Error ? err.message : String(err)
|
|
19734
|
-
});
|
|
19735
|
-
throw err;
|
|
19736
|
-
}
|
|
19737
|
-
debugLog("Enrollment completed successfully!", {
|
|
19738
|
-
credentialId,
|
|
19739
|
-
blobUrl,
|
|
19740
|
-
address
|
|
19741
|
-
});
|
|
19742
19599
|
return {
|
|
19743
19600
|
credentialId,
|
|
19744
19601
|
blobUrl,
|
|
@@ -19752,7 +19609,6 @@ async function enrollPasskey(params) {
|
|
|
19752
19609
|
user: registerResponse.user
|
|
19753
19610
|
};
|
|
19754
19611
|
} finally {
|
|
19755
|
-
debugLog("Cleanup: Destroying master key handle");
|
|
19756
19612
|
masterKeyHandle.destroy();
|
|
19757
19613
|
}
|
|
19758
19614
|
}
|