@powerhousedao/connect 5.1.0-dev.1 → 5.1.0-dev.10

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.
Files changed (74) hide show
  1. package/dist/assets/{AddDriveModal-BcKP3tRe.js → AddDriveModal-iB_KEynb.js} +1 -1
  2. package/dist/assets/ClearStorageModal-CnyF8zBA.js +1 -0
  3. package/dist/assets/{CookiesPolicyModal-CRZwgxod.js → CookiesPolicyModal-C8ZQOAgp.js} +1 -1
  4. package/dist/assets/CreateDocumentModal-BLDFassm.js +1 -0
  5. package/dist/assets/{DebugSettingsModal-D1lmoZeA.js → DebugSettingsModal-DvKbvj1U.js} +1 -1
  6. package/dist/assets/{DeleteDriveModal-Dko0j8XY.js → DeleteDriveModal-DsmvvXvh.js} +1 -1
  7. package/dist/assets/DeleteItemModal-Dh7tajGX.js +1 -0
  8. package/dist/assets/DisclaimerModal-BKDfOCru.js +1 -0
  9. package/dist/assets/DriveSettingsModal-BNc5PJFw.js +1 -0
  10. package/dist/assets/{ExportDocumentWithErrorsModal-p3fkHZfU.js → ExportDocumentWithErrorsModal-C-yyc0UI.js} +1 -1
  11. package/dist/assets/SettingsModal-CAlxZBOu.js +1 -0
  12. package/dist/assets/UpgradeDriveModal-DyGgzds5.js +1 -0
  13. package/dist/assets/{design_system-DnTVxPr0.js → design_system-DE7Ges91.js} +1 -1
  14. package/dist/assets/design_system_connect-Cqk2ba6o.js +104 -0
  15. package/dist/assets/{design_system_ui-Bqq8Fu01.js → design_system_ui-BEOPGOdN.js} +1 -1
  16. package/dist/assets/{document_drive-BEIKnuGM.js → document_drive-CVkeqJ3l.js} +2 -2
  17. package/dist/assets/{document_engineering-C2p9jHIj.js → document_engineering-CGinrIlc.js} +1 -1
  18. package/dist/assets/{document_model-DXcLJEjZ.js → document_model-LXEZCDPq.js} +1 -1
  19. package/dist/assets/{document_model_editor-7tmqOIHK.js → document_model_editor-Dl_8b34n.js} +4 -4
  20. package/dist/assets/{drive_explorer-DzIBsVp8.js → drive_explorer-XhLzf8r8.js} +2 -2
  21. package/dist/assets/{graphql-editor-BQvJ6Fu2.js → graphql-editor-CjtXeeqk.js} +1 -1
  22. package/dist/assets/{hooks-BAZes8kG.js → hooks-DVSEXsDN.js} +1 -1
  23. package/dist/assets/index-D112By54.js +20 -0
  24. package/dist/assets/index-XUlAOLkX.css +1 -0
  25. package/dist/assets/{json-editor-BV-qLD2_.js → json-editor-YRyMK2EM.js} +1 -1
  26. package/dist/assets/nodefs-B30OEPUO.js +1 -0
  27. package/dist/assets/opfs-ahp-DSdtqBR_.js +3 -0
  28. package/dist/assets/postgres-CkP7QCDB.data +0 -0
  29. package/dist/assets/postgres-CyuUVpXN.wasm +0 -0
  30. package/dist/assets/reactor_browser-BbhbrtsF.js +25 -0
  31. package/dist/assets/state-schemas-CTvF15K6.js +2 -0
  32. package/dist/index.html +10 -10
  33. package/heroku/Dockerfile +3 -0
  34. package/lib/package.copy.json +5 -1
  35. package/lib/src/feature-flags.d.ts +17 -3
  36. package/lib/src/feature-flags.d.ts.map +1 -1
  37. package/lib/src/feature-flags.js +32 -3
  38. package/lib/src/feature-flags.js.map +1 -1
  39. package/lib/src/pages/demo/atlas-import.js +2 -2
  40. package/lib/src/pages/demo/atlas-import.js.map +1 -1
  41. package/lib/src/store/reactor.d.ts.map +1 -1
  42. package/lib/src/store/reactor.js +33 -30
  43. package/lib/src/store/reactor.js.map +1 -1
  44. package/lib/src/utils/reactor.d.ts +7 -0
  45. package/lib/src/utils/reactor.d.ts.map +1 -1
  46. package/lib/src/utils/reactor.js +30 -2
  47. package/lib/src/utils/reactor.js.map +1 -1
  48. package/lib/src/utils/signer.d.ts +18 -0
  49. package/lib/src/utils/signer.d.ts.map +1 -0
  50. package/lib/src/utils/signer.js +215 -0
  51. package/lib/src/utils/signer.js.map +1 -0
  52. package/lib/test/utils/signer.test.d.ts +2 -0
  53. package/lib/test/utils/signer.test.d.ts.map +1 -0
  54. package/lib/test/utils/signer.test.js +319 -0
  55. package/lib/test/utils/signer.test.js.map +1 -0
  56. package/lib/tsconfig.tsbuildinfo +1 -1
  57. package/lib/vitest.config.d.ts +3 -0
  58. package/lib/vitest.config.d.ts.map +1 -0
  59. package/lib/vitest.config.js +8 -0
  60. package/lib/vitest.config.js.map +1 -0
  61. package/package.copy.json +5 -1
  62. package/package.json +13 -9
  63. package/dist/assets/ClearStorageModal-DTsvgkvC.js +0 -1
  64. package/dist/assets/CreateDocumentModal-DnYQnJIJ.js +0 -1
  65. package/dist/assets/DeleteItemModal-CGpOWuYv.js +0 -1
  66. package/dist/assets/DisclaimerModal-DvHxIKeX.js +0 -1
  67. package/dist/assets/DriveSettingsModal-Bw_uVXsp.js +0 -1
  68. package/dist/assets/SettingsModal--ZRZ8Ppf.js +0 -1
  69. package/dist/assets/UpgradeDriveModal-DdA909jM.js +0 -1
  70. package/dist/assets/design_system_connect-BEZiOxEn.js +0 -45
  71. package/dist/assets/index-Br7E7qjt.css +0 -1
  72. package/dist/assets/index-DmgPEV3W.js +0 -18
  73. package/dist/assets/reactor_browser-D8KSw52x.js +0 -25
  74. package/dist/assets/state-schemas-Il25Ux8q.js +0 -2
