Skip to content

Commit 9ff8599

Browse files
committed
feat: add derive address example
1 parent 25c91cd commit 9ff8599

File tree

9 files changed

+182
-11
lines changed

9 files changed

+182
-11
lines changed

sign-as-action/nodejs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"@dotenvx/dotenvx": "^0.44.1",
1212
"@lit-protocol/auth-helpers": "^7.0.4",
1313
"@lit-protocol/constants": "^7.0.4",
14-
"@lit-protocol/contracts-sdk": "^7.0.4",
14+
"@lit-protocol/contracts-sdk": "^7.3.1",
1515
"@lit-protocol/lit-node-client": "^7.0.4",
1616
"ethers": "5.7.2"
1717
},
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import * as ethers from "ethers";
2+
import { LIT_RPC } from "@lit-protocol/constants";
3+
import { LitContracts } from "@lit-protocol/contracts-sdk";
4+
5+
import { getEnv } from "./utils";
6+
7+
const ETHEREUM_PRIVATE_KEY = getEnv("ETHEREUM_PRIVATE_KEY");
8+
9+
export const deriveLitActionWalletAddress = async ({ litActionIpfsCid }: { litActionIpfsCid: string }) => {
10+
const ethersSigner = new ethers.Wallet(
11+
ETHEREUM_PRIVATE_KEY,
12+
new ethers.providers.JsonRpcProvider(LIT_RPC.CHRONICLE_YELLOWSTONE)
13+
);
14+
15+
const contractClient = new LitContracts({ signer: ethersSigner });
16+
await contractClient.connect();
17+
18+
const derivedKeyId = ethers.utils.keccak256(
19+
ethers.utils.toUtf8Bytes(`lit_action_${litActionIpfsCid}`)
20+
);
21+
22+
const derivedPubkey = await contractClient.pubkeyRouterContract.read.getDerivedPubkey(
23+
contractClient.stakingContract.read.address,
24+
derivedKeyId
25+
);
26+
27+
return {
28+
derivedPubkey,
29+
derivedAddress: ethers.utils.computeAddress(derivedPubkey),
30+
}
31+
};

sign-as-action/nodejs/src/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from "./signAsAction";
22
export * from "./verifyActionSignature";
3-
export * from './signAsActionLitAction';
4-
export * from './verifyActionSignatureLitAction';
3+
export * from "./deriveLitActionWalletAddress";
4+
export * from './litActions/signAsAction';
5+
export * from './litActions/verifyActionSignature';

sign-as-action/nodejs/src/signAsAction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { LitNodeClient } from "@lit-protocol/lit-node-client";
33
import { LIT_RPC, LIT_NETWORK } from "@lit-protocol/constants";
44

55
import { getEnv, getSessionSigs } from "./utils";
6-
import { signAsActionLitAction } from "./signAsActionLitAction";
6+
import { signAsActionLitAction } from "./litActions/signAsAction";
77

88
const ETHEREUM_PRIVATE_KEY = getEnv("ETHEREUM_PRIVATE_KEY");
99

sign-as-action/nodejs/src/verifyActionSignature.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { LitNodeClient } from "@lit-protocol/lit-node-client";
33
import { LIT_RPC, LIT_NETWORK } from "@lit-protocol/constants";
44

55
import { getEnv, getSessionSigs } from "./utils";
6-
import { verifyActionSignatureLitAction } from "./verifyActionSignatureLitAction";
6+
import { verifyActionSignatureLitAction } from "./litActions/verifyActionSignature";
77

88
const ETHEREUM_PRIVATE_KEY = getEnv("ETHEREUM_PRIVATE_KEY");
99

sign-as-action/nodejs/test/index.spec.ts

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,21 @@ import chaiJsonSchema from "chai-json-schema";
33
import * as ethers from "ethers";
44
import IpfsHash from "ipfs-only-hash";
55

6-
import { signAsAction, verifyActionSignature, signAsActionLitAction } from "../src";
6+
import { signAsAction, verifyActionSignature, signAsActionLitAction, deriveLitActionWalletAddress } from "../src";
77

88
use(chaiJsonSchema);
99

