@idos-network/kwil-infra 3.0.0 → 4.0.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/actions/index.d.mts +2 -2
  3. package/dist/actions/index.mjs +1 -1
  4. package/dist/actions/index.mjs.map +1 -1
  5. package/dist/facesign/index.d.mts +2 -2
  6. package/dist/facesign/index.mjs +1 -1
  7. package/dist/facesign-signer-CTPPUFxT.mjs +2 -0
  8. package/dist/facesign-signer-CTPPUFxT.mjs.map +1 -0
  9. package/dist/{facesign-signer-5I8juA7p.d.mts → facesign-signer-Dqh899om.d.mts} +3 -2
  10. package/dist/facesign-signer-Dqh899om.d.mts.map +1 -0
  11. package/dist/{index-Bqz6trCk.d.mts → index-Dwonqvwu.d.mts} +33 -20
  12. package/dist/index-Dwonqvwu.d.mts.map +1 -0
  13. package/dist/index.d.mts +2 -2
  14. package/dist/index.mjs +1 -1
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/nep413-D_D-6Yf6.mjs +2 -0
  17. package/dist/nep413-D_D-6Yf6.mjs.map +1 -0
  18. package/dist/signature-verification/index.d.mts +1 -1
  19. package/dist/signature-verification/index.mjs +1 -1
  20. package/dist/signature-verification/index.mjs.map +1 -1
  21. package/dist/xrp/utils.d.mts +41 -41
  22. package/dist/xrp/utils.d.mts.map +1 -1
  23. package/package.json +3 -3
  24. package/src/actions/actions.test.ts +18 -2
  25. package/src/actions/actions.ts +76 -19
  26. package/src/facesign/facesign-signer.test.ts +58 -1
  27. package/src/facesign/facesign-signer.ts +8 -0
  28. package/src/facesign/index.ts +1 -1
  29. package/src/mm-token/create-mm-token-kwil-signer.test.ts +0 -16
  30. package/src/mm-token/create-mm-token-kwil-signer.ts +0 -5
  31. package/src/near/create-near-wallet-kwil-signer.test.ts +218 -0
  32. package/src/near/create-near-wallet-kwil-signer.ts +121 -28
  33. package/src/near/nep413.ts +47 -37
  34. package/src/near/signature-verification.test.ts +35 -0
  35. package/src/near/signature-verification.ts +15 -36
  36. package/dist/facesign-signer-5I8juA7p.d.mts.map +0 -1
  37. package/dist/facesign-signer-z5T312uQ.mjs +0 -2
  38. package/dist/facesign-signer-z5T312uQ.mjs.map +0 -1
  39. package/dist/index-Bqz6trCk.d.mts.map +0 -1
@@ -11,16 +11,17 @@ import { KwilSigner } from "@idos-network/kwil-js";
11
11
  import {
12
12
  base64Decode,
13
13
  binaryWriteUint16BE,
14
- borshSerialize,
15
14
  bs58Decode,
16
15
  bytesConcat,
17
16
  hexEncode,
18
17
  utf8Decode,
19
18
  } from "@idos-network/utils/codecs";
19
+ import nacl from "tweetnacl";
20
20
 
21
21
  import type { KwilActionClient } from "../create-kwil-client";
22
22
 
23
23
  import { getNearConnectionConfig } from "./get-config";
24
+ import { nep413SignHash, serializeKwilNep413 } from "./nep413";
24
25
 
25
26
  const NEAR_WALLET_TYPES: string[] = [
26
27
  "browser",
@@ -88,25 +89,12 @@ function createNearWalletSigner(
88
89
  nonce: nonceSuggestion,
89
90
  }))!;
90
91
 
91
- const nep413BorschSchema = {
92
- struct: {
93
- tag: "u32",
94
- message: "string",
95
- nonce: { array: { type: "u8", len: 32 } },
96
- recipient: "string",
97
- callbackUrl: { option: "string" },
98
- },
99
- };
100
-
101
- const nep413BorshParams = {
102
- tag: 2147484061,
92
+ const nep413BorshPayload = serializeKwilNep413({
103
93
  message: messageString,
104
94
  nonce: Array.from(nonce),
105
95
  recipient,
106
96
  callbackUrl,
107
- };
108
-
109
- const nep413BorshPayload = borshSerialize(nep413BorschSchema, nep413BorshParams);
97
+ });
110
98
  const result = bytesConcat(
111
99
  binaryWriteUint16BE(nep413BorshPayload.length),
112
100
  nep413BorshPayload,
@@ -149,6 +137,112 @@ export async function getNearFullAccessPublicKeys(
149
137
  }
150
138
  }
151
139
 
