@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,231 @@
1
+ import { bytesToHex, getAddress, hexToBytes, isHex, numberToBytes, stringToBytes, } from "viem";
2
+ import { ClearSigningCanonicalString, EVMAccountAddress } from "@1shotapi/ows-types";
3
+ import { ClearSigningError } from "./ClearSigningError.js";
4
+ export var EClearSigningValueKind;
5
+ (function (EClearSigningValueKind) {
6
+ /** Decoded primitive: bigint (int/uint), string (address/bytes/string), boolean. */
7
+ EClearSigningValueKind["Leaf"] = "leaf";
8
+ EClearSigningValueKind["Array"] = "array";
9
+ EClearSigningValueKind["Struct"] = "struct";
10
+ /** Literal from the descriptor (`value`, `$.` references, constant params). */
11
+ EClearSigningValueKind["Constant"] = "constant";
12
+ })(EClearSigningValueKind || (EClearSigningValueKind = {}));
13
+ const ARRAY_SUFFIX = /\[(\d*)\]$/;
14
+ /**
15
+ * Decoded structured data with its Solidity / EIP-712 type kept alongside, so path slices
16
+ * and formatters know how to interpret each value (e.g. a slice of a `uint256` vs `bytes`).
17
+ */
18
+ export class ClearSigningValue {
19
+ kind;
20
+ type;
21
+ value;
22
+ constructor(kind,
23
+ /** Solidity type for leaves (`uint256`, `address`, `bytes`, …); struct/array type otherwise. */
24
+ type, value) {
25
+ this.kind = kind;
26
+ this.type = type;
27
+ this.value = value;
28
+ }
29
+ static constant(value) {
30
+ return new ClearSigningValue(EClearSigningValueKind.Constant, "", value);
31
+ }
32
+ static leaf(type, value) {
33
+ return new ClearSigningValue(EClearSigningValueKind.Leaf, type, ClearSigningValue.normalizeLeaf(type, value));
34
+ }
35
+ static struct(type, members) {
36
+ return new ClearSigningValue(EClearSigningValueKind.Struct, type, members);
37
+ }
38
+ /** Build the `#` root from viem `decodeFunctionData` args and the function inputs. */
39
+ static fromAbiArguments(inputs, args) {
40
+ const members = {};
41
+ inputs.forEach((input, i) => {
42
+ members[input.name || String(i)] = ClearSigningValue.fromAbi(input, args[i]);
43
+ });
44
+ return ClearSigningValue.struct("", members);
45
+ }
46
+ /** Build the `#` root from an EIP-712 message. */
47
+ static fromTypedData(types, primaryType, message) {
48
+ return ClearSigningValue.fromEip712(types, primaryType, message);
49
+ }
50
+ static fromAbi(param, raw) {
51
+ const arrayMatch = ARRAY_SUFFIX.exec(param.type);
52
+ if (arrayMatch) {
53
+ if (!Array.isArray(raw)) {
54
+ throw new ClearSigningError(`Expected array for ${param.type}`);
55
+ }
56
+ const element = {
57
+ ...param,
58
+ type: param.type.slice(0, arrayMatch.index),
59
+ };
60
+ return new ClearSigningValue(EClearSigningValueKind.Array, param.type, raw.map((item) => ClearSigningValue.fromAbi(element, item)));
61
+ }
62
+ if (param.type === "tuple") {
63
+ const components = "components" in param ? param.components : [];
64
+ const source = raw;
65
+ const members = {};
66
+ components.forEach((component, i) => {
67
+ const name = component.name || String(i);
68
+ const item = component.name && source[component.name] !== undefined
69
+ ? source[component.name]
70
+ : source[i];
71
+ members[name] = ClearSigningValue.fromAbi(component, item);
72
+ });
73
+ return ClearSigningValue.struct("tuple", members);
74
+ }
75
+ return ClearSigningValue.leaf(param.type, raw);
76
+ }
77
+ static fromEip712(types, type, raw) {
78
+ const arrayMatch = ARRAY_SUFFIX.exec(type);
79
+ if (arrayMatch) {
80
+ if (!Array.isArray(raw)) {
81
+ throw new ClearSigningError(`Expected array for ${type}`);
82
+ }
83
+ const elementType = type.slice(0, arrayMatch.index);
84
+ return new ClearSigningValue(EClearSigningValueKind.Array, type, raw.map((item) => ClearSigningValue.fromEip712(types, elementType, item)));
85
+ }
86
+ const structFields = types[type];
87
+ if (structFields) {
88
+ if (raw === null || typeof raw !== "object") {
89
+ throw new ClearSigningError(`Expected struct for ${type}`);
90
+ }
91
+ const source = raw;
92
+ const members = {};
93
+ for (const field of structFields) {
94
+ members[field.name] = ClearSigningValue.fromEip712(types, field.type, source[field.name]);
95
+ }
96
+ return ClearSigningValue.struct(type, members);
97
+ }
98
+ return ClearSigningValue.leaf(type, raw);
99
+ }
100
+ static normalizeLeaf(type, value) {
101
+ if (/^u?int\d*$/.test(type)) {
102
+ if (typeof value === "bigint" ||
103
+ typeof value === "number" ||
104
+ (typeof value === "string" && value.trim() !== "")) {
105
+ try {
106
+ return BigInt(value);
107
+ }
108
+ catch {
109
+ // fall through
110
+ }
111
+ }
112
+ throw new ClearSigningError(`Invalid ${type} value`);
113
+ }
114
+ if (type === "address") {
115
+ if (typeof value !== "string" || !/^0x[0-9a-fA-F]{40}$/.test(value)) {
116
+ throw new ClearSigningError("Invalid address value");
117
+ }
118
+ return getAddress(value);
119
+ }
120
+ if (type === "bool")
121
+ return Boolean(value);
122
+ if (type === "string")
123
+ return String(value ?? "");
124
+ if (type.startsWith("bytes")) {
125
+ if (typeof value !== "string" || !isHex(value)) {
126
+ throw new ClearSigningError(`Invalid ${type} value`);
127
+ }
128
+ return value.toLowerCase();
129
+ }
130
+ return value;
131
+ }
132
+ get isInteger() {
133
+ return this.kind === EClearSigningValueKind.Leaf && typeof this.value === "bigint";
134
+ }
135
+ /** Bytes view of a leaf, used by path slices. */
136
+ toBytes() {
137
+ if (this.kind === EClearSigningValueKind.Leaf) {
138
+ if (typeof this.value === "bigint") {
139
+ const v = this.value < 0n ? (1n << 256n) + this.value : this.value;
140
+ return numberToBytes(v, { size: 32 });
141
+ }
142
+ if (typeof this.value === "boolean")
143
+ return new Uint8Array([this.value ? 1 : 0]);
144
+ if (this.type === "string")
145
+ return stringToBytes(this.value);
146
+ if (typeof this.value === "string" && isHex(this.value)) {
147
+ return hexToBytes(this.value);
148
+ }
149
+ }
150
+ if (this.kind === EClearSigningValueKind.Constant && typeof this.value === "string") {
151
+ if (isHex(this.value))
152
+ return hexToBytes(this.value);
153
+ return stringToBytes(this.value);
154
+ }
155
+ throw new ClearSigningError("Value cannot be sliced");
156
+ }
157
+ /** Byte slice of a leaf → `bytes` leaf (spec: slices on primitives select bytes). */
158
+ sliceBytes(start, end) {
159
+ const bytes = this.toBytes();
160
+ const sliced = bytes.slice(ClearSigningValue.sliceIndex(start, bytes.length, 0), ClearSigningValue.sliceIndex(end, bytes.length, bytes.length));
161
+ return ClearSigningValue.leaf("bytes", bytesToHex(sliced));
162
+ }
163
+ static sliceIndex(index, length, fallback) {
164
+ if (index === undefined)
165
+ return fallback;
166
+ const resolved = index < 0 ? length + index : index;
167
+ return Math.max(0, Math.min(length, resolved));
168
+ }
169
+ /** Interpret as an unsigned/signed integer (ints, byte strings, numeric constants). */
170
+ asBigInt() {
171
+ const v = this.value;
172
+ if (typeof v === "bigint")
173
+ return v;
174
+ if (typeof v === "number" && Number.isInteger(v))
175
+ return BigInt(v);
176
+ if (typeof v === "string") {
177
+ if (v === "0x" || v === "")
178
+ return 0n;
179
+ if (isHex(v) || /^-?[0-9]+$/.test(v))
180
+ return BigInt(v);
181
+ }
182
+ if (typeof v === "boolean")
183
+ return v ? 1n : 0n;
184
+ throw new ClearSigningError("Value is not numeric");
185
+ }
186
+ /** Interpret as an address (address leaves, ≥20-byte slices → last 20 bytes, uint → low 160 bits). */
187
+ asAddress() {
188
+ const v = this.value;
189
+ if (typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v)) {
190
+ return EVMAccountAddress(getAddress(v));
191
+ }
192
+ if (typeof v === "bigint") {
193
+ const low = v & ((1n << 160n) - 1n);
194
+ return EVMAccountAddress(getAddress(`0x${low.toString(16).padStart(40, "0")}`));
195
+ }
196
+ if (typeof v === "string" && isHex(v)) {
197
+ const bytes = hexToBytes(v);
198
+ if (bytes.length >= 20) {
199
+ return EVMAccountAddress(getAddress(bytesToHex(bytes.slice(bytes.length - 20))));
200
+ }
201
+ }
202
+ throw new ClearSigningError("Value is not an address");
203
+ }
204
+ /** Canonical rendering of a primitive (decimal ints, `true`/`false`, strings as-is, JSON otherwise). */
205
+ static canonical(v) {
206
+ if (typeof v === "bigint")
207
+ return ClearSigningCanonicalString(v.toString());
208
+ if (typeof v === "boolean")
209
+ return ClearSigningCanonicalString(v ? "true" : "false");
210
+ if (typeof v === "string")
211
+ return ClearSigningCanonicalString(v);
212
+ if (v === null || v === undefined)
213
+ return ClearSigningCanonicalString("");
214
+ return ClearSigningCanonicalString(JSON.stringify(v));
215
+ }
216
+ /** Canonical raw rendering (decimal ints, checksummed addresses, hex bytes, utf-8 strings). */
217
+ toRawString() {
218
+ switch (this.kind) {
219
+ case EClearSigningValueKind.Leaf:
220
+ case EClearSigningValueKind.Constant:
221
+ return ClearSigningValue.canonical(this.value);
222
+ case EClearSigningValueKind.Array:
223
+ return ClearSigningCanonicalString(`[${this.value.map((v) => v.toRawString()).join(", ")}]`);
224
+ case EClearSigningValueKind.Struct:
225
+ return ClearSigningCanonicalString(`{${Object.entries(this.value)
226
+ .map(([k, v]) => `${k}: ${v.toRawString()}`)
227
+ .join(", ")}}`);
228
+ }
229
+ }
230
+ }
231
+ //# sourceMappingURL=ClearSigningValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClearSigningValue.js","sourceRoot":"","sources":["../src/ClearSigningValue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { ClearSigningFormatter } from "./ClearSigningFormatter.js";
2
+ export { ClearSigningUtils } from "./ClearSigningUtils.js";
3
+ export { ClearSigningError } from "./ClearSigningError.js";
4
+ export { EClearSigningDisplayKind, type IClearSigningDisplay, type IClearSigningDisplayField, type IClearSigningEnvironment, type IClearSigningIntentDetail, type IClearSigningTokenMetadata, type IClearSigningTransaction, type IClearSigningTypedData, type IClearSigningTypedDataField, } from "./interfaces.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,GACjC,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { ClearSigningFormatter } from "./ClearSigningFormatter.js";
2
+ export { ClearSigningUtils } from "./ClearSigningUtils.js";
3
+ export { ClearSigningError } from "./ClearSigningError.js";
4
+ export { EClearSigningDisplayKind, } from "./interfaces.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,wBAAwB,GASzB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { ClearSigningCanonicalString, EVMAccountAddress, EVMChainId, EVMContractAddress, HexString } from "@1shotapi/ows-types";
2
+ /** Kind of rendered value, so the UI can pick an affordance (copy button, token icon, …). */
3
+ export declare enum EClearSigningDisplayKind {
4
+ Text = "text",
5
+ Address = "address",
6
+ TokenAmount = "tokenAmount",
7
+ NativeAmount = "nativeAmount",
8
+ Date = "date",
9
+ Nft = "nft",
10
+ Calldata = "calldata"
11
+ }
12
+ /** Transaction being clear-signed (the ERC-7730 EVM transaction container). */
13
+ export interface IClearSigningTransaction {
14
+ chainId: EVMChainId;
15
+ from: EVMAccountAddress;
16
+ to: EVMContractAddress;
17
+ data: HexString;
18
+ /** Native value in wei, `0x` hex (as on `eth_sendTransaction`). */
19
+ value: HexString;
20
+ }
21
+ /** EIP-712 field definition. */
22
+ export interface IClearSigningTypedDataField {
23
+ name: string;
24
+ type: string;
25
+ }
26
+ /** EIP-712 payload (structurally compatible with `eth_signTypedData_v4` input). */
27
+ export interface IClearSigningTypedData {
28
+ types: Record<string, ReadonlyArray<IClearSigningTypedDataField>>;
29
+ primaryType: string;
30
+ domain: Record<string, unknown>;
31
+ message: Record<string, unknown>;
32
+ }
33
+ /** Token symbol + decimals used by `amount` / `tokenAmount` / `tokenTicker`. */
34
+ export interface IClearSigningTokenMetadata {
35
+ symbol: string;
36
+ decimals: number;
37
+ }
38
+ /**
39
+ * Wallet-supplied lookups. The formatter never does network I/O itself; implementations may
40
+ * read local registries, on-chain ERC-20 metadata, address books, etc. Return `null` when
41
+ * unknown; the formatter falls back to raw values with a warning.
42
+ */
43
+ export interface IClearSigningEnvironment {
44
+ getTokenMetadata(chainId: EVMChainId, address: EVMContractAddress): Promise<IClearSigningTokenMetadata | null>;
45
+ getNativeCurrency(chainId: EVMChainId): IClearSigningTokenMetadata;
46
+ getChainName(chainId: EVMChainId): string | null;
47
+ getAddressName(chainId: EVMChainId, address: EVMAccountAddress): Promise<string | null>;
48
+ }
49
+ /** One rendered row. */
50
+ export interface IClearSigningDisplayField {
51
+ label: string;
52
+ /** Formatted value for display. */
53
+ value: string;
54
+ /** Unformatted value (decimal integers, checksummed addresses, hex bytes) for a raw view. */
55
+ rawValue: ClearSigningCanonicalString;
56
+ kind: EClearSigningDisplayKind;
57
+ /** Set for address-like values (addressName, raw address, calldata callee, nft collection). */
58
+ address: EVMAccountAddress | null;
59
+ /** Set for token-denominated values. */
60
+ tokenAddress: EVMContractAddress | null;
61
+ /** Non-fatal caveat to surface next to the value (e.g. "Unknown token"). */
62
+ warning: string | null;
63
+ /** `visible: "optional"` — UI may collapse it. */
64
+ optional: boolean;
65
+ }
66
+ /** Label/value pair from an object-form `intent`. */
67
+ export interface IClearSigningIntentDetail {
68
+ label: string;
69
+ value: string;
70
+ }
71
+ /** Fully rendered clear-signing screen model. */
72
+ export interface IClearSigningDisplay {
73
+ /** Plain intent; for object intents, the values joined with " · ". */
74
+ intent: string;
75
+ intentDetails: IClearSigningIntentDetail[];
76
+ /** `interpolatedIntent` rendered, or `null` if absent or any interpolation failed. */
77
+ interpolatedIntent: string | null;
78
+ contractName: string | null;
79
+ owner: string | null;
80
+ url: string | null;
81
+ fields: IClearSigningDisplayField[];
82
+ }
83
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,SAAS,EACV,MAAM,qBAAqB,CAAC;AAE7B,6FAA6F;AAC7F,oBAAY,wBAAwB;IAClC,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,QAAQ,aAAa;CACtB;AAED,+EAA+E;AAC/E,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,iBAAiB,CAAC;IACxB,EAAE,EAAE,kBAAkB,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,mEAAmE;IACnE,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,gCAAgC;AAChC,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mFAAmF;AACnF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,gFAAgF;AAChF,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CACd,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IAC9C,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,0BAA0B,CAAC;IACnE,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IACjD,cAAc,CACZ,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAwB;AACxB,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,QAAQ,EAAE,2BAA2B,CAAC;IACtC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,+FAA+F;IAC/F,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,wCAAwC;IACxC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C,sFAAsF;IACtF,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC"}
@@ -0,0 +1,12 @@
1
+ /** Kind of rendered value, so the UI can pick an affordance (copy button, token icon, …). */
2
+ export var EClearSigningDisplayKind;
3
+ (function (EClearSigningDisplayKind) {
4
+ EClearSigningDisplayKind["Text"] = "text";
5
+ EClearSigningDisplayKind["Address"] = "address";
6
+ EClearSigningDisplayKind["TokenAmount"] = "tokenAmount";
7
+ EClearSigningDisplayKind["NativeAmount"] = "nativeAmount";
8
+ EClearSigningDisplayKind["Date"] = "date";
9
+ EClearSigningDisplayKind["Nft"] = "nft";
10
+ EClearSigningDisplayKind["Calldata"] = "calldata";
11
+ })(EClearSigningDisplayKind || (EClearSigningDisplayKind = {}));
12
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAQA,6FAA6F;AAC7F,MAAM,CAAN,IAAY,wBAQX;AARD,WAAY,wBAAwB;IAClC,yCAAa,CAAA;IACb,+CAAmB,CAAA;IACnB,uDAA2B,CAAA;IAC3B,yDAA6B,CAAA;IAC7B,yCAAa,CAAA;IACb,uCAAW,CAAA;IACX,iDAAqB,CAAA;AACvB,CAAC,EARW,wBAAwB,KAAxB,wBAAwB,QAQnC"}
package/package.json CHANGED
@@ -1,6 +1,51 @@
1
1
  {
2
2
  "name": "@1shotapi/ows-clear-signing",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "ERC-7730 clear signing for OWS Branding Layers — lookup keys, descriptor verification, calldata / EIP-712 decoding and field formatting",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
21
+ "test": "node --import tsx --test test/*.test.ts",
22
+ "lint": "tsc -p tsconfig.json --noEmit"
23
+ },
24
+ "dependencies": {
25
+ "@1shotapi/ows-types": "*"
26
+ },
27
+ "peerDependencies": {
28
+ "viem": "^2.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "tsx": "^4.19.0",
32
+ "viem": "^2.52.0"
33
+ },
34
+ "keywords": [
35
+ "ows",
36
+ "open-wallet-standard",
37
+ "erc-7730",
38
+ "clear-signing",
39
+ "evm",
40
+ "eip-712"
41
+ ],
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/1Shot-API/open-wallet.git",
45
+ "directory": "packages/ows-clear-signing"
46
+ },
47
+ "license": "MIT",
48
+ "publishConfig": {
49
+ "access": "public"
50
+ }
51
+ }