passkey-kit 0.12.1 → 0.13.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/README.md +399 -227
- package/{types → dist}/base.d.ts +1 -0
- package/dist/base.d.ts.map +1 -0
- package/{src/base.ts → dist/base.js} +8 -10
- package/dist/base.js.map +1 -0
- package/dist/base64url.d.ts +18 -0
- package/dist/base64url.d.ts.map +1 -0
- package/dist/base64url.js +18 -0
- package/dist/base64url.js.map +1 -0
- package/dist/constants.d.ts +87 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +111 -0
- package/dist/constants.js.map +1 -0
- package/dist/contract-errors.d.ts +69 -0
- package/dist/contract-errors.d.ts.map +1 -0
- package/dist/contract-errors.js +129 -0
- package/dist/contract-errors.js.map +1 -0
- package/dist/errors.d.ts +163 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +244 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +94 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +92 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/codec.d.ts +18 -0
- package/dist/indexer/codec.d.ts.map +1 -0
- package/dist/indexer/codec.js +32 -0
- package/dist/indexer/codec.js.map +1 -0
- package/dist/indexer/index.d.ts +25 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +34 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/mercury.d.ts +88 -0
- package/dist/indexer/mercury.d.ts.map +1 -0
- package/dist/indexer/mercury.js +237 -0
- package/dist/indexer/mercury.js.map +1 -0
- package/dist/indexer/stellar-indexer.d.ts +115 -0
- package/dist/indexer/stellar-indexer.d.ts.map +1 -0
- package/dist/indexer/stellar-indexer.js +279 -0
- package/dist/indexer/stellar-indexer.js.map +1 -0
- package/dist/indexer/types.d.ts +73 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +9 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/kit/auth-payload.d.ts +89 -0
- package/dist/kit/auth-payload.d.ts.map +1 -0
- package/dist/kit/auth-payload.js +203 -0
- package/dist/kit/auth-payload.js.map +1 -0
- package/dist/kit/deploy-ops.d.ts +45 -0
- package/dist/kit/deploy-ops.d.ts.map +1 -0
- package/dist/kit/deploy-ops.js +69 -0
- package/dist/kit/deploy-ops.js.map +1 -0
- package/dist/kit/tx-ops.d.ts +92 -0
- package/dist/kit/tx-ops.d.ts.map +1 -0
- package/dist/kit/tx-ops.js +113 -0
- package/dist/kit/tx-ops.js.map +1 -0
- package/dist/kit/wallet-ops.d.ts +59 -0
- package/dist/kit/wallet-ops.d.ts.map +1 -0
- package/dist/kit/wallet-ops.js +122 -0
- package/dist/kit/wallet-ops.js.map +1 -0
- package/dist/kit/webauthn-ops.d.ts +55 -0
- package/dist/kit/webauthn-ops.d.ts.map +1 -0
- package/dist/kit/webauthn-ops.js +79 -0
- package/dist/kit/webauthn-ops.js.map +1 -0
- package/dist/kit.d.ts +128 -0
- package/dist/kit.d.ts.map +1 -0
- package/dist/kit.js +276 -0
- package/dist/kit.js.map +1 -0
- package/dist/managers/credential-manager.d.ts +39 -0
- package/dist/managers/credential-manager.d.ts.map +1 -0
- package/dist/managers/credential-manager.js +47 -0
- package/dist/managers/credential-manager.js.map +1 -0
- package/dist/managers/index.d.ts +7 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/index.js +7 -0
- package/dist/managers/index.js.map +1 -0
- package/dist/managers/signer-manager.d.ts +51 -0
- package/dist/managers/signer-manager.d.ts.map +1 -0
- package/dist/managers/signer-manager.js +92 -0
- package/dist/managers/signer-manager.js.map +1 -0
- package/dist/managers/submission-manager.d.ts +52 -0
- package/dist/managers/submission-manager.d.ts.map +1 -0
- package/dist/managers/submission-manager.js +77 -0
- package/dist/managers/submission-manager.js.map +1 -0
- package/dist/relayer.d.ts +61 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +119 -0
- package/dist/relayer.js.map +1 -0
- package/dist/rpc-data.d.ts +35 -0
- package/dist/rpc-data.d.ts.map +1 -0
- package/dist/rpc-data.js +49 -0
- package/dist/rpc-data.js.map +1 -0
- package/dist/sac.d.ts +31 -0
- package/dist/sac.d.ts.map +1 -0
- package/dist/sac.js +47 -0
- package/dist/sac.js.map +1 -0
- package/dist/server.d.ts +79 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +152 -0
- package/dist/server.js.map +1 -0
- package/dist/signers.d.ts +83 -0
- package/dist/signers.d.ts.map +1 -0
- package/dist/signers.js +124 -0
- package/dist/signers.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +12 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +26 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +100 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/localStorage.d.ts +22 -0
- package/dist/storage/localStorage.d.ts.map +1 -0
- package/dist/storage/localStorage.js +86 -0
- package/dist/storage/localStorage.js.map +1 -0
- package/dist/storage/memory.d.ts +18 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +41 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +39 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +52 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +153 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +40 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +73 -0
- package/dist/validation.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/package.json +45 -18
- package/.claude/settings.local.json +0 -20
- package/.cursorrules +0 -170
- package/.gitattributes +0 -2
- package/.github/workflows/release.yml +0 -21
- package/.vscode/settings.json +0 -6
- package/PROPOSAL.md +0 -397
- package/cheatsheet.txt +0 -18
- package/clone-js-sdk.sh +0 -21
- package/packages/passkey-kit-sdk/README.md +0 -54
- package/packages/passkey-kit-sdk/package.json +0 -21
- package/packages/passkey-kit-sdk/src/index.ts +0 -171
- package/packages/passkey-kit-sdk/tsconfig.json +0 -98
- package/packages/passkey-kit-sdk/types/index.d.ts +0 -190
- package/packages/sac-sdk/README.md +0 -54
- package/packages/sac-sdk/package.json +0 -21
- package/packages/sac-sdk/src/index.ts +0 -586
- package/packages/sac-sdk/tsconfig.json +0 -98
- package/packages/sac-sdk/types/index.d.ts +0 -532
- package/pnpm-workspace.yaml +0 -2
- package/src/index.ts +0 -5
- package/src/kit.ts +0 -823
- package/src/sac.ts +0 -29
- package/src/server.ts +0 -179
- package/src/types.ts +0 -32
- package/tsconfig.json +0 -28
- package/types/index.d.ts +0 -5
- package/types/kit.d.ts +0 -95
- package/types/sac.d.ts +0 -13
- package/types/server.d.ts +0 -29
- package/types/types.d.ts +0 -22
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stellar Indexer backend (Creit Tech), over `POST /v1/contract-data/`.
|
|
3
|
+
*
|
|
4
|
+
* The wallet stores one top-level contract-data entry per signer
|
|
5
|
+
* (`key = SignerKey ScVal`, `val = SignerVal`), so signer enumeration is a
|
|
6
|
+
* contract-scoped query and reverse lookup is derive-then-confirm: derive the
|
|
7
|
+
* wallet address from the keyId, then confirm the signer entry exists there.
|
|
8
|
+
* Removed signers appear as tombstoned (`deleted_at`) entries.
|
|
9
|
+
*
|
|
10
|
+
* WIRE FORMAT (F2-confirmed, todo 959 c2502 / todo 967):
|
|
11
|
+
* - The live API returns each entry's `key`/`val` as **JSON ScVal**, e.g.
|
|
12
|
+
* `{"vec":[{"symbol":"Secp256r1"},{"bytes":"<hex>"}]}` — NOT base64 XDR. We
|
|
13
|
+
* convert JSON ScVal -> `xdr.ScVal` ({@link jsonScValToXdr}) and reuse the
|
|
14
|
+
* contract-spec decoders (`scValToSignerKey`/`decodeSignerVal`). The JSON
|
|
15
|
+
* convention is the standard Stellar one: `symbol`, `bytes` (hex), `address`
|
|
16
|
+
* (strkey), `vec` (array), `map` (`[{key,val}]`), `u64`/`i64` (string),
|
|
17
|
+
* `u32`/`i32` (number), `bool`, `string`, `void` (None).
|
|
18
|
+
* - Entry fields: `id, contract_id, durability, key, val,
|
|
19
|
+
* last_modified_ledger_seq, tx_meta_version, timestamp, created_at,
|
|
20
|
+
* updated_at, deleted_at`.
|
|
21
|
+
*
|
|
22
|
+
* NETWORK: **the Stellar Indexer indexes MAINNET only** — a testnet contract
|
|
23
|
+
* returns HTTP 200 with zero entries (F2). To keep "unsupported network" from
|
|
24
|
+
* masquerading as "wallet has no signers", the backend is network-aware: use
|
|
25
|
+
* {@link StellarIndexerBackend.forNetwork} (returns `null` off mainnet), and a
|
|
26
|
+
* config pinned to a non-mainnet passphrase throws at construction rather than
|
|
27
|
+
* silently returning `[]`. Live validation therefore needs a mainnet v1 wallet
|
|
28
|
+
* (endgame-gated); until then this is unit-tested against the documented shape.
|
|
29
|
+
*
|
|
30
|
+
* @packageDocumentation
|
|
31
|
+
*/
|
|
32
|
+
import { Address, Networks, nativeToScVal, xdr } from "@stellar/stellar-sdk";
|
|
33
|
+
import { IndexerError, PasskeyKitErrorCode } from "../errors.js";
|
|
34
|
+
import { DEFAULT_INDEXER_TIMEOUT_MS } from "../constants.js";
|
|
35
|
+
import { deriveContractAddress } from "../utils.js";
|
|
36
|
+
import { buildWalletSigner, decodeSignerVal, deriveStatus, scValToSignerKey, signerKeyToIndexerJson, } from "./codec.js";
|
|
37
|
+
/** Max contract ids per contract-data request (API cap). */
|
|
38
|
+
export const MAX_CONTRACTS_PER_QUERY = 25;
|
|
39
|
+
/** The only network the Stellar Indexer indexes (mainnet). */
|
|
40
|
+
export const STELLAR_INDEXER_NETWORK = Networks.PUBLIC;
|
|
41
|
+
export class StellarIndexerBackend {
|
|
42
|
+
config;
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this.config = config;
|
|
45
|
+
if (!config.url || !config.accessToken) {
|
|
46
|
+
throw new IndexerError("StellarIndexerBackend requires url and accessToken", PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
|
|
47
|
+
}
|
|
48
|
+
if (config.networkPassphrase &&
|
|
49
|
+
config.networkPassphrase !== STELLAR_INDEXER_NETWORK) {
|
|
50
|
+
throw new IndexerError(`Stellar Indexer indexes mainnet only; refusing a backend pinned to "${config.networkPassphrase}". ` +
|
|
51
|
+
`Use StellarIndexerBackend.forNetwork(...) to get null off mainnet.`, PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Network-aware factory: the backend for mainnet, or `null` for any other
|
|
56
|
+
* network (the Stellar Indexer doesn't index testnet, so "discovery disabled"
|
|
57
|
+
* is the honest answer — callers treat `null` as no-indexer rather than an
|
|
58
|
+
* empty signer set).
|
|
59
|
+
*/
|
|
60
|
+
static forNetwork(config, networkPassphrase) {
|
|
61
|
+
if (networkPassphrase !== STELLAR_INDEXER_NETWORK)
|
|
62
|
+
return null;
|
|
63
|
+
return new StellarIndexerBackend({ ...config, networkPassphrase });
|
|
64
|
+
}
|
|
65
|
+
nowSeconds() {
|
|
66
|
+
return this.config.now ? this.config.now() : Math.floor(Date.now() / 1000);
|
|
67
|
+
}
|
|
68
|
+
async query(body) {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timeout = setTimeout(() => controller.abort(), DEFAULT_INDEXER_TIMEOUT_MS);
|
|
71
|
+
try {
|
|
72
|
+
const response = await fetch(`${this.config.url}/v1/contract-data/`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: {
|
|
75
|
+
"Content-Type": "application/json",
|
|
76
|
+
Authorization: `Bearer ${this.config.accessToken}`,
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify(body),
|
|
79
|
+
signal: controller.signal,
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
const text = await response.text().catch(() => "");
|
|
83
|
+
throw new IndexerError(`Stellar Indexer request failed (${response.status}): ${text.slice(0, 200)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED, { status: response.status });
|
|
84
|
+
}
|
|
85
|
+
const json = (await response.json());
|
|
86
|
+
return extractEntries(json);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (err instanceof IndexerError)
|
|
90
|
+
throw err;
|
|
91
|
+
const aborted = err instanceof Error && err.name === "AbortError";
|
|
92
|
+
throw new IndexerError(aborted ? "Stellar Indexer request timed out" : String(err), PasskeyKitErrorCode.INDEXER_REQUEST_FAILED, undefined, err instanceof Error ? err : undefined);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
clearTimeout(timeout);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async getSigners(wallet) {
|
|
99
|
+
const entries = await this.query({ contracts: [wallet] });
|
|
100
|
+
return this.entriesToSigners(entries);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Group entries by signer key and resolve status. A key with any live entry
|
|
104
|
+
* is live/expired; a key whose every entry is tombstoned (no live counterpart
|
|
105
|
+
* in either durability) is `removed`.
|
|
106
|
+
*/
|
|
107
|
+
entriesToSigners(entries) {
|
|
108
|
+
const groups = new Map();
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
// Group on the raw JSON ScVal of the key (identical signer keys serialize
|
|
111
|
+
// identically); decode once per group below.
|
|
112
|
+
const groupKey = JSON.stringify(entry.key);
|
|
113
|
+
const list = groups.get(groupKey) ?? [];
|
|
114
|
+
list.push(entry);
|
|
115
|
+
groups.set(groupKey, list);
|
|
116
|
+
}
|
|
117
|
+
const signers = [];
|
|
118
|
+
for (const [, group] of groups) {
|
|
119
|
+
const live = group.find((e) => e.deleted_at == null);
|
|
120
|
+
const chosen = live ?? group[0];
|
|
121
|
+
const key = scValToSignerKey(jsonScValToXdr(chosen.key));
|
|
122
|
+
const decoded = decodeSignerVal(jsonScValToXdr(chosen.val));
|
|
123
|
+
const storage = chosen.durability;
|
|
124
|
+
const status = live
|
|
125
|
+
? deriveStatus({
|
|
126
|
+
expiration: decoded.expiration,
|
|
127
|
+
nowSeconds: this.nowSeconds(),
|
|
128
|
+
})
|
|
129
|
+
: "removed";
|
|
130
|
+
signers.push(buildWalletSigner(key, decoded, storage, status));
|
|
131
|
+
}
|
|
132
|
+
return signers;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Reverse lookup via derive-then-confirm. Only Secp256r1 keyIds are
|
|
136
|
+
* derivable; Ed25519/Policy signers are not discoverable through this backend
|
|
137
|
+
* (use Mercury's event-driven index for those).
|
|
138
|
+
*/
|
|
139
|
+
async findWallets(key) {
|
|
140
|
+
if (key.key !== "Secp256r1") {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
if (!this.config.hardening) {
|
|
144
|
+
throw new IndexerError("findWallets requires hardening deps (networkPassphrase + deployerPublicKey) to derive candidates", PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
|
|
145
|
+
}
|
|
146
|
+
const candidate = deriveContractAddress(Buffer.from(key.value, "base64url"), this.config.hardening.deployerPublicKey, this.config.hardening.networkPassphrase);
|
|
147
|
+
const entries = await this.query({
|
|
148
|
+
contracts: [candidate],
|
|
149
|
+
key: signerKeyToIndexerJson(key),
|
|
150
|
+
});
|
|
151
|
+
// Confirmed only if the derived wallet holds a live entry for this key.
|
|
152
|
+
const live = entries.some((e) => e.deleted_at == null);
|
|
153
|
+
return live ? [candidate] : [];
|
|
154
|
+
}
|
|
155
|
+
async health() {
|
|
156
|
+
try {
|
|
157
|
+
await this.query({
|
|
158
|
+
contracts: ["CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"],
|
|
159
|
+
});
|
|
160
|
+
return { ok: true, backend: "stellar-indexer" };
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
return {
|
|
164
|
+
ok: false,
|
|
165
|
+
backend: "stellar-indexer",
|
|
166
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Pull the entries array out of a few known response shapes.
|
|
173
|
+
*
|
|
174
|
+
* A genuinely empty response (`null`/`undefined` or `{}`) yields `[]`, but an
|
|
175
|
+
* UNRECOGNIZED non-empty envelope throws rather than silently degrading to `[]`:
|
|
176
|
+
* conflating "shape changed" with "wallet has no signers" would burn the whole
|
|
177
|
+
* retry budget and then report a valid wallet as signer-less (audit LOW).
|
|
178
|
+
*/
|
|
179
|
+
function extractEntries(json) {
|
|
180
|
+
if (Array.isArray(json))
|
|
181
|
+
return json;
|
|
182
|
+
if (json == null)
|
|
183
|
+
return [];
|
|
184
|
+
if (typeof json === "object") {
|
|
185
|
+
const obj = json;
|
|
186
|
+
if (Array.isArray(obj.entries))
|
|
187
|
+
return obj.entries;
|
|
188
|
+
if (Array.isArray(obj.data))
|
|
189
|
+
return obj.data;
|
|
190
|
+
if (Object.keys(obj).length === 0)
|
|
191
|
+
return []; // genuinely-empty object
|
|
192
|
+
}
|
|
193
|
+
throw new IndexerError("Unrecognized Stellar Indexer response shape (expected an array or { entries | data: [...] })", PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Convert a Stellar JSON-ScVal object into an `xdr.ScVal`.
|
|
197
|
+
*
|
|
198
|
+
* The Stellar Indexer serializes ledger-entry `key`/`val` as JSON ScVal — a
|
|
199
|
+
* single-key object per value (`{"vec":[...]}`, `{"symbol":"…"}`, …). This is
|
|
200
|
+
* the inverse of that serialization for the variants a smart-wallet
|
|
201
|
+
* SignerKey/SignerVal can contain, letting the contract-spec decoders take over.
|
|
202
|
+
*
|
|
203
|
+
* Unknown variant keys THROW (never silently misdecode): an unexpected wire
|
|
204
|
+
* shape must surface as an error, not a wrong signer.
|
|
205
|
+
*/
|
|
206
|
+
export function jsonScValToXdr(json) {
|
|
207
|
+
// Some encoders represent `void`/None as a bare null.
|
|
208
|
+
if (json === null || json === undefined)
|
|
209
|
+
return xdr.ScVal.scvVoid();
|
|
210
|
+
if (typeof json !== "object") {
|
|
211
|
+
throw new IndexerError(`Unrecognized JSON ScVal (not an object): ${JSON.stringify(json)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
|
|
212
|
+
}
|
|
213
|
+
const obj = json;
|
|
214
|
+
const keys = Object.keys(obj);
|
|
215
|
+
if (keys.length !== 1) {
|
|
216
|
+
throw new IndexerError(`Unrecognized JSON ScVal (expected exactly one type key): ${JSON.stringify(keys)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
|
|
217
|
+
}
|
|
218
|
+
const tag = keys[0];
|
|
219
|
+
const v = obj[tag];
|
|
220
|
+
switch (tag) {
|
|
221
|
+
case "void":
|
|
222
|
+
return xdr.ScVal.scvVoid();
|
|
223
|
+
case "bool":
|
|
224
|
+
return xdr.ScVal.scvBool(Boolean(v));
|
|
225
|
+
case "u32":
|
|
226
|
+
return xdr.ScVal.scvU32(Number(v));
|
|
227
|
+
case "i32":
|
|
228
|
+
return xdr.ScVal.scvI32(Number(v));
|
|
229
|
+
case "u64":
|
|
230
|
+
return nativeToScVal(BigInt(v), { type: "u64" });
|
|
231
|
+
case "i64":
|
|
232
|
+
return nativeToScVal(BigInt(v), { type: "i64" });
|
|
233
|
+
case "timepoint":
|
|
234
|
+
return nativeToScVal(BigInt(v), { type: "timepoint" });
|
|
235
|
+
case "duration":
|
|
236
|
+
return nativeToScVal(BigInt(v), { type: "duration" });
|
|
237
|
+
case "u128":
|
|
238
|
+
return nativeToScVal(bigIntOfParts(v), { type: "u128" });
|
|
239
|
+
case "i128":
|
|
240
|
+
return nativeToScVal(bigIntOfParts(v), { type: "i128" });
|
|
241
|
+
case "u256":
|
|
242
|
+
return nativeToScVal(bigIntOfParts(v), { type: "u256" });
|
|
243
|
+
case "i256":
|
|
244
|
+
return nativeToScVal(bigIntOfParts(v), { type: "i256" });
|
|
245
|
+
case "bytes":
|
|
246
|
+
return xdr.ScVal.scvBytes(Buffer.from(String(v), "hex"));
|
|
247
|
+
case "string":
|
|
248
|
+
return xdr.ScVal.scvString(String(v));
|
|
249
|
+
case "symbol":
|
|
250
|
+
return xdr.ScVal.scvSymbol(String(v));
|
|
251
|
+
case "address":
|
|
252
|
+
return Address.fromString(String(v)).toScVal();
|
|
253
|
+
case "vec":
|
|
254
|
+
return xdr.ScVal.scvVec(v.map(jsonScValToXdr));
|
|
255
|
+
case "map":
|
|
256
|
+
return xdr.ScVal.scvMap(v.map((e) => new xdr.ScMapEntry({
|
|
257
|
+
key: jsonScValToXdr(e.key),
|
|
258
|
+
val: jsonScValToXdr(e.val),
|
|
259
|
+
})));
|
|
260
|
+
default:
|
|
261
|
+
throw new IndexerError(`Unsupported JSON ScVal type "${tag}"`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Coerce a large-integer JSON ScVal value to a bigint, accepting either a
|
|
266
|
+
* decimal string/number or a `{ hi, lo }` multi-part object (the exact 128/256
|
|
267
|
+
* wire shape is undocumented and unused by SignerVal — u64 covers expiration —
|
|
268
|
+
* so this stays tolerant).
|
|
269
|
+
*/
|
|
270
|
+
function bigIntOfParts(v) {
|
|
271
|
+
if (typeof v === "string" || typeof v === "number")
|
|
272
|
+
return BigInt(v);
|
|
273
|
+
if (v && typeof v === "object" && "hi" in v && "lo" in v) {
|
|
274
|
+
const { hi, lo } = v;
|
|
275
|
+
return (BigInt(hi) << 64n) | BigInt(lo);
|
|
276
|
+
}
|
|
277
|
+
throw new IndexerError(`Unrecognized large-integer JSON ScVal value: ${JSON.stringify(v)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=stellar-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stellar-indexer.js","sourceRoot":"","sources":["../../src/indexer/stellar-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indexer abstraction: one {@link SignerIndexer} interface, resolved by the
|
|
3
|
+
* keyless {@link MercuryIndexer} backend into the {@link WalletSigner} shape so a
|
|
4
|
+
* signer added through the demo is discoverable and asserted in the browser e2e.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import type { SignerKey, SignerLimits } from "../types.js";
|
|
9
|
+
/** Storage durability of a signer's ledger entry. */
|
|
10
|
+
export type SignerStorageClass = "persistent" | "temporary";
|
|
11
|
+
/**
|
|
12
|
+
* Lifecycle status of a signer, derived from the entry + expiration:
|
|
13
|
+
* - `live` — present and not expired.
|
|
14
|
+
* - `expired` — present but past its expiration timestamp.
|
|
15
|
+
* - `evicted` — a temporary entry whose ledger state was evicted (TTL).
|
|
16
|
+
* - `removed` — tombstoned (remove_signer), no live counterpart in either
|
|
17
|
+
* durability.
|
|
18
|
+
*/
|
|
19
|
+
export type SignerStatus = "live" | "expired" | "evicted" | "removed";
|
|
20
|
+
/** A signer as resolved by an indexer backend. */
|
|
21
|
+
export interface WalletSigner {
|
|
22
|
+
/** The signer's key (kind + value). */
|
|
23
|
+
key: SignerKey;
|
|
24
|
+
/** 65-byte secp256r1 public key, for Secp256r1 signers. */
|
|
25
|
+
publicKey?: Uint8Array;
|
|
26
|
+
/**
|
|
27
|
+
* Expiration as a UNIX timestamp in seconds (inclusive), if set. The reworked
|
|
28
|
+
* contract stores expiration as a timestamp, not a ledger sequence (#602).
|
|
29
|
+
*/
|
|
30
|
+
expiration?: number;
|
|
31
|
+
/** Per-contract limits (`undefined` = unlimited). */
|
|
32
|
+
limits?: SignerLimits;
|
|
33
|
+
/** Storage durability of the entry. */
|
|
34
|
+
storage: SignerStorageClass;
|
|
35
|
+
/** Derived lifecycle status. */
|
|
36
|
+
status: SignerStatus;
|
|
37
|
+
}
|
|
38
|
+
/** Health of an indexer backend. */
|
|
39
|
+
export interface IndexerHealth {
|
|
40
|
+
/** Whether the backend answered a health probe. */
|
|
41
|
+
ok: boolean;
|
|
42
|
+
/** Backend identifier (e.g. "mercury"). */
|
|
43
|
+
backend: string;
|
|
44
|
+
/** Optional human-readable detail. */
|
|
45
|
+
detail?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A pluggable signer indexer.
|
|
49
|
+
*
|
|
50
|
+
* Null-tolerant seam (per SAK): a backend that is *not configured* is
|
|
51
|
+
* represented as `null` at the call site (see `forNetwork`); a backend that is
|
|
52
|
+
* configured but *fails* throws; a health/404 degrades to `{ ok: false }`
|
|
53
|
+
* rather than throwing.
|
|
54
|
+
*/
|
|
55
|
+
export interface SignerIndexer {
|
|
56
|
+
/** Enumerate all signers currently indexed for a wallet. */
|
|
57
|
+
getSigners(wallet: string): Promise<WalletSigner[]>;
|
|
58
|
+
/** Reverse lookup: the wallet contract ids a signer key belongs to. */
|
|
59
|
+
findWallets(key: SignerKey): Promise<string[]>;
|
|
60
|
+
/** Probe backend health (degrades to `{ ok: false }` rather than throwing). */
|
|
61
|
+
health(): Promise<IndexerHealth>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Deps for the SDK-side `findWallets` hardening (#598 F3): before trusting a
|
|
65
|
+
* reverse-lookup result, the candidate wallet is confirmed by re-deriving its
|
|
66
|
+
* address from the keyId (deterministic derivation) — no unverified `res[0]`.
|
|
67
|
+
*/
|
|
68
|
+
export interface FindWalletsHardeningDeps {
|
|
69
|
+
networkPassphrase: string;
|
|
70
|
+
/** The canonical deployer `G…` public key used for derivation. */
|
|
71
|
+
deployerPublicKey: string;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,WAAW,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,GAAG,EAAE,SAAS,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,uCAAuC;IACvC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,gCAAgC;IAChC,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,EAAE,EAAE,OAAO,CAAC;IACZ,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpD,uEAAuE;IACvE,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,+EAA+E;IAC/E,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indexer abstraction: one {@link SignerIndexer} interface, resolved by the
|
|
3
|
+
* keyless {@link MercuryIndexer} backend into the {@link WalletSigner} shape so a
|
|
4
|
+
* signer added through the demo is discoverable and asserted in the browser e2e.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Soroban authorization-entry payload helpers + the flat `Signatures` map codec.
|
|
3
|
+
*
|
|
4
|
+
* These are thin wrappers over the stellar-sdk's native Protocol-27 auth
|
|
5
|
+
* primitives (`buildAuthorizationEntryPreimage`). The old kit hand-rolled a
|
|
6
|
+
* stack of "does this SDK support P27?" probe shims; on stellar-sdk >= 16 those
|
|
7
|
+
* are all dead, so this module simply uses the SDK.
|
|
8
|
+
*
|
|
9
|
+
* The smart wallet's `__check_auth` reads a `Signatures` value — a single
|
|
10
|
+
* `Map<SignerKey, Signature>` — from the address credentials. Each signer
|
|
11
|
+
* contributes one entry keyed by its on-chain `SignerKey`. The host rejects an
|
|
12
|
+
* `ScMap` whose keys are not in the host's canonical sort order, so the map is
|
|
13
|
+
* sorted with {@link compareScVal} (NOT a byte/`localeCompare` sort — see below).
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { xdr } from "@stellar/stellar-sdk";
|
|
18
|
+
import type { Spec as ContractSpec } from "@stellar/stellar-sdk/contract";
|
|
19
|
+
import type { Signature as SDKSignature, SignerKey as SDKSignerKey } from "passkey-kit-sdk";
|
|
20
|
+
/**
|
|
21
|
+
* Extract the {@link xdr.SorobanAddressCredentials} from a credentials union,
|
|
22
|
+
* for the address / addressV2 / addressWithDelegates variants.
|
|
23
|
+
*
|
|
24
|
+
* @throws {SigningError} If the credentials are not address-based.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAddressCredentials(credentials: xdr.SorobanCredentials): xdr.SorobanAddressCredentials;
|
|
27
|
+
/**
|
|
28
|
+
* Whether a credentials union uses an address-bound signature payload (the P27
|
|
29
|
+
* V2 / with-delegates variants), whose preimage binds the invoker address.
|
|
30
|
+
*/
|
|
31
|
+
export declare function usesAddressBoundPayload(credentials: xdr.SorobanCredentials): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Assert that a signature-expiration ledger is a valid `u32`.
|
|
34
|
+
*
|
|
35
|
+
* @throws {SigningError} If not a `u32` integer.
|
|
36
|
+
*/
|
|
37
|
+
export declare function assertSignatureExpirationLedger(expiration: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Build the signature payload (the 32-byte hash a signer signs) for an
|
|
40
|
+
* authorization entry at a given expiration ledger.
|
|
41
|
+
*
|
|
42
|
+
* Sets the expiration on the entry's address credentials, then hashes the SDK's
|
|
43
|
+
* canonical authorization-entry preimage. Works for the address, addressV2, and
|
|
44
|
+
* addressWithDelegates credential variants.
|
|
45
|
+
*
|
|
46
|
+
* @throws {SigningError} If `expiration` is not a valid `u32`.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildSignaturePayload(networkPassphrase: string, entry: xdr.SorobanAuthorizationEntry, expiration: number): Buffer;
|
|
49
|
+
/**
|
|
50
|
+
* Compare two ScVals in the order the Soroban host uses when it validates that
|
|
51
|
+
* an ScMap is sorted by key (host `metered_map::from_map`, which rejects an
|
|
52
|
+
* unsorted map with `InvalidInput`).
|
|
53
|
+
*
|
|
54
|
+
* This is deliberately NOT a comparison of the XDR byte encodings. XDR prefixes
|
|
55
|
+
* every variable-length payload (Bytes, Symbol, String, Vec) with a 4-byte
|
|
56
|
+
* length, so `toXDR("hex")` sorting is length-major; the host instead compares
|
|
57
|
+
* those payloads element-wise by content (Rust slice `Ord`), where a shorter
|
|
58
|
+
* value that is a prefix of a longer one sorts first. The old kit's
|
|
59
|
+
* `localeCompare` on a symbol+hex string approximated this and could diverge
|
|
60
|
+
* from the host, producing a map the wallet rejects at `__check_auth`.
|
|
61
|
+
*
|
|
62
|
+
* Only the shapes that appear as `SignerKey` map keys are handled precisely
|
|
63
|
+
* (Vec, Symbol, String, Bytes, Address). All other shapes are same-type here
|
|
64
|
+
* (the discriminant is compared first), so their fixed-width XDR encodings sort
|
|
65
|
+
* order-equivalently to the host.
|
|
66
|
+
*/
|
|
67
|
+
export declare function compareScVal(a: xdr.ScVal, b: xdr.ScVal): number;
|
|
68
|
+
/** The `SignerVal` UDT type def, for decoding a stored signer entry's value. */
|
|
69
|
+
export declare const SIGNER_VAL_UDT: xdr.ScSpecTypeDef;
|
|
70
|
+
/** Encode a native `SignerKey` union into its contract ScVal via the spec. */
|
|
71
|
+
export declare function signerKeyToScVal(spec: ContractSpec, key: SDKSignerKey): xdr.ScVal;
|
|
72
|
+
/**
|
|
73
|
+
* Encode a native `Signature` union into its contract ScVal via the spec, or
|
|
74
|
+
* `scvVoid` when there is no signature value (policy signers).
|
|
75
|
+
*/
|
|
76
|
+
export declare function signatureToScVal(spec: ContractSpec, val: SDKSignature | undefined): xdr.ScVal;
|
|
77
|
+
/**
|
|
78
|
+
* Upsert a `(SignerKey, Signature)` pair into the entry's `Signatures` value,
|
|
79
|
+
* which is encoded as `scvVec([ scvMap([...]) ])`.
|
|
80
|
+
*
|
|
81
|
+
* A signer key already present in the map is replaced (co-signing is idempotent
|
|
82
|
+
* per signer). The map is re-sorted by key in host order after every insert, so
|
|
83
|
+
* the wallet's `__check_auth` accepts it.
|
|
84
|
+
*
|
|
85
|
+
* @throws {SigningError} If the existing signature is neither void nor a
|
|
86
|
+
* Signatures vec.
|
|
87
|
+
*/
|
|
88
|
+
export declare function upsertSignatureEntry(credentials: xdr.SorobanAddressCredentials, scKey: xdr.ScVal, scVal: xdr.ScVal): void;
|
|
89
|
+
//# sourceMappingURL=auth-payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-payload.d.ts","sourceRoot":"","sources":["../../src/kit/auth-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAGL,GAAG,EACJ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EACV,SAAS,IAAI,YAAY,EACzB,SAAS,IAAI,YAAY,EAC1B,MAAM,iBAAiB,CAAC;AAOzB;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,GAAG,CAAC,kBAAkB,GAClC,GAAG,CAAC,yBAAyB,CAc/B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,GAAG,CAAC,kBAAkB,GAClC,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAYxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,GAAG,CAAC,yBAAyB,EACpC,UAAU,EAAE,MAAM,GACjB,MAAM,CAaR;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,MAAM,CAmD/D;AAaD,gFAAgF;AAChF,eAAO,MAAM,cAAc,mBAE1B,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,YAAY,GAChB,GAAG,CAAC,KAAK,CAEX;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,YAAY,GAAG,SAAS,GAC5B,GAAG,CAAC,KAAK,CAEX;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,CAAC,yBAAyB,EAC1C,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,KAAK,EAAE,GAAG,CAAC,KAAK,GACf,IAAI,CAmCN"}
|