140
+ type NearRedirect = {
141
+ accountId?: string;
142
+ publicKey?: string;
143
+ signature?: string;
144
+ error?: string;
145
+ };
146
+
147
+ function parseNearRedirect(hash: string): NearRedirect {
148
+ const params = new URLSearchParams(hash.startsWith("#") ? hash.slice(1) : hash);
149
+ const signature = params.get("signature");
150
+ return {
151
+ accountId: params.get("accountId") ?? undefined,
152
+ publicKey: params.get("publicKey") ?? undefined,
153
+ // URLSearchParams decodes a literal "+" as a space. NEP-413 signatures are base64.
154
+ signature: signature?.replaceAll(" ", "+"),
155
+ error: params.get("error") ?? undefined,
156
+ };
157
+ }
158
+
159
+ function takeNearRedirect(): NearRedirect {
160
+ const redirect = parseNearRedirect(window.location.hash);
161
+ if (!redirect.accountId && !redirect.publicKey && !redirect.signature && !redirect.error) {
162
+ return redirect;
163
+ }
164
+
165
+ const params = new URLSearchParams(window.location.hash.slice(1));
166
+ for (const key of ["accountId", "publicKey", "signature", "error", "state"]) params.delete(key);
167
+ const rest = params.toString();
168
+ window.history.replaceState(
169
+ null,
170
+ "",
171
+ `${window.location.pathname}${window.location.search}${rest ? `#${rest}` : ""}`,
172
+ );
173
+ return redirect;
174
+ }
175
+
176
+ function verifyNep413Signature(
177
+ message: string,
178
+ nonce: Uint8Array,
179
+ recipient: string,
180
+ callbackUrl: string,
181
+ signature: string,
182
+ publicKey: string,
183
+ ): boolean {
184
+ const pieces = publicKey.split(":");
185
+ if (pieces.length !== 2 || pieces[0] !== "ed25519" || !pieces[1] || nonce.length !== 32) {
186
+ return false;
187
+ }
188
+
189
+ try {
190
+ const publicKeyBytes = bs58Decode(pieces[1]);
191
+ const signatureBytes = base64Decode(signature);
192
+ if (publicKeyBytes.length !== 32 || signatureBytes.length !== 64) return false;
193
+
194
+ return nacl.sign.detached.verify(
195
+ nep413SignHash({ message, nonce, recipient, callbackUrl }),
196
+ signatureBytes,
197
+ publicKeyBytes,
198
+ );
199
+ } catch {
200
+ return false;
201
+ }
202
+ }
203
+
204
+ // The hash is attacker-controlled. A signature is only the wallet's if it verifies
205
+ // against the request we stored before the redirect, for a full-access key of this account.
206
+ async function trustedNearRedirect(
207
+ redirect: NearRedirect,
208
+ currentAddress: string,
209
+ recipient: string,
210
+ store: Store,
211
+ ): Promise<{ signature: string; publicKey: string } | undefined> {
212
+ if (
213
+ redirect.error ||
214
+ !redirect.signature ||
215
+ !redirect.publicKey ||
216
+ redirect.accountId !== currentAddress
217
+ ) {
218
+ return;
219
+ }
220
+
221
+ const message = await store.get<string>("sign-last-message");
222
+ const savedNonce = await store.get<number[] | Uint8Array>("sign-last-nonce");
223
+ const callbackUrl = await store.get<string>("sign-last-url");
224
+ if (!message || !savedNonce || !callbackUrl) return;
225
+
226
+ const nonce = Uint8Array.from(savedNonce);
227
+ if (
228
+ !verifyNep413Signature(
229
+ message,
230
+ nonce,
231
+ recipient,
232
+ callbackUrl,
233
+ redirect.signature,
234
+ redirect.publicKey,
235
+ )
236
+ ) {
237
+ return;
238
+ }
239
+
240
+ const keys = await getNearFullAccessPublicKeys(currentAddress);
241
+ if (!keys?.includes(redirect.publicKey)) return;
242
+
243
+ return { signature: redirect.signature, publicKey: redirect.publicKey };
244
+ }
245
+
152
246
  export async function signNearMessage(
153
247
  wallet: NearWallet,
154
248
  message: string,
@@ -169,34 +263,33 @@ export async function createNearWalletKwilSigner(
169
263
  if (!wallet.signMessage) throw new Error("Only wallets with signMessage are supported.");
170
264
 
171
265
  if (wallet.id === "my-near-wallet") {
172
- const { accountId, signature, publicKey, error } = Object.fromEntries(
173
- new URLSearchParams(window.location.hash.slice(1)).entries(),
174
- );
266
+ const redirect = takeNearRedirect();
267
+ const trusted = await trustedNearRedirect(redirect, currentAddress, recipient, store);
175
268
 
176
- if (signature) {
177
- await store.set("signer-address", accountId);
178
- await store.set("signer-public-key", publicKey);
269
+ if (trusted) {
270
+ await store.set("signer-address", currentAddress);
271
+ await store.set("signer-public-key", trusted.publicKey);
179
272
  }
180
273
 
181
274
  const signMessageOriginal = wallet.signMessage.bind(wallet);
182
275
 
183
276
  wallet.signMessage = async ({
184
277
  message,
185
- recipient,
278
+ recipient: signRecipient,
186
279
  }: SignMessageParams): Promise<SignedMessage & { nonce?: Uint8Array }> => {
187
- if (error) return Promise.reject();
280
+ if (redirect.error) return Promise.reject();
188
281
 
189
282
  const lastMessage = await store.get<string>("sign-last-message");
190
283
  const lastNonce = await store.get<Uint8Array>("sign-last-nonce");
191
284
 
192
- if (signature && message === lastMessage && lastNonce) {
285
+ if (trusted && message === lastMessage && lastNonce) {
193
286
  const nonce = Buffer.from(lastNonce);
194
287
  const callbackUrl = await store.get<string>("sign-last-url");
195
288
 
196
289
  return Promise.resolve({
197
290
  accountId: currentAddress,
198
- publicKey,
199
- signature,
291
+ publicKey: trusted.publicKey,
292
+ signature: trusted.signature,
200
293
  nonce,
201
294
  message,
202
295
  callbackUrl,
@@ -210,7 +303,7 @@ export async function createNearWalletKwilSigner(
210
303
  await store.set("sign-last-nonce", Array.from(nonce));
211
304
  await store.set("sign-last-url", callbackUrl);
212
305
 
213
- signMessageOriginal({ message, nonce, recipient, callbackUrl });
306
+ signMessageOriginal({ message, nonce, recipient: signRecipient, callbackUrl });
214
307
 
215
308
  return new Promise(() => ({}) as SignedMessage);
216
309
  };
@@ -2,56 +2,66 @@ import type { KeyPair } from "near-api-js";
2
2
 
3
3
  import {
4
4
  binaryWriteUint16BE,
5
+ borshDeserialize,
5
6
  borshSerialize,
6
7
  bytesConcat,
7
8
  sha256Hash,
8
9
  utf8Decode,
9
10
  } from "@idos-network/utils/codecs";
10
11
 
12
+ // 2**31 + 413. Prepended so a NEP-413 payload cannot be a valid NEAR transaction.
13
+ const NEP413_TAG = 2147484061;
14
+
15
+ const nep413PayloadSchema = {
16
+ struct: {
17
+ message: "string",
18
+ nonce: { array: { type: "u8", len: 32 } },
19
+ recipient: "string",
20
+ callbackUrl: { option: "string" },
21
+ },
22
+ } as const;
23
+
24
+ // Borsh has no struct header, so this is the same bytes as `u32 tag` followed by `nep413PayloadSchema`.
25
+ const kwilNep413Schema = {
26
+ struct: {
27
+ tag: "u32",
28
+ ...nep413PayloadSchema.struct,
29
+ },
30
+ } as const;
31
+
32
+ type Nep413Fields = {
33
+ message: string;
34
+ nonce: Uint8Array | number[];
35
+ recipient: string;
36
+ callbackUrl?: string;
37
+ };
38
+
39
+ export type Nep413Envelope = Nep413Fields & { tag: number };
40
+
41
+ export function nep413SignHash(payload: Nep413Fields): Uint8Array {
42
+ return sha256Hash(
43
+ bytesConcat(borshSerialize("u32", NEP413_TAG), borshSerialize(nep413PayloadSchema, payload)),
44
+ );
45
+ }
46
+
47
+ export function serializeKwilNep413(payload: Nep413Fields): Uint8Array {
48
+ return borshSerialize(kwilNep413Schema, { tag: NEP413_TAG, ...payload });
49
+ }
50
+
51
+ export function deserializeKwilNep413(bytes: Uint8Array): Nep413Envelope {
52
+ return borshDeserialize(kwilNep413Schema, bytes) as Nep413Envelope;
53
+ }
54
+
11
55
  export function kwilNep413Signer(
12
56
  recipient: string,
13
57
  ): (keyPair: KeyPair) => (messageBytes: Uint8Array) => Promise<Uint8Array> {
14
58
  return (keyPair: KeyPair) =>
15
59
  async (messageBytes: Uint8Array): Promise<Uint8Array> => {
16
60
  const message = utf8Decode(messageBytes);
17
- const nonceLength = 32;
18
- const nonce = crypto.getRandomValues(new Uint8Array(nonceLength));
19
-
20
- const nep413BorschSchema = {
21
- struct: {
22
- message: "string",
23
- nonce: { array: { type: "u8", len: nonceLength } },
24
- recipient: "string",
25
- callbackUrl: { option: "string" },
26
- },
27
- } as const;
28
-
29
- const tag = 2147484061; // 2**31 + 413
30
-
31
- const { signature } = keyPair.sign(
32
- sha256Hash(
33
- bytesConcat(
34
- borshSerialize("u32", tag),
35
- borshSerialize(nep413BorschSchema, { message, nonce, recipient }),
36
- ),
37
- ),
38
- );
61
+ const nonce = crypto.getRandomValues(new Uint8Array(32));
62
+ const { signature } = keyPair.sign(nep413SignHash({ message, nonce, recipient }));
39
63
 
40
- const kwilNep413BorschSchema = {
41
- struct: {
42
- tag: "u32",
43
- ...nep413BorschSchema.struct,
44
- },
45
- };
46
-
47
- const kwilNep413BorshParams = {
48
- tag,
49
- message,
50
- nonce,
51
- recipient,
52
- };
53
-
54
- const kwilNep413BorshPayload = borshSerialize(kwilNep413BorschSchema, kwilNep413BorshParams);
64
+ const kwilNep413BorshPayload = serializeKwilNep413({ message, nonce, recipient });
55
65
 
56
66
  return bytesConcat(
57
67
  binaryWriteUint16BE(kwilNep413BorshPayload.length),
@@ -0,0 +1,35 @@
1
+ import { hexEncode, utf8Encode } from "@idos-network/utils/codecs";
2
+ import { KeyPair } from "near-api-js";
3
+ import { describe, expect, it } from "vitest";
4
+
5
+ import { kwilNep413Signer } from "./nep413";
6
+ import { verifyNearSignature } from "./signature-verification";
7
+
8
+ async function sign(message: string, recipient: string) {
9
+ const keyPair = KeyPair.fromRandom("ed25519");
10
+ const signed = await kwilNep413Signer(recipient)(keyPair)(utf8Encode(message));
11
+ return {
12
+ signature: hexEncode(signed),
13
+ publicKey: keyPair.getPublicKey().toString(),
14
+ };
15
+ }
16
+
17
+ describe("verifyNearSignature", () => {
18
+ it("accepts a signature addressed to idos.network", async () => {
19
+ const { signature, publicKey } = await sign("hello", "idos.network");
20
+ expect(await verifyNearSignature("hello", signature, publicKey)).toBe(true);
21
+ });
22
+
23
+ it.each(["evil.example", "idos.network.evil", "idos-issuer"])(
24
+ "rejects a valid signature addressed to %s",
25
+ async (recipient) => {
26
+ const { signature, publicKey } = await sign("hello", recipient);
27
+ expect(await verifyNearSignature("hello", signature, publicKey)).toBe(false);
28
+ },
29
+ );
30
+
31
+ it("rejects an idos.network signature of a different message", async () => {
32
+ const { signature, publicKey } = await sign("hello", "idos.network");
33
+ expect(await verifyNearSignature("goodbye", signature, publicKey)).toBe(false);
34
+ });
35
+ });
@@ -1,19 +1,10 @@
1
- import {
2
- borshDeserialize,
3
- borshSerialize,
4
- bs58Decode,
5
- hexDecode,
6
- sha256Hash,
7
- } from "@idos-network/utils/codecs";
1
+ import { bs58Decode, hexDecode } from "@idos-network/utils/codecs";
8
2
  import nacl from "tweetnacl";
9
3
 
10
- interface NEP413Payload {
11
- tag: number;
12
- message: string;
13
- nonce: number[];
14
- recipient: string;
15
- callbackUrl?: string;
16
- }
4
+ import { deserializeKwilNep413, nep413SignHash } from "./nep413";
5
+
6
+ // Must match the recipient the idOS node accepts for NEP-413 wallet signatures.
7
+ const NEP413_RECIPIENT = "idos.network";
17
8
 
18
9
  export const verifyNearSignature = async (
19
10
  message: string,
@@ -48,33 +39,21 @@ export const verifyNearSignature = async (
48
39
  return false;
49
40
  }
50
41
 
51
- // Deserialize the payload to extract nonce, recipient, callbackUrl
52
- const payloadSchema = {
53
- struct: {
54
- tag: "u32",
55
- message: "string",
56
- nonce: { array: { type: "u8", len: 32 } },
57
- recipient: "string",
58
- callbackUrl: { option: "string" },
59
- },
60
- };
42
+ const deserializedPayload = deserializeKwilNep413(payloadBytes);
61
43
 
62
- const deserializedPayload = borshDeserialize(payloadSchema, payloadBytes) as NEP413Payload;
44
+ // NEP-413 binds the signature to a relying party; reject ones addressed elsewhere.
45
+ if (deserializedPayload.recipient !== NEP413_RECIPIENT) {
46
+ console.warn("Invalid NEP-413 recipient");
47
+ return false;
48
+ }
63
49
 
64
- // Reconstruct the payload with tag and message (matching Go implementation)
65
- const reconstructedPayload: NEP413Payload = {
66
- tag: 2147484061, // 2**31 + 413
67
- message: message, // Use the provided message
50
+ // Hash the caller-supplied message with the nonce and recipient from the envelope.
51
+ const hash = nep413SignHash({
52
+ message,
68
53
  nonce: deserializedPayload.nonce,
69
54
  recipient: deserializedPayload.recipient,
70
55
  callbackUrl: deserializedPayload.callbackUrl,
71
- };
72
-
73
- // Serialize the entire payload (matching Go's borsch.Serialize(*payload))
74
- const fullPayloadBytes = borshSerialize(payloadSchema, reconstructedPayload);
75
- // Hash the payload (matching Go's sha256.Sum256(payloadBytes))
76
- const hash = sha256Hash(fullPayloadBytes);
77
- // Raw ed25519 verification using nacl (matching Go's ed25519.Verify)
56
+ });
78
57
  const isValid = nacl.sign.detached.verify(hash, actualSignature, publicKeyBytes);
79
58
 
80
59
  return isValid;
@@ -1 +0,0 @@
1
- {"version":3,"file":"facesign-signer-5I8juA7p.d.mts","names":[],"sources":["../src/facesign/facesign-signer.ts"],"mappings":";UAMiB;EACf;EACA;;UAGe;EACf,UAAU;EACV;;cAOW;;EAqBX;EACA;EACA;EACA;EAEA,YAAY,SAAS;EA2DrB,WAAiB;IAAU;;EAM3B,QAAc;EAWd,cAAoB;MA0BhB;EAIJ,YAAkB,SAAS,sBAAsB,QAAQ;EAiFzD,SAAe;EAqCf;EAqBA"}
@@ -1,2 +0,0 @@
1
- const e=6e5;var t=class{#e=null;#t=null;#n=null;#r=null;#i=null;#a=null;#o=null;#s=null;#c=null;#l=null;#u=null;#d=!1;#f=0;#p=null;#m;#h;#g;signatureType=`ed25519`;walletType=`FaceSign`;publicAddress=``;publicKey=``;constructor(e){this.#m=e.metadata,this.#h=e.enclaveUrl,this.#g=new URL(e.enclaveUrl).origin}#_(){this.#d||=(this.#u=e=>{if(e.origin===this.#g){if(e.data?.type===`facesign_ready`&&(this.#p=!!e.data.hasKey,this.#n?.()),e.data?.type===`sign_proposal_response`){let t=e.data.data;if(!t)return;t.signature?this.#r?.(new Uint8Array(t.signature)):this.#i?.(Error(`Sign request rejected by user`))}if(e.data?.type===`session_proposal_response`){let t=e.data.data;if(!t)return;t.approved&&t.address?this.#a?.({address:t.address}):this.#o?.(Error(`Session request rejected by user`))}if(e.data?.type===`address_response`){let t=e.data.data;this.#s?.(t?.address??null)}e.data?.type===`reset_complete`&&(e.data.data?.ok?this.#c?.():this.#l?.(Error(`FaceSign enclave failed to delete its key`)))}},window.addEventListener(`message`,this.#u),!0)}async preload(){return this.#_(),await this.#x(),{hasKey:this.#p??!1}}async init(){this.#_();let e=await this.#v();return this.publicKey=e.address,this.publicAddress=e.address,e.address}async getAddress(){return this.#_(),await this.#x(),this.#p?new Promise(t=>{let n=setTimeout(()=>t(null),e);this.#s=e=>{clearTimeout(n),this.#s=null,e&&(this.publicKey=e,this.publicAddress=e),t(e)},this.#e?.contentWindow?.postMessage({type:`address_request`,data:{id:++this.#f}},this.#h)}):null}get signer(){return this}async signMessage(t){await this.#x(),this.#S();let n=typeof t==`string`?new TextEncoder().encode(t):t;try{return await new Promise((t,r)=>{let i=setTimeout(()=>{r(Error(`FaceSign sign request timed out`))},e);this.#r=e=>{clearTimeout(i),t(e)},this.#i=e=>{clearTimeout(i),r(e)},setTimeout(()=>{this.#e?.contentWindow?.postMessage({type:`sign_proposal`,data:{id:++this.#f,data:n,metadata:this.#m}},this.#h)},300)})}finally{this.#r=null,this.#i=null,this.#C()}}async#v(){await this.#x(),this.#S();try{return await new Promise((t,n)=>{let r=setTimeout(()=>{n(Error(`FaceSign session proposal timed out`))},e);this.#a=e=>{clearTimeout(r),t(e)},this.#o=e=>{clearTimeout(r),n(e)},setTimeout(()=>{this.#e?.contentWindow?.postMessage({type:`session_proposal`,data:{id:++this.#f,metadata:this.#m}},this.#h)},300)})}finally{this.#a=null,this.#o=null,this.#C()}}async reset(){this.#_();let e=Date.now()+15e3;try{await this.#x(e-Date.now()),await new Promise((t,n)=>{let r=setTimeout(()=>{n(Error(`FaceSign reset timed out`))},Math.max(e-Date.now(),0));this.#c=()=>{clearTimeout(r),this.#c=null,this.#l=null,t()},this.#l=e=>{clearTimeout(r),this.#c=null,this.#l=null,n(e)},this.#e?.contentWindow?.postMessage({type:`reset`,data:{id:++this.#f}},this.#g)})}finally{this.destroy()}}hide(){this.#y(),this.#C()}#y(){let e=Error(`FaceSign operation cancelled`);this.#i&&=(this.#i(e),this.#r=null,null),this.#o&&=(this.#o(e),this.#a=null,null)}destroy(){this.#y(),this.#u&&=(window.removeEventListener(`message`,this.#u),null),this.#w()}#b(){let e=document.createElement(`dialog`);return Object.assign(e.style,{position:`fixed`,inset:`0`,width:`100%`,height:`100%`,maxWidth:`100%`,maxHeight:`100%`,margin:`0`,padding:`0`,border:`none`,zIndex:`99999`,background:`#0a0a0a`}),document.body.appendChild(e),e}#x(t=e){return this.#e?.contentWindow?Promise.resolve():new Promise((e,n)=>{let r=setTimeout(()=>{n(Error(`FaceSign enclave failed to load`))},t);this.#t||=this.#b(),this.#e=document.createElement(`iframe`),this.#e.src=this.#h,this.#e.title=`FaceSign Enclave`,this.#e.allow=`camera; fullscreen`,this.#e.style.cssText=`width:100%;height:100%;border:none;`,this.#t.appendChild(this.#e),this.#n=()=>{console.log(`resolveOpenEnclave`),clearTimeout(r),e()}})}#S(){let e=this.#t;e&&!e.open&&e.showModal()}#C(){let e=this.#t;e?.open&&e.close()}#w(){this.#e&&=(this.#e.remove(),null),this.#t&&=(this.#t.remove(),null)}};export{t};
2
- //# sourceMappingURL=facesign-signer-z5T312uQ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"facesign-signer-z5T312uQ.mjs","names":[],"sources":["../src/facesign/facesign-signer.ts"],"sourcesContent":["// Buffer after showing the iframe before posting a message, giving the enclave time to be ready.\nconst POST_MESSAGE_DELAY_MS = 300;\n// Safety net: reject proposals if the enclave doesn't respond within this window.\nconst PROPOSAL_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\nconst RESET_TIMEOUT_MS = 15_000;\n\nexport interface FaceSignMetadata {\n name: string;\n description: string;\n}\n\nexport interface FaceSignSignerProviderOptions {\n metadata: FaceSignMetadata;\n enclaveUrl: string;\n}\n\ninterface SessionResponse {\n address: string;\n}\n\nexport class FaceSignSignerProvider {\n #iframe: HTMLIFrameElement | null = null;\n #container: HTMLDialogElement | null = null;\n\n #resolveOpenEnclave: (() => void) | null = null;\n #resolveSignMessage: ((signature: Uint8Array) => void) | null = null;\n #rejectSignMessage: ((error: Error) => void) | null = null;\n #resolveSessionProposal: ((response: SessionResponse) => void) | null = null;\n #rejectSessionProposal: ((error: Error) => void) | null = null;\n #resolveAddressRequest: ((address: string | null) => void) | null = null;\n #resolveReset: (() => void) | null = null;\n #rejectReset: ((error: Error) => void) | null = null;\n\n #messageListener: ((event: MessageEvent) => void) | null = null;\n #messageListenerInitialized = false;\n #proposalId = 0;\n #hasKey: boolean | null = null;\n #metadata: FaceSignMetadata;\n #enclaveUrl: string;\n #enclaveOrigin: string;\n\n signatureType = \"ed25519\";\n walletType = \"FaceSign\";\n publicAddress = \"\";\n publicKey = \"\";\n\n constructor(options: FaceSignSignerProviderOptions) {\n this.#metadata = options.metadata;\n this.#enclaveUrl = options.enclaveUrl;\n this.#enclaveOrigin = new URL(options.enclaveUrl).origin;\n }\n\n #setupMessageListener(): void {\n if (this.#messageListenerInitialized) {\n return;\n }\n\n this.#messageListener = (event: MessageEvent) => {\n if (event.origin !== this.#enclaveOrigin) return;\n\n if (event.data?.type === \"facesign_ready\") {\n this.#hasKey = !!event.data.hasKey;\n this.#resolveOpenEnclave?.();\n }\n\n if (event.data?.type === \"sign_proposal_response\") {\n const payload = event.data.data;\n if (!payload) return;\n\n if (payload.signature) {\n this.#resolveSignMessage?.(new Uint8Array(payload.signature));\n } else {\n this.#rejectSignMessage?.(new Error(\"Sign request rejected by user\"));\n }\n }\n\n if (event.data?.type === \"session_proposal_response\") {\n const payload = event.data.data;\n if (!payload) return;\n\n if (payload.approved && payload.address) {\n this.#resolveSessionProposal?.({ address: payload.address });\n } else {\n this.#rejectSessionProposal?.(new Error(\"Session request rejected by user\"));\n }\n }\n\n if (event.data?.type === \"address_response\") {\n const payload = event.data.data;\n this.#resolveAddressRequest?.(payload?.address ?? null);\n }\n\n if (event.data?.type === \"reset_complete\") {\n if (event.data.data?.ok) {\n this.#resolveReset?.();\n } else {\n this.#rejectReset?.(new Error(\"FaceSign enclave failed to delete its key\"));\n }\n }\n };\n\n window.addEventListener(\"message\", this.#messageListener);\n this.#messageListenerInitialized = true;\n }\n\n async preload(): Promise<{ hasKey: boolean }> {\n this.#setupMessageListener();\n await this.#ensureEnclave();\n return { hasKey: this.#hasKey ?? false };\n }\n\n async init(): Promise<string> {\n this.#setupMessageListener();\n\n const sessionProposal = await this.#sessionProposal();\n\n this.publicKey = sessionProposal.address;\n this.publicAddress = sessionProposal.address;\n\n return sessionProposal.address;\n }\n\n async getAddress(): Promise<string | null> {\n this.#setupMessageListener();\n await this.#ensureEnclave();\n\n if (!this.#hasKey) return null;\n\n return new Promise<string | null>((resolve) => {\n const timer = setTimeout(() => resolve(null), PROPOSAL_TIMEOUT_MS);\n\n this.#resolveAddressRequest = (address) => {\n clearTimeout(timer);\n this.#resolveAddressRequest = null;\n if (address) {\n this.publicKey = address;\n this.publicAddress = address;\n }\n resolve(address);\n };\n\n this.#iframe?.contentWindow?.postMessage(\n { type: \"address_request\", data: { id: ++this.#proposalId } },\n this.#enclaveUrl,\n );\n });\n }\n\n get signer(): this {\n return this;\n }\n\n async signMessage(message: Uint8Array | string): Promise<Uint8Array> {\n await this.#ensureEnclave();\n this.#showEnclave();\n\n const messageToSign = typeof message === \"string\" ? new TextEncoder().encode(message) : message;\n\n try {\n return await new Promise<Uint8Array>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"FaceSign sign request timed out\"));\n }, PROPOSAL_TIMEOUT_MS);\n\n this.#resolveSignMessage = (sig) => {\n clearTimeout(timer);\n resolve(sig);\n };\n this.#rejectSignMessage = (err) => {\n clearTimeout(timer);\n reject(err);\n };\n\n setTimeout(() => {\n this.#iframe?.contentWindow?.postMessage(\n {\n type: \"sign_proposal\",\n data: {\n id: ++this.#proposalId,\n data: messageToSign,\n metadata: this.#metadata,\n },\n },\n this.#enclaveUrl,\n );\n }, POST_MESSAGE_DELAY_MS);\n });\n } finally {\n this.#resolveSignMessage = null;\n this.#rejectSignMessage = null;\n this.#hideEnclave();\n }\n }\n\n async #sessionProposal(): Promise<SessionResponse> {\n await this.#ensureEnclave();\n this.#showEnclave();\n\n try {\n return await new Promise<SessionResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"FaceSign session proposal timed out\"));\n }, PROPOSAL_TIMEOUT_MS);\n\n this.#resolveSessionProposal = (res) => {\n clearTimeout(timer);\n resolve(res);\n };\n this.#rejectSessionProposal = (err) => {\n clearTimeout(timer);\n reject(err);\n };\n\n setTimeout(() => {\n this.#iframe?.contentWindow?.postMessage(\n {\n type: \"session_proposal\",\n data: {\n id: ++this.#proposalId,\n metadata: this.#metadata,\n },\n },\n this.#enclaveUrl,\n );\n }, POST_MESSAGE_DELAY_MS);\n });\n } finally {\n this.#resolveSessionProposal = null;\n this.#rejectSessionProposal = null;\n this.#hideEnclave();\n }\n }\n\n async reset(): Promise<void> {\n this.#setupMessageListener();\n const deadline = Date.now() + RESET_TIMEOUT_MS;\n\n try {\n await this.#ensureEnclave(deadline - Date.now());\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => {\n reject(new Error(\"FaceSign reset timed out\"));\n },\n Math.max(deadline - Date.now(), 0),\n );\n\n this.#resolveReset = () => {\n clearTimeout(timer);\n this.#resolveReset = null;\n this.#rejectReset = null;\n resolve();\n };\n this.#rejectReset = (error) => {\n clearTimeout(timer);\n this.#resolveReset = null;\n this.#rejectReset = null;\n reject(error);\n };\n\n this.#iframe?.contentWindow?.postMessage(\n { type: \"reset\", data: { id: ++this.#proposalId } },\n this.#enclaveOrigin,\n );\n });\n } finally {\n this.destroy();\n }\n }\n\n hide(): void {\n this.#cancelPendingProposals();\n this.#hideEnclave();\n }\n\n #cancelPendingProposals(): void {\n const cancelError = new Error(\"FaceSign operation cancelled\");\n\n if (this.#rejectSignMessage) {\n this.#rejectSignMessage(cancelError);\n this.#resolveSignMessage = null;\n this.#rejectSignMessage = null;\n }\n\n if (this.#rejectSessionProposal) {\n this.#rejectSessionProposal(cancelError);\n this.#resolveSessionProposal = null;\n this.#rejectSessionProposal = null;\n }\n }\n\n destroy(): void {\n this.#cancelPendingProposals();\n if (this.#messageListener) {\n window.removeEventListener(\"message\", this.#messageListener);\n this.#messageListener = null;\n }\n this.#destroyEnclave();\n }\n\n #createContainer(): HTMLDialogElement {\n const container = document.createElement(\"dialog\");\n Object.assign(container.style, {\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n margin: \"0\",\n padding: \"0\",\n border: \"none\",\n zIndex: \"99999\",\n background: \"#0a0a0a\",\n });\n document.body.appendChild(container);\n return container;\n }\n\n #ensureEnclave(timeoutMs = PROPOSAL_TIMEOUT_MS): Promise<void> {\n if (this.#iframe?.contentWindow) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"FaceSign enclave failed to load\"));\n }, timeoutMs);\n\n if (!this.#container) {\n this.#container = this.#createContainer();\n }\n\n this.#iframe = document.createElement(\"iframe\");\n this.#iframe.src = this.#enclaveUrl;\n this.#iframe.title = \"FaceSign Enclave\";\n this.#iframe.allow = \"camera; fullscreen\";\n this.#iframe.style.cssText = \"width:100%;height:100%;border:none;\";\n\n this.#container.appendChild(this.#iframe);\n\n this.#resolveOpenEnclave = () => {\n console.log(\"resolveOpenEnclave\");\n clearTimeout(timer);\n resolve();\n };\n });\n }\n\n #showEnclave(): void {\n const el = this.#container;\n\n if (el && !el.open) {\n el.showModal();\n }\n }\n\n #hideEnclave(): void {\n const el = this.#container;\n if (el?.open) {\n el.close();\n }\n }\n\n #destroyEnclave(): void {\n if (this.#iframe) {\n this.#iframe.remove();\n this.#iframe = null;\n }\n if (this.#container) {\n this.#container.remove();\n this.#container = null;\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Bqz6trCk.d.mts","names":[],"sources":["../src/wait-for-kwil-tx.ts","../src/create-kwil-client.ts","../src/mm-token/create-mm-token-kwil-signer.ts","../src/create-kgw-authenticated-fetch.ts","../src/create-kwil-signer.ts","../src/near/create-near-wallet-kwil-signer.ts","../src/actions/actions.ts","../src/actions/index.ts"],"mappings":"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"}