@seams/wallet-server 0.9.4 → 0.10.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/artifact-manifest.json +51 -31
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/migrations/deriver-a/0020_registration_preparation.sql +7 -0
- package/cloudflare-router-ab/migrations/deriver-b/0020_registration_preparation.sql +7 -0
- package/dist/esm/cloud-host.js +9 -9
- package/dist/esm/core/d1Ed25519SignerRead.js +3 -19
- package/dist/esm/hosted-wallet-gateway.js +15 -1
- package/dist/esm/localHostedWalletGatewayHandler.js +1 -1
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +26 -20
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +21 -2
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupRateLimit.js +34 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +17 -16
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +45 -65
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +101 -9
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +2 -0
- package/dist/esm/router/cloudflare-adaptor.js +7 -7
- package/dist/esm/router/cloudflare.js +8812 -8594
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +45 -24
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +52 -3
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +1 -1
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +13 -5
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +41 -7
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +1 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +24 -4
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +24 -14
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +10 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +45 -5
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +48 -8
- package/dist/esm/router/express.js +107 -16
- package/dist/esm/router/framework/registrationSetupRateLimit.js +0 -0
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +3 -2
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
- package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +12 -0
- package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +1 -4
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +50 -6
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupRateLimit.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +1 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +18 -4
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +35 -4
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.d.ts +1 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +7 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +2 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +5 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +18 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.d.ts +39 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +6 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +16 -2
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +1 -0
- package/dist/types/wallet-server/src/router/framework/registrationSetupRateLimit.d.ts +11 -0
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +1 -0
- package/migrations/d1-signer/0079_tenant_lookup_indexes.sql +33 -0
- package/migrations/d1-signer/0080_registration_setup_rate_limits.sql +11 -0
- package/package.json +1 -1
- package/src/README.md +1 -1
|
@@ -3,6 +3,7 @@ import { parseDeviceId } from "../../../../shared-ts/src/authorization/capabilit
|
|
|
3
3
|
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
4
4
|
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
5
5
|
import { parseWalletAddAuthMethodRegistrationOptions } from "../../../../shared-ts/src/utils/addAuthMethodRegistration.js";
|
|
6
|
+
import { parseRouterAbMpcMaterialActivationRef } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
|
|
6
7
|
import { parseRouterAbEd25519YaoRegistrationActivationAdmissionReceiptV1, parseRouterAbEd25519YaoRegistrationActivationResultV1, parseRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
7
8
|
import { deriveEvmFamilySigningKeySlotId } from "../../../../shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js";
|
|
8
9
|
import { derivationClientSharePublicKey33B64uFromString, ecdsaClientRootPublicKey33B64uFromString } from "../../../../shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js";
|
|
@@ -23,7 +24,7 @@ import "../../../../shared-ts/src/signing-lanes/index.js";
|
|
|
23
24
|
import { parsePasskeyCustodyEnvelopeRecord } from "../../../../shared-ts/src/passkey-custody/custodyEnvelope.js";
|
|
24
25
|
import "../../../../shared-ts/src/passkey-custody/index.js";
|
|
25
26
|
import { parseImplicitNearAccountId, parseNamedNearAccountId } from "../../../../shared-ts/src/utils/near.js";
|
|
26
|
-
import { normalizeAddSignerSelection, normalizeRegistrationSignerPlan, registrationSignerBranchKeyFromString, registrationSignerSetSelectionFromPlan } from "../../../../shared-ts/src/utils/registrationSignerPlan.js";
|
|
27
|
+
import { findRegistrationSignerPlanNearEd25519Branch, normalizeAddSignerSelection, normalizeRegistrationSignerPlan, registrationSignerBranchKeyFromString, registrationSignerSetSelectionFromPlan } from "../../../../shared-ts/src/utils/registrationSignerPlan.js";
|
|
27
28
|
import { addAuthMethodIntentGrantFromString, addSignerIntentGrantFromString, normalizeAddAuthMethodIntentCaller } from "../../../../shared-ts/src/utils/registrationIntent.js";
|
|
28
29
|
import { parseEcdsaDerivationPublicIdentity, parseThresholdEd25519AuthorityScope, thresholdEd25519AuthorityScopeFromWalletAuthAuthority, thresholdEd25519AuthorityScopesMatch } from "../../../../core/ThresholdService/validation.js";
|
|
29
30
|
import { toRecordValue } from "../auth/d1RouterApiAuthBoundary.js";
|
|
@@ -172,7 +173,8 @@ function parseD1StoredWalletRegistrationCeremony(raw) {
|
|
|
172
173
|
const signerState = parseD1StoredWalletRegistrationSignerState(record.signerState);
|
|
173
174
|
const signingRootId = normalizeOptionalTrimmedString(record.signingRootId);
|
|
174
175
|
const signingRootVersion = normalizeOptionalTrimmedString(record.signingRootVersion);
|
|
175
|
-
|
|
176
|
+
const ed25519YaoMint = parseD1WalletRegistrationEd25519YaoMint(record.ed25519YaoMint);
|
|
177
|
+
if (!registrationCeremonyId || !intent || !digestB64u || !orgId || !signingRootId || !signingRootVersion || !foundingWalletAuthorityId.ok || !foundingDeviceId.ok || !foundingWalletAuthMethodId.ok || expiresAtMs === null || !authorityState || !signerPlan || !preparedContext || !intentSignerPlan || !storedRegistrationSignerPlansMatch(signerPlan, intentSignerPlan) || signingRootId && preparedContext.signingRootId !== signingRootId || signingRootVersion && preparedContext.signingRootVersion !== signingRootVersion || !signerState || ed25519YaoMint === void 0 || ed25519YaoMint === null !== (findRegistrationSignerPlanNearEd25519Branch(signerPlan) === null)) return null;
|
|
176
178
|
const ceremony = {
|
|
177
179
|
registrationCeremonyId,
|
|
178
180
|
foundingWalletAuthorityId: foundingWalletAuthorityId.value,
|
|
@@ -185,6 +187,7 @@ function parseD1StoredWalletRegistrationCeremony(raw) {
|
|
|
185
187
|
orgId,
|
|
186
188
|
expiresAtMs,
|
|
187
189
|
authorityState,
|
|
190
|
+
ed25519YaoMint,
|
|
188
191
|
signerState
|
|
189
192
|
};
|
|
190
193
|
const expectedOrigin = normalizeOptionalTrimmedString(record.expectedOrigin);
|
|
@@ -193,6 +196,22 @@ function parseD1StoredWalletRegistrationCeremony(raw) {
|
|
|
193
196
|
if (expectedOrigin) ceremony.expectedOrigin = expectedOrigin;
|
|
194
197
|
return ceremony;
|
|
195
198
|
}
|
|
199
|
+
/** `undefined` for a record that is not a mint and not `null`. */
|
|
200
|
+
function parseD1WalletRegistrationEd25519YaoMint(raw) {
|
|
201
|
+
if (raw === null) return null;
|
|
202
|
+
const record = toRecordValue(raw);
|
|
203
|
+
if (!record || !hasExactKeys(record, ["materialActivation", "sessionId"])) return void 0;
|
|
204
|
+
const sessionId = parseD1Bytes32(record.sessionId);
|
|
205
|
+
if (!sessionId || sessionId.every((byte) => byte === 0)) return void 0;
|
|
206
|
+
try {
|
|
207
|
+
return {
|
|
208
|
+
materialActivation: parseRouterAbMpcMaterialActivationRef(record.materialActivation),
|
|
209
|
+
sessionId
|
|
210
|
+
};
|
|
211
|
+
} catch {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
196
215
|
/**
|
|
197
216
|
* Setup creates the ceremony before the WebAuthn proof exists, so the stored
|
|
198
217
|
* authority is a two-arm state rather than a required record.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { sha256HexUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
2
|
+
import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
|
|
3
|
+
//#region src/router/cloudflare/d1/registration/d1RegistrationSetupRateLimit.ts
|
|
4
|
+
/** Regional counters bound the work that runs before a passkey is verified. */
|
|
5
|
+
async function consumeRegistrationSetupRateLimit(database, namespace, input) {
|
|
6
|
+
const scope = {
|
|
7
|
+
namespace,
|
|
8
|
+
orgId: input.orgId,
|
|
9
|
+
projectId: input.projectId,
|
|
10
|
+
envId: input.envId
|
|
11
|
+
};
|
|
12
|
+
const key = await sha256HexUtf8(JSON.stringify([input.apiKeyId, input.sourceIp]));
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
const results = await database.batch([database.prepare(`DELETE FROM registration_setup_rate_limits WHERE rowid IN (
|
|
15
|
+
SELECT rowid FROM registration_setup_rate_limits WHERE reset_at_ms <= ? LIMIT 100
|
|
16
|
+
)`).bind(now), prepareD1TenantStatement(database, scope, `INSERT INTO registration_setup_rate_limits
|
|
17
|
+
(namespace, org_id, project_id, env_id, rate_key, consumed_count, reset_at_ms)
|
|
18
|
+
VALUES (?1, ?2, ?3, ?4, ?5, 1, ?7)
|
|
19
|
+
ON CONFLICT (namespace, org_id, project_id, env_id, rate_key) DO UPDATE SET
|
|
20
|
+
consumed_count = CASE WHEN reset_at_ms <= ?6 THEN 1 ELSE consumed_count + 1 END,
|
|
21
|
+
reset_at_ms = CASE WHEN reset_at_ms <= ?6 THEN ?7 ELSE reset_at_ms END
|
|
22
|
+
WHERE reset_at_ms <= ?6 OR consumed_count < 30
|
|
23
|
+
RETURNING consumed_count`, [
|
|
24
|
+
key,
|
|
25
|
+
now,
|
|
26
|
+
now + 6e4
|
|
27
|
+
])]);
|
|
28
|
+
if (results.length !== 2 || !results[0].success || !results[1].success) throw new Error("Registration setup rate limit is unavailable");
|
|
29
|
+
return { allowed: results[1].results?.length === 1 };
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { consumeRegistrationSetupRateLimit };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=d1RegistrationSetupRateLimit.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mpcMaterialActivationRefsEqual } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
1
|
+
import { mpcMaterialActivationRefsEqual, parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
2
|
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
3
3
|
import { parseWalletAuthMethodRecordV2, sameWalletAuthMethodRecordV2 } from "../../../../shared-ts/src/utils/walletAuthMethodRecord.js";
|
|
4
4
|
import { parseWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
|
|
@@ -11,8 +11,8 @@ import { prepareD1WebAuthnCredentialBindingPutStatement } from "../../../../core
|
|
|
11
11
|
import { prepareD1WebAuthnAuthenticatorPutStatement } from "../webauthn/d1WebAuthnStore.js";
|
|
12
12
|
import { prepareD1WalletSessionAuthorityProjectionStatements } from "../authorization/walletSessionAuthorityProjection.js";
|
|
13
13
|
import { prepareD1WalletAuthorityExtensionCasGuard, prepareD1WalletAuthorityExtensionStatement, prepareD1WalletAuthorityPutStatement } from "../wallet/d1WalletAuthorityStore.js";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { lifecycleWriteFenceStatements } from "../ed25519Yao/d1Ed25519YaoStateWriteFence.js";
|
|
15
|
+
import { validateRouterAbEd25519YaoRegistrationCapability } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js";
|
|
16
16
|
//#region src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.ts
|
|
17
17
|
function requireScopeString(value, field) {
|
|
18
18
|
const normalized = normalizeOptionalTrimmedString(value);
|
|
@@ -261,14 +261,12 @@ var CloudflareD1WalletRegistrationCommitStore = class {
|
|
|
261
261
|
}
|
|
262
262
|
async commit(authority, input, executeBatch) {
|
|
263
263
|
assertCommitWalletIdentity(input, authority);
|
|
264
|
+
const fenced = [];
|
|
264
265
|
const ed25519Signer = input.walletSigners.find(isEd25519Signer);
|
|
265
266
|
if (ed25519Signer) {
|
|
266
267
|
const capability = ed25519Signer.activeYaoCapability;
|
|
267
268
|
if (capability.version !== "wallet_ed25519_yao_registration_capability_v1") throw new Error("A registration commit requires its registration capability");
|
|
268
|
-
const
|
|
269
|
-
database: this.database,
|
|
270
|
-
scope: this.scope
|
|
271
|
-
}), {
|
|
269
|
+
const validated = validateRouterAbEd25519YaoRegistrationCapability({
|
|
272
270
|
kind: "router_ab_ed25519_yao_registration_finalize_capability_v1",
|
|
273
271
|
activeCapabilityBinding: capability.activeCapabilityBinding,
|
|
274
272
|
nearAccountId: capability.nearAccountId,
|
|
@@ -276,11 +274,17 @@ var CloudflareD1WalletRegistrationCommitStore = class {
|
|
|
276
274
|
registrationAdmissionReceipt: capability.admissionReceipt,
|
|
277
275
|
registrationResult: capability.activationResult,
|
|
278
276
|
runtimePolicyScope: capability.runtimePolicyScope
|
|
279
|
-
}
|
|
280
|
-
if (!
|
|
281
|
-
|
|
277
|
+
});
|
|
278
|
+
if (!validated.ok) throw new Error(validated.message);
|
|
279
|
+
const capabilityWallet = parseWalletId(capability.admissionRequest.application_binding.wallet_id);
|
|
280
|
+
if (!capabilityWallet.ok) throw new Error("Lifecycle wallet owner is invalid");
|
|
281
|
+
fenced.push(...lifecycleWriteFenceStatements({
|
|
282
|
+
database: this.database,
|
|
283
|
+
scope: this.scope
|
|
284
|
+
}, new Set([capabilityWallet.value, input.wallet.walletId])));
|
|
282
285
|
}
|
|
283
|
-
const
|
|
286
|
+
const prepared = await prepareWalletWrite(this.database, this.scope, authority, input);
|
|
287
|
+
const statements = [...fenced, ...prepared.statements];
|
|
284
288
|
const results = executeBatch ? await executeBatch(statements) : await this.database.batch(statements);
|
|
285
289
|
assertBatchSucceeded({
|
|
286
290
|
expectedStatementCount: statements.length,
|
|
@@ -288,7 +292,7 @@ var CloudflareD1WalletRegistrationCommitStore = class {
|
|
|
288
292
|
});
|
|
289
293
|
}
|
|
290
294
|
};
|
|
291
|
-
async function prepareWalletWrite(database, scope, authority, input
|
|
295
|
+
async function prepareWalletWrite(database, scope, authority, input) {
|
|
292
296
|
const foundingStatements = await prepareFoundingStatements({
|
|
293
297
|
database,
|
|
294
298
|
scope,
|
|
@@ -316,10 +320,7 @@ async function prepareWalletWrite(database, scope, authority, input, executeBatc
|
|
|
316
320
|
foundingStatements,
|
|
317
321
|
now: input.now
|
|
318
322
|
}), ...emailOtpCommitStatements(input), ...input.decisionStatements);
|
|
319
|
-
return {
|
|
320
|
-
statements,
|
|
321
|
-
executeBatch
|
|
322
|
-
};
|
|
323
|
+
return { statements };
|
|
323
324
|
}
|
|
324
325
|
function isEd25519Signer(signer) {
|
|
325
326
|
return signer.version === "wallet_signer_ed25519_v1";
|
|
@@ -25,12 +25,14 @@ import "../../../../shared-ts/src/passkey-custody/index.js";
|
|
|
25
25
|
import { parseImplicitNearAccountId, parseNamedNearAccountId } from "../../../../shared-ts/src/utils/near.js";
|
|
26
26
|
import { registrationNearEd25519BranchKey } from "../../../../shared-ts/src/utils/registrationSignerPlan.js";
|
|
27
27
|
import { registrationIntentGrantFromString } from "../../../../shared-ts/src/utils/registrationIntent.js";
|
|
28
|
+
import { createRouterAbTraceContextV1 } from "../../../../shared-ts/src/utils/routerAbTraceContext.js";
|
|
28
29
|
import { buildTenantRootIdentityFromAuthenticatedDeploymentV1 } from "../../../../shared-ts/src/tenant-root/tenantRootIdentity.js";
|
|
29
30
|
import { DEFAULT_WALLET_SESSION_TTL_MS } from "../../../../shared-ts/src/threshold/sessionPolicy.js";
|
|
30
31
|
import { parseEcdsaDerivationPublicIdentity, thresholdEd25519AuthorityScopeFromWalletAuthAuthority } from "../../../../core/ThresholdService/validation.js";
|
|
31
32
|
import { walletAuthAuthorityFromRegistrationAuthority, walletRegistrationFinalizeAuthMethodFromAuthority } from "../wallet/d1WalletAuthMethodBoundary.js";
|
|
32
33
|
import { buildRouterAbEd25519YaoRegistrationCapabilityRecordV1 } from "../../../domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js";
|
|
33
|
-
import { buildRouterAbEd25519YaoProductAdmissionRequestV1,
|
|
34
|
+
import { buildRouterAbEd25519YaoProductAdmissionRequestV1, projectRouterAbEd25519YaoExactWalletSession } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js";
|
|
35
|
+
import { routerAbEd25519YaoRegistrationExecutionTimingEntriesV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js";
|
|
34
36
|
import { runRouterAbEd25519YaoRegistrationSideEffectV2, throwIfRouterAbEd25519YaoRetryableSideEffectFailureV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
|
|
35
37
|
import { buildYaoEd25519WalletSignerRecord, ed25519NearPublicKeyFromBytes, implicitNearAccountIdFromEd25519PublicKeyBytes } from "../ed25519Yao/d1Ed25519YaoWalletSigner.js";
|
|
36
38
|
import { buildStoredWalletRegistrationEvmFamilyEcdsaFinalizedBranch, buildStoredWalletRegistrationNearEd25519YaoAuthorizedBranch, findStoredWalletRegistrationEvmFamilyEcdsaBranch, findStoredWalletRegistrationNearEd25519YaoBranch, replaceStoredWalletRegistrationSignerBranch, storedRegistrationAuthoritiesMatch, verifiedRegistrationCeremonyAuthority } from "../../../../core/RegistrationCeremonyStore.js";
|
|
@@ -51,7 +53,9 @@ import { commitWalletRegistration } from "./d1WalletRegistrationInitialSession.j
|
|
|
51
53
|
import { storedRespondEd25519DeferredWork, walletRegistrationRespondResult } from "./d1WalletRegistrationSetup.js";
|
|
52
54
|
import { executeD1WalletRegistrationSetup } from "./d1WalletRegistrationSetupExecution.js";
|
|
53
55
|
//#region src/router/cloudflare/d1/registration/d1WalletRegistrationService.ts
|
|
56
|
+
/** The admission request of a NEAR branch, over the identity that setup minted. */
|
|
54
57
|
async function buildRespondEd25519AdmissionRequest(input) {
|
|
58
|
+
const mint = requireRegistrationEd25519YaoMint(input.ceremony);
|
|
55
59
|
return buildRouterAbEd25519YaoProductAdmissionRequestV1({
|
|
56
60
|
registrationCeremonyId: input.ceremony.registrationCeremonyId,
|
|
57
61
|
walletId: input.ceremony.intent.walletId,
|
|
@@ -60,12 +64,16 @@ async function buildRespondEd25519AdmissionRequest(input) {
|
|
|
60
64
|
authorityScope: registrationEd25519AuthorityScopeFromAuthority(input.authority),
|
|
61
65
|
branch: input.branch,
|
|
62
66
|
signingWorkerId: input.signingWorkerId,
|
|
63
|
-
materialActivation:
|
|
64
|
-
walletId: input.ceremony.intent.walletId,
|
|
65
|
-
signingWorkerId: input.signingWorkerId
|
|
66
|
-
})
|
|
67
|
+
materialActivation: mint.materialActivation
|
|
67
68
|
});
|
|
68
69
|
}
|
|
70
|
+
function ignoreRespondExecutionFailure() {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function requireRegistrationEd25519YaoMint(ceremony) {
|
|
74
|
+
if (!ceremony.ed25519YaoMint) throw new Error("Registration ceremony has no NEAR branch identity");
|
|
75
|
+
return ceremony.ed25519YaoMint;
|
|
76
|
+
}
|
|
69
77
|
function sameEd25519ParticipantIds(left, right) {
|
|
70
78
|
return left[0] === right[0] && left[1] === right[1];
|
|
71
79
|
}
|
|
@@ -122,24 +130,6 @@ function linkedEcdsaProjectionMatchesSigner(projection, signer) {
|
|
|
122
130
|
function sameLinkedEcdsaResolvedSignerIdentity(left, right) {
|
|
123
131
|
return left.walletId === right.walletId && left.walletKey.keyHandle === right.walletKey.keyHandle && left.walletKey.relayerKeyId === right.walletKey.relayerKeyId && left.walletKey.participantIds[0] === right.walletKey.participantIds[0] && left.walletKey.participantIds[1] === right.walletKey.participantIds[1] && sameRouterAbEcdsaDerivationPublicCapabilityV1(left.walletKey.publicCapability, right.walletKey.publicCapability) && sameWalletRuntimePolicyScope(left.runtimePolicyScope, right.runtimePolicyScope);
|
|
124
132
|
}
|
|
125
|
-
async function ed25519ExportIdentityFromActiveCapability(descriptor) {
|
|
126
|
-
return {
|
|
127
|
-
scope: {
|
|
128
|
-
lifecycle_id: descriptor.lifecycle.lifecycleId,
|
|
129
|
-
root_share_epoch: descriptor.lifecycle.rootShareEpoch,
|
|
130
|
-
account_id: descriptor.lifecycle.accountId,
|
|
131
|
-
threshold_session_id: descriptor.lifecycle.thresholdSessionId,
|
|
132
|
-
signer_set_id: descriptor.lifecycle.signerSetId,
|
|
133
|
-
signing_worker_id: descriptor.lifecycle.signingWorkerId,
|
|
134
|
-
material_activation: descriptor.materialActivation
|
|
135
|
-
},
|
|
136
|
-
application_binding: descriptor.applicationBinding,
|
|
137
|
-
participant_ids: descriptor.participantIds,
|
|
138
|
-
registered_public_key: descriptor.registeredPublicKey,
|
|
139
|
-
state_epoch: descriptor.stateEpoch,
|
|
140
|
-
runtime_policy_binding: await deriveRouterAbEd25519YaoRuntimePolicyBindingV1(descriptor.runtimePolicyScope)
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
133
|
async function ed25519ExportIdentityFromPersistedCapability(capability) {
|
|
144
134
|
const binding = capability.activationResult.binding;
|
|
145
135
|
return {
|
|
@@ -939,45 +929,12 @@ var CloudflareD1WalletRegistrationService = class {
|
|
|
939
929
|
exportIdentity: await ed25519ExportIdentityFromLinkedProjection(projection, active.capability)
|
|
940
930
|
};
|
|
941
931
|
}
|
|
942
|
-
|
|
943
|
-
kind: "router_ab_ed25519_yao_active_capability_lookup_v1",
|
|
944
|
-
walletId: input.walletId,
|
|
945
|
-
nearEd25519SigningKeyId: signer.nearEd25519SigningKeyId,
|
|
946
|
-
signerSlot: signer.signerSlot,
|
|
947
|
-
signingWorkerId: signer.signingWorkerId,
|
|
948
|
-
participantIds: signer.participantIds
|
|
949
|
-
};
|
|
950
|
-
const active = input.signerRead?.resolveActiveCapability(lookup) ?? await yaoRuntime.resolveActiveCapability(lookup);
|
|
951
|
-
if (!active.ok) {
|
|
952
|
-
if (active.code === "unknown_capability") {
|
|
953
|
-
if (!sameRouterAbMpcMaterialActivationRef(signer.activeYaoCapability.activationResult.binding.material_activation, input.materialActivation)) return {
|
|
954
|
-
ok: false,
|
|
955
|
-
code: "not_found",
|
|
956
|
-
message: "Ed25519 material activation does not match the persisted capability"
|
|
957
|
-
};
|
|
958
|
-
return await activeEd25519MaterialFromPersistedSigner(signer);
|
|
959
|
-
}
|
|
960
|
-
return {
|
|
961
|
-
ok: false,
|
|
962
|
-
code: "internal",
|
|
963
|
-
message: active.message
|
|
964
|
-
};
|
|
965
|
-
}
|
|
966
|
-
if (!sameRouterAbMpcMaterialActivationRef(active.capability.materialActivation, input.materialActivation)) return {
|
|
932
|
+
if (!sameRouterAbMpcMaterialActivationRef(signer.activeYaoCapability.activationResult.binding.material_activation, input.materialActivation)) return {
|
|
967
933
|
ok: false,
|
|
968
934
|
code: "not_found",
|
|
969
|
-
message: "Ed25519 material activation does not match the
|
|
970
|
-
};
|
|
971
|
-
return {
|
|
972
|
-
ok: true,
|
|
973
|
-
materialActivation: active.capability.materialActivation,
|
|
974
|
-
nearAccountId: active.capability.nearAccountId,
|
|
975
|
-
signerSlot: signer.signerSlot,
|
|
976
|
-
signingWorkerId: signer.signingWorkerId,
|
|
977
|
-
participantIds: signer.participantIds,
|
|
978
|
-
runtimePolicyScope: active.capability.runtimePolicyScope,
|
|
979
|
-
exportIdentity: await ed25519ExportIdentityFromActiveCapability(active.capability)
|
|
935
|
+
message: "Ed25519 material activation does not match the persisted capability"
|
|
980
936
|
};
|
|
937
|
+
return await activeEd25519MaterialFromPersistedSigner(signer);
|
|
981
938
|
} catch (error) {
|
|
982
939
|
return {
|
|
983
940
|
ok: false,
|
|
@@ -1588,6 +1545,7 @@ var CloudflareD1WalletRegistrationService = class {
|
|
|
1588
1545
|
reservation: this.registrationAuthority,
|
|
1589
1546
|
store: this.getRegistrationCeremonyIntentStore(),
|
|
1590
1547
|
ecdsaStrictRegistration: this.ecdsaStrictRegistration,
|
|
1548
|
+
ed25519Yao: this.getEd25519YaoProductRegistration(),
|
|
1591
1549
|
startRegistrationWallets: this.startRegistrationWallets
|
|
1592
1550
|
});
|
|
1593
1551
|
}
|
|
@@ -1768,8 +1726,16 @@ var CloudflareD1WalletRegistrationService = class {
|
|
|
1768
1726
|
startedDispatchRoot,
|
|
1769
1727
|
expectedOrigin,
|
|
1770
1728
|
waitUntil,
|
|
1729
|
+
ed25519Execution: input.ed25519Execution ?? null,
|
|
1730
|
+
traceContext: traceContext ?? null,
|
|
1731
|
+
serverTiming,
|
|
1771
1732
|
...input.userAgent ? { userAgent: input.userAgent } : {}
|
|
1772
1733
|
});
|
|
1734
|
+
if (input.ed25519Execution) return {
|
|
1735
|
+
ok: false,
|
|
1736
|
+
code: "invalid_body",
|
|
1737
|
+
message: "only an Ed25519-only respond carries its Yao execution"
|
|
1738
|
+
};
|
|
1773
1739
|
if (!ecdsaBranch) return {
|
|
1774
1740
|
ok: false,
|
|
1775
1741
|
code: "invalid_state",
|
|
@@ -2641,7 +2607,7 @@ var CloudflareD1WalletRegistrationService = class {
|
|
|
2641
2607
|
}, stored ? null : (bound) => ceremonyStore.prepareEcdsaClaimCommit({
|
|
2642
2608
|
expected: input.snapshot,
|
|
2643
2609
|
next: authorizedCeremony(bound)
|
|
2644
|
-
}), input.startedDispatchRoot);
|
|
2610
|
+
}), input.startedDispatchRoot, requireRegistrationEd25519YaoMint(ceremony).sessionId);
|
|
2645
2611
|
if (!admitted.ok) return {
|
|
2646
2612
|
ok: false,
|
|
2647
2613
|
code: admitted.code,
|
|
@@ -2661,14 +2627,28 @@ var CloudflareD1WalletRegistrationService = class {
|
|
|
2661
2627
|
reason: errorMessage(error)
|
|
2662
2628
|
});
|
|
2663
2629
|
}));
|
|
2630
|
+
const admission = {
|
|
2631
|
+
admissionRequest: admitted.admissionRequest,
|
|
2632
|
+
admissionReceipt: admitted.value
|
|
2633
|
+
};
|
|
2634
|
+
const execution = input.ed25519Execution ? await runtime.executeAdmittedRegistration({
|
|
2635
|
+
request: input.ed25519Execution,
|
|
2636
|
+
credential: input.registrationBearerToken,
|
|
2637
|
+
trace: input.traceContext ?? createRouterAbTraceContextV1()
|
|
2638
|
+
}).catch(ignoreRespondExecutionFailure) : null;
|
|
2639
|
+
if (execution) input.serverTiming.push(...routerAbEd25519YaoRegistrationExecutionTimingEntriesV1(execution.timing));
|
|
2640
|
+
const executed = execution?.result ?? null;
|
|
2664
2641
|
return {
|
|
2665
2642
|
ok: true,
|
|
2666
2643
|
registrationCeremonyId: ceremony.registrationCeremonyId,
|
|
2667
2644
|
kind: "near_ed25519",
|
|
2668
|
-
ed25519: {
|
|
2645
|
+
ed25519: executed?.ok ? {
|
|
2646
|
+
status: "executed",
|
|
2647
|
+
...admission,
|
|
2648
|
+
activationResult: executed.value
|
|
2649
|
+
} : {
|
|
2669
2650
|
status: "admitted",
|
|
2670
|
-
|
|
2671
|
-
admissionReceipt: admitted.value
|
|
2651
|
+
...admission
|
|
2672
2652
|
}
|
|
2673
2653
|
};
|
|
2674
2654
|
}
|
|
@@ -2696,14 +2676,14 @@ var CloudflareD1WalletRegistrationService = class {
|
|
|
2696
2676
|
authority: input.authority,
|
|
2697
2677
|
signingWorkerId: yaoRuntime.signingWorkerId
|
|
2698
2678
|
});
|
|
2699
|
-
const admitted = await yaoRuntime.
|
|
2679
|
+
const admitted = await yaoRuntime.bindAndAdmitVerifiedRegistration({
|
|
2700
2680
|
kind: "verified_registration_intent",
|
|
2701
2681
|
ownershipGeneration: input.ownershipGeneration,
|
|
2702
2682
|
registrationIntentGrant: registrationIntentGrantFromString(input.registrationBearerToken),
|
|
2703
2683
|
intent: input.ceremony.intent,
|
|
2704
2684
|
admissionRequest,
|
|
2705
2685
|
expiresAtMs: input.ceremony.expiresAtMs
|
|
2706
|
-
});
|
|
2686
|
+
}, null, null, requireRegistrationEd25519YaoMint(input.ceremony).sessionId);
|
|
2707
2687
|
if (!admitted.ok) return {
|
|
2708
2688
|
ok: false,
|
|
2709
2689
|
code: admitted.code,
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
2
2
|
import { deriveSigningRootId } from "../../../../shared-ts/src/threshold/signingRootScope.js";
|
|
3
3
|
import { registrationPreparationIdFromString } from "../../../../core/types.js";
|
|
4
|
+
import { buildRouterAbEd25519YaoProductAdmissionRequestV1, mintRouterAbEd25519YaoRegistrationIdentityV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js";
|
|
4
5
|
import { buildStoredWalletRegistrationEvmFamilyEcdsaPreparedBranch, findStoredWalletRegistrationEvmFamilyEcdsaBranch } from "../../../../core/RegistrationCeremonyStore.js";
|
|
5
6
|
import { routerAbEcdsaStrictRegistrationFactsBindingJson } from "../../../domains/ecdsa/routerAbEcdsaStrictRegistration.js";
|
|
6
7
|
import { buildRegistrationIntent, inferRuntimePolicyScopeFromSigningRoot } from "./d1RegistrationCeremonyRecords.js";
|
|
7
8
|
import { isTransientD1Error } from "../../../../storage/d1Retry.js";
|
|
8
|
-
import { errorMessage, registrationIntentSignerBranches, registrationPreparedContextEcdsaChainTargets, resolveRegistrationPreparedContextFromPlan } from "./d1RegistrationSetupSupport.js";
|
|
9
|
+
import { errorMessage, registrationIntentSignerBranches, registrationPreparedContextEcdsaChainTargets, registrationSignerBranchesFromPlan, resolveRegistrationPreparedContextFromPlan } from "./d1RegistrationSetupSupport.js";
|
|
9
10
|
import { buildWalletRegistrationSetupSignature, normalizeWalletRegistrationSetupRequest, walletRegistrationSetupError, walletRegistrationSetupExpiresAtMs, walletRegistrationSetupIntentDigest } from "./d1WalletRegistrationSetup.js";
|
|
10
11
|
import { buildD1EvmFamilyEcdsaRegistrationPrepare } from "./d1EvmFamilyEcdsaRegistrationBranch.js";
|
|
11
12
|
//#region src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.ts
|
|
@@ -22,17 +23,48 @@ async function executeD1WalletRegistrationSetup(input, dependencies) {
|
|
|
22
23
|
const expiresAtMs = walletRegistrationSetupExpiresAtMs(reservation.reservedAtMs);
|
|
23
24
|
if (Date.now() >= expiresAtMs) return walletRegistrationSetupError("registration_expired", "Registration setup has expired");
|
|
24
25
|
const [startup, setup] = await Promise.allSettled([dependencies.startRegistrationWallets?.({
|
|
26
|
+
kind: "objects",
|
|
25
27
|
walletId: wallet.walletId,
|
|
26
28
|
ownershipGeneration: admitted.ownershipGeneration
|
|
27
29
|
}), completeReservedRegistrationSetup(input, dependencies, admitted, normalized, expiresAtMs)]);
|
|
28
30
|
if (setup.status === "rejected") throw setup.reason;
|
|
29
31
|
if (!setup.value.ok) return setup.value;
|
|
30
32
|
if (startup.status === "rejected") throw startup.reason;
|
|
33
|
+
if (dependencies.startRegistrationWallets) try {
|
|
34
|
+
const preparation = await describeCommittedSetupPair(setup.value, dependencies);
|
|
35
|
+
if (preparation.status === "described") await dependencies.startRegistrationWallets({
|
|
36
|
+
kind: "pair",
|
|
37
|
+
walletId: wallet.walletId,
|
|
38
|
+
ownershipGeneration: admitted.ownershipGeneration,
|
|
39
|
+
admissionRequest: preparation.admissionRequest,
|
|
40
|
+
admissionReceipt: preparation.admissionReceipt,
|
|
41
|
+
expiresAtMs
|
|
42
|
+
});
|
|
43
|
+
} catch {
|
|
44
|
+
console.warn("[wallet-registration] pair preparation unavailable");
|
|
45
|
+
}
|
|
31
46
|
return setup.value;
|
|
32
47
|
} catch (error) {
|
|
33
48
|
return walletRegistrationSetupError(isTransientD1Error(error) ? "storage_unavailable" : "internal", errorMessage(error) || "Failed to set up wallet registration");
|
|
34
49
|
}
|
|
35
50
|
}
|
|
51
|
+
async function describeCommittedSetupPair(response, dependencies) {
|
|
52
|
+
switch (response.kind) {
|
|
53
|
+
case "near_ed25519": return response.ed25519;
|
|
54
|
+
case "evm_family_ecdsa": return { status: "after_proof" };
|
|
55
|
+
case "near_ed25519_and_evm_family_ecdsa": {
|
|
56
|
+
const ceremony = await dependencies.store.getSetupCeremony(response.registrationCeremonyId);
|
|
57
|
+
if (!ceremony) throw new Error("Committed mixed registration ceremony is missing");
|
|
58
|
+
const branches = registrationSignerBranchesFromPlan(ceremony.signerPlan);
|
|
59
|
+
if (!branches.nearEd25519) throw new Error("Mixed registration has no NEAR branch");
|
|
60
|
+
return describeSetupEd25519Admission(dependencies.ed25519Yao, ceremony, branches.nearEd25519);
|
|
61
|
+
}
|
|
62
|
+
default: return assertNeverSetupResponse(response);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function assertNeverSetupResponse(value) {
|
|
66
|
+
throw new Error(`Unexpected registration setup response: ${String(value)}`);
|
|
67
|
+
}
|
|
36
68
|
async function completeReservedRegistrationSetup(input, dependencies, admitted, normalized, expiresAtMs) {
|
|
37
69
|
const reservation = admitted.reservation;
|
|
38
70
|
const wallet = { walletId: reservation.walletId };
|
|
@@ -62,12 +94,13 @@ async function completeReservedRegistrationSetup(input, dependencies, admitted,
|
|
|
62
94
|
if (existing) {
|
|
63
95
|
if (existing.digestB64u !== digestB64u || existing.expectedOrigin !== input.expectedOrigin || existing.foundingWalletAuthorityId !== reservation.walletAuthorityId || existing.foundingDeviceId !== reservation.deviceId || existing.foundingWalletAuthMethodId !== reservation.walletAuthMethodId || existing.expiresAtMs !== expiresAtMs) return walletRegistrationSetupError("reservation_conflict", "Registration setup conflicts with its reservation");
|
|
64
96
|
if (admitted.lifecycle === "reserved") await dependencies.store.reserveSetupCeremony(existing, admitted.ownershipGeneration);
|
|
65
|
-
return await setupResponseFromCeremony(input, dependencies
|
|
97
|
+
return await setupResponseFromCeremony(input, dependencies, existing);
|
|
66
98
|
}
|
|
67
99
|
if (admitted.lifecycle === "established") return walletRegistrationSetupError("registration_closed", "Completed registration setup snapshot is unavailable");
|
|
68
100
|
const ecdsaBranch = branches.value.evmFamilyEcdsa;
|
|
69
101
|
const nearEd25519Branch = branches.value.nearEd25519;
|
|
70
102
|
if (!ecdsaBranch && !nearEd25519Branch) return walletRegistrationSetupError("invalid_body", "registration signer branch is required");
|
|
103
|
+
if (nearEd25519Branch && !dependencies.ed25519Yao) return walletRegistrationSetupError("not_configured", "Ed25519 Yao registration is unavailable");
|
|
71
104
|
const preparedContext = resolveRegistrationPreparedContextFromPlan({
|
|
72
105
|
signerPlan: branches.value.plan,
|
|
73
106
|
runtimePolicyScope,
|
|
@@ -120,15 +153,70 @@ async function completeReservedRegistrationSetup(input, dependencies, admitted,
|
|
|
120
153
|
kind: "awaiting_proof",
|
|
121
154
|
authMethod: normalized.authMethod
|
|
122
155
|
},
|
|
156
|
+
ed25519YaoMint: nearEd25519Branch && dependencies.ed25519Yao ? mintRouterAbEd25519YaoRegistrationIdentityV1({
|
|
157
|
+
walletId: wallet.walletId,
|
|
158
|
+
signingWorkerId: dependencies.ed25519Yao.signingWorkerId
|
|
159
|
+
}) : null,
|
|
123
160
|
signerState: {
|
|
124
161
|
kind: "signer_set_registration",
|
|
125
162
|
branches: storedBranches
|
|
126
163
|
}
|
|
127
164
|
};
|
|
128
|
-
|
|
129
|
-
|
|
165
|
+
return await setupResponseFromCeremony(input, dependencies, await dependencies.store.reserveSetupCeremony(ceremony, admitted.ownershipGeneration));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The admission that respond will issue for a passkey plan with a NEAR branch.
|
|
169
|
+
* It follows from the stored ceremony alone, so a setup retry describes the
|
|
170
|
+
* same admission. A failure to describe it withholds the description and
|
|
171
|
+
* nothing else: respond then issues the admission as its first word on it.
|
|
172
|
+
*/
|
|
173
|
+
async function describeSetupEd25519Admission(ed25519Yao, ceremony, branch) {
|
|
174
|
+
const authMethod = ceremony.intent.authMethod;
|
|
175
|
+
const mint = ceremony.ed25519YaoMint;
|
|
176
|
+
const signingRootId = normalizeOptionalTrimmedString(ceremony.signingRootId);
|
|
177
|
+
const signingRootVersion = normalizeOptionalTrimmedString(ceremony.signingRootVersion);
|
|
178
|
+
if (authMethod.kind !== "passkey" || !ed25519Yao || !mint || !signingRootId || !signingRootVersion) return { status: "after_proof" };
|
|
179
|
+
return await describedEd25519Admission({
|
|
180
|
+
ed25519Yao,
|
|
181
|
+
ceremony,
|
|
182
|
+
branch,
|
|
183
|
+
rpId: authMethod.rpId,
|
|
184
|
+
mint,
|
|
185
|
+
signingRootId,
|
|
186
|
+
signingRootVersion
|
|
187
|
+
}).catch(withholdEd25519AdmissionDescription) ?? { status: "after_proof" };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Every step that can fail is inside this one promise, so the caller's single
|
|
191
|
+
* catch covers the request as well as the receipt. A wallet id that cannot
|
|
192
|
+
* hold the branch's signing key fails here, and respond reports it as before.
|
|
193
|
+
*/
|
|
194
|
+
async function describedEd25519Admission(input) {
|
|
195
|
+
const admissionRequest = await buildRouterAbEd25519YaoProductAdmissionRequestV1({
|
|
196
|
+
registrationCeremonyId: input.ceremony.registrationCeremonyId,
|
|
197
|
+
walletId: input.ceremony.intent.walletId,
|
|
198
|
+
signingRootId: input.signingRootId,
|
|
199
|
+
signingRootVersion: input.signingRootVersion,
|
|
200
|
+
authorityScope: {
|
|
201
|
+
kind: "passkey",
|
|
202
|
+
rpId: input.rpId
|
|
203
|
+
},
|
|
204
|
+
branch: input.branch,
|
|
205
|
+
signingWorkerId: input.ed25519Yao.signingWorkerId,
|
|
206
|
+
materialActivation: input.mint.materialActivation
|
|
207
|
+
});
|
|
208
|
+
const described = await input.ed25519Yao.describeRegistrationAdmission(admissionRequest, input.mint.sessionId);
|
|
209
|
+
return described.ok ? {
|
|
210
|
+
status: "described",
|
|
211
|
+
admissionRequest,
|
|
212
|
+
admissionReceipt: described.value
|
|
213
|
+
} : null;
|
|
130
214
|
}
|
|
131
|
-
|
|
215
|
+
function withholdEd25519AdmissionDescription() {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
async function setupResponseFromCeremony(input, dependencies, ceremony) {
|
|
219
|
+
const home = dependencies.home;
|
|
132
220
|
const { signedSetup } = await buildWalletRegistrationSetupSignature({
|
|
133
221
|
signer: input.signer,
|
|
134
222
|
ceremony,
|
|
@@ -146,10 +234,14 @@ async function setupResponseFromCeremony(input, home, ceremony) {
|
|
|
146
234
|
intent: ceremony.intent,
|
|
147
235
|
signedSetup
|
|
148
236
|
};
|
|
149
|
-
if (!branches.value.evmFamilyEcdsa)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
237
|
+
if (!branches.value.evmFamilyEcdsa) {
|
|
238
|
+
if (!branches.value.nearEd25519) return walletRegistrationSetupError("invalid_state", "Registration setup has no signer");
|
|
239
|
+
return {
|
|
240
|
+
...success,
|
|
241
|
+
kind: "near_ed25519",
|
|
242
|
+
ed25519: await describeSetupEd25519Admission(dependencies.ed25519Yao, ceremony, branches.value.nearEd25519)
|
|
243
|
+
};
|
|
244
|
+
}
|
|
153
245
|
if (ceremony.signerState.kind !== "signer_set_registration") return walletRegistrationSetupError("invalid_state", "Registration setup signer state is invalid");
|
|
154
246
|
const ecdsa = findStoredWalletRegistrationEvmFamilyEcdsaBranch(ceremony.signerState);
|
|
155
247
|
if (!ecdsa || ecdsa.kind !== "evm_family_ecdsa_prepared") return walletRegistrationSetupError("invalid_state", "Registration setup snapshot is not prepared");
|
|
@@ -14,9 +14,9 @@ import { buildWalletEcdsaSignerActivationV1, extendEd25519WalletAuthorityWithEcd
|
|
|
14
14
|
import { registrationPreparationIdFromString } from "../../../../core/types.js";
|
|
15
15
|
import { addSignerIntentGrantFromString, computeAddSignerIntentDigestB64u, sameAddSignerIntentV1 } from "../../../../shared-ts/src/utils/registrationIntent.js";
|
|
16
16
|
import { buildTenantRootIdentityFromAuthenticatedDeploymentV1 } from "../../../../shared-ts/src/tenant-root/tenantRootIdentity.js";
|
|
17
|
+
import { WalletAuthorityCommitConflictError } from "./d1WalletAuthorityStore.js";
|
|
17
18
|
import { buildRouterAbEd25519YaoRegistrationCapabilityRecordV1 } from "../../../domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js";
|
|
18
19
|
import { buildRouterAbEd25519YaoAddSignerAdmissionRequestV1, createRouterAbEd25519YaoMaterialActivationRefV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js";
|
|
19
|
-
import { WalletAuthorityCommitConflictError } from "./d1WalletAuthorityStore.js";
|
|
20
20
|
import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV1, runRouterAbEd25519YaoRegistrationSideEffectV1, throwIfRouterAbEd25519YaoRetryableSideEffectFailureV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
|
|
21
21
|
import { buildYaoEd25519WalletSignerRecord, ed25519NearPublicKeyFromBytes, implicitNearAccountIdFromEd25519PublicKeyBytes } from "../ed25519Yao/d1Ed25519YaoWalletSigner.js";
|
|
22
22
|
import { routerAbEcdsaStrictRegistrationRequestMatchesFacts } from "../../../domains/ecdsa/routerAbEcdsaStrictRegistration.js";
|
|
@@ -3,6 +3,7 @@ import { createRouterAbNormalSigningAdmissionAdapter } from "../../domains/signi
|
|
|
3
3
|
import { createCloudflareD1RouterAbNormalSigningAdmissionStore } from "../d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js";
|
|
4
4
|
import { WALLET_CONSOLE_SERVICE_ORIGIN_V1 } from "./walletConsoleOps.js";
|
|
5
5
|
import { createWalletConsoleOpsClient } from "./walletConsoleOpsClient.js";
|
|
6
|
+
import { consumeRegistrationSetupRateLimit } from "../d1/registration/d1RegistrationSetupRateLimit.js";
|
|
6
7
|
import { createCloudflareRouter } from "./createCloudflareRouter.js";
|
|
7
8
|
//#region src/router/cloudflare/runtime/walletGateway.ts
|
|
8
9
|
const WALLET_CONSOLE_API_WALLET_DETAIL_PREFIX_V1 = "/v1/wallets/";
|
|
@@ -137,6 +138,7 @@ function createCloudflareWalletGatewayRouterV1(input) {
|
|
|
137
138
|
apiKeyAuth: consoleOps.apiKeyAuth,
|
|
138
139
|
publishableKeyAuth: consoleOps.publishableKeyAuth,
|
|
139
140
|
registrationContext: input.registrationContext ?? consoleOps.registrationContext,
|
|
141
|
+
registrationSetupRateLimit: consumeRegistrationSetupRateLimit.bind(void 0, input.signerDatabase, input.signerStorageNamespace),
|
|
140
142
|
apiKeyUsageMeter: consoleOps.usageMeter,
|
|
141
143
|
orgProjectEnv: consoleOps.projectEnvironments,
|
|
142
144
|
routerAbNormalSigningAdmission: createRouterAbNormalSigningAdmissionAdapter(admissionStore),
|
|
@@ -20,25 +20,25 @@ import { readEnvironmentCsv, readEnvironmentString, requireEnvironmentString } f
|
|
|
20
20
|
import { createStaticWalletConsoleBindingV1, handleStaticWalletConsoleRequestV1, parseStaticWalletConsoleBindingConfigV1 } from "./cloudflare/runtime/staticWalletConsoleBinding.js";
|
|
21
21
|
import { CloudflareD1WebAuthnStore } from "./cloudflare/d1/webauthn/d1WebAuthnStore.js";
|
|
22
22
|
import { CloudflareD1WebAuthnAuthService } from "./cloudflare/d1/webauthn/d1WebAuthnAuthService.js";
|
|
23
|
+
import { CloudflareD1AuthorizationStore } from "./cloudflare/d1/authorization/d1AuthorizationStore.js";
|
|
24
|
+
import { CloudflareD1VaultProxyStore } from "./cloudflare/d1/authorization/d1VaultProxyStore.js";
|
|
23
25
|
import { InMemoryRouterAbEd25519YaoRegistrationService, createRouterAbEd25519YaoRegistrationModule } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js";
|
|
24
26
|
import { InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js";
|
|
25
27
|
import { buildRouterAbEd25519YaoProductAdmissionRequestV1, createRouterAbEd25519YaoProductRegistrationCompositionFromPortsV1, createRouterAbEd25519YaoProductRegistrationRuntimeV1, createRouterAbEd25519YaoProductRegistrationStateV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js";
|
|
26
|
-
import { createRouterAbEd25519YaoCeremonyStateStoreV1, encodeRouterAbEd25519YaoProductRegistrationStateV1, parseRouterAbEd25519YaoCeremonyKeyV1, parseRouterAbEd25519YaoProductRegistrationStateJsonV1, resolveRouterAbEd25519YaoCeremonyKeyFromRequestV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js";
|
|
27
|
-
import { mergeRouterAbEd25519YaoProductRegistrationStatePartitionV1, partitionRouterAbEd25519YaoProductRegistrationStateV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js";
|
|
28
|
-
import { ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1, encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
|
|
29
|
-
import { CloudflareD1AuthorizationStore } from "./cloudflare/d1/authorization/d1AuthorizationStore.js";
|
|
30
|
-
import { CloudflareD1VaultProxyStore } from "./cloudflare/d1/authorization/d1VaultProxyStore.js";
|
|
31
28
|
import { RouterAbEd25519YaoHttpRegistrationBackend, createRouterAbEd25519YaoHttpRegistrationBackendFromEnv } from "./domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js";
|
|
32
29
|
import { StaticCloudflareTenantStorageRouteResolver, createCloudflareTenantStorageRoute, createSignerD1DoStorageTarget, createStaticCloudflareTenantStorageRouteResolver, createStaticCloudflareTenantStorageRouteResolverFromBindings } from "../storage/tenantRoute.js";
|
|
33
30
|
import { createInMemoryRouterApiRuntimeSnapshotConsumer, validateRuntimeSnapshotExpectation } from "./framework/runtimeSnapshotConsumer.js";
|
|
34
31
|
import { createSelfHostedCloudflareSigningRouter, createSelfHostedCloudflareSigningWorker } from "./cloudflare/runtime/createSelfHostedCloudflareSigningWorker.js";
|
|
35
32
|
import { CloudflareDurableObjectVersionedJsonRecordStore, CloudflareVersionedJsonRecordStoreError, createCloudflareDurableObjectVersionedJsonRecordStore } from "./cloudflare/durableObjects/versionedJsonRecordStore.js";
|
|
36
33
|
import { CloudflareD1VersionedJsonRecordStore, CloudflareD1VersionedJsonRecordStoreError, createCloudflareD1VersionedJsonRecordStore } from "./cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js";
|
|
34
|
+
import { createRouterAbEd25519YaoCeremonyStateStoreV1, encodeRouterAbEd25519YaoProductRegistrationStateV1, parseRouterAbEd25519YaoCeremonyKeyV1, parseRouterAbEd25519YaoProductRegistrationStateJsonV1, resolveRouterAbEd25519YaoCeremonyKeyFromRequestV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js";
|
|
35
|
+
import { mergeRouterAbEd25519YaoProductRegistrationStatePartitionV1, partitionRouterAbEd25519YaoProductRegistrationStateV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js";
|
|
36
|
+
import { ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1, encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
|
|
37
37
|
import { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1 } from "./cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js";
|
|
38
38
|
import { runRouterAbEd25519YaoProductRegistrationRequestScopedV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRunner.js";
|
|
39
|
+
import { runRouterAbEd25519YaoRegistrationTwoPhaseV1 } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.js";
|
|
40
|
+
import { handleRouterAbEd25519YaoRegistrationRequestScopedCloudflareV1 } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js";
|
|
39
41
|
import { createRouterAbEd25519YaoProductRegistrationRequestScopedRuntimeV1 } from "./domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js";
|
|
40
42
|
import { runRouterAbEd25519YaoRegistrationSideEffectV1 } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
|
|
41
|
-
import { runRouterAbEd25519YaoRegistrationTwoPhaseV1 } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationTwoPhaseRunner.js";
|
|
42
43
|
import { CLOUDFLARE_ROUTER_ED25519_YAO_SOURCE_PRESERVING_EXECUTE_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ECDSA_ACTIVATE_RESERVATION_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ECDSA_DEACTIVATE_RESERVATION_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ECDSA_RESERVE_INACTIVE_SOURCE_PRESERVING_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ED25519_YAO_ACTIVATE_RESERVATION_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ED25519_YAO_DEACTIVATE_RESERVATION_PATH_V1, CloudflareOrdinaryInactiveSignerMaterialDeactivationWorkerV1, CloudflareOrdinaryInactiveSignerMaterialReservationWorkerV1, UnavailableOrdinaryInactiveSignerMaterialDeactivationWorkerV1, UnavailableOrdinaryInactiveSignerMaterialReservationWorkerV1, createCloudflareLinkedDeviceEd25519SourcePreservingRouterEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialActivationEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialActivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialDeactivationEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialDeactivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialReservationEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialReservationServiceV1, createUnavailableOrdinaryInactiveSignerMaterialDeactivationPortV1, createUnavailableOrdinaryInactiveSignerMaterialReservationWorkerV1 } from "./cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js";
|
|
43
|
-
import { handleRouterAbEd25519YaoRegistrationRequestScopedCloudflareV1 } from "./domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js";
|
|
44
44
|
export { CLOUDFLARE_ROUTER_ED25519_YAO_SOURCE_PRESERVING_EXECUTE_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ECDSA_ACTIVATE_RESERVATION_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ECDSA_DEACTIVATE_RESERVATION_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ECDSA_RESERVE_INACTIVE_SOURCE_PRESERVING_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ED25519_YAO_ACTIVATE_RESERVATION_PATH_V1, CLOUDFLARE_SIGNING_WORKER_ED25519_YAO_DEACTIVATE_RESERVATION_PATH_V1, CloudflareD1AuthorizationStore, CloudflareD1RouterAbNormalSigningAdmissionStore, CloudflareD1VaultProxyStore, CloudflareD1VersionedJsonRecordStore, CloudflareD1VersionedJsonRecordStoreError, CloudflareD1WebAuthnAuthService, CloudflareD1WebAuthnStore, CloudflareDurableObjectVersionedJsonRecordStore, CloudflareOrdinaryInactiveSignerMaterialDeactivationWorkerV1, CloudflareOrdinaryInactiveSignerMaterialReservationWorkerV1, CloudflareVersionedJsonRecordStoreError, DEFAULT_WALLET_CONSOLE_SIGNED_DELEGATE_ROUTE_V1, DEFAULT_WALLET_CONSOLE_SPONSORED_EVM_CALL_ROUTE_V1, InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter, InMemoryRouterAbEd25519YaoRegistrationService, InMemoryRouterAbNormalSigningAdmissionStore, ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, ROUTER_AB_PUBLIC_KEYSET_PATH, ROUTER_AB_PUBLIC_KEYSET_VERSION_V2, ROUTER_AB_PUBLIC_KEYSET_WELL_KNOWN_PATH, RouterAbEd25519YaoHttpRegistrationBackend, StaticCloudflareTenantStorageRouteResolver, UnavailableOrdinaryInactiveSignerMaterialDeactivationWorkerV1, UnavailableOrdinaryInactiveSignerMaterialReservationWorkerV1, WALLET_CONSOLE_API_WALLET_DETAIL_PREFIX_V1, WALLET_CONSOLE_OPS_BASE_PATH_V1, WALLET_CONSOLE_OP_PATHS_V1, WALLET_CONSOLE_SERVICE_ORIGIN_V1, WALLET_CONSOLE_SIGNED_DELEGATE_ROUTE_ID_V1, WALLET_CONSOLE_SPONSORED_EVM_CALL_ROUTE_ID_V1, WALLET_CONTROL_AUTH_MARKER_V1, WALLET_CONTROL_BASE_PATH_V1, WALLET_CONTROL_SERVICE_ORIGIN_V1, WALLET_RUNTIME_OPS_BASE_PATH_V1, WALLET_RUNTIME_OP_PATHS_V1, WALLET_RUNTIME_SERVICE_ORIGIN_V1, buildRouterAbEd25519YaoProductAdmissionRequestV1, coerceRouterLogger, createCloudflareD1RouterAbNormalSigningAdmissionStore, createCloudflareD1VersionedJsonRecordStore, createCloudflareDurableObjectVersionedJsonRecordStore, createCloudflareLinkedDeviceEd25519SourcePreservingRouterEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialActivationEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialActivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialDeactivationEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialDeactivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialReservationEndpointV1, createCloudflareOrdinaryInactiveSignerMaterialReservationServiceV1, createCloudflareRouter, createCloudflareTenantStorageRoute, createCloudflareWalletGatewayRouterV1, createInMemoryRouterAbNormalSigningAdmissionAdapter, createInMemoryRouterAbNormalSigningAdmissionStore, createInMemoryRouterApiRuntimeSnapshotConsumer, createRouterAbEd25519YaoCeremonyStateStoreV1, createRouterAbEd25519YaoHttpRegistrationBackendFromEnv, createRouterAbEd25519YaoProductRegistrationCompositionFromPortsV1, createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1, createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1, createRouterAbEd25519YaoProductRegistrationRequestScopedRuntimeV1, createRouterAbEd25519YaoProductRegistrationRuntimeV1, createRouterAbEd25519YaoProductRegistrationStateV1, createRouterAbEd25519YaoRegistrationModule, createRouterAbNormalSigningAdmissionAdapter, createRouterApiModule, createSelfHostedCloudflareSigningRouter, createSelfHostedCloudflareSigningWorker, createSignerD1DoStorageTarget, createStaticCloudflareTenantStorageRouteResolver, createStaticCloudflareTenantStorageRouteResolverFromBindings, createStaticWalletConsoleBindingV1, createUnavailableOrdinaryInactiveSignerMaterialDeactivationPortV1, createUnavailableOrdinaryInactiveSignerMaterialReservationWorkerV1, createWalletConsoleOpsClient, createWalletConsoleRelayProxyExtensionV1, createWalletControlClientBindings, createWalletRuntimeOpsHandler, decodeWalletConsoleTenantRootActiveLineageRequestV1, decodeWalletConsoleTenantRootActiveLineageResponseV1, defineRoute, encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1, encodeRouterAbEd25519YaoProductRegistrationStateV1, extractBearerCredential, extractRouterApiEnvironmentId, getRouterApiRouteExtensionRoutes, handleRouterAbEd25519YaoRegistrationRequestScopedCloudflareV1, handleStaticWalletConsoleRequestV1, handleWalletControlRequest, matchesRouteDefinitionRequest, mergeRouterAbEd25519YaoProductRegistrationStatePartitionV1, parseRouterAbEd25519YaoCeremonyKeyV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1, parseRouterAbEd25519YaoProductRegistrationStateJsonV1, parseRouterAbPublicKeysetV2, parseStaticWalletConsoleBindingConfigV1, parseWalletRegistrationContextResponse, parseWalletRuntimeExecuteSignedDelegateRequest, parseWalletRuntimeExecuteSignedDelegateResponse, parseWalletRuntimeExecuteSignedDelegateResult, parseWalletRuntimeRelayerAccount, parseWalletRuntimeWalletIdentitiesResult, parseWalletRuntimeWalletIdentityRequest, partitionRouterAbEd25519YaoProductRegistrationStateV1, randomTenantRootCreationGrantBytesV1, readEnvironmentCsv, readEnvironmentString, requireEnvironmentString, resolveRouterAbEd25519YaoCeremonyKeyFromRequestV1, resolveRuntimeTenantRootLineage, resolveSourceIpFromExpressRequest, resolveSourceIpFromFetchHeaders, runRouterAbEd25519YaoProductRegistrationRequestScopedV1, runRouterAbEd25519YaoRegistrationSideEffectV1, runRouterAbEd25519YaoRegistrationTwoPhaseV1, runRouterAbPrewarmScheduledV1, signTenantRootCreationGrantV1, tenantRootIdentityDigestB64uV1, validateRuntimeSnapshotExpectation, walletConsoleApiWalletGetRouteDefinitionV1, walletConsoleApiWalletListRouteDefinitionV1, walletConsoleApiWalletSearchRouteDefinitionV1, walletConsoleRelayRouteDefinitionsV1, walletConsoleSignedDelegateRouteDefinitionV1, walletConsoleSponsoredEvmCallRouteDefinitionV1 };
|