@idos-network/kwil-infra 4.0.0 → 5.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.
@@ -1,72 +1,7 @@
1
- import { base64UrlEncode, utf8Encode } from "@idos-network/utils/codecs";
2
- import { MemoryStore } from "@idos-network/utils/store";
3
1
  import nacl from "tweetnacl";
4
- import { describe, expect, it, vi } from "vitest";
2
+ import { describe, expect, it } from "vitest";
5
3
 
6
- import type { KwilActionClient } from "./create-kwil-client";
7
-
8
- import { createClientKwilSigner, createServerKwilSigner } from "./create-kwil-signer";
9
- import { createMmTokenAuth } from "./mm-token/create-mm-token-kwil-signer";
10
-
11
- function mmToken(signingKeyByte: number): string {
12
- return base64UrlEncode(
13
- utf8Encode(
14
- JSON.stringify({
15
- payload: {
16
- signing_public_key: base64UrlEncode(new Uint8Array(32).fill(signingKeyByte)),
17
- storage_id: "storage-abc",
18
- },
19
- signature: base64UrlEncode(new Uint8Array(64).fill(9)),
20
- }),
21
- ),
22
- );
23
- }
24
-
25
- function kwilClientWithLogout(logoutKGW: () => Promise<void>): KwilActionClient {
26
- return { client: { auth: { logoutKGW } } } as unknown as KwilActionClient;
27
- }
28
-
29
- describe("createClientKwilSigner with MM authentication", () => {
30
- it("reports the MM signing identity as address and public key", async () => {
31
- const auth = createMmTokenAuth(mmToken(7));
32
- const logoutKGW = vi.fn(async () => {});
33
-
34
- const [signer, address, publicKey, walletType] = await createClientKwilSigner(
35
- new MemoryStore(),
36
- kwilClientWithLogout(logoutKGW),
37
- auth,
38
- );
39
-
40
- expect(signer).toBe(auth);
41
- expect(walletType).toBe("MM");
42
- expect(address).toBe(base64UrlEncode(auth.identifier));
43
- expect(publicKey).toBe(address);
44
- });
45
-
46
- it("clears the KGW session only when the MM signing identity changes", async () => {
47
- const store = new MemoryStore();
48
- const logoutKGW = vi.fn(async () => {});
49
- const kwilClient = kwilClientWithLogout(logoutKGW);
50
-
51
- await createClientKwilSigner(store, kwilClient, createMmTokenAuth(mmToken(7)));
52
- expect(logoutKGW).toHaveBeenCalledTimes(1);
53
-
54
- // Same identity, freshly issued token: the existing KGW cookie stays valid.
55
- await createClientKwilSigner(store, kwilClient, createMmTokenAuth(mmToken(7)));
56
- expect(logoutKGW).toHaveBeenCalledTimes(1);
57
-
58
- await createClientKwilSigner(store, kwilClient, createMmTokenAuth(mmToken(8)));
59
- expect(logoutKGW).toHaveBeenCalledTimes(2);
60
- });
61
- });
62
-
63
- describe("createServerKwilSigner with MM authentication", () => {
64
- it("uses the MM authentication object as the Kwil signer", async () => {
65
- const auth = createMmTokenAuth(mmToken(7));
66
-
67
- expect(await createServerKwilSigner(auth)).toEqual([auth, base64UrlEncode(auth.identifier)]);
68
- });
69
- });
4
+ import { createServerKwilSigner } from "./create-kwil-signer";
70
5
 
