@vlayer/sdk 0.1.0-nightly-20241120-8c3f7ae → 0.1.0-nightly-20241122-7018b34

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,15 +8,9 @@ function dropEmptyProofFromArgs(args) {
8
8
  }
9
9
  return [];
10
10
  }
11
- function generateRandomHash() {
12
- let hash = "0x";
13
- for (let i = 0; i < 40; ++i) {
14
- hash += Math.floor(Math.random() * 16).toString(16);
15
- }
16
- return hash;
17
- }
18
- async function getHash() {
19
- return Promise.resolve(generateRandomHash());
11
+ async function getHash(vcall_response) {
12
+ const result = await vcall_response;
13
+ return [result.result.hash, result];
20
14
  }
21
15
  export const createVlayerClient = ({ url = "http://127.0.0.1:3000", webProofProvider = createExtensionWebProofProvider(), } = {
22
16
  url: "http://127.0.0.1:3000",
@@ -26,7 +20,7 @@ export const createVlayerClient = ({ url = "http://127.0.0.1:3000", webProofProv
26
20
  return {
27
21
  prove: async ({ address, functionName, chainId, proverAbi, args }) => {
28
22
  webProofProvider.notifyZkProvingStatus(ZkProvingStatus.Proving);
29
- const result_promise = prove(address, proverAbi, functionName, args, chainId, url)
23
+ const response = prove(address, proverAbi, functionName, args, chainId, url)
30
24
  .catch((error) => {
31
25
  webProofProvider.notifyZkProvingStatus(ZkProvingStatus.Error);
32
26
  throw error;
@@ -35,8 +29,12 @@ export const createVlayerClient = ({ url = "http://127.0.0.1:3000", webProofProv
35
29
  webProofProvider.notifyZkProvingStatus(ZkProvingStatus.Done);
36
30
  return result;
37
31
  });
38
- const hash = await getHash();
39
- resultHashMap.set(hash, [result_promise, proverAbi, functionName]);
32
+ const [hash, result_promise] = await getHash(response);
33
+ resultHashMap.set(hash, [
34
+ Promise.resolve(result_promise),
35
+ proverAbi,
36
+ functionName,
37
+ ]);
40
38
  return { hash };
41
39
  },
42
40
  waitForProvingResult: async ({ hash, }) => {
@@ -20,6 +20,13 @@ beforeEach(() => {
20
20
  },
21
21
  };
22
22
  });
23
+ function generateRandomHash() {
24
+ let hash = "0x";
25
+ for (let i = 0; i < 40; ++i) {
26
+ hash += Math.floor(Math.random() * 16).toString(16);
27
+ }
28
+ return hash;
29
+ }
23
30
  describe("Success zk-proving", () => {
24
31
  beforeEach(() => {
25
32
  fetchMocker.mockResponseOnce((req) => {
@@ -27,6 +34,7 @@ describe("Success zk-proving", () => {
27
34
  return {
28
35
  body: JSON.stringify({
29
36
  result: {
37
+ hash: generateRandomHash(),
30
38
  proof: {},
31
39
  },
32
40
  }),
@@ -67,14 +75,14 @@ describe("Failed zk-proving", () => {
67
75
  const webProofProvider = createExtensionWebProofProvider();
68
76
  const zkProvingSpy = vi.spyOn(webProofProvider, "notifyZkProvingStatus");
69
77
  const vlayer = createVlayerClient({ webProofProvider });
70
- const hash = await vlayer.prove({
71
- address: `0x${"a".repeat(40)}`,
72
- functionName: "main",
73
- proverAbi: [],
74
- args: [],
75
- chainId: 42,
76
- });
77
78
  try {
79
+ const hash = await vlayer.prove({
80
+ address: `0x${"a".repeat(40)}`,
81
+ functionName: "main",
82
+ proverAbi: [],
83
+ args: [],
84
+ chainId: 42,
85
+ });
78
86
  await vlayer.waitForProvingResult(hash);
79
87
  }
80
88
  catch (e) {
@@ -0,0 +1,6 @@
1
+ export declare class VersionError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function parseVCallResponseError({ message, }: {
5
+ message: string | undefined;
6
+ }): Error;
@@ -0,0 +1,14 @@
1
+ export class VersionError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "VersionError";
5
+ }
6
+ }
7
+ export function parseVCallResponseError({ message, }) {
8
+ if (message?.startsWith("Unsupported CallGuestID")) {
9
+ return new VersionError(`${message}
10
+ vlayer uses the daily release cycle, and SDK version must match the proving server version.
11
+ Please run "vlayer update" to update the SDK to the latest version.`);
12
+ }
13
+ return new Error(`Error response: ${message ?? "unknown error"}`);
14
+ }
@@ -27,6 +27,7 @@ export type Proof = {
27
27
  };
28
28
  };
29
29
  export interface VCallResult {
30
+ hash: Hex;
30
31
  evm_call_result: Hex;
31
32
  proof: Proof;
32
33
  }
@@ -1,6 +1,6 @@
1
1
  import { Hex, Abi, ContractFunctionName } from "viem";
2
2
  import type { ContractFunctionArgsWithout } from "./viem.js";
3
- import { Branded, WebProof, WebProofStep, ZkProvingStatus } from "../../../web-proof-commons/index.js";
3
+ import { Branded, ExtensionMessageType, ExtensionMessage, WebProof, WebProofStep, ZkProvingStatus } from "../../../web-proof-commons/index.js";
4
4
  export type WebProofSetupInput = {
5
5
  logoUrl: string;
6
6
  steps: WebProofStep[];
@@ -22,7 +22,11 @@ export type GetWebProofArgs<T extends Abi, F extends ContractFunctionName<T>> =
22
22
  } & WebProofSetupInput;
23
23
  export type WebProofProvider = {
24
24
  getWebProof: <T extends Abi, F extends ContractFunctionName<T>>(args: GetWebProofArgs<T, F>) => Promise<WebProof>;
25
+ requestWebProof: <T extends Abi, F extends ContractFunctionName<T>>(args: GetWebProofArgs<T, F>) => void;
25
26
  notifyZkProvingStatus: (status: ZkProvingStatus) => void;
27
+ addEventListeners: <T extends ExtensionMessageType>(messageType: T, listener: (args: Extract<ExtensionMessage, {
28
+ type: T;
29
+ }>) => void) => void;
26
30
  };
27
31
  export type WebProofProviderSetup = {
28
32
  notaryUrl?: string;
@@ -1,3 +1,4 @@
1
+ import { parseVCallResponseError } from "./lib/errors.js";
1
2
  function v_callBody(call, context) {
2
3
  return {
3
4
  method: "v_call",
@@ -20,7 +21,7 @@ export async function v_call(call, context, url = "http://127.0.0.1:3000") {
20
21
  console.log("response_json", response_json);
21
22
  assertObject(response_json);
22
23
  if ("error" in response_json) {
23
- throw new Error(`Error response: ${response_json.error.message || "unknown error"}`);
24
+ throw parseVCallResponseError(response_json.error);
24
25
  }
25
26
  return response_json;
26
27
  }
@@ -1,10 +1,10 @@
1
1
  import { ExtensionMessageType, } from "../../../web-proof-commons/index.js";
2
- // this id is fixed in the extension by the key in manifest.json
3
2
  const EXTENSION_ID = "jbchhcgphfokabmfacnkafoeeeppjmpl";
4
3
  class ExtensionWebProofProvider {
5
4
  notaryUrl;
6
5
  wsProxyUrl;
7
6
  port = null;
7
+ listeners = {};
8
8
  constructor(notaryUrl, wsProxyUrl) {
9
9
  this.notaryUrl = notaryUrl;
10
10
  this.wsProxyUrl = wsProxyUrl;
@@ -12,7 +12,7 @@ class ExtensionWebProofProvider {
12
12
  notifyZkProvingStatus(status) {
13
13
  if (typeof chrome !== "undefined") {
14
14
  chrome.runtime.sendMessage(EXTENSION_ID, {
15
- action: 1 /* ExtensionAction.NotifyZkProvingStatus */,
15
+ action: "NotifyZkProvingStatus" /* ExtensionAction.NotifyZkProvingStatus */,
16
16
  payload: { status },
17
17
  });
18
18
  }
@@ -20,13 +20,43 @@ class ExtensionWebProofProvider {
20
20
  connectToExtension() {
21
21
  if (!this.port) {
22
22
  this.port = chrome.runtime.connect(EXTENSION_ID);
23
+ this.port.onMessage.addListener((message) => {
24
+ if (message.type === ExtensionMessageType.ProofDone) {
25
+ this.listeners[ExtensionMessageType.ProofDone]?.forEach((cb) => {
26
+ cb(message);
27
+ });
28
+ }
29
+ if (message.type === ExtensionMessageType.ProofError) {
30
+ this.listeners[ExtensionMessageType.ProofError]?.forEach((cb) => {
31
+ cb(message);
32
+ });
33
+ }
34
+ });
23
35
  }
24
36
  return this.port;
25
37
  }
38
+ addEventListeners(messageType, listener) {
39
+ this.connectToExtension();
40
+ if (!this.listeners[messageType]) {
41
+ this.listeners[messageType] = [];
42
+ }
43
+ this.listeners[messageType].push(listener);
44
+ }
45
+ requestWebProof(webProofSetup) {
46
+ this.connectToExtension().postMessage({
47
+ action: "RequestWebProof" /* ExtensionAction.RequestWebProof */,
48
+ payload: {
49
+ notaryUrl: this.notaryUrl,
50
+ wsProxyUrl: this.wsProxyUrl,
51
+ logoUrl: webProofSetup.logoUrl,
52
+ steps: webProofSetup.steps,
53
+ },
54
+ });
55
+ }
26
56
  async getWebProof(webProofSetup) {
27
57
  return new Promise((resolve, reject) => {
28
58
  chrome.runtime.sendMessage(EXTENSION_ID, {
29
- action: 0 /* ExtensionAction.RequestWebProof */,
59
+ action: "RequestWebProof" /* ExtensionAction.RequestWebProof */,
30
60
  payload: {
31
61
  notaryUrl: this.notaryUrl,
32
62
  wsProxyUrl: this.wsProxyUrl,
@@ -36,10 +66,10 @@ class ExtensionWebProofProvider {
36
66
  });
37
67
  this.connectToExtension().onMessage.addListener((message) => {
38
68
  if (message.type === ExtensionMessageType.ProofDone) {
39
- resolve(message.proof);
69
+ resolve(message.payload.proof);
40
70
  }
41
71
  if (message.type === ExtensionMessageType.ProofError) {
42
- reject(new Error(message.error));
72
+ reject(new Error(message.payload.error));
43
73
  }
44
74
  });
45
75
  });
@@ -2,8 +2,8 @@ import { expectUrl } from "./expectUrl.js";
2
2
  import { startPage } from "./startPage.js";
3
3
  import { notarize } from "./notarize.js";
4
4
  declare const steps: {
5
- expectUrl: (url: string, label: string) => import("../../../web-proof-commons/index.js").WebProofStepExpectUrl;
6
- startPage: (url: string, label: string) => import("../../../web-proof-commons/index.js").WebProofStepStartPage;
7
- notarize: (url: string, method: string | undefined, label: string) => import("../../../web-proof-commons/index.js").WebProofStepNotarize;
5
+ expectUrl: (url: string, label: string) => import("../../../index.js").WebProofStepExpectUrl;
6
+ startPage: (url: string, label: string) => import("../../../index.js").WebProofStepStartPage;
7
+ notarize: (url: string, method: string | undefined, label: string) => import("../../../index.js").WebProofStepNotarize;
8
8
  };
9
9
  export { expectUrl, startPage, notarize, steps };
@@ -2,7 +2,7 @@ import { type Chain, type CustomTransport, custom } from "viem";
2
2
  import { Config } from "./getConfig.js";
3
3
  export declare const customTransport: typeof custom;
4
4
  export { Chain };
5
- export declare const createContext: (config: Config, transport?: CustomTransport) => Promise<{
5
+ export declare const createContext: (config: Config, transport?: CustomTransport) => {
6
6
  chain: Chain;
7
7
  account: {
8
8
  address: import("viem").Address;
@@ -4952,4 +4952,4 @@ export declare const createContext: (config: Config, transport?: CustomTransport
4952
4952
  chainName: string;
4953
4953
  proverUrl: string;
4954
4954
  privateKey: `0x${string}`;
4955
- }>;
4955
+ };
@@ -1,9 +1,9 @@
1
1
  import { createWalletClient, http, publicActions, custom, } from "viem";
2
2
  import { privateKeyToAccount } from "viem/accounts";
3
3
  import { getChainConfirmations } from "./getChainConfirmations.js";
4
- const getChainSpecs = async (chainName) => {
4
+ import * as chains from "viem/chains";
5
+ const getChainSpecs = (chainName) => {
5
6
  try {
6
- const chains = await import("viem/chains");
7
7
  return chains[chainName];
8
8
  }
9
9
  catch {
@@ -15,8 +15,8 @@ const createEthClient = (chain, jsonRpcUrl, transport) => createWalletClient({
15
15
  chain,
16
16
  transport: transport || http(jsonRpcUrl),
17
17
  }).extend(publicActions);
18
- export const createContext = async (config, transport) => {
19
- const chain = await getChainSpecs(config.chainName);
18
+ export const createContext = (config, transport) => {
19
+ const chain = getChainSpecs(config.chainName);
20
20
  const jsonRpcUrl = config.jsonRpcUrl ?? chain.rpcUrls.default.http[0];
21
21
  return {
22
22
  ...config,
@@ -2,7 +2,7 @@ import { getConfig } from "./getConfig.js";
2
2
  import { createContext } from "./createContext.js";
3
3
  import { getChainConfirmations } from "./getChainConfirmations.js";
4
4
  export const waitForContractDeploy = async ({ hash, }) => {
5
- const { ethClient: client } = await createContext(getConfig());
5
+ const { ethClient: client } = createContext(getConfig());
6
6
  const receipt = await client.waitForTransactionReceipt({
7
7
  hash,
8
8
  confirmations: getChainConfirmations(client.chain?.name),
@@ -15,7 +15,7 @@ export const waitForContractDeploy = async ({ hash, }) => {
15
15
  return receipt.contractAddress;
16
16
  };
17
17
  export const waitForTransactionReceipt = async ({ hash, }) => {
18
- const { ethClient } = await createContext(getConfig());
18
+ const { ethClient } = createContext(getConfig());
19
19
  return ethClient.waitForTransactionReceipt({
20
20
  hash,
21
21
  confirmations: getChainConfirmations(ethClient.chain?.name),
@@ -26,7 +26,7 @@ export const waitForTransactionReceipt = async ({ hash, }) => {
26
26
  export const deployVlayerContracts = async ({ proverSpec, verifierSpec, proverArgs, verifierArgs, }) => {
27
27
  console.log("Starting contract deployment process...");
28
28
  const config = getConfig();
29
- const { chain, ethClient, account } = await createContext(config);
29
+ const { chain, ethClient, account } = createContext(config);
30
30
  console.log("Deploying prover contract...");
31
31
  const proverHash = await ethClient.deployContract({
32
32
  chain,
package/dist/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export { createVlayerClient } from "./api/lib/client.js";
4
4
  export * from "./api/lib/types/index.js";
5
5
  export * from "./web-proof-commons/types/webProof.js";
6
6
  export * from "./web-proof-commons/utils.js";
7
+ export * from "./web-proof-commons/types/message.js";
package/dist/index.js CHANGED
@@ -4,3 +4,4 @@ export { createVlayerClient } from "./api/lib/client.js";
4
4
  export * from "./api/lib/types/index.js";
5
5
  export * from "./web-proof-commons/types/webProof.js";
6
6
  export * from "./web-proof-commons/utils.js";
7
+ export * from "./web-proof-commons/types/message.js";
@@ -7,8 +7,8 @@ export declare const EXTENSION_STEP: {
7
7
  };
8
8
  export type ExtensionStep = (typeof EXTENSION_STEP)[keyof typeof EXTENSION_STEP];
9
9
  export declare const enum ExtensionAction {
10
- RequestWebProof = 0,
11
- NotifyZkProvingStatus = 1
10
+ RequestWebProof = "RequestWebProof",
11
+ NotifyZkProvingStatus = "NotifyZkProvingStatus"
12
12
  }
13
13
  export declare enum ZkProvingStatus {
14
14
  NotStarted = "NotStarted",
@@ -29,19 +29,31 @@ export declare enum ExtensionMessageType {
29
29
  ProofDone = "ProofDone",
30
30
  ProofError = "ProofError",
31
31
  RedirectBack = "RedirectBack",
32
- TabOpened = "TabOpened"
32
+ TabOpened = "TabOpened",
33
+ ProofProcessing = "ProofProcessing"
33
34
  }
34
35
  export type ExtensionMessage = {
35
36
  type: ExtensionMessageType.ProofDone;
36
- proof: WebProof;
37
+ payload: {
38
+ proof: WebProof;
39
+ };
37
40
  } | {
38
41
  type: ExtensionMessageType.ProofError;
39
- error: string;
42
+ payload: {
43
+ error: string;
44
+ };
40
45
  } | {
41
46
  type: ExtensionMessageType.RedirectBack;
42
47
  } | {
43
48
  type: ExtensionMessageType.TabOpened;
44
- tabId: number;
49
+ payload: {
50
+ tabId: number;
51
+ };
52
+ } | {
53
+ type: ExtensionMessageType.ProofProcessing;
54
+ payload: {
55
+ progress?: number;
56
+ };
45
57
  };
46
58
  export type WebProverSessionConfig = {
47
59
  notaryUrl: string | null;
@@ -16,4 +16,5 @@ export var ExtensionMessageType;
16
16
  ExtensionMessageType["ProofError"] = "ProofError";
17
17
  ExtensionMessageType["RedirectBack"] = "RedirectBack";
18
18
  ExtensionMessageType["TabOpened"] = "TabOpened";
19
+ ExtensionMessageType["ProofProcessing"] = "ProofProcessing";
19
20
  })(ExtensionMessageType || (ExtensionMessageType = {}));
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "types": "./dist/config/index.d.ts"
16
16
  }
17
17
  },
18
- "version": "0.1.0-nightly-20241120-8c3f7ae",
18
+ "version": "0.1.0-nightly-20241122-7018b34",
19
19
  "scripts": {
20
20
  "build": "bun tsc && bun tsc-alias",
21
21
  "test:unit": "vitest --run",