@invisible-labs/sdk 0.8.0-devnet → 0.9.0-devnet
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/README.md +7 -0
- package/dist/.invisible-sdk-build-target.json +1 -1
- package/dist/{chunk-HJFMDMPY.js → chunk-6AKBRYKO.js} +3 -3
- package/dist/{chunk-HJFMDMPY.js.map → chunk-6AKBRYKO.js.map} +1 -1
- package/dist/{chunk-DCTYBUY3.js → chunk-AIKC2XQS.js} +3 -3
- package/dist/{chunk-DCTYBUY3.js.map → chunk-AIKC2XQS.js.map} +1 -1
- package/dist/{chunk-Y7AK6RBV.js → chunk-EOPZVOVP.js} +11 -6
- package/dist/chunk-EOPZVOVP.js.map +1 -0
- package/dist/{chunk-EBWTAXNT.js → chunk-EPWTRF5U.js} +3 -3
- package/dist/{chunk-EBWTAXNT.js.map → chunk-EPWTRF5U.js.map} +1 -1
- package/dist/{chunk-IG6JJFR2.js → chunk-HWRMSK7E.js} +8 -6
- package/dist/chunk-HWRMSK7E.js.map +1 -0
- package/dist/{chunk-MZKJU3UA.js → chunk-ISIWWGSR.js} +16 -6
- package/dist/chunk-ISIWWGSR.js.map +1 -0
- package/dist/{chunk-K67FTCQU.js → chunk-JNNVPZEU.js} +3 -3
- package/dist/chunk-JNNVPZEU.js.map +1 -0
- package/dist/{chunk-MPNVF727.js → chunk-QF5TSUQE.js} +178 -41
- package/dist/chunk-QF5TSUQE.js.map +1 -0
- package/dist/{chunk-QRN46R3F.js → chunk-RWKG7N7I.js} +10 -3
- package/dist/chunk-RWKG7N7I.js.map +1 -0
- package/dist/coordinator-DHL3AP7V.js +4 -0
- package/dist/{coordinator-E2TS6NR2.js.map → coordinator-DHL3AP7V.js.map} +1 -1
- package/dist/dkgWorker.js +1 -1
- package/dist/events.js +3 -3
- package/dist/frostRuntime-JESDHN6O.js +4 -0
- package/dist/{frostRuntime-6FTPKUCP.js.map → frostRuntime-JESDHN6O.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -8
- package/dist/lp.d.ts +10 -1
- package/dist/lp.js +178 -65
- package/dist/lp.js.map +1 -1
- package/dist/stats.js +1 -1
- package/dist/storage.js +2 -2
- package/dist/{types.generated-YhFu9ZBR.d.ts → types.generated-DrM2M4DZ.d.ts} +6 -2
- package/dist/user.d.ts +18 -9
- package/dist/user.js +86 -30
- package/dist/user.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-IG6JJFR2.js.map +0 -1
- package/dist/chunk-K67FTCQU.js.map +0 -1
- package/dist/chunk-MPNVF727.js.map +0 -1
- package/dist/chunk-MZKJU3UA.js.map +0 -1
- package/dist/chunk-QRN46R3F.js.map +0 -1
- package/dist/chunk-Y7AK6RBV.js.map +0 -1
- package/dist/coordinator-E2TS6NR2.js +0 -4
- package/dist/frostRuntime-6FTPKUCP.js +0 -4
package/README.md
CHANGED
|
@@ -191,6 +191,13 @@ clearing. Use a caller-controlled encrypted adapter when that tradeoff is unacce
|
|
|
191
191
|
fails after coordinator acceptance, the SDK throws a typed `StorageError` with the affected swap
|
|
192
192
|
and `remoteAccepted: true`; do not blindly retry the coordinator command.
|
|
193
193
|
|
|
194
|
+
Busy and capacity rejections are returned by default. For caller-controlled
|
|
195
|
+
initialization recovery, `contractRequest` and `resumePreDelegation` accept
|
|
196
|
+
`onInitializationRetry({ swapId, stage, error })`. Wait in that callback to
|
|
197
|
+
repeat the same DKG/delegation payload after a correlated temporary busy
|
|
198
|
+
response. The SDK defines no retry delays. `signal` stops future attempts;
|
|
199
|
+
unknown outcomes never authorize allocating another transfer.
|
|
200
|
+
|
|
194
201
|
When client persistence is disabled, consumers that need restart or tab-close recovery must store
|
|
195
202
|
the relevant values themselves:
|
|
196
203
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@invisible-labs/sdk",
|
|
3
3
|
"target": "public",
|
|
4
|
-
"productionBinaryHash": "
|
|
4
|
+
"productionBinaryHash": "176a3f8eb8941bb6b9dd85a044eff1df686df87ff757133a4df467ba46d7c7cf",
|
|
5
5
|
"productionMrtd": "6f3e84c54ac6377614d4c139473db575a83b5db41bd845eecb4eedaf2788ea881309a410c4ceae9641406411f3f639b8",
|
|
6
6
|
"productionRuntimeProfile": "prod-hardened"
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TransportError } from './chunk-
|
|
1
|
+
import { TransportError } from './chunk-RWKG7N7I.js';
|
|
2
2
|
|
|
3
3
|
// src/session/state.ts
|
|
4
4
|
var registry = /* @__PURE__ */ new WeakMap();
|
|
@@ -46,5 +46,5 @@ function failSessionClosed(state, cause, options = {}) {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export { closeSessionState, createSessionHandle, failSessionClosed, getSessionState };
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
50
|
-
//# sourceMappingURL=chunk-
|
|
49
|
+
//# sourceMappingURL=chunk-6AKBRYKO.js.map
|
|
50
|
+
//# sourceMappingURL=chunk-6AKBRYKO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/session/state.ts"],"names":[],"mappings":";;;AAoDA,IAAM,QAAA,uBAAe,OAAA,EAA+B;AAG7C,SAAS,oBAAoB,KAAA,EAA8B;AAChE,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAI,QAAA,GAAW;AACb,MAAA,OAAO,KAAA,CAAM,QAAA;AAAA,IACf;AAAA,GACF;AACA,EAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,CAAA;AAC1B,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,gBAAgB,OAAA,EAAgC;AAC9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAA2B;AAC3D,EAAA,iBAAA,CAAkB,KAAA,EAAO,IAAI,cAAA,CAAe,iBAAA,EAAmB,gBAAgB,CAAA,EAAG;AAAA,IAChF,qBAAA,EAAuB;AAAA,GACxB,CAAA;AACH;AAEO,SAAS,iBAAA,CACd,KAAA,EACA,KAAA,EACA,OAAA,GAAwD,EAAC,EACnD;AACN,EAAA,MAAM,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,IAAA;AAC/D,EAAA,MAAM,YAAA,GACJ,0BACC,KAAA,CAAM,QAAA,IAAY,MAAM,WAAA,KAAgB,IAAA,IAAQ,MAAM,OAAA,KAAY,IAAA,CAAA;AAErE,EAAA,IAAI,KAAA,CAAM,kBAAkB,IAAA,EAAM;AAChC,IAAA,YAAA,CAAa,MAAM,aAAa,CAAA;AAChC,IAAA,KAAA,CAAM,aAAA,GAAgB,IAAA;AAAA,EACxB;AACA,EAAA,KAAA,CAAM,eAAA,GAAkB,IAAA;AACxB,EAAA,KAAA,CAAM,cAAA,GAAiB,KAAA;AAEvB,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,EAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,EAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,EAAA,KAAA,CAAM,qBAAA,GAAwB,IAAA;AAE9B,EAAA,OAAA,EAAS,KAAA,EAAM;AACf,EAAA,KAAA,CAAM,UAAU,KAAA,EAAM;AAEtB,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,uBAAA,EAAyB,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpE;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/session/state.ts"],"names":[],"mappings":";;;AAoDA,IAAM,QAAA,uBAAe,OAAA,EAA+B;AAG7C,SAAS,oBAAoB,KAAA,EAA8B;AAChE,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAI,QAAA,GAAW;AACb,MAAA,OAAO,KAAA,CAAM,QAAA;AAAA,IACf;AAAA,GACF;AACA,EAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,CAAA;AAC1B,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,gBAAgB,OAAA,EAAgC;AAC9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAA2B;AAC3D,EAAA,iBAAA,CAAkB,KAAA,EAAO,IAAI,cAAA,CAAe,iBAAA,EAAmB,gBAAgB,CAAA,EAAG;AAAA,IAChF,qBAAA,EAAuB;AAAA,GACxB,CAAA;AACH;AAEO,SAAS,iBAAA,CACd,KAAA,EACA,KAAA,EACA,OAAA,GAAwD,EAAC,EACnD;AACN,EAAA,MAAM,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,IAAA;AAC/D,EAAA,MAAM,YAAA,GACJ,0BACC,KAAA,CAAM,QAAA,IAAY,MAAM,WAAA,KAAgB,IAAA,IAAQ,MAAM,OAAA,KAAY,IAAA,CAAA;AAErE,EAAA,IAAI,KAAA,CAAM,kBAAkB,IAAA,EAAM;AAChC,IAAA,YAAA,CAAa,MAAM,aAAa,CAAA;AAChC,IAAA,KAAA,CAAM,aAAA,GAAgB,IAAA;AAAA,EACxB;AACA,EAAA,KAAA,CAAM,eAAA,GAAkB,IAAA;AACxB,EAAA,KAAA,CAAM,cAAA,GAAiB,KAAA;AAEvB,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,EAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,EAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,EAAA,KAAA,CAAM,qBAAA,GAAwB,IAAA;AAE9B,EAAA,OAAA,EAAS,KAAA,EAAM;AACf,EAAA,KAAA,CAAM,UAAU,KAAA,EAAM;AAEtB,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,uBAAA,EAAyB,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpE;AACF","file":"chunk-6AKBRYKO.js","sourcesContent":["/**\n * Internal session state and the opaque-handle registry.\n *\n * The public {@link Session} is opaque: consumers only read `session.attested`.\n * The real state (transport, endpoint pool, attestation result) is held here\n * and reached through {@link getSessionState}, keyed off the handle in a\n * `WeakMap` so it is never reachable from the public surface.\n */\n\nimport type { Session } from \"../core/session.js\";\nimport type { Transport } from \"../transport/types.js\";\nimport type { AttestationResult } from \"../transport/handshake.js\";\nimport type { SecureChannel } from \"./secureChannel.js\";\nimport type { CoordinatorPoolConfig } from \"../schemas/types.generated.js\";\nimport { TransportError } from \"../core/errors.js\";\nimport type { ClientPersistenceState } from \"../storage/clientPersistence.js\";\n\nexport interface SessionState {\n /** Flipped to `true` once attestation passes. */\n attested: boolean;\n /** The byte channel this session runs over. */\n readonly transport: Transport;\n /** The endpoint pool the session was created with. */\n readonly pool: CoordinatorPoolConfig;\n /** The last verified attestation result, or `null` before first attestation. */\n attestation: AttestationResult | null;\n /**\n * The live attested Noise channel, or `null` before/after attestation. All\n * application I/O Noise-encrypts through this.\n */\n channel: SecureChannel | null;\n /**\n * The per-connection 32-byte CSPRNG nonce bound into the attestation request.\n * Retained for re-attestation over the same channel.\n */\n nonce: Uint8Array | null;\n /** The coordinator's pinned Noise static public key, or `null` if unattested. */\n remoteStaticPublicKey: Uint8Array | null;\n /** Pending re-attestation timer, cleared on close. */\n reattestTimer: ReturnType<typeof setTimeout> | null;\n /** In-flight re-attestation shared by explicit and periodic checks. */\n reattestPromise: Promise<AttestationResult> | null;\n /** Fatal secure-channel cause preserved across transport close notifications. */\n lastFatalError: Error | null;\n /** Handlers invoked when an out-of-band re-attestation fails. */\n readonly policyViolationHandlers: Set<(error: Error) => void>;\n /** Resolved opt-in client-persistence policy, kept behind the opaque handle. */\n readonly clientPersistence: ClientPersistenceState;\n /** Tear down the session: clear the re-attest timer and close the channel. */\n close(): void;\n}\n\nconst registry = new WeakMap<Session, SessionState>();\n\n/** Build an opaque {@link Session} handle backed by `state`. */\nexport function createSessionHandle(state: SessionState): Session {\n const handle = {\n get attested() {\n return state.attested;\n },\n } as unknown as Session;\n registry.set(handle, state);\n return handle;\n}\n\n/**\n * Resolve the internal state for a session.\n *\n * @throws Error if the handle was not produced by `createSession`.\n */\nexport function getSessionState(session: Session): SessionState {\n const state = registry.get(session);\n if (!state) {\n throw new Error(\"invalid Session: this handle was not created by createSession\");\n }\n return state;\n}\n\nexport function closeSessionState(state: SessionState): void {\n failSessionClosed(state, new TransportError(\"CONNECTION_LOST\", \"session closed\"), {\n notifyPolicyViolation: false,\n });\n}\n\nexport function failSessionClosed(\n state: SessionState,\n cause: Error,\n options: { readonly notifyPolicyViolation?: boolean } = {},\n): void {\n const notifyPolicyViolation = options.notifyPolicyViolation ?? true;\n const shouldNotify =\n notifyPolicyViolation &&\n (state.attested || state.attestation !== null || state.channel !== null);\n\n if (state.reattestTimer !== null) {\n clearTimeout(state.reattestTimer);\n state.reattestTimer = null;\n }\n state.reattestPromise = null;\n state.lastFatalError = cause;\n\n const channel = state.channel;\n state.attested = false;\n state.attestation = null;\n state.channel = null;\n state.nonce = null;\n state.remoteStaticPublicKey = null;\n\n channel?.close();\n state.transport.close();\n\n if (shouldNotify) {\n for (const handler of state.policyViolationHandlers) handler(cause);\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { StorageError } from './chunk-
|
|
1
|
+
import { StorageError } from './chunk-RWKG7N7I.js';
|
|
2
2
|
|
|
3
3
|
// src/storage/coordination.ts
|
|
4
4
|
var storageBackings = /* @__PURE__ */ new WeakMap();
|
|
@@ -254,5 +254,5 @@ function isPromise(value) {
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
export { browserStorage, extensionStorage, getStorageBacking, inMemoryStorage };
|
|
257
|
-
//# sourceMappingURL=chunk-
|
|
258
|
-
//# sourceMappingURL=chunk-
|
|
257
|
+
//# sourceMappingURL=chunk-AIKC2XQS.js.map
|
|
258
|
+
//# sourceMappingURL=chunk-AIKC2XQS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/coordination.ts","../src/storage/index.ts"],"names":[],"mappings":"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","file":"chunk-DCTYBUY3.js","sourcesContent":["const storageBackings = new WeakMap<object, object>();\n\nexport function registerStorageBacking(adapter: object, backing: object): void {\n storageBackings.set(adapter, backing);\n}\n\nexport function getStorageBacking(adapter: object): object {\n return storageBackings.get(adapter) ?? adapter;\n}\n","/**\n * `@invisible-labs/sdk/storage` - storage adapters (spec section 7).\n *\n * The SDK persists recoverable secrets (Recovery Code, LP Position Code, LP\n * Refill Key, withdrawal secret) only through a {@link StorageAdapter}. The\n * `memory`, `browser`, and `extension` adapters are real. Browser and\n * extension adapters persist the bytes provided by the caller; callers that need\n * encrypted-at-rest storage can wrap/encrypt bytes before calling `put`.\n */\n\nimport { StorageError } from \"../core/errors.js\";\nimport { registerStorageBacking } from \"./coordination.js\";\n\nconst STORAGE_KEY_PREFIX = \"invisible:sdk:storage:v1:\";\nconst STORAGE_KEY_SEPARATOR = \":\";\nconst BASE64URL_PAD = \"=\";\nconst BASE64URL_PLUS = \"+\";\nconst BASE64URL_SLASH = \"/\";\nconst BASE64URL_MINUS = \"-\";\nconst BASE64URL_UNDERSCORE = \"_\";\nconst BYTE_STRING_CHUNK_SIZE = 0x8000;\nconst EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL = \"TRUSTED_CONTEXTS\";\n\n/**\n * A namespaced key/value store for the SDK's recoverable secrets. Values are\n * raw bytes. Callers may store plaintext bytes, pre-wrapped bytes, or encrypted\n * bytes depending on their host product's storage model.\n */\nexport interface StorageAdapter {\n /** Which backing the adapter uses. */\n readonly kind: \"browser\" | \"extension\" | \"server-hkdf\" | \"server-custom\" | \"memory\";\n put(namespace: string, key: string, value: Uint8Array): Promise<void>;\n get(namespace: string, key: string): Promise<Uint8Array | null>;\n list(namespace: string): Promise<string[]>;\n remove(namespace: string, key: string): Promise<void>;\n /** `server-hkdf` only: derive a secret from a stable domain context. */\n derive?(namespace: string, context: string): Promise<Uint8Array>;\n}\n\nexport interface BrowserStorageOptions {\n /** Override for tests or custom host environments. Defaults to `globalThis.localStorage`. */\n readonly storage?: StorageLike;\n}\n\nexport interface ExtensionStorageOptions {\n /** Override for tests or custom extension hosts. Defaults to chrome/browser storage local. */\n readonly storage?: ExtensionStorageArea;\n /** Override for tests or custom extension hosts. Defaults to chrome/browser runtime. */\n readonly runtime?: ExtensionRuntimeLike;\n /**\n * Chrome exposes storage.local to content scripts by default. Keep the default\n * trusted-context restriction when the host API supports it.\n */\n readonly restrictAccessToTrustedContexts?: boolean;\n}\n\ninterface StorageLike {\n readonly length: number;\n key(index: number): string | null;\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\ninterface ExtensionStorageArea {\n get(\n keys?: string | string[] | Record<string, unknown> | null,\n callback?: (items: Record<string, unknown>) => void,\n ): Promise<Record<string, unknown>> | void;\n set(items: Record<string, string>, callback?: () => void): Promise<void> | void;\n remove(keys: string | string[], callback?: () => void): Promise<void> | void;\n setAccessLevel?(details: { accessLevel: string }, callback?: () => void): Promise<void> | void;\n}\n\ninterface ExtensionRuntimeLike {\n readonly lastError?: { readonly message?: string } | null;\n}\n\n/**\n * In-memory adapter. Fully functional, unencrypted, non-persistent - intended\n * for tests and ephemeral flows, never for real secrets at rest.\n */\nexport function inMemoryStorage(): StorageAdapter {\n // Each namespace is a separate inner map rather than a flattened composite\n // key, so a namespace or key containing any character (including a separator)\n // can never collide across namespaces.\n const namespaces = new Map<string, Map<string, Uint8Array>>();\n const bucket = (namespace: string) => {\n let inner = namespaces.get(namespace);\n if (!inner) {\n inner = new Map<string, Uint8Array>();\n namespaces.set(namespace, inner);\n }\n return inner;\n };\n return {\n kind: \"memory\",\n async put(namespace, key, value) {\n bucket(namespace).set(key, value);\n },\n async get(namespace, key) {\n return namespaces.get(namespace)?.get(key) ?? null;\n },\n async list(namespace) {\n return [...(namespaces.get(namespace)?.keys() ?? [])];\n },\n async remove(namespace, key) {\n namespaces.get(namespace)?.delete(key);\n },\n };\n}\n\n/**\n * Browser `localStorage` adapter. Values are stored as base64url-encoded bytes.\n * Encrypt or wrap the bytes before `put` if your product requires encrypted\n * local persistence.\n *\n * @throws StorageError `STORAGE_NOT_AVAILABLE` if `localStorage` is unavailable.\n */\nexport function browserStorage(options: BrowserStorageOptions = {}): StorageAdapter {\n const storage = options.storage ?? defaultBrowserStorage();\n if (!storage) throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"localStorage is unavailable\");\n const adapter: StorageAdapter = {\n kind: \"browser\",\n async put(namespace, key, value) {\n try {\n storage.setItem(storageKey(namespace, key), bytesToBase64Url(value));\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async get(namespace, key) {\n try {\n const value = storage.getItem(storageKey(namespace, key));\n return value === null ? null : base64UrlToBytes(value);\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async list(namespace) {\n try {\n const prefix = storageKeyPrefix(namespace);\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const storedKey = storage.key(index);\n if (storedKey?.startsWith(prefix)) {\n keys.push(decodeStorageSegment(storedKey.slice(prefix.length)));\n }\n }\n return keys;\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async remove(namespace, key) {\n try {\n storage.removeItem(storageKey(namespace, key));\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n };\n registerStorageBacking(adapter, storage);\n return adapter;\n}\n\n/**\n * Browser-extension (`chrome.storage.local` / `browser.storage.local`) adapter.\n * Values are stored as base64url-encoded bytes. Encrypt or wrap the bytes before\n * `put` if your product requires encrypted local persistence.\n *\n * @throws StorageError `STORAGE_NOT_AVAILABLE` if extension storage is unavailable.\n */\nexport function extensionStorage(options: ExtensionStorageOptions = {}): StorageAdapter {\n const storage = options.storage ?? defaultExtensionStorage();\n if (!storage) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"extension local storage is unavailable\");\n }\n const runtime = options.runtime ?? defaultExtensionRuntime();\n const trustedAccess =\n options.restrictAccessToTrustedContexts === false\n ? Promise.resolve()\n : extensionSetAccessLevel(storage, runtime);\n const adapter: StorageAdapter = {\n kind: \"extension\",\n async put(namespace, key, value) {\n await trustedAccess;\n await extensionSet(storage, runtime, {\n [storageKey(namespace, key)]: bytesToBase64Url(value),\n });\n },\n async get(namespace, key) {\n await trustedAccess;\n const storedKey = storageKey(namespace, key);\n const values = await extensionGet(storage, runtime, storedKey);\n const value = values[storedKey];\n return typeof value === \"string\" ? base64UrlToBytes(value) : null;\n },\n async list(namespace) {\n await trustedAccess;\n const prefix = storageKeyPrefix(namespace);\n const values = await extensionGet(storage, runtime, null);\n return Object.keys(values)\n .filter((key) => key.startsWith(prefix))\n .map((key) => decodeStorageSegment(key.slice(prefix.length)));\n },\n async remove(namespace, key) {\n await trustedAccess;\n await extensionRemove(storage, runtime, storageKey(namespace, key));\n },\n };\n registerStorageBacking(adapter, storage);\n return adapter;\n}\n\nfunction storageKey(namespace: string, key: string): string {\n return `${storageKeyPrefix(namespace)}${encodeStorageSegment(key)}`;\n}\n\nfunction storageKeyPrefix(namespace: string): string {\n return `${STORAGE_KEY_PREFIX}${encodeStorageSegment(namespace)}${STORAGE_KEY_SEPARATOR}`;\n}\n\nfunction encodeStorageSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction decodeStorageSegment(value: string): string {\n return decodeURIComponent(value);\n}\n\nfunction bytesToBase64Url(value: Uint8Array): string {\n let binary = \"\";\n for (let index = 0; index < value.length; index += BYTE_STRING_CHUNK_SIZE) {\n binary += String.fromCharCode(...value.slice(index, index + BYTE_STRING_CHUNK_SIZE));\n }\n return btoa(binary)\n .split(BASE64URL_PLUS)\n .join(BASE64URL_MINUS)\n .split(BASE64URL_SLASH)\n .join(BASE64URL_UNDERSCORE)\n .split(BASE64URL_PAD)\n .join(\"\");\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array {\n try {\n const base64 = value\n .split(BASE64URL_MINUS)\n .join(BASE64URL_PLUS)\n .split(BASE64URL_UNDERSCORE)\n .join(BASE64URL_SLASH)\n .padEnd(Math.ceil(value.length / 4) * 4, BASE64URL_PAD);\n return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));\n } catch (cause) {\n throw new StorageError(\"STORAGE_DECRYPT_FAILED\", \"stored value is not valid base64url\", {\n cause,\n });\n }\n}\n\nfunction defaultBrowserStorage(): StorageLike | undefined {\n try {\n return globalThis.localStorage;\n } catch (cause) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"localStorage is unavailable\", { cause });\n }\n}\n\nfunction browserOperationError(cause: unknown): StorageError {\n if (cause instanceof StorageError) return cause;\n return new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n storageErrorMessage(cause) ?? \"localStorage operation failed\",\n { cause },\n );\n}\n\nfunction defaultExtensionStorage(): ExtensionStorageArea | undefined {\n const global = globalThis as {\n chrome?: { storage?: { local?: ExtensionStorageArea } };\n browser?: { storage?: { local?: ExtensionStorageArea } };\n };\n return global.chrome?.storage?.local ?? global.browser?.storage?.local;\n}\n\nfunction defaultExtensionRuntime(): ExtensionRuntimeLike | undefined {\n const global = globalThis as {\n chrome?: { runtime?: ExtensionRuntimeLike };\n browser?: { runtime?: ExtensionRuntimeLike };\n };\n return global.chrome?.runtime ?? global.browser?.runtime;\n}\n\nfunction extensionGet(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n keys: string | string[] | Record<string, unknown> | null,\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.get(keys, (items) => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve(items);\n });\n if (isPromise<Record<string, unknown>>(maybePromise)) {\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n }\n });\n}\n\nfunction extensionSet(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n items: Record<string, string>,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.set(items, () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n });\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionRemove(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n key: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.remove(key, () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n });\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionSetAccessLevel(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n): Promise<void> {\n const setAccessLevel = storage.setAccessLevel;\n if (!setAccessLevel) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const maybePromise = setAccessLevel.call(\n storage,\n { accessLevel: EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL },\n () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n },\n );\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionLastError(\n runtime: ExtensionRuntimeLike | undefined,\n): { readonly message?: string } | null {\n return runtime?.lastError ?? null;\n}\n\nfunction extensionOperationError(error: unknown): StorageError {\n if (error instanceof StorageError) return error;\n return new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n storageErrorMessage(error) ?? \"extension storage operation failed\",\n { cause: error },\n );\n}\n\nfunction storageErrorMessage(error: unknown): string | undefined {\n if (error instanceof Error) return error.message;\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return undefined;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then: unknown }).then === \"function\"\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/coordination.ts","../src/storage/index.ts"],"names":[],"mappings":"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","file":"chunk-AIKC2XQS.js","sourcesContent":["const storageBackings = new WeakMap<object, object>();\n\nexport function registerStorageBacking(adapter: object, backing: object): void {\n storageBackings.set(adapter, backing);\n}\n\nexport function getStorageBacking(adapter: object): object {\n return storageBackings.get(adapter) ?? adapter;\n}\n","/**\n * `@invisible-labs/sdk/storage` - storage adapters (spec section 7).\n *\n * The SDK persists recoverable secrets (Recovery Code, LP Position Code, LP\n * Refill Key, withdrawal secret) only through a {@link StorageAdapter}. The\n * `memory`, `browser`, and `extension` adapters are real. Browser and\n * extension adapters persist the bytes provided by the caller; callers that need\n * encrypted-at-rest storage can wrap/encrypt bytes before calling `put`.\n */\n\nimport { StorageError } from \"../core/errors.js\";\nimport { registerStorageBacking } from \"./coordination.js\";\n\nconst STORAGE_KEY_PREFIX = \"invisible:sdk:storage:v1:\";\nconst STORAGE_KEY_SEPARATOR = \":\";\nconst BASE64URL_PAD = \"=\";\nconst BASE64URL_PLUS = \"+\";\nconst BASE64URL_SLASH = \"/\";\nconst BASE64URL_MINUS = \"-\";\nconst BASE64URL_UNDERSCORE = \"_\";\nconst BYTE_STRING_CHUNK_SIZE = 0x8000;\nconst EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL = \"TRUSTED_CONTEXTS\";\n\n/**\n * A namespaced key/value store for the SDK's recoverable secrets. Values are\n * raw bytes. Callers may store plaintext bytes, pre-wrapped bytes, or encrypted\n * bytes depending on their host product's storage model.\n */\nexport interface StorageAdapter {\n /** Which backing the adapter uses. */\n readonly kind: \"browser\" | \"extension\" | \"server-hkdf\" | \"server-custom\" | \"memory\";\n put(namespace: string, key: string, value: Uint8Array): Promise<void>;\n get(namespace: string, key: string): Promise<Uint8Array | null>;\n list(namespace: string): Promise<string[]>;\n remove(namespace: string, key: string): Promise<void>;\n /** `server-hkdf` only: derive a secret from a stable domain context. */\n derive?(namespace: string, context: string): Promise<Uint8Array>;\n}\n\nexport interface BrowserStorageOptions {\n /** Override for tests or custom host environments. Defaults to `globalThis.localStorage`. */\n readonly storage?: StorageLike;\n}\n\nexport interface ExtensionStorageOptions {\n /** Override for tests or custom extension hosts. Defaults to chrome/browser storage local. */\n readonly storage?: ExtensionStorageArea;\n /** Override for tests or custom extension hosts. Defaults to chrome/browser runtime. */\n readonly runtime?: ExtensionRuntimeLike;\n /**\n * Chrome exposes storage.local to content scripts by default. Keep the default\n * trusted-context restriction when the host API supports it.\n */\n readonly restrictAccessToTrustedContexts?: boolean;\n}\n\ninterface StorageLike {\n readonly length: number;\n key(index: number): string | null;\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\ninterface ExtensionStorageArea {\n get(\n keys?: string | string[] | Record<string, unknown> | null,\n callback?: (items: Record<string, unknown>) => void,\n ): Promise<Record<string, unknown>> | void;\n set(items: Record<string, string>, callback?: () => void): Promise<void> | void;\n remove(keys: string | string[], callback?: () => void): Promise<void> | void;\n setAccessLevel?(details: { accessLevel: string }, callback?: () => void): Promise<void> | void;\n}\n\ninterface ExtensionRuntimeLike {\n readonly lastError?: { readonly message?: string } | null;\n}\n\n/**\n * In-memory adapter. Fully functional, unencrypted, non-persistent - intended\n * for tests and ephemeral flows, never for real secrets at rest.\n */\nexport function inMemoryStorage(): StorageAdapter {\n // Each namespace is a separate inner map rather than a flattened composite\n // key, so a namespace or key containing any character (including a separator)\n // can never collide across namespaces.\n const namespaces = new Map<string, Map<string, Uint8Array>>();\n const bucket = (namespace: string) => {\n let inner = namespaces.get(namespace);\n if (!inner) {\n inner = new Map<string, Uint8Array>();\n namespaces.set(namespace, inner);\n }\n return inner;\n };\n return {\n kind: \"memory\",\n async put(namespace, key, value) {\n bucket(namespace).set(key, value);\n },\n async get(namespace, key) {\n return namespaces.get(namespace)?.get(key) ?? null;\n },\n async list(namespace) {\n return [...(namespaces.get(namespace)?.keys() ?? [])];\n },\n async remove(namespace, key) {\n namespaces.get(namespace)?.delete(key);\n },\n };\n}\n\n/**\n * Browser `localStorage` adapter. Values are stored as base64url-encoded bytes.\n * Encrypt or wrap the bytes before `put` if your product requires encrypted\n * local persistence.\n *\n * @throws StorageError `STORAGE_NOT_AVAILABLE` if `localStorage` is unavailable.\n */\nexport function browserStorage(options: BrowserStorageOptions = {}): StorageAdapter {\n const storage = options.storage ?? defaultBrowserStorage();\n if (!storage) throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"localStorage is unavailable\");\n const adapter: StorageAdapter = {\n kind: \"browser\",\n async put(namespace, key, value) {\n try {\n storage.setItem(storageKey(namespace, key), bytesToBase64Url(value));\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async get(namespace, key) {\n try {\n const value = storage.getItem(storageKey(namespace, key));\n return value === null ? null : base64UrlToBytes(value);\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async list(namespace) {\n try {\n const prefix = storageKeyPrefix(namespace);\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const storedKey = storage.key(index);\n if (storedKey?.startsWith(prefix)) {\n keys.push(decodeStorageSegment(storedKey.slice(prefix.length)));\n }\n }\n return keys;\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async remove(namespace, key) {\n try {\n storage.removeItem(storageKey(namespace, key));\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n };\n registerStorageBacking(adapter, storage);\n return adapter;\n}\n\n/**\n * Browser-extension (`chrome.storage.local` / `browser.storage.local`) adapter.\n * Values are stored as base64url-encoded bytes. Encrypt or wrap the bytes before\n * `put` if your product requires encrypted local persistence.\n *\n * @throws StorageError `STORAGE_NOT_AVAILABLE` if extension storage is unavailable.\n */\nexport function extensionStorage(options: ExtensionStorageOptions = {}): StorageAdapter {\n const storage = options.storage ?? defaultExtensionStorage();\n if (!storage) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"extension local storage is unavailable\");\n }\n const runtime = options.runtime ?? defaultExtensionRuntime();\n const trustedAccess =\n options.restrictAccessToTrustedContexts === false\n ? Promise.resolve()\n : extensionSetAccessLevel(storage, runtime);\n const adapter: StorageAdapter = {\n kind: \"extension\",\n async put(namespace, key, value) {\n await trustedAccess;\n await extensionSet(storage, runtime, {\n [storageKey(namespace, key)]: bytesToBase64Url(value),\n });\n },\n async get(namespace, key) {\n await trustedAccess;\n const storedKey = storageKey(namespace, key);\n const values = await extensionGet(storage, runtime, storedKey);\n const value = values[storedKey];\n return typeof value === \"string\" ? base64UrlToBytes(value) : null;\n },\n async list(namespace) {\n await trustedAccess;\n const prefix = storageKeyPrefix(namespace);\n const values = await extensionGet(storage, runtime, null);\n return Object.keys(values)\n .filter((key) => key.startsWith(prefix))\n .map((key) => decodeStorageSegment(key.slice(prefix.length)));\n },\n async remove(namespace, key) {\n await trustedAccess;\n await extensionRemove(storage, runtime, storageKey(namespace, key));\n },\n };\n registerStorageBacking(adapter, storage);\n return adapter;\n}\n\nfunction storageKey(namespace: string, key: string): string {\n return `${storageKeyPrefix(namespace)}${encodeStorageSegment(key)}`;\n}\n\nfunction storageKeyPrefix(namespace: string): string {\n return `${STORAGE_KEY_PREFIX}${encodeStorageSegment(namespace)}${STORAGE_KEY_SEPARATOR}`;\n}\n\nfunction encodeStorageSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction decodeStorageSegment(value: string): string {\n return decodeURIComponent(value);\n}\n\nfunction bytesToBase64Url(value: Uint8Array): string {\n let binary = \"\";\n for (let index = 0; index < value.length; index += BYTE_STRING_CHUNK_SIZE) {\n binary += String.fromCharCode(...value.slice(index, index + BYTE_STRING_CHUNK_SIZE));\n }\n return btoa(binary)\n .split(BASE64URL_PLUS)\n .join(BASE64URL_MINUS)\n .split(BASE64URL_SLASH)\n .join(BASE64URL_UNDERSCORE)\n .split(BASE64URL_PAD)\n .join(\"\");\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array {\n try {\n const base64 = value\n .split(BASE64URL_MINUS)\n .join(BASE64URL_PLUS)\n .split(BASE64URL_UNDERSCORE)\n .join(BASE64URL_SLASH)\n .padEnd(Math.ceil(value.length / 4) * 4, BASE64URL_PAD);\n return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));\n } catch (cause) {\n throw new StorageError(\"STORAGE_DECRYPT_FAILED\", \"stored value is not valid base64url\", {\n cause,\n });\n }\n}\n\nfunction defaultBrowserStorage(): StorageLike | undefined {\n try {\n return globalThis.localStorage;\n } catch (cause) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"localStorage is unavailable\", { cause });\n }\n}\n\nfunction browserOperationError(cause: unknown): StorageError {\n if (cause instanceof StorageError) return cause;\n return new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n storageErrorMessage(cause) ?? \"localStorage operation failed\",\n { cause },\n );\n}\n\nfunction defaultExtensionStorage(): ExtensionStorageArea | undefined {\n const global = globalThis as {\n chrome?: { storage?: { local?: ExtensionStorageArea } };\n browser?: { storage?: { local?: ExtensionStorageArea } };\n };\n return global.chrome?.storage?.local ?? global.browser?.storage?.local;\n}\n\nfunction defaultExtensionRuntime(): ExtensionRuntimeLike | undefined {\n const global = globalThis as {\n chrome?: { runtime?: ExtensionRuntimeLike };\n browser?: { runtime?: ExtensionRuntimeLike };\n };\n return global.chrome?.runtime ?? global.browser?.runtime;\n}\n\nfunction extensionGet(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n keys: string | string[] | Record<string, unknown> | null,\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.get(keys, (items) => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve(items);\n });\n if (isPromise<Record<string, unknown>>(maybePromise)) {\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n }\n });\n}\n\nfunction extensionSet(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n items: Record<string, string>,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.set(items, () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n });\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionRemove(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n key: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.remove(key, () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n });\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionSetAccessLevel(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n): Promise<void> {\n const setAccessLevel = storage.setAccessLevel;\n if (!setAccessLevel) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const maybePromise = setAccessLevel.call(\n storage,\n { accessLevel: EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL },\n () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n },\n );\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionLastError(\n runtime: ExtensionRuntimeLike | undefined,\n): { readonly message?: string } | null {\n return runtime?.lastError ?? null;\n}\n\nfunction extensionOperationError(error: unknown): StorageError {\n if (error instanceof StorageError) return error;\n return new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n storageErrorMessage(error) ?? \"extension storage operation failed\",\n { cause: error },\n );\n}\n\nfunction storageErrorMessage(error: unknown): string | undefined {\n if (error instanceof Error) return error.message;\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return undefined;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then: unknown }).then === \"function\"\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getSessionState, failSessionClosed, createSessionHandle, closeSessionState } from './chunk-
|
|
2
|
-
import { getStorageBacking, browserStorage, extensionStorage } from './chunk-
|
|
3
|
-
import { TransportError, StorageError, AttestationError } from './chunk-
|
|
1
|
+
import { getSessionState, failSessionClosed, createSessionHandle, closeSessionState } from './chunk-6AKBRYKO.js';
|
|
2
|
+
import { getStorageBacking, browserStorage, extensionStorage } from './chunk-AIKC2XQS.js';
|
|
3
|
+
import { TransportError, StorageError, AttestationError } from './chunk-RWKG7N7I.js';
|
|
4
4
|
import * as x509 from '@peculiar/x509';
|
|
5
5
|
import { generateKeyPair, sharedKey } from '@stablelib/x25519';
|
|
6
6
|
import { ChaCha20Poly1305 } from '@stablelib/chacha20poly1305';
|
|
@@ -232,6 +232,7 @@ var SERIALIZED_RECORD_KEYS = /* @__PURE__ */ new Set([
|
|
|
232
232
|
"recoveryCodeHex"
|
|
233
233
|
]);
|
|
234
234
|
var POLICY_SNAPSHOT_KEYS = /* @__PURE__ */ new Set([
|
|
235
|
+
"economics",
|
|
235
236
|
"asset",
|
|
236
237
|
"entry_amount_lamports",
|
|
237
238
|
"total_committed_lamports",
|
|
@@ -1120,6 +1121,9 @@ function normalizePolicySnapshot(value) {
|
|
|
1120
1121
|
if (Object.keys(value).some((key) => !POLICY_SNAPSHOT_KEYS.has(key))) {
|
|
1121
1122
|
throw corruptRecordError("persisted transfer policy snapshot contains an unknown field");
|
|
1122
1123
|
}
|
|
1124
|
+
if (value.economics !== void 0 && value.economics !== "legacy" && value.economics !== "zero_protocol_fees") {
|
|
1125
|
+
throw corruptRecordError("persisted transfer policy economics is invalid");
|
|
1126
|
+
}
|
|
1123
1127
|
if (value.asset !== "SOL") throw corruptRecordError("persisted transfer policy asset is invalid");
|
|
1124
1128
|
const integerFields = [
|
|
1125
1129
|
"entry_amount_lamports",
|
|
@@ -1161,6 +1165,7 @@ function normalizePolicySnapshot(value) {
|
|
|
1161
1165
|
return { destination_address: entry.destination_address };
|
|
1162
1166
|
});
|
|
1163
1167
|
return {
|
|
1168
|
+
...value.economics !== void 0 && { economics: value.economics },
|
|
1164
1169
|
asset: "SOL",
|
|
1165
1170
|
entry_amount_lamports: value.entry_amount_lamports,
|
|
1166
1171
|
total_committed_lamports: value.total_committed_lamports,
|
|
@@ -3924,7 +3929,7 @@ var lpPositionView_schema_default = {
|
|
|
3924
3929
|
properties: {
|
|
3925
3930
|
id: { type: "string", description: "lp_position_id" },
|
|
3926
3931
|
status: { enum: ["dkg_pending", "active", "withdrawing", "closed"] },
|
|
3927
|
-
targetShardCount: { type: "integer", minimum: 0, maximum:
|
|
3932
|
+
targetShardCount: { type: "integer", minimum: 0, maximum: 4294967295 },
|
|
3928
3933
|
authPublicKey: {
|
|
3929
3934
|
type: "string",
|
|
3930
3935
|
description: "Derived from the LP Position Code; signs LP commands."
|
|
@@ -4185,5 +4190,5 @@ async function runReattest(state, endpoint) {
|
|
|
4185
4190
|
}
|
|
4186
4191
|
|
|
4187
4192
|
export { INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256, closeSession, createExponentialBackoff, createSession, createSessionInternal, createStateController, disabledClientPersistence, formatAjvErrors, getPersistedTransfer, isLoopbackUrl, listPersistedTransfers, noiseWebSocketTransport, persistTransferAllocation, persistTransferDkgMetadata, persistTransferReady, persistTransferRecoveryCode, persistTransferStatus, persistTransferTerminal, purgePersistedTransfers, readPersistedTransferForResume, reattestSerialized, removePersistedTransfer, validatePayoutPolicyShape };
|
|
4188
|
-
//# sourceMappingURL=chunk-
|
|
4189
|
-
//# sourceMappingURL=chunk-
|
|
4193
|
+
//# sourceMappingURL=chunk-EOPZVOVP.js.map
|
|
4194
|
+
//# sourceMappingURL=chunk-EOPZVOVP.js.map
|