1010
describe("Testing signAsAction and verifyActionSignature", () => {
11+
let signAsActionLitActionIpfsCid: string;
12+
let message: Uint8Array;
13+
let messageHash: string;
1114
let litActionSignatureString: string;
15+
let litActionSignatureObject: { r: string, s: string, v: number };
1216

13-
it("should sign and verify an action signature", async () => {
14-
const signAsActionLitActionIpfsCid = await IpfsHash.of(signAsActionLitAction);
15-
const message = new Uint8Array(
17+
it("should sign a message with signAsAction", async () => {
18+
signAsActionLitActionIpfsCid = await IpfsHash.of(signAsActionLitAction);
19+
20+
message = new Uint8Array(
1621
await crypto.subtle.digest(
1722
"SHA-256",
1823
new TextEncoder().encode("Hello world")
@@ -37,7 +42,7 @@ describe("Testing signAsAction and verifyActionSignature", () => {
3742

3843
litActionSignatureString = result!.response as string;
3944

40-
const litActionSignatureObject = JSON.parse(litActionSignatureString);
45+
litActionSignatureObject = JSON.parse(litActionSignatureString);
4146
expect(litActionSignatureObject).to.be.jsonSchema(
4247
{
4348
type: "object",
@@ -49,12 +54,36 @@ describe("Testing signAsAction and verifyActionSignature", () => {
4954
required: ["r", "s", "v"],
5055
}
5156
);
57+
}).timeout(120_000);
5258

59+
it("should sign and verify an action signature", async () => {
5360
const response = await verifyActionSignature({
5461
actionIpfsCid: signAsActionLitActionIpfsCid,
5562
toSign: message,
5663
signOutput: litActionSignatureString
5764
});
5865
expect(response?.response).to.be.equal('true');
5966
}).timeout(120_000);
67+
68+
it("should calculate the ETH address of the Lit Action wallet and verify the signature", async () => {
69+
const response = await deriveLitActionWalletAddress({ litActionIpfsCid: signAsActionLitActionIpfsCid });
70+
71+
const combinedSignature = ethers.utils.joinSignature({
72+
recoveryParam: litActionSignatureObject.v,
73+
r: `0x${litActionSignatureObject.r.substring(2)}`,
74+
s: `0x${litActionSignatureObject.s}`,
75+
});
76+
77+
const recoveredPubkey = ethers.utils.recoverPublicKey(
78+
message,
79+
combinedSignature
80+
);
81+
const recoveredAddress = ethers.utils.recoverAddress(
82+
message,
83+
combinedSignature
84+
);
85+
86+
expect(recoveredPubkey).to.be.equal(response.derivedPubkey);
87+
expect(recoveredAddress).to.be.equal(response.derivedAddress);
88+
}).timeout(120_000);
6089
});

yarn.lock

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2841,6 +2841,15 @@ __metadata:
28412841
languageName: node
28422842
linkType: hard
28432843

2844+
"@lit-protocol/accs-schemas@npm:^0.0.36":
2845+
version: 0.0.36
2846+
resolution: "@lit-protocol/accs-schemas@npm:0.0.36"
2847+
dependencies:
2848+
ajv: "npm:^8.12.0"
2849+
checksum: 10c0/97d3ac6c6ebacba3dff020cb38d3ce631ae8b17a67f2ec941239b51ead02cfba9a9344967119dde8c14c69bc9d8392f543c38a086940bed7460f545eabc30e49
2850+
languageName: node
2851+
linkType: hard
2852+
28442853
"@lit-protocol/auth-browser@npm:7.0.4, @lit-protocol/auth-browser@npm:^7.0.4":
28452854
version: 7.0.4
28462855
resolution: "@lit-protocol/auth-browser@npm:7.0.4"
@@ -2913,6 +2922,23 @@ __metadata:
29132922
languageName: node
29142923
linkType: hard
29152924

2925+
"@lit-protocol/constants@npm:7.3.1":
2926+
version: 7.3.1
2927+
resolution: "@lit-protocol/constants@npm:7.3.1"
2928+
dependencies:
2929+
"@ethersproject/abstract-provider": "npm:5.7.0"
2930+
"@lit-protocol/accs-schemas": "npm:^0.0.36"
2931+
"@lit-protocol/contracts": "npm:^0.0.74"
2932+
"@lit-protocol/types": "npm:7.3.1"
2933+
"@openagenda/verror": "npm:^3.1.4"
2934+
depd: "npm:^2.0.0"
2935+
ethers: "npm:^5.7.1"
2936+
siwe: "npm:^2.3.2"
2937+
tslib: "npm:1.14.1"
2938+
checksum: 10c0/fdc69994caee4d06aa8775aac47d792ff7aa8f68175745f22f3ef647c1e8c979af30f4f164dadd5373e9feb1571e88e71606e0d45d6cbc379e161b85d7c8ce83
2939+
languageName: node
2940+
linkType: hard
2941+
29162942
"@lit-protocol/contracts-sdk@npm:7.0.4, @lit-protocol/contracts-sdk@npm:^7.0.4":
29172943
version: 7.0.4
29182944
resolution: "@lit-protocol/contracts-sdk@npm:7.0.4"
@@ -2941,6 +2967,34 @@ __metadata:
29412967
languageName: node
29422968
linkType: hard
29432969

2970+
"@lit-protocol/contracts-sdk@npm:^7.3.1":
2971+
version: 7.3.1
2972+
resolution: "@lit-protocol/contracts-sdk@npm:7.3.1"
2973+
dependencies:
2974+
"@ethersproject/abi": "npm:5.7.0"
2975+
"@ethersproject/abstract-provider": "npm:5.7.0"
2976+
"@ethersproject/contracts": "npm:5.7.0"
2977+
"@ethersproject/providers": "npm:5.7.2"
2978+
"@lit-protocol/accs-schemas": "npm:^0.0.36"
2979+
"@lit-protocol/constants": "npm:7.3.1"
2980+
"@lit-protocol/contracts": "npm:^0.0.74"
2981+
"@lit-protocol/logger": "npm:7.3.1"
2982+
"@lit-protocol/misc": "npm:7.3.1"
2983+
"@lit-protocol/types": "npm:7.3.1"
2984+
"@openagenda/verror": "npm:^3.1.4"
2985+
ajv: "npm:^8.12.0"
2986+
bech32: "npm:^2.0.0"
2987+
depd: "npm:^2.0.0"
2988+
ethers: "npm:^5.7.1"
2989+
jose: "npm:^4.14.4"
2990+
process: "npm:0.11.10"
2991+
siwe: "npm:^2.3.2"
2992+
tslib: "npm:1.14.1"
2993+
util: "npm:0.12.5"
2994+
checksum: 10c0/69721e42e5335102145a01e41e0a963719a98f5ba4c45616161d110d17ab72e912a83051ec340a3d60ce8627ec85ba4d28cd5e6a93e73e690a56f478856c0a38
2995+
languageName: node
2996+
linkType: hard
2997+
29442998
"@lit-protocol/contracts@npm:^0.0.74":
29452999
version: 0.0.74
29463000
resolution: "@lit-protocol/contracts@npm:0.0.74"
@@ -3207,6 +3261,24 @@ __metadata:
32073261
languageName: node
32083262
linkType: hard
32093263

3264+
"@lit-protocol/logger@npm:7.3.1":
3265+
version: 7.3.1
3266+
resolution: "@lit-protocol/logger@npm:7.3.1"
3267+
dependencies:
3268+
"@ethersproject/abstract-provider": "npm:5.7.0"
3269+
"@lit-protocol/accs-schemas": "npm:^0.0.36"
3270+
"@lit-protocol/constants": "npm:7.3.1"
3271+
"@lit-protocol/contracts": "npm:^0.0.74"
3272+
"@lit-protocol/types": "npm:7.3.1"
3273+
"@openagenda/verror": "npm:^3.1.4"
3274+
depd: "npm:^2.0.0"
3275+
ethers: "npm:^5.7.1"
3276+
siwe: "npm:^2.3.2"
3277+
tslib: "npm:1.14.1"
3278+
checksum: 10c0/502e8f50dede9b4c99ece1b2a5e50a43d3aacbdaf239ca5c469914176e3ff4ab676d36a374b48b3d1527afb21d49820000bf76c541ccc3e39bcac57f124bc1fa
3279+
languageName: node
3280+
linkType: hard
3281+
32103282
"@lit-protocol/misc-browser@npm:7.0.4":
32113283
version: 7.0.4
32123284
resolution: "@lit-protocol/misc-browser@npm:7.0.4"
@@ -3250,6 +3322,30 @@ __metadata:
32503322
languageName: node
32513323
linkType: hard
32523324

3325+
"@lit-protocol/misc@npm:7.3.1":
3326+
version: 7.3.1
3327+
resolution: "@lit-protocol/misc@npm:7.3.1"
3328+
dependencies:
3329+
"@ethersproject/abstract-provider": "npm:5.7.0"
3330+
"@ethersproject/contracts": "npm:5.7.0"
3331+
"@ethersproject/providers": "npm:5.7.2"
3332+
"@lit-protocol/accs-schemas": "npm:^0.0.36"
3333+
"@lit-protocol/constants": "npm:7.3.1"
3334+
"@lit-protocol/contracts": "npm:^0.0.74"
3335+
"@lit-protocol/logger": "npm:7.3.1"
3336+
"@lit-protocol/types": "npm:7.3.1"
3337+
"@openagenda/verror": "npm:^3.1.4"
3338+
ajv: "npm:^8.12.0"
3339+
bech32: "npm:^2.0.0"
3340+
depd: "npm:^2.0.0"
3341+
ethers: "npm:^5.7.1"
3342+
siwe: "npm:^2.3.2"
3343+
tslib: "npm:1.14.1"
3344+
util: "npm:0.12.5"
3345+
checksum: 10c0/9987d80d5bd3eab311f2d65d0a7d7b7da7b0d767d25bfcbde58bc208c2cc872b834157065f374ff2198db37a2d4bd160408bea635902d963a73a5e022fc7f922
3346+
languageName: node
3347+
linkType: hard
3348+
32533349
"@lit-protocol/nacl@npm:7.0.4":
32543350
version: 7.0.4
32553351
resolution: "@lit-protocol/nacl@npm:7.0.4"
@@ -3273,6 +3369,20 @@ __metadata:
32733369
languageName: node
32743370
linkType: hard
32753371

3372+
"@lit-protocol/types@npm:7.3.1":
3373+
version: 7.3.1
3374+
resolution: "@lit-protocol/types@npm:7.3.1"
3375+
dependencies:
3376+
"@ethersproject/abstract-provider": "npm:5.7.0"
3377+
"@lit-protocol/accs-schemas": "npm:^0.0.36"
3378+
depd: "npm:^2.0.0"
3379+
ethers: "npm:^5.7.1"
3380+
siwe: "npm:^2.3.2"
3381+
tslib: "npm:1.14.1"
3382+
checksum: 10c0/f707023534a7af480e88f5cc8fd5da91534a17805e4ec153880abf9257e6b656a8ae3d99f83ffead7dbfaf9f1f2203aa01a0880899c3d3463d8f75d9eba38089
3383+
languageName: node
3384+
linkType: hard
3385+
32763386
"@lit-protocol/uint8arrays@npm:7.0.4":
32773387
version: 7.0.4
32783388
resolution: "@lit-protocol/uint8arrays@npm:7.0.4"
@@ -19499,7 +19609,7 @@ __metadata:
1949919609
"@dotenvx/dotenvx": "npm:^0.44.1"
1950019610
"@lit-protocol/auth-helpers": "npm:^7.0.4"
1950119611
"@lit-protocol/constants": "npm:^7.0.4"
19502-
"@lit-protocol/contracts-sdk": "npm:^7.0.4"
19612+
"@lit-protocol/contracts-sdk": "npm:^7.3.1"
1950319613
"@lit-protocol/lit-node-client": "npm:^7.0.4"
1950419614
"@types/chai": "npm:^4.3.16"
1950519615
"@types/chai-json-schema": "npm:^1.4.10"

0 commit comments

Comments
 (0)