@vlayer/sdk 0.1.0-nightly-20241105-90d39b6 → 0.1.0-nightly-20241106-04bef04
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/lib/client.js +15 -4
- package/dist/api/lib/client.test.d.ts +1 -0
- package/dist/api/lib/client.test.js +87 -0
- package/dist/api/lib/types/webProofProvider.d.ts +2 -1
- package/dist/api/v_call.js +0 -1
- package/dist/api/webProof/providers/extension.js +49 -28
- package/dist/web-proof-commons/types/message.d.ts +14 -3
- package/dist/web-proof-commons/types/message.js +13 -0
- package/package.json +3 -2
package/dist/api/lib/client.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { prove } from "../prover";
|
|
2
2
|
import { createExtensionWebProofProvider } from "../webProof";
|
|
3
3
|
import { decodeFunctionResult } from "viem";
|
|
4
|
+
import { ZkProvingStatus } from "../../web-proof-commons";
|
|
4
5
|
function dropEmptyProofFromArgs(args) {
|
|
5
6
|
if (Array.isArray(args)) {
|
|
6
7
|
return args.slice(1);
|
|
@@ -14,17 +15,27 @@ function generateRandomHash() {
|
|
|
14
15
|
}
|
|
15
16
|
return hash;
|
|
16
17
|
}
|
|
18
|
+
async function getHash() {
|
|
19
|
+
return Promise.resolve(generateRandomHash());
|
|
20
|
+
}
|
|
17
21
|
export const createVlayerClient = ({ url = "http://127.0.0.1:3000", webProofProvider = createExtensionWebProofProvider(), } = {
|
|
18
22
|
url: "http://127.0.0.1:3000",
|
|
19
23
|
webProofProvider: createExtensionWebProofProvider(),
|
|
20
24
|
}) => {
|
|
21
|
-
console.log("createVlayerClient with", url, webProofProvider);
|
|
22
25
|
const resultHashMap = new Map();
|
|
23
26
|
return {
|
|
24
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
25
27
|
prove: async ({ address, functionName, chainId, proverAbi, args }) => {
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
+
webProofProvider.notifyZkProvingStatus(ZkProvingStatus.Proving);
|
|
29
|
+
const result_promise = prove(address, proverAbi, functionName, args, chainId, url)
|
|
30
|
+
.catch((error) => {
|
|
31
|
+
webProofProvider.notifyZkProvingStatus(ZkProvingStatus.Error);
|
|
32
|
+
throw error;
|
|
33
|
+
})
|
|
34
|
+
.then((result) => {
|
|
35
|
+
webProofProvider.notifyZkProvingStatus(ZkProvingStatus.Done);
|
|
36
|
+
return result;
|
|
37
|
+
});
|
|
38
|
+
const hash = await getHash();
|
|
28
39
|
resultHashMap.set(hash, [result_promise, proverAbi, functionName]);
|
|
29
40
|
return { hash };
|
|
30
41
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { describe, expect, it, vi, beforeEach } from "vitest";
|
|
2
|
+
import { createExtensionWebProofProvider } from "../webProof";
|
|
3
|
+
import { createVlayerClient } from "./client";
|
|
4
|
+
import { ZkProvingStatus } from "src/web-proof-commons";
|
|
5
|
+
import createFetchMock from "vitest-fetch-mock";
|
|
6
|
+
const fetchMocker = createFetchMock(vi);
|
|
7
|
+
fetchMocker.enableMocks();
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
global.chrome = {
|
|
10
|
+
runtime: {
|
|
11
|
+
sendMessage: vi.fn(),
|
|
12
|
+
connect: vi.fn().mockImplementation(() => {
|
|
13
|
+
return {
|
|
14
|
+
onMessage: {
|
|
15
|
+
addListener: vi.fn(),
|
|
16
|
+
},
|
|
17
|
+
postMessage: vi.fn(),
|
|
18
|
+
};
|
|
19
|
+
}),
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
describe("Success zk-proving", () => {
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
fetchMocker.mockResponseOnce((req) => {
|
|
26
|
+
if (req.url === "http://127.0.0.1:3000/") {
|
|
27
|
+
return {
|
|
28
|
+
body: JSON.stringify({
|
|
29
|
+
result: {
|
|
30
|
+
proof: {},
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {};
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it("should send message to extension that zkproving started and then that is done", async () => {
|
|
39
|
+
const webProofProvider = createExtensionWebProofProvider();
|
|
40
|
+
const zkProvingSpy = vi.spyOn(webProofProvider, "notifyZkProvingStatus");
|
|
41
|
+
const vlayer = createVlayerClient({ webProofProvider });
|
|
42
|
+
const { hash } = await vlayer.prove({
|
|
43
|
+
address: `0x${"a".repeat(40)}`,
|
|
44
|
+
functionName: "main",
|
|
45
|
+
proverAbi: [],
|
|
46
|
+
args: [],
|
|
47
|
+
chainId: 42,
|
|
48
|
+
});
|
|
49
|
+
await vlayer.waitForProvingResult({ hash });
|
|
50
|
+
expect(zkProvingSpy).toBeCalledTimes(2);
|
|
51
|
+
expect(zkProvingSpy).toHaveBeenNthCalledWith(1, ZkProvingStatus.Proving);
|
|
52
|
+
expect(zkProvingSpy).toHaveBeenNthCalledWith(2, ZkProvingStatus.Done);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("Failed zk-proving", () => {
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
fetchMocker.mockResponseOnce((req) => {
|
|
58
|
+
if (req.url === "http://127.0.0.1:3000/") {
|
|
59
|
+
return {
|
|
60
|
+
status: 500,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {};
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
it("should send message to extension that zkproving started and then that failed ", async () => {
|
|
67
|
+
const webProofProvider = createExtensionWebProofProvider();
|
|
68
|
+
const zkProvingSpy = vi.spyOn(webProofProvider, "notifyZkProvingStatus");
|
|
69
|
+
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
|
+
try {
|
|
78
|
+
await vlayer.waitForProvingResult({ hash });
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.log("Error waiting for proving result", e);
|
|
82
|
+
}
|
|
83
|
+
expect(zkProvingSpy).toBeCalledTimes(2);
|
|
84
|
+
expect(zkProvingSpy).toHaveBeenNthCalledWith(1, ZkProvingStatus.Proving);
|
|
85
|
+
expect(zkProvingSpy).toHaveBeenNthCalledWith(2, ZkProvingStatus.Error);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hex, Abi, ContractFunctionName } from "viem";
|
|
2
2
|
import type { ContractFunctionArgsWithout } from "./viem";
|
|
3
|
-
import { Branded, WebProof, WebProofStep } from "../../../web-proof-commons";
|
|
3
|
+
import { Branded, WebProof, WebProofStep, ZkProvingStatus } from "../../../web-proof-commons";
|
|
4
4
|
export type WebProofSetupInput = {
|
|
5
5
|
logoUrl: string;
|
|
6
6
|
steps: WebProofStep[];
|
|
@@ -22,6 +22,7 @@ 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
|
+
notifyZkProvingStatus: (status: ZkProvingStatus) => void;
|
|
25
26
|
};
|
|
26
27
|
export type WebProofProviderSetup = {
|
|
27
28
|
notaryUrl?: string;
|
package/dist/api/v_call.js
CHANGED
|
@@ -16,7 +16,6 @@ export async function v_call(call, context, url = "http://127.0.0.1:3000") {
|
|
|
16
16
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
17
17
|
}
|
|
18
18
|
const response_json = await response.json();
|
|
19
|
-
//TODO we should launch some schema validation here
|
|
20
19
|
assertObject(response_json);
|
|
21
20
|
if ("error" in response_json) {
|
|
22
21
|
throw new Error(`Error response: ${response_json.error.message || "unknown error"}`);
|
|
@@ -1,32 +1,53 @@
|
|
|
1
|
+
import { ExtensionMessageType, } from "../../../web-proof-commons";
|
|
1
2
|
// this id is fixed in the extension by the key in manifest.json
|
|
2
3
|
const EXTENSION_ID = "jbchhcgphfokabmfacnkafoeeeppjmpl";
|
|
3
|
-
|
|
4
|
-
notaryUrl
|
|
5
|
-
wsProxyUrl
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
steps: webProofSetup.steps,
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
const port = chrome.runtime.connect(EXTENSION_ID);
|
|
20
|
-
// TODO: validate message in runtime
|
|
21
|
-
port.onMessage.addListener((message) => {
|
|
22
|
-
if (message.type === "ProofDone" /* ExtensionMessageType.ProofDone */) {
|
|
23
|
-
resolve(message.proof);
|
|
24
|
-
}
|
|
25
|
-
if (message.type === "ProofError" /* ExtensionMessageType.ProofError */) {
|
|
26
|
-
reject(new Error(message.error));
|
|
27
|
-
}
|
|
28
|
-
});
|
|
4
|
+
class ExtensionWebProofProvider {
|
|
5
|
+
notaryUrl;
|
|
6
|
+
wsProxyUrl;
|
|
7
|
+
port = null;
|
|
8
|
+
constructor(notaryUrl, wsProxyUrl) {
|
|
9
|
+
this.notaryUrl = notaryUrl;
|
|
10
|
+
this.wsProxyUrl = wsProxyUrl;
|
|
11
|
+
}
|
|
12
|
+
notifyZkProvingStatus(status) {
|
|
13
|
+
if (typeof chrome !== "undefined") {
|
|
14
|
+
this.connectToExtension().postMessage({
|
|
15
|
+
action: 1 /* ExtensionAction.NotifyZkProvingStatus */,
|
|
16
|
+
payload: { status },
|
|
29
17
|
});
|
|
30
|
-
}
|
|
31
|
-
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log("Run out of chrome context");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
connectToExtension() {
|
|
24
|
+
if (!this.port) {
|
|
25
|
+
this.port = chrome.runtime.connect(EXTENSION_ID);
|
|
26
|
+
}
|
|
27
|
+
return this.port;
|
|
28
|
+
}
|
|
29
|
+
async getWebProof(webProofSetup) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
chrome.runtime.sendMessage(EXTENSION_ID, {
|
|
32
|
+
action: 0 /* ExtensionAction.RequestWebProof */,
|
|
33
|
+
payload: {
|
|
34
|
+
notaryUrl: this.notaryUrl,
|
|
35
|
+
wsProxyUrl: this.wsProxyUrl,
|
|
36
|
+
logoUrl: webProofSetup.logoUrl,
|
|
37
|
+
steps: webProofSetup.steps,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
this.connectToExtension().onMessage.addListener((message) => {
|
|
41
|
+
if (message.type === ExtensionMessageType.ProofDone) {
|
|
42
|
+
resolve(message.proof);
|
|
43
|
+
}
|
|
44
|
+
if (message.type === ExtensionMessageType.ProofError) {
|
|
45
|
+
reject(new Error(message.error));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const createExtensionWebProofProvider = ({ notaryUrl = "https://notary.pse.dev/v0.1.0-alpha.5/", wsProxyUrl = "wss://notary.pse.dev/proxy", } = {}) => {
|
|
52
|
+
return new ExtensionWebProofProvider(notaryUrl, wsProxyUrl);
|
|
32
53
|
};
|
|
@@ -7,13 +7,24 @@ 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
|
|
10
|
+
RequestWebProof = 0,
|
|
11
|
+
NotifyZkProvingStatus = 1
|
|
12
|
+
}
|
|
13
|
+
export declare enum ZkProvingStatus {
|
|
14
|
+
Proving = "proving",
|
|
15
|
+
Done = "done",
|
|
16
|
+
Error = "error"
|
|
11
17
|
}
|
|
12
18
|
export type MessageToExtension = {
|
|
13
|
-
action: ExtensionAction;
|
|
19
|
+
action: ExtensionAction.RequestWebProof;
|
|
14
20
|
payload: WebProverSessionConfig;
|
|
21
|
+
} | {
|
|
22
|
+
action: ExtensionAction.NotifyZkProvingStatus;
|
|
23
|
+
payload: {
|
|
24
|
+
status: ZkProvingStatus;
|
|
25
|
+
};
|
|
15
26
|
};
|
|
16
|
-
export declare
|
|
27
|
+
export declare enum ExtensionMessageType {
|
|
17
28
|
ProofDone = "ProofDone",
|
|
18
29
|
ProofError = "ProofError",
|
|
19
30
|
RedirectBack = "RedirectBack",
|
|
@@ -3,3 +3,16 @@ export const EXTENSION_STEP = {
|
|
|
3
3
|
startPage: "startPage",
|
|
4
4
|
notarize: "notarize",
|
|
5
5
|
};
|
|
6
|
+
export var ZkProvingStatus;
|
|
7
|
+
(function (ZkProvingStatus) {
|
|
8
|
+
ZkProvingStatus["Proving"] = "proving";
|
|
9
|
+
ZkProvingStatus["Done"] = "done";
|
|
10
|
+
ZkProvingStatus["Error"] = "error";
|
|
11
|
+
})(ZkProvingStatus || (ZkProvingStatus = {}));
|
|
12
|
+
export var ExtensionMessageType;
|
|
13
|
+
(function (ExtensionMessageType) {
|
|
14
|
+
ExtensionMessageType["ProofDone"] = "ProofDone";
|
|
15
|
+
ExtensionMessageType["ProofError"] = "ProofError";
|
|
16
|
+
ExtensionMessageType["RedirectBack"] = "RedirectBack";
|
|
17
|
+
ExtensionMessageType["TabOpened"] = "TabOpened";
|
|
18
|
+
})(ExtensionMessageType || (ExtensionMessageType = {}));
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"types": "./dist/api/webProof/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"version": "0.1.0-nightly-
|
|
14
|
+
"version": "0.1.0-nightly-20241106-04bef04",
|
|
15
15
|
"scripts": {
|
|
16
16
|
"build": "bun tsc",
|
|
17
17
|
"test:unit": "vitest --run",
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"@changesets/cli": "^2.27.7",
|
|
23
23
|
"@types/bun": "latest",
|
|
24
24
|
"abitype": "^1.0.6",
|
|
25
|
-
"vitest": "^2.1.1"
|
|
25
|
+
"vitest": "^2.1.1",
|
|
26
|
+
"vitest-fetch-mock": "^0.4.1"
|
|
26
27
|
},
|
|
27
28
|
"peerDependencies": {
|
|
28
29
|
"typescript": "^5.6.3"
|