@1shotapi/ows-clear-signing 0.0.0-stage → 0.2.0

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.
@@ -0,0 +1,606 @@
1
+ import { decodeFunctionData, domainSeparator, formatUnits, toFunctionSelector, } from "viem";
2
+ import { ChainUtils, EClearSigningFieldFormat, EClearSigningIteration, EClearSigningVisibility, EVMAccountAddress, EVMContractAddress, EVMContractAddressSchema, } from "@1shotapi/ows-types";
3
+ import { ClearSigningError } from "./ClearSigningError.js";
4
+ import { ClearSigningPath, EClearSigningPathRoot, } from "./ClearSigningPath.js";
5
+ import { ClearSigningUtils } from "./ClearSigningUtils.js";
6
+ import { ClearSigningValue, EClearSigningValueKind } from "./ClearSigningValue.js";
7
+ import { EClearSigningDisplayKind, } from "./interfaces.js";
8
+ /** Largest unix timestamp (seconds) JS `Date` can represent. */
9
+ const MAX_DATE_SECONDS = 8640000000000n;
10
+ const SI_PREFIXES = [
11
+ [24, "Y"], [21, "Z"], [18, "E"], [15, "P"], [12, "T"], [9, "G"], [6, "M"], [3, "k"],
12
+ [0, ""], [-3, "m"], [-6, "µ"], [-9, "n"], [-12, "p"], [-15, "f"], [-18, "a"], [-21, "z"], [-24, "y"],
13
+ ];
14
+ /**
15
+ * Renders an ERC-7730 descriptor (as resolved by the Relayer) against a transaction or EIP-712
16
+ * message. Every binding the wallet can check locally is re-verified here, so a compromised
17
+ * resolver can at worst mislabel fields — never change decoded values:
18
+ *
19
+ * - calldata: `context.contract.deployments` contains (chainId, to); the format key's selector
20
+ * equals `data[0:4]`; arguments are decoded by the wallet from the format key.
21
+ * - EIP-712: `context.eip712` deployments / domain / domainSeparator constraints hold; the
22
+ * format key equals `encodeType(primaryType)` of the message being signed.
23
+ *
24
+ * Throws {@link ClearSigningError} when the descriptor cannot be applied; callers fall back to
25
+ * their generic display.
26
+ */
27
+ export class ClearSigningFormatter {
28
+ environment;
29
+ constructor(environment) {
30
+ this.environment = environment;
31
+ }
32
+ async formatCalldata(descriptor, transaction) {
33
+ const deployments = descriptor.context.contract?.deployments;
34
+ if (!deployments?.length) {
35
+ throw new ClearSigningError("Descriptor has no contract binding");
36
+ }
37
+ if (!this.matchesDeployment(deployments, transaction.chainId, transaction.to)) {
38
+ throw new ClearSigningError("Descriptor is not bound to this contract");
39
+ }
40
+ const fn = ClearSigningUtils.parseFunctionKey(descriptor.format.key);
41
+ const selector = toFunctionSelector(fn).toLowerCase();
42
+ if (transaction.data.slice(0, 10).toLowerCase() !== selector) {
43
+ throw new ClearSigningError("Descriptor format does not match calldata selector");
44
+ }
45
+ let args;
46
+ try {
47
+ args = decodeFunctionData({ abi: [fn], data: transaction.data }).args ?? [];
48
+ }
49
+ catch {
50
+ throw new ClearSigningError("Calldata does not decode with descriptor signature");
51
+ }
52
+ const value = /^0x0*$/.test(transaction.value) ? 0n : BigInt(transaction.value);
53
+ return new ClearSigningRenderSession(this.environment, descriptor, ClearSigningValue.fromAbiArguments(fn.inputs, args), this.container(transaction.from, transaction.to, value, transaction.chainId), transaction.chainId).render();
54
+ }
55
+ async formatTypedData(descriptor, typedData, signer) {
56
+ const chainId = ClearSigningUtils.domainChainId(typedData.domain);
57
+ const contract = EVMContractAddressSchema.safeParse(typedData.domain.verifyingContract);
58
+ if (chainId === null || !contract.success) {
59
+ throw new ClearSigningError("EIP-712 domain lacks chainId / verifyingContract");
60
+ }
61
+ this.verifyEip712Binding(descriptor, typedData, chainId, contract.data);
62
+ const encoded = ClearSigningUtils.encodeType(typedData.types, typedData.primaryType);
63
+ if (ClearSigningUtils.normalizeEncodeType(descriptor.format.key) !== encoded) {
64
+ throw new ClearSigningError("Descriptor format does not match EIP-712 type");
65
+ }
66
+ return new ClearSigningRenderSession(this.environment, descriptor, ClearSigningValue.fromTypedData(typedData.types, typedData.primaryType, typedData.message), this.container(signer, contract.data, 0n, chainId), chainId).render();
67
+ }
68
+ verifyEip712Binding(descriptor, typedData, chainId, verifyingContract) {
69
+ const context = descriptor.context.eip712;
70
+ if (!context)
71
+ throw new ClearSigningError("Descriptor has no EIP-712 binding");
72
+ let bound = false;
73
+ if (context.deployments?.length) {
74
+ if (!this.matchesDeployment(context.deployments, chainId, verifyingContract)) {
75
+ throw new ClearSigningError("Descriptor is not bound to this verifying contract");
76
+ }
77
+ bound = true;
78
+ }
79
+ if (context.domain) {
80
+ for (const [key, expected] of Object.entries(context.domain)) {
81
+ if (!this.domainValueEquals(typedData.domain[key], expected)) {
82
+ throw new ClearSigningError(`EIP-712 domain ${key} does not match descriptor`);
83
+ }
84
+ if (key === "verifyingContract")
85
+ bound = true;
86
+ }
87
+ }
88
+ if (context.domainSeparator) {
89
+ let actual;
90
+ try {
91
+ actual = domainSeparator({ domain: typedData.domain });
92
+ }
93
+ catch {
94
+ throw new ClearSigningError("Cannot compute EIP-712 domain separator");
95
+ }
96
+ if (actual.toLowerCase() !== context.domainSeparator.toLowerCase()) {
97
+ throw new ClearSigningError("EIP-712 domain separator does not match descriptor");
98
+ }
99
+ bound = true;
100
+ }
101
+ if (!bound) {
102
+ throw new ClearSigningError("Descriptor is not bound to a verifying contract");
103
+ }
104
+ }
105
+ domainValueEquals(actual, expected) {
106
+ if (actual === undefined || actual === null)
107
+ return false;
108
+ const a = String(actual);
109
+ const e = String(expected);
110
+ if (/^(0x[0-9a-fA-F]+|[0-9]+)$/.test(a) && /^(0x[0-9a-fA-F]+|[0-9]+)$/.test(e)) {
111
+ return BigInt(a) === BigInt(e);
112
+ }
113
+ return a === e;
114
+ }
115
+ matchesDeployment(deployments, chainId, address) {
116
+ const target = address.toLowerCase();
117
+ return deployments.some((d) => d.chainId === chainId && d.address.toLowerCase() === target);
118
+ }
119
+ container(from, to, value, chainId) {
120
+ return ClearSigningValue.struct("container", {
121
+ from: ClearSigningValue.leaf("address", from),
122
+ to: ClearSigningValue.leaf("address", to),
123
+ value: ClearSigningValue.leaf("uint256", value),
124
+ chainId: ClearSigningValue.leaf("uint256", BigInt(chainId)),
125
+ });
126
+ }
127
+ }
128
+ /** Per-request rendering state (decoded data, container, `$.` document). */
129
+ class ClearSigningRenderSession {
130
+ environment;
131
+ descriptor;
132
+ data;
133
+ containerValue;
134
+ chainId;
135
+ document;
136
+ constructor(environment, descriptor, data, containerValue, chainId) {
137
+ this.environment = environment;
138
+ this.descriptor = descriptor;
139
+ this.data = data;
140
+ this.containerValue = containerValue;
141
+ this.chainId = chainId;
142
+ this.document = {
143
+ context: descriptor.context,
144
+ metadata: descriptor.metadata,
145
+ display: { formats: { [descriptor.format.key]: descriptor.format } },
146
+ };
147
+ }
148
+ async render() {
149
+ const fields = [];
150
+ await this.renderFields(this.descriptor.format.fields, [], "", fields);
151
+ const { intent, intentDetails } = this.intent();
152
+ const metadata = this.descriptor.metadata;
153
+ return {
154
+ intent,
155
+ intentDetails,
156
+ interpolatedIntent: await this.interpolate(),
157
+ contractName: metadata.contractName ?? null,
158
+ owner: metadata.owner ?? null,
159
+ url: metadata.info?.url ?? null,
160
+ fields,
161
+ };
162
+ }
163
+ // ── structure ──────────────────────────────────────────────────────────────
164
+ async renderFields(fields, base, labelSuffix, out) {
165
+ for (const field of fields) {
166
+ if (field.fields) {
167
+ await this.renderGroup(field, base, labelSuffix, out);
168
+ continue;
169
+ }
170
+ if (field.visible === EClearSigningVisibility.Never)
171
+ continue;
172
+ const values = this.fieldValues(field, base);
173
+ for (let i = 0; i < values.length; i++) {
174
+ if (!this.isVisible(field, values[i].value))
175
+ continue;
176
+ const rendered = await this.formatField(field, values[i], i, values.length, base);
177
+ out.push({
178
+ ...rendered,
179
+ label: this.label(field, i, values.length) + labelSuffix,
180
+ optional: field.visible === EClearSigningVisibility.Optional,
181
+ });
182
+ }
183
+ }
184
+ }
185
+ async renderGroup(group, base, labelSuffix, out) {
186
+ const children = group.fields ?? [];
187
+ if (!group.path) {
188
+ await this.renderFields(children, base, labelSuffix, out);
189
+ return;
190
+ }
191
+ const elements = this.resolve(group.path, base);
192
+ const suffix = (i) => elements.length > 1 ? `${labelSuffix} (${i + 1})` : labelSuffix;
193
+ if (group.iteration === EClearSigningIteration.Sequential) {
194
+ for (const child of children) {
195
+ for (let i = 0; i < elements.length; i++) {
196
+ await this.renderFields([child], elements[i].concrete, suffix(i), out);
197
+ }
198
+ }
199
+ return;
200
+ }
201
+ for (let i = 0; i < elements.length; i++) {
202
+ await this.renderFields(children, elements[i].concrete, suffix(i), out);
203
+ }
204
+ }
205
+ label(field, index, count) {
206
+ const base = field.label ?? "";
207
+ if (count <= 1)
208
+ return base;
209
+ if (field.separator) {
210
+ return `${base} ${field.separator.replace(/\{index\}/g, String(index))}`.trim();
211
+ }
212
+ return `${base} (${index + 1})`;
213
+ }
214
+ fieldValues(field, base) {
215
+ if (field.value !== undefined) {
216
+ return [{ value: ClearSigningValue.constant(this.resolveConstant(field.value, base)), concrete: base }];
217
+ }
218
+ if (!field.path)
219
+ throw new ClearSigningError("Field has neither path nor value");
220
+ return this.resolve(field.path, base);
221
+ }
222
+ isVisible(field, value) {
223
+ const rule = field.visible;
224
+ if (!rule || typeof rule === "string")
225
+ return true;
226
+ if (rule.mustMatch) {
227
+ if (!rule.mustMatch.some((x) => this.valueEquals(value, x))) {
228
+ throw new ClearSigningError(`Field ${field.path ?? ""} failed mustMatch`);
229
+ }
230
+ return false;
231
+ }
232
+ if (rule.ifNotIn)
233
+ return !rule.ifNotIn.some((x) => this.valueEquals(value, x));
234
+ return true;
235
+ }
236
+ valueEquals(value, expected) {
237
+ try {
238
+ if (value.isInteger || typeof expected === "number") {
239
+ return value.asBigInt() === ClearSigningValue.constant(expected).asBigInt();
240
+ }
241
+ }
242
+ catch {
243
+ return false;
244
+ }
245
+ return value.toRawString().toLowerCase() === String(expected).toLowerCase();
246
+ }
247
+ // ── paths & params ─────────────────────────────────────────────────────────
248
+ resolve(path, base) {
249
+ const parsed = ClearSigningPath.parse(path);
250
+ switch (parsed.root) {
251
+ case EClearSigningPathRoot.Descriptor:
252
+ return [{
253
+ value: ClearSigningValue.constant(ClearSigningPath.lookupJson(this.document, parsed.tokens, parsed.source)),
254
+ concrete: base,
255
+ }];
256
+ case EClearSigningPathRoot.Container:
257
+ return ClearSigningPath.walk({ value: this.containerValue, concrete: [] }, parsed.tokens, parsed.source);
258
+ case EClearSigningPathRoot.Data:
259
+ return ClearSigningPath.walk({ value: this.data, concrete: [] }, parsed.tokens, parsed.source);
260
+ case EClearSigningPathRoot.Relative:
261
+ return ClearSigningPath.walk({ value: this.data, concrete: [] }, [...base, ...parsed.tokens], parsed.source);
262
+ }
263
+ }
264
+ /** Resolve `$.` references and `{ map, keyPath }` map references inside constant params. */
265
+ resolveConstant(raw, base) {
266
+ if (typeof raw === "string" && raw.startsWith("$.")) {
267
+ const parsed = ClearSigningPath.parse(raw);
268
+ return ClearSigningPath.lookupJson(this.document, parsed.tokens, raw);
269
+ }
270
+ if (Array.isArray(raw))
271
+ return raw.map((item) => this.resolveConstant(item, base));
272
+ if (raw && typeof raw === "object" && "map" in raw && "keyPath" in raw) {
273
+ const ref = raw;
274
+ if (typeof ref.map !== "string" || typeof ref.keyPath !== "string") {
275
+ throw new ClearSigningError("Invalid map reference");
276
+ }
277
+ const map = this.resolveConstant(ref.map, base);
278
+ const keys = this.resolve(ref.keyPath, base);
279
+ if (keys.length !== 1 || !map?.values)
280
+ throw new ClearSigningError("Invalid map reference");
281
+ const key = keys[0].value.toRawString();
282
+ const hit = map.values[key] ?? map.values[key.toLowerCase()];
283
+ if (hit === undefined)
284
+ throw new ClearSigningError(`No map value for ${key}`);
285
+ return hit;
286
+ }
287
+ return raw;
288
+ }
289
+ /**
290
+ * A `<name>Path` / `<name>` param pair. Path results are matched to the formatted value by
291
+ * index when the field iterates over an array (spec "Array references in parameters").
292
+ */
293
+ paramValue(params, pathKey, constantKey, index, count, base) {
294
+ const path = params[pathKey];
295
+ if (typeof path === "string") {
296
+ const resolved = this.resolve(path, base);
297
+ if (resolved.length === 1)
298
+ return resolved[0].value;
299
+ if (resolved.length === count)
300
+ return resolved[index].value;
301
+ throw new ClearSigningError(`Param ${pathKey} does not match field array length`);
302
+ }
303
+ if (params[constantKey] !== undefined) {
304
+ return ClearSigningValue.constant(this.resolveConstant(params[constantKey], base));
305
+ }
306
+ return null;
307
+ }
308
+ addressList(raw, base) {
309
+ if (raw === undefined)
310
+ return [];
311
+ const resolved = this.resolveConstant(raw, base);
312
+ const list = Array.isArray(resolved) ? resolved : [resolved];
313
+ return list.filter((x) => typeof x === "string").map((x) => x.toLowerCase());
314
+ }
315
+ paramChainId(params, index, count, base) {
316
+ const value = this.paramValue(params, "chainIdPath", "chainId", index, count, base);
317
+ return value ? ChainUtils.asEVMChainId(value.asBigInt()) : this.chainId;
318
+ }
319
+ // ── formats ────────────────────────────────────────────────────────────────
320
+ async formatField(field, item, index, count, base) {
321
+ const value = item.value;
322
+ if (field.encryption) {
323
+ return this.text(field.encryption.fallbackLabel ?? "[Encrypted]", value.toRawString(), "Encrypted value");
324
+ }
325
+ const params = field.params ?? {};
326
+ switch (field.format ?? EClearSigningFieldFormat.Raw) {
327
+ case EClearSigningFieldFormat.Amount:
328
+ return this.formatNativeAmount(value, params, base);
329
+ case EClearSigningFieldFormat.TokenAmount:
330
+ return this.formatTokenAmount(value, params, index, count, base);
331
+ case EClearSigningFieldFormat.Date:
332
+ return this.formatDate(value, params);
333
+ case EClearSigningFieldFormat.Duration:
334
+ return this.formatDuration(value);
335
+ case EClearSigningFieldFormat.Unit:
336
+ return this.formatUnit(value, params);
337
+ case EClearSigningFieldFormat.Enum:
338
+ return this.formatEnum(value, params, base);
339
+ case EClearSigningFieldFormat.ChainId: {
340
+ const id = value.asBigInt();
341
+ const name = this.environment.getChainName(ChainUtils.asEVMChainId(id));
342
+ return this.text(name ?? `Chain ${id}`, ClearSigningValue.canonical(id));
343
+ }
344
+ case EClearSigningFieldFormat.AddressName:
345
+ return this.formatAddressName(value, params, base);
346
+ case EClearSigningFieldFormat.TokenTicker:
347
+ return this.formatTokenTicker(value, params, index, count, base);
348
+ case EClearSigningFieldFormat.NftName:
349
+ return this.formatNftName(value, params, index, count, base);
350
+ case EClearSigningFieldFormat.Calldata:
351
+ return this.formatCalldata(value, params, index, count, base);
352
+ case EClearSigningFieldFormat.Raw:
353
+ case EClearSigningFieldFormat.InteroperableAddressName:
354
+ default:
355
+ return this.formatRaw(value);
356
+ }
357
+ }
358
+ formatRaw(value) {
359
+ if (value.kind === EClearSigningValueKind.Leaf && value.type === "address") {
360
+ const address = value.asAddress();
361
+ return { ...this.text(address, ClearSigningValue.canonical(address)), kind: EClearSigningDisplayKind.Address, address };
362
+ }
363
+ const raw = value.toRawString();
364
+ return this.text(value.isInteger ? this.groupDigits(raw) : raw, raw);
365
+ }
366
+ formatNativeAmount(value, params, base) {
367
+ const amount = value.asBigInt();
368
+ const native = this.environment.getNativeCurrency(this.chainId);
369
+ const display = this.overThreshold(amount, params, base)
370
+ ? `${this.stringParam(params.message, "All")} ${native.symbol}`
371
+ : `${this.formatDecimal(amount, native.decimals)} ${native.symbol}`;
372
+ return { ...this.text(display, ClearSigningValue.canonical(amount)), kind: EClearSigningDisplayKind.NativeAmount };
373
+ }
374
+ async formatTokenAmount(value, params, index, count, base) {
375
+ const amount = value.asBigInt();
376
+ const chainId = this.paramChainId(params, index, count, base);
377
+ const tokenValue = this.paramValue(params, "tokenPath", "token", index, count, base);
378
+ const token = tokenValue ? EVMContractAddress(tokenValue.asAddress()) : null;
379
+ const natives = this.addressList(params.nativeCurrencyAddress, base);
380
+ const isNative = token !== null && natives.includes(token.toLowerCase());
381
+ let metadata = isNative ? this.environment.getNativeCurrency(chainId) : null;
382
+ if (!metadata && token) {
383
+ const own = this.descriptor.metadata.token;
384
+ const to = this.containerValue.value;
385
+ if (own?.ticker && own.decimals !== undefined &&
386
+ to.to.asAddress().toLowerCase() === token.toLowerCase()) {
387
+ metadata = { symbol: own.ticker, decimals: own.decimals };
388
+ }
389
+ else {
390
+ metadata = await this.environment.getTokenMetadata(chainId, token);
391
+ }
392
+ }
393
+ const kind = isNative ? EClearSigningDisplayKind.NativeAmount : EClearSigningDisplayKind.TokenAmount;
394
+ const tokenAddress = isNative ? null : token;
395
+ if (!metadata) {
396
+ return {
397
+ ...this.text(this.groupDigits(amount.toString()), ClearSigningValue.canonical(amount), "Unknown token"),
398
+ kind,
399
+ address: token ? EVMAccountAddress(token) : null,
400
+ tokenAddress,
401
+ };
402
+ }
403
+ const display = this.overThreshold(amount, params, base)
404
+ ? `${this.stringParam(params.message, "Unlimited")} ${metadata.symbol}`
405
+ : `${this.formatDecimal(amount, metadata.decimals)} ${metadata.symbol}`;
406
+ return { ...this.text(display, ClearSigningValue.canonical(amount)), kind, tokenAddress };
407
+ }
408
+ formatDate(value, params) {
409
+ const n = value.asBigInt();
410
+ if (params.encoding === "blockheight") {
411
+ return { ...this.text(`Block ${this.groupDigits(n.toString())}`, ClearSigningValue.canonical(n)), kind: EClearSigningDisplayKind.Date };
412
+ }
413
+ if (n < 0n || n > MAX_DATE_SECONDS) {
414
+ return { ...this.text(this.groupDigits(n.toString()), ClearSigningValue.canonical(n)), kind: EClearSigningDisplayKind.Date };
415
+ }
416
+ const iso = new Date(Number(n) * 1000).toISOString();
417
+ return {
418
+ ...this.text(`${iso.slice(0, 10)} ${iso.slice(11, 19)} UTC`, ClearSigningValue.canonical(n)),
419
+ kind: EClearSigningDisplayKind.Date,
420
+ };
421
+ }
422
+ formatDuration(value) {
423
+ const n = value.asBigInt();
424
+ const hours = n / 3600n;
425
+ const minutes = (n % 3600n) / 60n;
426
+ const seconds = n % 60n;
427
+ const pad = (x) => x.toString().padStart(2, "0");
428
+ return this.text(`${pad(hours)}:${pad(minutes)}:${pad(seconds)}`, ClearSigningValue.canonical(n));
429
+ }
430
+ formatUnit(value, params) {
431
+ const n = value.asBigInt();
432
+ const decimals = typeof params.decimals === "number" ? params.decimals : 0;
433
+ const unit = typeof params.base === "string" ? params.base : "";
434
+ const plain = formatUnits(n, decimals);
435
+ if (params.prefix !== true || n === 0n) {
436
+ return this.text(`${plain}${unit}`, ClearSigningValue.canonical(n));
437
+ }
438
+ const asNumber = Number(plain);
439
+ const exponent = Math.floor(Math.log10(Math.abs(asNumber)));
440
+ const [power, symbol] = SI_PREFIXES.find(([p]) => exponent >= p) ?? SI_PREFIXES[SI_PREFIXES.length - 1];
441
+ const mantissa = Number((asNumber / 10 ** power).toPrecision(6));
442
+ return this.text(`${mantissa}${symbol}${unit}`, ClearSigningValue.canonical(n));
443
+ }
444
+ formatEnum(value, params, base) {
445
+ const ref = params.$ref;
446
+ const table = typeof ref === "string" ? this.resolveConstant(ref, base) : undefined;
447
+ const raw = value.toRawString();
448
+ const label = table && typeof table === "object" ? table[raw] : undefined;
449
+ return typeof label === "string"
450
+ ? this.text(label, raw)
451
+ : this.text(raw, raw, "Unknown enum value");
452
+ }
453
+ async formatAddressName(value, params, base) {
454
+ let address = value.asAddress();
455
+ const container = this.containerValue.value;
456
+ const sender = container.from.asAddress();
457
+ if (this.addressList(params.senderAddress, base).includes(address.toLowerCase())) {
458
+ address = sender;
459
+ }
460
+ if (address.toLowerCase() === sender.toLowerCase()) {
461
+ return { ...this.text("You", ClearSigningValue.canonical(address)), kind: EClearSigningDisplayKind.Address, address };
462
+ }
463
+ const name = await this.environment.getAddressName(this.chainId, address);
464
+ return { ...this.text(name ?? address, ClearSigningValue.canonical(address)), kind: EClearSigningDisplayKind.Address, address };
465
+ }
466
+ async formatTokenTicker(value, params, index, count, base) {
467
+ const address = value.asAddress();
468
+ const token = EVMContractAddress(address);
469
+ const metadata = await this.environment.getTokenMetadata(this.paramChainId(params, index, count, base), token);
470
+ return {
471
+ ...this.text(metadata?.symbol ?? address, ClearSigningValue.canonical(address), metadata ? null : "Unknown token"),
472
+ kind: EClearSigningDisplayKind.Address,
473
+ address,
474
+ tokenAddress: token,
475
+ };
476
+ }
477
+ async formatNftName(value, params, index, count, base) {
478
+ const id = value.asBigInt();
479
+ const collectionValue = this.paramValue(params, "collectionPath", "collection", index, count, base);
480
+ const collection = collectionValue ? collectionValue.asAddress() : null;
481
+ const name = collection
482
+ ? await this.environment.getAddressName(this.chainId, collection)
483
+ : null;
484
+ return {
485
+ ...this.text(`${name ?? collection ?? "Token"} #${id}`, ClearSigningValue.canonical(id)),
486
+ kind: EClearSigningDisplayKind.Nft,
487
+ address: collection,
488
+ };
489
+ }
490
+ async formatCalldata(value, params, index, count, base) {
491
+ const calleeValue = this.paramValue(params, "calleePath", "callee", index, count, base);
492
+ const callee = calleeValue ? calleeValue.asAddress() : null;
493
+ const name = callee ? await this.environment.getAddressName(this.chainId, callee) : null;
494
+ const raw = value.toRawString();
495
+ return {
496
+ ...this.text(`Embedded call to ${name ?? callee ?? "unknown contract"}`, raw, "Embedded call details are not decoded"),
497
+ kind: EClearSigningDisplayKind.Calldata,
498
+ address: callee,
499
+ };
500
+ }
501
+ // ── intent ─────────────────────────────────────────────────────────────────
502
+ intent() {
503
+ const intent = this.descriptor.format.intent;
504
+ if (typeof intent === "string")
505
+ return { intent, intentDetails: [] };
506
+ const intentDetails = Object.entries(intent).map(([label, value]) => ({ label, value }));
507
+ return { intent: intentDetails.map((d) => d.value).join(" · "), intentDetails };
508
+ }
509
+ /** Render `interpolatedIntent`; any failure yields `null` (spec: fall back to `intent`). */
510
+ async interpolate() {
511
+ const template = this.descriptor.format.interpolatedIntent;
512
+ if (!template)
513
+ return null;
514
+ try {
515
+ let out = "";
516
+ let i = 0;
517
+ while (i < template.length) {
518
+ const ch = template[i];
519
+ if ((ch === "{" || ch === "}") && template[i + 1] === ch) {
520
+ out += ch;
521
+ i += 2;
522
+ }
523
+ else if (ch === "{") {
524
+ const close = template.indexOf("}", i);
525
+ if (close < 0)
526
+ return null;
527
+ out += await this.interpolateValue(template.slice(i + 1, close).trim());
528
+ i = close + 1;
529
+ }
530
+ else if (ch === "}") {
531
+ return null;
532
+ }
533
+ else {
534
+ out += ch;
535
+ i += 1;
536
+ }
537
+ }
538
+ return out;
539
+ }
540
+ catch {
541
+ return null;
542
+ }
543
+ }
544
+ async interpolateValue(path) {
545
+ const field = this.findField(this.descriptor.format.fields, path, "");
546
+ if (!field || (field.visible !== undefined && field.visible !== EClearSigningVisibility.Always)) {
547
+ throw new ClearSigningError(`Interpolated path ${path} has no visible field`);
548
+ }
549
+ const values = this.fieldValues(field, []);
550
+ const rendered = await Promise.all(values.map((v, i) => this.formatField(field, v, i, values.length, [])));
551
+ return rendered.map((r) => r.value).join(", ");
552
+ }
553
+ /** Find the field spec for an interpolation path (top level or flattened through groups). */
554
+ findField(fields, path, prefix) {
555
+ const wanted = this.normalizePath(path);
556
+ for (const field of fields) {
557
+ const full = field.path ? (prefix ? `${prefix}.${field.path}` : field.path) : prefix;
558
+ if (field.fields) {
559
+ const hit = this.findField(field.fields, path, full);
560
+ if (hit)
561
+ return hit;
562
+ }
563
+ else if (field.path && this.normalizePath(full) === wanted) {
564
+ return { ...field, path: full };
565
+ }
566
+ }
567
+ return null;
568
+ }
569
+ normalizePath(path) {
570
+ return path.trim().replace(/^#\./, "").replace(/\.\[/g, "[");
571
+ }
572
+ // ── helpers ────────────────────────────────────────────────────────────────
573
+ overThreshold(amount, params, base) {
574
+ if (params.threshold === undefined)
575
+ return false;
576
+ const threshold = ClearSigningValue.constant(this.resolveConstant(params.threshold, base));
577
+ return amount >= threshold.asBigInt();
578
+ }
579
+ stringParam(value, fallback) {
580
+ return typeof value === "string" && value.length > 0 ? value : fallback;
581
+ }
582
+ formatDecimal(amount, decimals) {
583
+ const [whole, fraction] = formatUnits(amount, decimals).split(".");
584
+ const grouped = this.groupDigits(whole);
585
+ return fraction ? `${grouped}.${fraction}` : grouped;
586
+ }
587
+ groupDigits(digits) {
588
+ const negative = digits.startsWith("-");
589
+ const body = negative ? digits.slice(1) : digits;
590
+ if (!/^\d+$/.test(body))
591
+ return digits;
592
+ const grouped = body.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
593
+ return negative ? `-${grouped}` : grouped;
594
+ }
595
+ text(value, rawValue, warning = null) {
596
+ return {
597
+ value,
598
+ rawValue,
599
+ kind: EClearSigningDisplayKind.Text,
600
+ address: null,
601
+ tokenAddress: null,
602
+ warning,
603
+ };
604
+ }
605
+ }
606
+ //# sourceMappingURL=ClearSigningFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClearSigningFormatter.js","sourceRoot":"","sources":["../src/ClearSigningFormatter.ts"],"names":[],"mappings":"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"}