@verbeth/sdk 0.1.4
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 +202 -0
- package/dist/esm/src/client/VerbethClient.d.ts +134 -0
- package/dist/esm/src/client/VerbethClient.d.ts.map +1 -0
- package/dist/esm/src/client/VerbethClient.js +191 -0
- package/dist/esm/src/client/index.d.ts +3 -0
- package/dist/esm/src/client/index.d.ts.map +1 -0
- package/dist/esm/src/client/index.js +2 -0
- package/dist/esm/src/client/types.d.ts +30 -0
- package/dist/esm/src/client/types.d.ts.map +1 -0
- package/dist/esm/src/client/types.js +2 -0
- package/dist/esm/src/crypto.d.ts +46 -0
- package/dist/esm/src/crypto.d.ts.map +1 -0
- package/dist/esm/src/crypto.js +137 -0
- package/dist/esm/src/executor.d.ts +73 -0
- package/dist/esm/src/executor.d.ts.map +1 -0
- package/dist/esm/src/executor.js +353 -0
- package/dist/esm/src/identity.d.ts +28 -0
- package/dist/esm/src/identity.d.ts.map +1 -0
- package/dist/esm/src/identity.js +70 -0
- package/dist/esm/src/index.d.ts +18 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js +17 -0
- package/dist/esm/src/payload.d.ts +94 -0
- package/dist/esm/src/payload.d.ts.map +1 -0
- package/dist/esm/src/payload.js +216 -0
- package/dist/esm/src/send.d.ts +50 -0
- package/dist/esm/src/send.d.ts.map +1 -0
- package/dist/esm/src/send.js +75 -0
- package/dist/esm/src/types.d.ts +73 -0
- package/dist/esm/src/types.d.ts.map +1 -0
- package/dist/esm/src/types.js +2 -0
- package/dist/esm/src/utils/nonce.d.ts +2 -0
- package/dist/esm/src/utils/nonce.d.ts.map +1 -0
- package/dist/esm/src/utils/nonce.js +6 -0
- package/dist/esm/src/utils/x25519.d.ts +6 -0
- package/dist/esm/src/utils/x25519.d.ts.map +1 -0
- package/dist/esm/src/utils/x25519.js +12 -0
- package/dist/esm/src/utils.d.ts +29 -0
- package/dist/esm/src/utils.d.ts.map +1 -0
- package/dist/esm/src/utils.js +123 -0
- package/dist/esm/src/verify.d.ts +54 -0
- package/dist/esm/src/verify.d.ts.map +1 -0
- package/dist/esm/src/verify.js +186 -0
- package/dist/src/client/VerbethClient.d.ts +134 -0
- package/dist/src/client/VerbethClient.d.ts.map +1 -0
- package/dist/src/client/VerbethClient.js +191 -0
- package/dist/src/client/index.d.ts +3 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +2 -0
- package/dist/src/client/types.d.ts +30 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/client/types.js +2 -0
- package/dist/src/crypto.d.ts +46 -0
- package/dist/src/crypto.d.ts.map +1 -0
- package/dist/src/crypto.js +137 -0
- package/dist/src/executor.d.ts +73 -0
- package/dist/src/executor.d.ts.map +1 -0
- package/dist/src/executor.js +353 -0
- package/dist/src/identity.d.ts +28 -0
- package/dist/src/identity.d.ts.map +1 -0
- package/dist/src/identity.js +70 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/payload.d.ts +94 -0
- package/dist/src/payload.d.ts.map +1 -0
- package/dist/src/payload.js +216 -0
- package/dist/src/send.d.ts +50 -0
- package/dist/src/send.d.ts.map +1 -0
- package/dist/src/send.js +75 -0
- package/dist/src/types.d.ts +73 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/utils/nonce.d.ts +2 -0
- package/dist/src/utils/nonce.d.ts.map +1 -0
- package/dist/src/utils/nonce.js +6 -0
- package/dist/src/utils/x25519.d.ts +6 -0
- package/dist/src/utils/x25519.d.ts.map +1 -0
- package/dist/src/utils/x25519.js +12 -0
- package/dist/src/utils.d.ts +29 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +123 -0
- package/dist/src/verify.d.ts +54 -0
- package/dist/src/verify.d.ts.map +1 -0
- package/dist/src/verify.js +186 -0
- package/package.json +38 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { JsonRpcProvider } from "ethers";
|
|
2
|
+
import { HandshakeLog, HandshakeResponseLog, IdentityProof, TopicInfoWire, DuplexTopics } from "./types.js";
|
|
3
|
+
import { Rpcish } from "./utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* handshake verification with mandatory identity proof
|
|
6
|
+
*/
|
|
7
|
+
export declare function verifyHandshakeIdentity(handshakeEvent: HandshakeLog, provider: JsonRpcProvider): Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* handshake response verification with mandatory identity proof
|
|
10
|
+
*/
|
|
11
|
+
export declare function verifyHandshakeResponseIdentity(responseEvent: HandshakeResponseLog, responderIdentityPubKey: Uint8Array, initiatorEphemeralSecretKey: Uint8Array, provider: JsonRpcProvider): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Verify "IdentityProof" for EOAs and smart accounts.
|
|
14
|
+
* - Verifies the signature with viem (EOA / ERC-1271 / ERC-6492).
|
|
15
|
+
* - Parses and checks the expected address and public key against the message content.
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyIdentityProof(identityProof: IdentityProof, smartAccountAddress: string, expectedUnifiedKeys: {
|
|
18
|
+
identityPubKey: Uint8Array;
|
|
19
|
+
signingPubKey: Uint8Array;
|
|
20
|
+
}, provider: Rpcish): Promise<boolean>;
|
|
21
|
+
export declare function verifyAndExtractHandshakeKeys(handshakeEvent: HandshakeLog, provider: JsonRpcProvider): Promise<{
|
|
22
|
+
isValid: boolean;
|
|
23
|
+
keys?: {
|
|
24
|
+
identityPubKey: Uint8Array;
|
|
25
|
+
signingPubKey: Uint8Array;
|
|
26
|
+
};
|
|
27
|
+
}>;
|
|
28
|
+
export declare function verifyAndExtractHandshakeResponseKeys(responseEvent: HandshakeResponseLog, initiatorEphemeralSecretKey: Uint8Array, provider: JsonRpcProvider): Promise<{
|
|
29
|
+
isValid: boolean;
|
|
30
|
+
keys?: {
|
|
31
|
+
identityPubKey: Uint8Array;
|
|
32
|
+
signingPubKey: Uint8Array;
|
|
33
|
+
ephemeralPubKey: Uint8Array;
|
|
34
|
+
note?: string;
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Verify and derive duplex topics from a long-term DH secret.
|
|
39
|
+
* - Accepts either `tag` (inResponseTo) or a raw salt as KDF input.
|
|
40
|
+
* - Recomputes topicOut/topicIn deterministically from the identity DH.
|
|
41
|
+
* - If topicInfo is provided (from HSR), also verify the checksum.
|
|
42
|
+
* - Used by the initiator after decrypting a HandshakeResponse to confirm responder’s topics.
|
|
43
|
+
*/
|
|
44
|
+
export declare function verifyDerivedDuplexTopics({ myIdentitySecretKey, theirIdentityPubKey, tag, salt, topicInfo }: {
|
|
45
|
+
myIdentitySecretKey: Uint8Array;
|
|
46
|
+
theirIdentityPubKey: Uint8Array;
|
|
47
|
+
tag?: `0x${string}`;
|
|
48
|
+
salt?: Uint8Array;
|
|
49
|
+
topicInfo?: TopicInfoWire;
|
|
50
|
+
}): {
|
|
51
|
+
topics: DuplexTopics;
|
|
52
|
+
ok?: boolean;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAiC,MAAM,QAAQ,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5G,OAAO,EACL,MAAM,EAGP,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,cAAc,EAAE,YAAY,EAC5B,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC,CA6ClB;AAID;;GAEG;AACH,wBAAsB,+BAA+B,CACnD,aAAa,EAAE,oBAAoB,EACnC,uBAAuB,EAAE,UAAU,EACnC,2BAA2B,EAAE,UAAU,EACvC,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC,CAgDlB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE;IACnB,cAAc,EAAE,UAAU,CAAC;IAC3B,aAAa,EAAE,UAAU,CAAC;CAC3B,EACD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CA+DlB;AAID,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,YAAY,EAC5B,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,cAAc,EAAE,UAAU,CAAC;QAC3B,aAAa,EAAE,UAAU,CAAC;KAC3B,CAAC;CACH,CAAC,CAgBD;AAED,wBAAsB,qCAAqC,CACzD,aAAa,EAAE,oBAAoB,EACnC,2BAA2B,EAAE,UAAU,EACvC,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,cAAc,EAAE,UAAU,CAAC;QAC3B,aAAa,EAAE,UAAU,CAAC;QAC1B,eAAe,EAAE,UAAU,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC,CAwCD;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,mBAAmB,EACnB,mBAAmB,EACnB,GAAG,EACH,IAAI,EACJ,SAAS,EACV,EAAE;IACD,mBAAmB,EAAE,UAAU,CAAC;IAChC,mBAAmB,EAAE,UAAU,CAAC;IAChC,GAAG,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,GAAG;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,CAYzC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// packages/sdk/src/verify.ts
|
|
2
|
+
import { getBytes, hexlify, getAddress } from "ethers";
|
|
3
|
+
import { decryptAndExtractHandshakeKeys, computeTagFromInitiator, verifyDuplexTopicsChecksum, deriveDuplexTopics } from "./crypto.js";
|
|
4
|
+
import { parseHandshakePayload, parseHandshakeKeys } from "./payload.js";
|
|
5
|
+
import { makeViemPublicClient, parseBindingMessage, } from "./utils.js";
|
|
6
|
+
// ============= Handshake Verification =============
|
|
7
|
+
/**
|
|
8
|
+
* handshake verification with mandatory identity proof
|
|
9
|
+
*/
|
|
10
|
+
export async function verifyHandshakeIdentity(handshakeEvent, provider) {
|
|
11
|
+
try {
|
|
12
|
+
let plaintextPayload = handshakeEvent.plaintextPayload;
|
|
13
|
+
if (typeof plaintextPayload === "string" &&
|
|
14
|
+
plaintextPayload.startsWith("0x")) {
|
|
15
|
+
try {
|
|
16
|
+
const bytes = new Uint8Array(Buffer.from(plaintextPayload.slice(2), "hex"));
|
|
17
|
+
plaintextPayload = new TextDecoder().decode(bytes);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
console.error("Failed to decode hex payload:", err);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const content = parseHandshakePayload(plaintextPayload);
|
|
25
|
+
const parsedKeys = parseHandshakeKeys(handshakeEvent);
|
|
26
|
+
if (!parsedKeys) {
|
|
27
|
+
console.error("Failed to parse unified pubKeys from handshake event");
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// // 6492 awareness
|
|
31
|
+
// const dp: any = content.identityProof;
|
|
32
|
+
// const sigPrimary: string = dp.signature;
|
|
33
|
+
// const sig6492: string | undefined = dp.signature6492 ?? dp.erc6492;
|
|
34
|
+
// const uses6492 = hasERC6492Suffix(sigPrimary) || !!sig6492;
|
|
35
|
+
// const isContract1271 = await isSmartContract1271(handshakeEvent.sender, provider);
|
|
36
|
+
return await verifyIdentityProof(content.identityProof, handshakeEvent.sender, parsedKeys, provider);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
console.error("verifyHandshakeIdentity error:", err);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ============= HandshakeResponse Verification =============
|
|
44
|
+
/**
|
|
45
|
+
* handshake response verification with mandatory identity proof
|
|
46
|
+
*/
|
|
47
|
+
export async function verifyHandshakeResponseIdentity(responseEvent, responderIdentityPubKey, initiatorEphemeralSecretKey, provider) {
|
|
48
|
+
try {
|
|
49
|
+
const extractedResponse = decryptAndExtractHandshakeKeys(responseEvent.ciphertext, initiatorEphemeralSecretKey);
|
|
50
|
+
if (!extractedResponse) {
|
|
51
|
+
console.error("Failed to decrypt handshake response");
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (!Buffer.from(extractedResponse.identityPubKey).equals(Buffer.from(responderIdentityPubKey))) {
|
|
55
|
+
console.error("Identity public key mismatch in handshake response");
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
// 6492 awareness
|
|
59
|
+
const dpAny = extractedResponse.identityProof;
|
|
60
|
+
if (!dpAny) {
|
|
61
|
+
console.error("Missing identityProof in handshake response payload");
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
// const sigPrimary: string = dpAny.signature;
|
|
65
|
+
// const sig6492: string | undefined = dpAny.signature6492 ?? dpAny.erc6492;
|
|
66
|
+
// const uses6492 = hasERC6492Suffix(sigPrimary) || !!sig6492;
|
|
67
|
+
// const isContract1271 = await isSmartContract1271(responseEvent.responder,provider);
|
|
68
|
+
const expectedKeys = {
|
|
69
|
+
identityPubKey: extractedResponse.identityPubKey,
|
|
70
|
+
signingPubKey: extractedResponse.signingPubKey,
|
|
71
|
+
};
|
|
72
|
+
return await verifyIdentityProof(extractedResponse.identityProof, responseEvent.responder, expectedKeys, provider);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error("verifyHandshakeResponseIdentity error:", err);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Verify "IdentityProof" for EOAs and smart accounts.
|
|
81
|
+
* - Verifies the signature with viem (EOA / ERC-1271 / ERC-6492).
|
|
82
|
+
* - Parses and checks the expected address and public key against the message content.
|
|
83
|
+
*/
|
|
84
|
+
export async function verifyIdentityProof(identityProof, smartAccountAddress, expectedUnifiedKeys, provider) {
|
|
85
|
+
try {
|
|
86
|
+
const client = await makeViemPublicClient(provider);
|
|
87
|
+
const address = smartAccountAddress;
|
|
88
|
+
const okSig = await client.verifyMessage({
|
|
89
|
+
address,
|
|
90
|
+
message: identityProof.message,
|
|
91
|
+
signature: identityProof.signature,
|
|
92
|
+
});
|
|
93
|
+
if (!okSig) {
|
|
94
|
+
console.error("Binding signature invalid for address");
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const parsed = parseBindingMessage(identityProof.message);
|
|
98
|
+
if (parsed.header && parsed.header !== "VerbEth Key Binding v1") {
|
|
99
|
+
console.error("Unexpected binding header:", parsed.header);
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
if (!parsed.address ||
|
|
103
|
+
getAddress(parsed.address) !== getAddress(smartAccountAddress)) {
|
|
104
|
+
console.error("Binding message address mismatch");
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
const expectedPkX = hexlify(expectedUnifiedKeys.identityPubKey);
|
|
108
|
+
const expectedPkEd = hexlify(expectedUnifiedKeys.signingPubKey);
|
|
109
|
+
if (!parsed.pkX25519 || hexlify(parsed.pkX25519) !== expectedPkX) {
|
|
110
|
+
console.error("PkX25519 mismatch");
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
if (!parsed.pkEd25519 || hexlify(parsed.pkEd25519) !== expectedPkEd) {
|
|
114
|
+
console.error("PkEd25519 mismatch");
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
if (parsed.context && parsed.context !== "verbeth") {
|
|
118
|
+
console.error("Unexpected context:", parsed.context);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
if (parsed.version && parsed.version !== "1") {
|
|
122
|
+
console.error("Unexpected version:", parsed.version);
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
// if (typeof parsed.chainId === 'number' && parsed.chainId !== currentChainId) return false;
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error("verifyIdentityProof error:", err);
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ============= Utility Functions =============
|
|
134
|
+
export async function verifyAndExtractHandshakeKeys(handshakeEvent, provider) {
|
|
135
|
+
const isValid = await verifyHandshakeIdentity(handshakeEvent, provider);
|
|
136
|
+
if (!isValid) {
|
|
137
|
+
return { isValid: false };
|
|
138
|
+
}
|
|
139
|
+
const parsedKeys = parseHandshakeKeys(handshakeEvent);
|
|
140
|
+
if (!parsedKeys) {
|
|
141
|
+
return { isValid: false };
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
isValid: true,
|
|
145
|
+
keys: parsedKeys,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export async function verifyAndExtractHandshakeResponseKeys(responseEvent, initiatorEphemeralSecretKey, provider) {
|
|
149
|
+
const Rbytes = getBytes(responseEvent.responderEphemeralR); // hex -> Uint8Array
|
|
150
|
+
const expectedTag = computeTagFromInitiator(initiatorEphemeralSecretKey, Rbytes);
|
|
151
|
+
if (expectedTag !== responseEvent.inResponseTo) {
|
|
152
|
+
return { isValid: false };
|
|
153
|
+
}
|
|
154
|
+
const extractedResponse = decryptAndExtractHandshakeKeys(responseEvent.ciphertext, initiatorEphemeralSecretKey);
|
|
155
|
+
if (!extractedResponse) {
|
|
156
|
+
return { isValid: false };
|
|
157
|
+
}
|
|
158
|
+
const isValid = await verifyHandshakeResponseIdentity(responseEvent, extractedResponse.identityPubKey, initiatorEphemeralSecretKey, provider);
|
|
159
|
+
if (!isValid) {
|
|
160
|
+
return { isValid: false };
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
isValid: true,
|
|
164
|
+
keys: {
|
|
165
|
+
identityPubKey: extractedResponse.identityPubKey,
|
|
166
|
+
signingPubKey: extractedResponse.signingPubKey,
|
|
167
|
+
ephemeralPubKey: extractedResponse.ephemeralPubKey,
|
|
168
|
+
note: extractedResponse.note,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Verify and derive duplex topics from a long-term DH secret.
|
|
174
|
+
* - Accepts either `tag` (inResponseTo) or a raw salt as KDF input.
|
|
175
|
+
* - Recomputes topicOut/topicIn deterministically from the identity DH.
|
|
176
|
+
* - If topicInfo is provided (from HSR), also verify the checksum.
|
|
177
|
+
* - Used by the initiator after decrypting a HandshakeResponse to confirm responder’s topics.
|
|
178
|
+
*/
|
|
179
|
+
export function verifyDerivedDuplexTopics({ myIdentitySecretKey, theirIdentityPubKey, tag, salt, topicInfo }) {
|
|
180
|
+
const s = salt ?? (tag ? getBytes(tag) : undefined);
|
|
181
|
+
if (!s)
|
|
182
|
+
throw new Error("Provide either salt or inResponseTo");
|
|
183
|
+
const { topicOut, topicIn, checksum } = deriveDuplexTopics(myIdentitySecretKey, theirIdentityPubKey, s);
|
|
184
|
+
const ok = topicInfo ? verifyDuplexTopicsChecksum(topicOut, topicIn, topicInfo.chk) : undefined;
|
|
185
|
+
return { topics: { topicOut, topicIn }, ok };
|
|
186
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@verbeth/sdk",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"private": false,
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"module": "dist/esm/src/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
"import": "./dist/esm/src/index.js",
|
|
9
|
+
"require": "./dist/src/index.js"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"types": "dist/src/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/src",
|
|
15
|
+
"dist/esm/src"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@noble/curves": "^1.8.1",
|
|
19
|
+
"@noble/hashes": "^1.8.0",
|
|
20
|
+
"@noble/secp256k1": "^2.2.3",
|
|
21
|
+
"ethers": "^6.7.0",
|
|
22
|
+
"tweetnacl": "^1.0.3",
|
|
23
|
+
"viem": "^2.37.5"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@verbeth/contracts": "workspace:^0.1.0",
|
|
27
|
+
"ts-node": "^10.9.2",
|
|
28
|
+
"typechain": "^8.3.2",
|
|
29
|
+
"typescript": "^5.4.0",
|
|
30
|
+
"vitest": "^3.1.4"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build:cjs": "tsc --project tsconfig.json",
|
|
34
|
+
"build:esm": "tsc --project tsconfig.esm.json",
|
|
35
|
+
"build": "npm run build:cjs && npm run build:esm",
|
|
36
|
+
"test": "vitest run"
|
|
37
|
+
}
|
|
38
|
+
}
|