71
6
  describe("createServerKwilSigner with Nacl sign key pair", () => {
72
7
  it("emits lowercase hex SignerAddress matching kwild ed25519 @caller format", async () => {
@@ -6,15 +6,13 @@ import type { KeyPair as NearKeyPair } from "near-api-js";
6
6
  import type { KeyPair as XrpKeyPair } from "ripple-keypairs/src/types";
7
7
 
8
8
  import { KwilSigner } from "@idos-network/kwil-js";
9
- import { base64UrlEncode, bs58Encode, hexDecode, hexEncode } from "@idos-network/utils/codecs";
9
+ import { bs58Encode, hexDecode, hexEncode } from "@idos-network/utils/codecs";
10
10
  import nacl from "tweetnacl";
11
11
 
12
12
  import type { WalletType } from "./actions";
13
13
  import type { KwilActionClient } from "./create-kwil-client";
14
- import type { MmTokenAuth } from "./mm-token/create-mm-token-kwil-signer";
15
14
 
16
15
  import { FaceSignSignerProvider } from "./facesign/facesign-signer";
17
- import { isMmTokenAuth } from "./mm-token/create-mm-token-kwil-signer";
18
16
  import {
19
17
  createNearWalletKwilSigner,
20
18
  implicitAddressFromPublicKey,
@@ -30,7 +28,6 @@ export type Wallet =
30
28
  | JsonRpcSigner
31
29
  | NearWallet
32
30
  | CustomKwilSigner
33
- | MmTokenAuth
34
31
  | FaceSignSignerProvider;
35
32
 
36
33
  /**
@@ -111,8 +108,7 @@ export type KwilSignerType =
111
108
  | nacl.SignKeyPair
112
109
  | JsonRpcSigner
113
110
  | StellarKeypair
114
- | XrpKeyPair
115
- | MmTokenAuth;
111
+ | XrpKeyPair;
116
112
 
117
113
  export type SignerAddress = string;
118
114
  export type SignerPublicKey = string | undefined;
@@ -126,10 +122,6 @@ export type SignerPublicKey = string | undefined;
126
122
  export async function createServerKwilSigner(
127
123
  signer: KwilSignerType,
128
124
  ): Promise<[KwilSigner, SignerAddress]> {
129
- if (isMmTokenAuth(signer)) {
130
- return [signer, base64UrlEncode(signer.identifier)];
131
- }
132
-
133
125
  if (isNaclSignKeyPair(signer)) {
134
126
  return [
135
127
  new KwilSigner(
@@ -247,23 +239,6 @@ export async function createClientKwilSigner(
247
239
  ];
248
240
  }
249
241
 
250
- if (isMmTokenAuth(wallet)) {
251
- const currentAddress = base64UrlEncode(wallet.identifier);
252
- const storedAddress = await store.get<string>("signer-address");
253
-
254
- if (storedAddress !== currentAddress) {
255
- // A different MM signing identity must not re-use the previous KGW cookie.
256
- store.set("signer-address", currentAddress);
257
- try {
258
- await kwilClient.client.auth.logoutKGW();
259
- } catch (error) {
260
- console.log("error logoutKGW", error);
261
- }
262
- }
263
-
264
- return [wallet, currentAddress, currentAddress, "MM"];
265
- }
266
-
267
242
  if (isCustomKwilSigner(wallet) || wallet instanceof FaceSignSignerProvider) {
268
243
  const storedAddress = await store.get<string>("signer-address");
269
244
 
package/src/index.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from "./create-kwil-client";
2
2
  export * from "./create-kgw-authenticated-fetch";
3
3
  export * from "./create-kwil-signer";
4
- export * from "./mm-token/create-mm-token-kwil-signer";
5
4
  export {
6
5
  getNearFullAccessPublicKeys,
7
6
  implicitAddressFromPublicKey,
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Dwonqvwu.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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"}
@@ -1,132 +0,0 @@
1
- import { base64UrlEncode, utf8Encode } from "@idos-network/utils/codecs";
2
- import { describe, expect, it } from "vitest";
3
-
4
- import {
5
- createMmTokenAuth,
6
- isMmTokenAuth,
7
- mmTokenStorageId,
8
- type MmTokenEnvelope,
9
- } from "./create-mm-token-kwil-signer.js";
10
-
11
- const signingPublicKeyBytes = new Uint8Array(Array.from({ length: 32 }, (_, index) => index + 1));
12
- const signatureBytes = new Uint8Array(Array.from({ length: 64 }, (_, index) => index + 64));
13
-
14
- function createEnvelope(overrides: Partial<MmTokenEnvelope> = {}): MmTokenEnvelope {
15
- return {
16
- payload: {
17
- version: 1,
18
- aud: ["metamask:user-storage:ukyc", "idos:kwil"],
19
- signing_public_key: base64UrlEncode(signingPublicKeyBytes),
20
- storage_id: "storage-abc",
21
- },
22
- signature: base64UrlEncode(signatureBytes),
23
- ...overrides,
24
- };
25
- }
26
-
27
- function encodeEnvelope(envelope: MmTokenEnvelope): string {
28
- return base64UrlEncode(utf8Encode(JSON.stringify(envelope)));
29
- }
30
-
31
- async function signMessage(signer: ReturnType<typeof createMmTokenAuth>): Promise<Uint8Array> {
32
- return await (signer.signer as (message: Uint8Array) => Promise<Uint8Array>)(
33
- new Uint8Array([1, 2, 3]),
34
- );
35
- }
36
-
37
- describe("createMmTokenAuth", () => {
38
- it("uses mm_token auth type and decoded signing_public_key bytes as identity", () => {
39
- const signer = createMmTokenAuth(encodeEnvelope(createEnvelope()));
40
-
41
- expect(signer.signatureType).toBe("mm_token");
42
- expect(signer.identifier).toEqual(signingPublicKeyBytes);
43
- });
44
-
45
- it("returns the exact encoded envelope bytes from signMessage", async () => {
46
- const encoded = encodeEnvelope(createEnvelope());
47
- const signer = createMmTokenAuth(encoded);
48
-
49
- expect(await signMessage(signer)).toEqual(utf8Encode(encoded));
50
- });
51
-
52
- it("accepts a decoded envelope object and returns its encoded form", async () => {
53
- const envelope = createEnvelope();
54
- const signer = createMmTokenAuth(envelope);
55
-
56
- expect(await signMessage(signer)).toEqual(utf8Encode(encodeEnvelope(envelope)));
57
- });
58
-
59
- it("rejects raw JSON envelope strings (must be base64url-encoded)", () => {
60
- expect(() => createMmTokenAuth(JSON.stringify(createEnvelope()))).toThrow(
61
- "Invalid mm_token envelope encoding",
62
- );
63
- });
64
-
65
- it("rejects invalid signature length", () => {
66
- expect(() =>
67
- createMmTokenAuth(
68
- encodeEnvelope(createEnvelope({ signature: base64UrlEncode(new Uint8Array(63)) })),
69
- ),
70
- ).toThrow("Invalid mm_token signature length: expected 64, got 63");
71
- });
72
-
73
- it("rejects signing_public_key with the wrong byte length", () => {
74
- expect(() =>
75
- createMmTokenAuth(
76
- encodeEnvelope(
77
- createEnvelope({
78
- payload: {
79
- version: 1,
80
- signing_public_key: base64UrlEncode(new Uint8Array(31)),
81
- },
82
- }),
83
- ),
84
- ),
85
- ).toThrow("Invalid mm_token signing_public_key length: expected 32, got 31");
86
- });
87
-
88
- it("carries the exact encoded capability as a non-enumerable access token", () => {
89
- const encoded = encodeEnvelope(createEnvelope());
90
- const auth = createMmTokenAuth(encoded);
91
-
92
- expect(auth.accessToken).toBe(encoded);
93
- expect(isMmTokenAuth(auth)).toBe(true);
94
- // Blob authorization must not leak through logging or serialization.
95
- expect(Object.keys(auth)).not.toContain("accessToken");
96
- expect(JSON.stringify(auth)).not.toContain(encoded);
97
- });
98
-
99
- it("re-encodes a decoded envelope object into the access token", () => {
100
- const envelope = createEnvelope();
101
-
102
- expect(createMmTokenAuth(envelope).accessToken).toBe(encodeEnvelope(envelope));
103
- });
104
-
105
- it("does not recognize a non-MM signer as MM authentication", () => {
106
- expect(isMmTokenAuth({ identifier: "a", signer: () => {}, signatureType: "ed25519" })).toBe(
107
- false,
108
- );
109
- });
110
-
111
- it("keeps the token payload and exposes its storage_id", () => {
112
- const signer = createMmTokenAuth(encodeEnvelope(createEnvelope()));
113
-
114
- expect(signer.mmTokenPayload.storage_id).toBe("storage-abc");
115
- expect(mmTokenStorageId(signer)).toBe("storage-abc");
116
- });
117
-
118
- it("fails when the token payload has no storage_id", () => {
119
- const signer = createMmTokenAuth(
120
- encodeEnvelope(
121
- createEnvelope({
122
- payload: {
123
- version: 1,
124
- signing_public_key: base64UrlEncode(signingPublicKeyBytes),
125
- },
126
- }),
127
- ),
128
- );
129
-
130
- expect(() => mmTokenStorageId(signer)).toThrow("mm_token payload is missing storage_id");
131
- });
132
- });
@@ -1,161 +0,0 @@
1
- import { KwilSigner } from "@idos-network/kwil-js";
2
- import {
3
- base64UrlDecode,
4
- base64UrlEncode,
5
- utf8Decode,
6
- utf8Encode,
7
- } from "@idos-network/utils/codecs";
8
-
9
- const ED25519_PUBLIC_KEY_BYTES = 32;
10
- const ED25519_SIGNATURE_BYTES = 64;
11
-
12
- /** Decoded UKYC capability envelope. KGW signature data is base64url(JSON of this). */
13
- export interface MmTokenEnvelope {
14
- payload: MmTokenPayload | Record<string, unknown>;
15
- signature: string;
16
- }
17
-
18
- export interface MmTokenPayload {
19
- signing_public_key: string;
20
- storage_id?: string;
21
- [key: string]: unknown;
22
- }
23
-
24
- /**
25
- * One MM/UKYC capability, valid both as a KGW `mm_token` signer and as the
26
- * `Authorization: AccessToken …` credential for UKYC blob requests.
27
- */
28
- export type MmTokenAuth = KwilSigner & {
29
- readonly mmTokenPayload: MmTokenPayload | Record<string, unknown>;
30
- /** Exact encoded envelope KGW and UKYC storage verify. Non-enumerable, so it stays out of logs. */
31
- readonly accessToken: string;
32
- /**
33
- * A capability signs its own envelope, never an arbitrary message. Declared so callers
34
- * handling a `Wallet` union can keep asking wallets for a message signature.
35
- */
36
- readonly signMessage?: undefined;
37
- };
38
-
39
- export function isMmTokenAuth(value: unknown): value is MmTokenAuth {
40
- return (
41
- value !== null &&
42
- typeof value === "object" &&
43
- "signatureType" in value &&
44
- value.signatureType === "mm_token" &&
45
- "identifier" in value &&
46
- "signer" in value &&
47
- typeof (value as Partial<MmTokenAuth>).accessToken === "string"
48
- );
49
- }
50
-
51
- /** `storage_id` from the capability token used to construct this signer. */
52
- export function mmTokenStorageId(signer: KwilSigner): string {
53
- const storageId = (signer as Partial<MmTokenAuth>).mmTokenPayload?.storage_id;
54
- if (typeof storageId !== "string" || !storageId.trim()) {
55
- throw new Error("mm_token payload is missing storage_id");
56
- }
57
- return storageId.trim();
58
- }
59
-
60
- function isMmTokenEnvelope(value: unknown): value is MmTokenEnvelope {
61
- return (
62
- value !== null &&
63
- typeof value === "object" &&
64
- "payload" in value &&
65
- value.payload !== null &&
66
- typeof value.payload === "object" &&
67
- !Array.isArray(value.payload) &&
68
- "signature" in value &&
69
- typeof value.signature === "string"
70
- );
71
- }
72
-
73
- function parseJson<T>(bytes: Uint8Array, errorMessage: string): T {
74
- try {
75
- return JSON.parse(utf8Decode(bytes)) as T;
76
- } catch (error) {
77
- throw new Error(errorMessage, { cause: error });
78
- }
79
- }
80
-
81
- function decodeBase64Url(value: string, errorMessage: string): Uint8Array {
82
- try {
83
- return base64UrlDecode(value);
84
- } catch (error) {
85
- throw new Error(errorMessage, { cause: error });
86
- }
87
- }
88
-
89
- /**
90
- * Build the MM authentication object for one UKYC capability.
91
- *
92
- * Pass the MetaMask-issued capability token as a **base64url-encoded** envelope string
93
- * (what KGW verifies). A decoded `{ payload, signature }` object is also accepted and
94
- * will be re-encoded.
95
- *
96
- * `signMessage` always returns the UTF-8 bytes of that encoded string — KGW ignores the
97
- * request message and only verifies the envelope.
98
- */
99
- export function createMmTokenAuth(encodedEnvelope: string | MmTokenEnvelope): MmTokenAuth {
100
- let encodedToken: string;
101
- let envelope: MmTokenEnvelope;
102
-
103
- if (typeof encodedEnvelope === "string") {
104
- const trimmed = encodedEnvelope.trim();
105
- if (!trimmed) {
106
- throw new Error("Invalid mm_token envelope: empty");
107
- }
108
- encodedToken = trimmed;
109
- const envelopeBytes = decodeBase64Url(trimmed, "Invalid mm_token envelope encoding");
110
- const parsed = parseJson<unknown>(envelopeBytes, "Invalid mm_token envelope JSON");
111
- if (!isMmTokenEnvelope(parsed)) {
112
- throw new Error("Invalid mm_token envelope: expected payload object and signature string");
113
- }
114
- envelope = parsed;
115
- } else {
116
- if (!isMmTokenEnvelope(encodedEnvelope)) {
117
- throw new Error("Invalid mm_token envelope: expected payload object and signature string");
118
- }
119
- envelope = encodedEnvelope;
120
- encodedToken = base64UrlEncode(utf8Encode(JSON.stringify(envelope)));
121
- }
122
-
123
- // KGW Verify receives UTF-8 of the base64url string, not the decoded JSON bytes.
124
- const signatureData = utf8Encode(encodedToken);
125
-
126
- const tokenSignatureBytes = decodeBase64Url(
127
- envelope.signature,
128
- "Invalid mm_token envelope signature encoding",
129
- );
130
- if (tokenSignatureBytes.length !== ED25519_SIGNATURE_BYTES) {
131
- throw new Error(
132
- `Invalid mm_token signature length: expected ${ED25519_SIGNATURE_BYTES}, got ${tokenSignatureBytes.length}`,
133
- );
134
- }
135
-
136
- const signingPublicKey = envelope.payload.signing_public_key;
137
- if (typeof signingPublicKey !== "string") {
138
- throw new Error("Invalid mm_token payload: missing signing_public_key");
139
- }
140
-
141
- const signingPublicKeyBytes = decodeBase64Url(
142
- signingPublicKey,
143
- "Invalid mm_token signing_public_key encoding",
144
- );
145
-
146
- if (signingPublicKeyBytes.length !== ED25519_PUBLIC_KEY_BYTES) {
147
- throw new Error(
148
- `Invalid mm_token signing_public_key length: expected ${ED25519_PUBLIC_KEY_BYTES}, got ${signingPublicKeyBytes.length}`,
149
- );
150
- }
151
-
152
- const auth = Object.assign(
153
- new KwilSigner(async () => signatureData.slice(), signingPublicKeyBytes, "mm_token"),
154
- { mmTokenPayload: envelope.payload },
155
- );
156
-
157
- return Object.defineProperty(auth, "accessToken", {
158
- value: encodedToken,
159
- enumerable: false,
160
- }) as MmTokenAuth;
161
- }