@@ -0,0 +1,215 @@
1
+ export class ConnectCryptoSigner {
2
+ connectCrypto;
3
+ constructor(connectCrypto) {
4
+ this.connectCrypto = connectCrypto;
5
+ }
6
+ async sign(action, abortSignal) {
7
+ if (abortSignal?.aborted) {
8
+ throw new Error("Signing aborted");
9
+ }
10
+ const timestamp = (new Date().getTime() / 1000).toFixed(0);
11
+ const did = await this.connectCrypto.did();
12
+ if (abortSignal?.aborted) {
13
+ throw new Error("Signing aborted");
14
+ }
15
+ const hash = await this.hashAction(action);
16
+ if (abortSignal?.aborted) {
17
+ throw new Error("Signing aborted");
18
+ }
19
+ const prevStateHash = action.context?.prevOpHash ?? "";
20
+ const params = [
21
+ timestamp,
22
+ did,
23
+ hash,
24
+ prevStateHash,
25
+ ];
26
+ const message = this.buildSignatureMessage(params);
27
+ const signatureBytes = await this.connectCrypto.sign(message);
28
+ const signatureHex = `0x${this.arrayBufferToHex(signatureBytes)}`;
29
+ if (abortSignal?.aborted) {
30
+ throw new Error("Signing aborted");
31
+ }
32
+ return [...params, signatureHex];
33
+ }
34
+ async hashAction(action) {
35
+ const payload = [
36
+ action.scope,
37
+ action.type,
38
+ JSON.stringify(action.input),
39
+ ].join("");
40
+ const encoder = new TextEncoder();
41
+ const data = encoder.encode(payload);
42
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
43
+ return this.arrayBufferToBase64(hashBuffer);
44
+ }
45
+ buildSignatureMessage(params) {
46
+ const message = params.join("");
47
+ const prefix = "\x19Signed Operation:\n" + message.length.toString();
48
+ const encoder = new TextEncoder();
49
+ return encoder.encode(prefix + message);
50
+ }
51
+ arrayBufferToHex(buffer) {
52
+ const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
53
+ return Array.from(bytes)
54
+ .map((byte) => byte.toString(16).padStart(2, "0"))
55
+ .join("");
56
+ }
57
+ arrayBufferToBase64(buffer) {
58
+ const bytes = new Uint8Array(buffer);
59
+ let binary = "";
60
+ for (let i = 0; i < bytes.length; i++) {
61
+ binary += String.fromCharCode(bytes[i]);
62
+ }
63
+ return btoa(binary);
64
+ }
65
+ }
66
+ /**
67
+ * Creates a signature verification handler that verifies signatures using the Web Crypto API.
68
+ * The verification uses ECDSA with P-256 curve and SHA-256 hash, matching the ConnectCrypto signing algorithm.
69
+ */
70
+ export function createSignatureVerifier() {
71
+ return async (operation, publicKey) => {
72
+ const signer = operation.action.context?.signer;
73
+ if (!signer) {
74
+ return true;
75
+ }
76
+ const signatures = signer.signatures;
77
+ if (signatures.length === 0) {
78
+ return false;
79
+ }
80
+ const signature = signatures[signatures.length - 1];
81
+ const [timestamp, signerKey, hash, prevStateHash, signatureHex] = signature;
82
+ if (signerKey !== publicKey) {
83
+ return false;
84
+ }
85
+ const params = [
86
+ timestamp,
87
+ signerKey,
88
+ hash,
89
+ prevStateHash,
90
+ ];
91
+ const message = buildSignatureMessage(params);
92
+ const signatureBytes = hexToUint8Array(signatureHex);
93
+ const cryptoKey = await importPublicKey(publicKey);
94
+ const isValid = await crypto.subtle.verify({ name: "ECDSA", hash: "SHA-256" }, cryptoKey, signatureBytes.buffer, message.buffer);
95
+ return isValid;
96
+ };
97
+ }
98
+ function buildSignatureMessage(params) {
99
+ const message = params.join("");
100
+ const prefix = "\x19Signed Operation:\n" + message.length.toString();
101
+ const encoder = new TextEncoder();
102
+ return encoder.encode(prefix + message);
103
+ }
104
+ function hexToUint8Array(hex) {
105
+ const cleanHex = hex.startsWith("0x") ? hex.slice(2) : hex;
106
+ const bytes = new Uint8Array(cleanHex.length / 2);
107
+ for (let i = 0; i < cleanHex.length; i += 2) {
108
+ bytes[i / 2] = parseInt(cleanHex.substring(i, i + 2), 16);
109
+ }
110
+ return bytes;
111
+ }
112
+ async function importPublicKey(did) {
113
+ const keyData = extractKeyFromDid(did);
114
+ return crypto.subtle.importKey("raw", keyData.buffer, { name: "ECDSA", namedCurve: "P-256" }, true, ["verify"]);
115
+ }
116
+ function extractKeyFromDid(did) {
117
+ const parts = did.split(":");
118
+ if (parts.length < 3 || parts[0] !== "did" || parts[1] !== "key") {
119
+ throw new Error(`Invalid DID format: ${did}`);
120
+ }
121
+ const multibaseKey = parts[2];
122
+ if (!multibaseKey.startsWith("z")) {
123
+ throw new Error(`Unsupported multibase encoding: ${multibaseKey[0]}`);
124
+ }
125
+ const decoded = base58Decode(multibaseKey.slice(1));
126
+ if (decoded[0] !== 0x80 || decoded[1] !== 0x24) {
127
+ throw new Error("Not a P-256 public key multicodec");
128
+ }
129
+ const compressedKey = decoded.slice(2);
130
+ return decompressP256PublicKey(compressedKey);
131
+ }
132
+ function base58Decode(input) {
133
+ const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
134
+ const ALPHABET_MAP = new Map();
135
+ for (let i = 0; i < ALPHABET.length; i++) {
136
+ ALPHABET_MAP.set(ALPHABET[i], i);
137
+ }
138
+ if (input.length === 0) {
139
+ return new Uint8Array(0);
140
+ }
141
+ const bytes = [0];
142
+ for (const char of input) {
143
+ const value = ALPHABET_MAP.get(char);
144
+ if (value === undefined) {
145
+ throw new Error(`Invalid base58 character: ${char}`);
146
+ }
147
+ let carry = value;
148
+ for (let j = 0; j < bytes.length; j++) {
149
+ carry += bytes[j] * 58;
150
+ bytes[j] = carry & 0xff;
151
+ carry >>= 8;
152
+ }
153
+ while (carry > 0) {
154
+ bytes.push(carry & 0xff);
155
+ carry >>= 8;
156
+ }
157
+ }
158
+ for (const char of input) {
159
+ if (char !== "1")
160
+ break;
161
+ bytes.push(0);
162
+ }
163
+ return new Uint8Array(bytes.reverse());
164
+ }
165
+ function decompressP256PublicKey(compressed) {
166
+ if (compressed.length !== 33) {
167
+ throw new Error(`Invalid compressed key length: ${compressed.length}`);
168
+ }
169
+ const prefix = compressed[0];
170
+ if (prefix !== 0x02 && prefix !== 0x03) {
171
+ throw new Error(`Invalid compression prefix: ${prefix}`);
172
+ }
173
+ const p = BigInt("0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff");
174
+ const a = BigInt("0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc");
175
+ const b = BigInt("0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b");
176
+ let x = BigInt(0);
177
+ for (let i = 1; i < compressed.length; i++) {
178
+ x = (x << BigInt(8)) | BigInt(compressed[i]);
179
+ }
180
+ const ySquared = (modPow(x, BigInt(3), p) + a * x + b) % p;
181
+ let y = modPow(ySquared, (p + BigInt(1)) / BigInt(4), p);
182
+ const isYEven = y % BigInt(2) === BigInt(0);
183
+ const shouldBeEven = prefix === 0x02;
184
+ if (isYEven !== shouldBeEven) {
185
+ y = p - y;
186
+ }
187
+ const uncompressed = new Uint8Array(65);
188
+ uncompressed[0] = 0x04;
189
+ const xBytes = bigIntToBytes(x, 32);
190
+ const yBytes = bigIntToBytes(y, 32);
191
+ uncompressed.set(xBytes, 1);
192
+ uncompressed.set(yBytes, 33);
193
+ return uncompressed;
194
+ }
195
+ function modPow(base, exp, mod) {
196
+ let result = BigInt(1);
197
+ base = base % mod;
198
+ while (exp > BigInt(0)) {
199
+ if (exp % BigInt(2) === BigInt(1)) {
200
+ result = (result * base) % mod;
201
+ }
202
+ exp = exp >> BigInt(1);
203
+ base = (base * base) % mod;
204
+ }
205
+ return result;
206
+ }
207
+ function bigIntToBytes(n, length) {
208
+ const bytes = new Uint8Array(length);
209
+ for (let i = length - 1; i >= 0; i--) {
210
+ bytes[i] = Number(n & BigInt(0xff));
211
+ n = n >> BigInt(8);
212
+ }
213
+ return bytes;
214
+ }
215
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/utils/signer.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,aAA6B;QAA7B,kBAAa,GAAb,aAAa,CAAgB;IAAG,CAAC;IAE9D,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,WAAyB;QAClD,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;QAE3C,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC;QAEvD,MAAM,MAAM,GAAqC;YAC/C,SAAS;YACT,GAAG;YACH,IAAI;YACJ,aAAa;SACd,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,KAAK,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,CAAC;QAElE,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,MAAc;QACrC,MAAM,OAAO,GAAG;YACd,MAAM,CAAC,KAAK;YACZ,MAAM,CAAC,IAAI;YACX,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAEO,qBAAqB,CAC3B,MAAwC;QAExC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,gBAAgB,CAAC,MAAgC;QACvD,MAAM,KAAK,GACT,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aACjD,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAEO,mBAAmB,CAAC,MAAmB;QAC7C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,EAAE,SAAoB,EAAE,SAAiB,EAAoB,EAAE;QACzE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,CAAC,GAAG,SAAS,CAAC;QAE5E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAqC;YAC/C,SAAS;YACT,SAAS;YACT,IAAI;YACJ,aAAa;SACd,CAAC;QACF,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACxC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAClC,SAAS,EACT,cAAc,CAAC,MAAqB,EACpC,OAAO,CAAC,MAAqB,CAC9B,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAwC;IAExC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAC5B,KAAK,EACL,OAAO,CAAC,MAAqB,EAC7B,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EACtC,IAAI,EACJ,CAAC,QAAQ,CAAC,CACX,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,uBAAuB,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,QAAQ,GAAG,4DAA4D,CAAC;IAC9E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;YACxB,KAAK,KAAK,CAAC,CAAC;QACd,CAAC;QAED,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YACzB,KAAK,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG;YAAE,MAAM;QACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAsB;IACrD,IAAI,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAC;IAEF,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,KAAK,IAAI,CAAC;IACrC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACxC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5B,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,GAAW,EAAE,GAAW;IACpD,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IAClB,OAAO,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QACjC,CAAC;QACD,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,MAAc;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=signer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.test.d.ts","sourceRoot":"","sources":["../../../test/utils/signer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,319 @@
1
+ import { ConnectCrypto, } from "@renown/sdk";
2
+ import { beforeEach, describe, expect, it } from "vitest";
3
+ import { ConnectCryptoSigner, createSignatureVerifier, } from "../../src/utils/signer.js";
4
+ class InMemoryKeyStorage {
5
+ keyPair;
6
+ loadKeyPair() {
7
+ return Promise.resolve(this.keyPair);
8
+ }
9
+ saveKeyPair(keyPair) {
10
+ this.keyPair = keyPair;
11
+ return Promise.resolve();
12
+ }
13
+ }
14
+ describe("ConnectCryptoSigner and Verifier Integration", () => {
15
+ let keyStorage;
16
+ let connectCrypto;
17
+ let signer;
18
+ let verifier;
19
+ beforeEach(async () => {
20
+ keyStorage = new InMemoryKeyStorage();
21
+ connectCrypto = new ConnectCrypto(keyStorage);
22
+ signer = new ConnectCryptoSigner(connectCrypto);
23
+ verifier = createSignatureVerifier();
24
+ await connectCrypto.did();
25
+ });
26
+ it("signs an action and produces a valid signature format", async () => {
27
+ const action = {
28
+ id: "action-1",
29
+ type: "TEST_ACTION",
30
+ timestampUtcMs: new Date().toISOString(),
31
+ input: { foo: "bar" },
32
+ scope: "global",
33
+ };
34
+ const signature = await signer.sign(action);
35
+ expect(signature).toHaveLength(5);
36
+ const [timestamp, signerKey, hash, prevStateHash, signatureHex] = signature;
37
+ expect(timestamp).toMatch(/^\d+$/);
38
+ expect(signerKey.startsWith("did:key:z")).toBe(true);
39
+ expect(hash).toBeDefined();
40
+ expect(prevStateHash).toBe("");
41
+ expect(signatureHex.startsWith("0x")).toBe(true);
42
+ expect(signatureHex.length).toBeGreaterThan(2);
43
+ });
44
+ it("verifies a signature created by ConnectCryptoSigner", async () => {
45
+ const did = await connectCrypto.did();
46
+ const action = {
47
+ id: "action-1",
48
+ type: "TEST_ACTION",
49
+ timestampUtcMs: new Date().toISOString(),
50
+ input: { foo: "bar" },
51
+ scope: "global",
52
+ };
53
+ const signature = await signer.sign(action);
54
+ const signedAction = {
55
+ ...action,
56
+ context: {
57
+ signer: {
58
+ user: { address: did, chainId: 1, networkId: "eip155" },
59
+ app: { name: "test-app", key: did },
60
+ signatures: [signature],
61
+ },
62
+ },
63
+ };
64
+ const operation = {
65
+ index: 0,
66
+ timestampUtcMs: action.timestampUtcMs,
67
+ hash: "",
68
+ skip: 0,
69
+ action: signedAction,
70
+ };
71
+ const isValid = await verifier(operation, did);
72
+ expect(isValid).toBe(true);
73
+ });
74
+ it("rejects a tampered signature", async () => {
75
+ const did = await connectCrypto.did();
76
+ const action = {
77
+ id: "action-1",
78
+ type: "TEST_ACTION",
79
+ timestampUtcMs: new Date().toISOString(),
80
+ input: { foo: "bar" },
81
+ scope: "global",
82
+ };
83
+ const signature = await signer.sign(action);
84
+ const [timestamp, signerKey, hash, prevStateHash] = signature;
85
+ const tamperedSignature = [
86
+ timestamp,
87
+ signerKey,
88
+ hash,
89
+ prevStateHash,
90
+ "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
91
+ ];
92
+ const signedAction = {
93
+ ...action,
94
+ context: {
95
+ signer: {
96
+ user: { address: did, chainId: 1, networkId: "eip155" },
97
+ app: { name: "test-app", key: did },
98
+ signatures: [tamperedSignature],
99
+ },
100
+ },
101
+ };
102
+ const operation = {
103
+ index: 0,
104
+ timestampUtcMs: action.timestampUtcMs,
105
+ hash: "",
106
+ skip: 0,
107
+ action: signedAction,
108
+ };
109
+ const isValid = await verifier(operation, did);
110
+ expect(isValid).toBe(false);
111
+ });
112
+ it("rejects verification when public key does not match", async () => {
113
+ const did = await connectCrypto.did();
114
+ const action = {
115
+ id: "action-1",
116
+ type: "TEST_ACTION",
117
+ timestampUtcMs: new Date().toISOString(),
118
+ input: { foo: "bar" },
119
+ scope: "global",
120
+ };
121
+ const signature = await signer.sign(action);
122
+ const signedAction = {
123
+ ...action,
124
+ context: {
125
+ signer: {
126
+ user: { address: did, chainId: 1, networkId: "eip155" },
127
+ app: { name: "test-app", key: did },
128
+ signatures: [signature],
129
+ },
130
+ },
131
+ };
132
+ const operation = {
133
+ index: 0,
134
+ timestampUtcMs: action.timestampUtcMs,
135
+ hash: "",
136
+ skip: 0,
137
+ action: signedAction,
138
+ };
139
+ const wrongDid = "did:key:zDnaerDaTF5BXEavCrfRZEk316dpbLsfPDZ3WJ5hRTPFU2169";
140
+ const isValid = await verifier(operation, wrongDid);
141
+ expect(isValid).toBe(false);
142
+ });
143
+ it("returns true for operations without signer context", async () => {
144
+ const action = {
145
+ id: "action-1",
146
+ type: "TEST_ACTION",
147
+ timestampUtcMs: new Date().toISOString(),
148
+ input: { foo: "bar" },
149
+ scope: "global",
150
+ };
151
+ const operation = {
152
+ index: 0,
153
+ timestampUtcMs: action.timestampUtcMs,
154
+ hash: "",
155
+ skip: 0,
156
+ action: action,
157
+ };
158
+ const isValid = await verifier(operation, "any-key");
159
+ expect(isValid).toBe(true);
160
+ });
161
+ it("returns false for operations with signer but no signatures", async () => {
162
+ const did = await connectCrypto.did();
163
+ const action = {
164
+ id: "action-1",
165
+ type: "TEST_ACTION",
166
+ timestampUtcMs: new Date().toISOString(),
167
+ input: { foo: "bar" },
168
+ scope: "global",
169
+ context: {
170
+ signer: {
171
+ user: { address: did, chainId: 1, networkId: "eip155" },
172
+ app: { name: "test-app", key: did },
173
+ signatures: [],
174
+ },
175
+ },
176
+ };
177
+ const operation = {
178
+ index: 0,
179
+ timestampUtcMs: action.timestampUtcMs,
180
+ hash: "",
181
+ skip: 0,
182
+ action: action,
183
+ };
184
+ const isValid = await verifier(operation, did);
185
+ expect(isValid).toBe(false);
186
+ });
187
+ it("handles actions with prevOpHash in context", async () => {
188
+ const did = await connectCrypto.did();
189
+ const action = {
190
+ id: "action-1",
191
+ type: "TEST_ACTION",
192
+ timestampUtcMs: new Date().toISOString(),
193
+ input: { foo: "bar" },
194
+ scope: "global",
195
+ context: {
196
+ prevOpHash: "abc123",
197
+ },
198
+ };
199
+ const signature = await signer.sign(action);
200
+ const signedAction = {
201
+ ...action,
202
+ context: {
203
+ ...action.context,
204
+ signer: {
205
+ user: { address: did, chainId: 1, networkId: "eip155" },
206
+ app: { name: "test-app", key: did },
207
+ signatures: [signature],
208
+ },
209
+ },
210
+ };
211
+ const operation = {
212
+ index: 0,
213
+ timestampUtcMs: action.timestampUtcMs,
214
+ hash: "",
215
+ skip: 0,
216
+ action: signedAction,
217
+ };
218
+ const isValid = await verifier(operation, did);
219
+ expect(isValid).toBe(true);
220
+ expect(signature[3]).toBe("abc123");
221
+ });
222
+ it("handles complex action inputs", async () => {
223
+ const did = await connectCrypto.did();
224
+ const action = {
225
+ id: "action-1",
226
+ type: "COMPLEX_ACTION",
227
+ timestampUtcMs: new Date().toISOString(),
228
+ input: {
229
+ nested: {
230
+ deeply: {
231
+ value: [1, 2, 3],
232
+ unicode: "\u00e9\u00e0\u00f9",
233
+ },
234
+ },
235
+ array: ["a", "b", "c"],
236
+ nullValue: null,
237
+ booleans: { yes: true, no: false },
238
+ },
239
+ scope: "document",
240
+ };
241
+ const signature = await signer.sign(action);
242
+ const signedAction = {
243
+ ...action,
244
+ context: {
245
+ signer: {
246
+ user: { address: did, chainId: 1, networkId: "eip155" },
247
+ app: { name: "test-app", key: did },
248
+ signatures: [signature],
249
+ },
250
+ },
251
+ };
252
+ const operation = {
253
+ index: 0,
254
+ timestampUtcMs: action.timestampUtcMs,
255
+ hash: "",
256
+ skip: 0,
257
+ action: signedAction,
258
+ };
259
+ const isValid = await verifier(operation, did);
260
+ expect(isValid).toBe(true);
261
+ });
262
+ it("produces different signatures for different actions", async () => {
263
+ const action1 = {
264
+ id: "action-1",
265
+ type: "TEST_ACTION",
266
+ timestampUtcMs: new Date().toISOString(),
267
+ input: { value: 1 },
268
+ scope: "global",
269
+ };
270
+ const action2 = {
271
+ id: "action-2",
272
+ type: "TEST_ACTION",
273
+ timestampUtcMs: new Date().toISOString(),
274
+ input: { value: 2 },
275
+ scope: "global",
276
+ };
277
+ const signature1 = await signer.sign(action1);
278
+ const signature2 = await signer.sign(action2);
279
+ expect(signature1[2]).not.toBe(signature2[2]);
280
+ expect(signature1[4]).not.toBe(signature2[4]);
281
+ });
282
+ it("signatures from different keys fail verification", async () => {
283
+ const did1 = await connectCrypto.did();
284
+ const action = {
285
+ id: "action-1",
286
+ type: "TEST_ACTION",
287
+ timestampUtcMs: new Date().toISOString(),
288
+ input: { foo: "bar" },
289
+ scope: "global",
290
+ };
291
+ const signature = await signer.sign(action);
292
+ const newKeyStorage = new InMemoryKeyStorage();
293
+ const newConnectCrypto = new ConnectCrypto(newKeyStorage);
294
+ const did2 = await newConnectCrypto.did();
295
+ expect(did1).not.toBe(did2);
296
+ const signedAction = {
297
+ ...action,
298
+ context: {
299
+ signer: {
300
+ user: { address: did1, chainId: 1, networkId: "eip155" },
301
+ app: { name: "test-app", key: did1 },
302
+ signatures: [signature],
303
+ },
304
+ },
305
+ };
306
+ const operation = {
307
+ index: 0,
308
+ timestampUtcMs: action.timestampUtcMs,
309
+ hash: "",
310
+ skip: 0,
311
+ action: signedAction,
312
+ };
313
+ const isValidWithOriginalKey = await verifier(operation, did1);
314
+ expect(isValidWithOriginalKey).toBe(true);
315
+ const isValidWithDifferentKey = await verifier(operation, did2);
316
+ expect(isValidWithDifferentKey).toBe(false);
317
+ });
318
+ });
319
+ //# sourceMappingURL=signer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.test.js","sourceRoot":"","sources":["../../../test/utils/signer.test.ts"],"names":[],"mappings":"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"}