From c8a10a9a0c21d01e4d0b7444f4e871081c36e6c7 Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 10 Oct 2025 21:49:49 +0100 Subject: [PATCH 1/6] chore: prune changelog messages --- .../CHANGELOG.md | 192 --------- .../access-control-conditions/CHANGELOG.md | 200 ---------- packages/artillery/CHANGELOG.md | 131 ------- packages/auth-helpers/CHANGELOG.md | 204 ---------- packages/auth-services/CHANGELOG.md | 370 ------------------ packages/auth/CHANGELOG.md | 225 ----------- packages/constants/CHANGELOG.md | 203 ---------- packages/contracts/CHANGELOG.md | 84 ---- packages/crypto/CHANGELOG.md | 204 ---------- packages/e2e/CHANGELOG.md | 196 ---------- packages/lit-client/CHANGELOG.md | 252 ------------ packages/logger/CHANGELOG.md | 182 --------- packages/networks/CHANGELOG.md | 327 ---------------- packages/schemas/CHANGELOG.md | 200 ---------- packages/types/CHANGELOG.md | 196 ---------- packages/wasm/CHANGELOG.md | 182 --------- .../wrapped-keys-lit-actions/CHANGELOG.md | 185 --------- packages/wrapped-keys/CHANGELOG.md | 177 --------- 18 files changed, 3710 deletions(-) diff --git a/packages/access-control-conditions-schemas/CHANGELOG.md b/packages/access-control-conditions-schemas/CHANGELOG.md index ef50d43c7..5cf9367fe 100644 --- a/packages/access-control-conditions-schemas/CHANGELOG.md +++ b/packages/access-control-conditions-schemas/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,149 +22,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/constants@8.0.0-alpha.8 - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/constants@8.0.0-alpha.7 - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/access-control-conditions/CHANGELOG.md b/packages/access-control-conditions/CHANGELOG.md index 43d85c8ee..aff566ab6 100644 --- a/packages/access-control-conditions/CHANGELOG.md +++ b/packages/access-control-conditions/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,157 +22,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/logger@8.0.0-alpha.8 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.7 - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/logger@8.0.0-alpha.7 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/artillery/CHANGELOG.md b/packages/artillery/CHANGELOG.md index 933bc726a..3ab601fcd 100644 --- a/packages/artillery/CHANGELOG.md +++ b/packages/artillery/CHANGELOG.md @@ -1,132 +1 @@ # @lit-protocol/artillery - -## 0.0.3 - -### Patch Changes - -- 9ec9ea9: naga-test release -- Updated dependencies [9ec9ea9] -- Updated dependencies [dd339e0] - - @lit-protocol/e2e@1.0.13 - -## 0.0.2 - -### Patch Changes - -- release naga-test -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [9752854] -- Updated dependencies -- Updated dependencies [4616e56] -- Updated dependencies [a833c7a] -- Updated dependencies [4d353dd] -- Updated dependencies [4616e56] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [867516f] - - @lit-protocol/e2e@1.0.12 - -## 0.0.2-test.13 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.14 - -## 0.0.2-test.12 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.13 - -## 0.0.2-test.11 - -### Patch Changes - -- @lit-protocol/e2e@1.0.12-test.12 - -## 0.0.2-test.10 - -### Patch Changes - -- @lit-protocol/e2e@1.0.12-test.11 - -## 0.0.2-test.9 - -### Patch Changes - -- @lit-protocol/e2e@1.0.12-test.10 - -## 0.0.2-test.8 - -### Patch Changes - -- @lit-protocol/e2e@1.0.12-test.9 - -## 0.0.2-test.7 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.7 - -## 0.0.2-test.6 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.6 - -## 0.0.2-test.5 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.5 - -## 0.0.2-test.4 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.4 - -## 0.0.2-test.3 - -### Patch Changes - -- put console logs to debug -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.3 - -## 0.0.2-test.2 - -### Patch Changes - -- bump -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.2 - -## 0.0.2-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.1 - -## 0.0.2-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test -- Updated dependencies - - @lit-protocol/e2e@1.0.12-test.0 diff --git a/packages/auth-helpers/CHANGELOG.md b/packages/auth-helpers/CHANGELOG.md index 782e6025d..cb5e6db6e 100644 --- a/packages/auth-helpers/CHANGELOG.md +++ b/packages/auth-helpers/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,162 +22,20 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum - 3ed0a77: this should fix the browser pino logger issue -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.15 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.14 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.13 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.12 - -### Major Changes - -- wip - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.9 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - -## 8.0.0-alpha.8 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.0-alpha.7 - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - -## 8.0.0-alpha.7 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.6 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.5 - -### Major Changes - -- this should fix the browser pino logger issue - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/auth-services/CHANGELOG.md b/packages/auth-services/CHANGELOG.md index 4324b7a55..76ac3d56d 100644 --- a/packages/auth-services/CHANGELOG.md +++ b/packages/auth-services/CHANGELOG.md @@ -1,371 +1 @@ # @lit-protocol/auth-services - -## 2.0.2 - -### Patch Changes - -- 9ec9ea9: naga-test release -- Updated dependencies [9ec9ea9] - - @lit-protocol/contracts@0.5.3 - - @lit-protocol/logger@8.0.2 - -## 2.0.1 - -### Patch Changes - -- release naga-test -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [9752854] -- Updated dependencies -- Updated dependencies [4616e56] -- Updated dependencies [a833c7a] -- Updated dependencies [4d353dd] -- Updated dependencies [4616e56] -- Updated dependencies [a833c7a] -- Updated dependencies [642cd0b] -- Updated dependencies [a833c7a] -- Updated dependencies [867516f] - - @lit-protocol/contracts@0.5.2 - - @lit-protocol/logger@8.0.1 - -## 2.0.1-test.9 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.9 - - @lit-protocol/logger@8.0.1-test.9 - -## 2.0.1-test.8 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.8 - - @lit-protocol/logger@8.0.1-test.8 - -## 2.0.1-test.7 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.7 - -## 2.0.1-test.6 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.6 - -## 2.0.1-test.5 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.5 - -## 2.0.1-test.4 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.4 - -## 2.0.1-test.3 - -### Patch Changes - -- put console logs to debug -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.3 - -## 2.0.1-test.2 - -### Patch Changes - -- bump -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.2 - -## 2.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again -- Updated dependencies - - @lit-protocol/logger@8.0.1-test.1 - -## 2.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test -- Updated dependencies -- Updated dependencies [642cd0b] - - @lit-protocol/contracts@0.5.2-test.0 - - @lit-protocol/logger@8.0.1-test.0 - -## 2.0.0 - -### Major Changes - -- ceac462: first naga beta release - -### Patch Changes - -- 935c218: reset naga-dev contract addresses and add naga-staging network -- a48fbfb: Initial version after networks unification -- a59f48f: Initial release for networks unification - -## 2.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 2.0.0-beta.0 - -### Major Changes - -- first naga beta release - -## 1.0.0 - -### Major Changes - -- cac8964: add "zod-validation-error": "^3.4.0" -- 3ac49c5: fixing cors -- b8ae37b: fix build pipeline -> dependencies order is important -- 53973d3: add "cbor-web": "^9.0.2", -- 6c3938a: fix build -- 4ad5cec: test publish -- 3a0a30d: fix imports -- c664381: test -- e56fa39: fix import path -- ff75c6b: merged lit-login-server & relayer as auth-services -- 67cc0bf: fix(config): auth-services -- ca72c25: wip -- c044935: fix dependencies -- 9d38582: wip -- da8bf7c: add "@openagenda/verror": "^3.1.4" -- 20f98e5: add "@lit-protocol/contracts": "^0.1.23", -- d08eed4: fix exports and paths -- fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip -- 857e330: add a pipeline to check for missing dependencies -- f2818e1: The core issue was that the auth-services package was trying to be a modern ES module package with modern dependencies, but was configured with older CommonJS/Node.js settings. Once we aligned everything to be consistently modern ES2022 with bundler resolution, TypeScript could properly: -- c664381: wip -- 12e304c: fix and publish -- 8523cb7: wip -- cb0bbed: wip -- c6bddb8: make workspace packages -- c044935: fix http://naga-auth-service.getlit.dev -- c664381: fix build - -### Minor Changes - -- f482a99: fix build -- a0919a9: add imports - -### Patch Changes - -- 138437b: add required dependencies - -## 1.0.0-alpha.23 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 1.0.0-alpha.22 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 1.0.0-alpha.21 - -### Major Changes - -- fix dependencies - -## 1.0.0-alpha.20 - -### Major Changes - -- fixing cors - -## 1.0.0-alpha.19 - -### Major Changes - -- wip - -## 1.0.0-alpha.18 - -### Major Changes - -- wip - -## 1.0.0-alpha.17 - -### Major Changes - -- test -- fix build - -## 1.0.0-alpha.16 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/auth@8.0.0-alpha.8 - - @lit-protocol/lit-client@8.0.0-alpha.9 - - @lit-protocol/logger@8.0.0-alpha.8 - - @lit-protocol/networks@8.0.0-alpha.13 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - -## 1.0.0-alpha.15 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/auth@8.0.0-alpha.7 - - @lit-protocol/lit-client@8.0.0-alpha.8 - - @lit-protocol/logger@8.0.0-alpha.7 - - @lit-protocol/networks@8.0.0-alpha.12 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - -## 1.0.0-alpha.14 - -### Patch Changes - -- add required dependencies - -## 1.0.0-alpha.13 - -### Major Changes - -- wip - -## 1.0.0-alpha.12 - -### Major Changes - -- wip - -## 1.0.0-alpha.12 - -### Major Changes - -- 4ad5cec: test publish -- da8bf7c: add "@openagenda/verror": "^3.1.4" -- wip - -## 1.0.0-alpha.11 - -### Major Changes - -- fix import path - -## 1.0.0-alpha.10 - -### Major Changes - -- fix imports - -## 1.0.0-alpha.9 - -### Major Changes - -- fix(config): auth-services - -## 1.0.0-alpha.8 - -### Major Changes - -- The core issue was that the auth-services package was trying to be a modern ES module package with modern dependencies, but was configured with older CommonJS/Node.js settings. Once we aligned everything to be consistently modern ES2022 with bundler resolution, TypeScript could properly: - -## 1.0.0-alpha.8 - -### Major Changes - -- 20f98e5: add "@lit-protocol/contracts": "^0.1.23", -- make workspace packages - -## 1.0.0-alpha.7 - -### Major Changes - -- add "cbor-web": "^9.0.2", - -## 1.0.0-alpha.6 - -### Major Changes - -- add "zod-validation-error": "^3.4.0" - -## 1.0.0-alpha.5 - -### Minor Changes - -- add imports - -## 1.0.0-alpha.4 - -### Major Changes - -- fix exports and paths - -## 1.0.0-alpha.3 - -### Major Changes - -- fix and publish - -## 1.0.0-alpha.2 - -### Major Changes - -- fix build - -## 1.0.0-alpha.1 - -### Minor Changes - -- f482a99: fix build - -## 1.0.0-alpha.0 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -### Patch Changes - -- Updated dependencies - - @lit-protocol/constants@8.0.0-alpha.5 - -## 0.1.0 - -- Initial package setup for PKP Auth Service. diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md index 000286456..b0697e652 100644 --- a/packages/auth/CHANGELOG.md +++ b/packages/auth/CHANGELOG.md @@ -4,98 +4,13 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- a833c7a: test -- a833c7a: test -- a833c7a: testing -- 9752854: first pnpm complete release test for naga-test -- release naga-test -- 4616e56: testing -- a833c7a: test -- 4d353dd: bump -- 4616e56: put console logs to debug -- a833c7a: testing -- a833c7a: testing -- a833c7a: testing - 867516f: fix package metadata so bundlers load the CommonJS builds again -## 8.0.1-test.11 - -### Patch Changes - -- test - -## 8.0.1-test.10 - -### Patch Changes - -- testing - -## 8.0.1-test.9 - -### Patch Changes - -- testing - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test - ## 8.0.0 ### Major Changes @@ -108,159 +23,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/auth-helpers@8.0.0-alpha.9 - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/crypto@8.0.0-alpha.8 - - @lit-protocol/logger@8.0.0-alpha.8 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/auth-helpers@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/crypto@8.0.0-alpha.7 - - @lit-protocol/logger@8.0.0-alpha.7 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/constants/CHANGELOG.md b/packages/constants/CHANGELOG.md index 431aff2e3..b0f8f3366 100644 --- a/packages/constants/CHANGELOG.md +++ b/packages/constants/CHANGELOG.md @@ -4,7 +4,6 @@ ### Patch Changes -- 9ec9ea9: naga-test release - Updated dependencies [9ec9ea9] - @lit-protocol/contracts@0.5.3 @@ -12,7 +11,6 @@ ### Patch Changes -- release naga-test - Updated dependencies [a833c7a] - Updated dependencies [a833c7a] - Updated dependencies [9752854] @@ -27,87 +25,6 @@ - Updated dependencies [867516f] - @lit-protocol/contracts@0.5.2 -## 8.0.1-test.9 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.9 - -## 8.0.1-test.8 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.8 - -## 8.0.1-test.7 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.7 - -## 8.0.1-test.6 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.6 - -## 8.0.1-test.5 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.5 - -## 8.0.1-test.4 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.4 - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.3 - -## 8.0.1-test.2 - -### Patch Changes - -- bump -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.2 - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.1 - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test -- Updated dependencies -- Updated dependencies [642cd0b] - - @lit-protocol/contracts@0.5.2-test.0 - ## 8.0.0 ### Major Changes @@ -120,139 +37,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 1e24a8684..0ae98bba8 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,85 +1 @@ # @lit-protocol/contracts - -## 0.5.3 - -### Patch Changes - -- 9ec9ea9: naga-test release - -## 0.5.2 - -### Patch Changes - -- a833c7a: test -- a833c7a: test -- 9752854: first pnpm complete release test for naga-test -- release naga-test -- 4616e56: testing -- a833c7a: test -- 4d353dd: bump -- 4616e56: put console logs to debug -- a833c7a: testing -- 642cd0b: This is the first monorepo release and should behave exactly like v0.5.1. If anything breaks, roll back to v0.5.1. -- a833c7a: testing -- 867516f: fix package metadata so bundlers load the CommonJS builds again - -## 0.5.2-test.9 - -### Patch Changes - -- test - -## 0.5.2-test.8 - -### Patch Changes - -- testing - -## 0.5.2-test.7 - -### Patch Changes - -- test - -## 0.5.2-test.6 - -### Patch Changes - -- test - -## 0.5.2-test.5 - -### Patch Changes - -- testing - -## 0.5.2-test.4 - -### Patch Changes - -- testing - -## 0.5.2-test.3 - -### Patch Changes - -- put console logs to debug - -## 0.5.2-test.2 - -### Patch Changes - -- bump - -## 0.5.2-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 0.5.2-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test -- 642cd0b: This is the first monorepo release and should behave exactly like v0.5.1. If anything breaks, roll back to v0.5.1. diff --git a/packages/crypto/CHANGELOG.md b/packages/crypto/CHANGELOG.md index 64370f5be..da6b1f9ab 100644 --- a/packages/crypto/CHANGELOG.md +++ b/packages/crypto/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,162 +22,20 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes - 16fc970: added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.15 - -### Major Changes - -- added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - - @lit-protocol/wasm@8.0.0-alpha.8 - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - - @lit-protocol/wasm@8.0.0-alpha.7 - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index d08ac6eae..af91d3b79 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,197 +1 @@ # @lit-protocol/e2e - -## 1.0.13 - -### Patch Changes - -- 9ec9ea9: naga-test release -- dd339e0: Add standalone Naga health checks (EOA + single PKP) covering handshake, pkpSign, signSessionKey, executeJs, and encrypt/decrypt, with status logging via @lit-protocol/lit-status-sdk (no breaking changes). -- Updated dependencies [9ec9ea9] - - @lit-protocol/access-control-conditions@8.0.2 - - @lit-protocol/auth@8.0.2 - - @lit-protocol/lit-client@8.0.2 - - @lit-protocol/networks@8.0.2 - - @lit-protocol/schemas@8.0.2 - -## 1.0.12 - -### Patch Changes - -- release naga-test -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [9752854] -- Updated dependencies -- Updated dependencies [4616e56] -- Updated dependencies [a833c7a] -- Updated dependencies [4d353dd] -- Updated dependencies [4616e56] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [a833c7a] -- Updated dependencies [867516f] - - @lit-protocol/access-control-conditions@8.0.1 - - @lit-protocol/auth@8.0.1 - - @lit-protocol/lit-client@8.0.1 - - @lit-protocol/networks@8.0.1 - - @lit-protocol/schemas@8.0.1 - -## 1.0.12-test.14 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.9 - - @lit-protocol/auth@8.0.1-test.11 - - @lit-protocol/lit-client@8.0.1-test.11 - - @lit-protocol/networks@8.0.1-test.11 - - @lit-protocol/schemas@8.0.1-test.9 - -## 1.0.12-test.13 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.8 - - @lit-protocol/auth@8.0.1-test.10 - - @lit-protocol/lit-client@8.0.1-test.10 - - @lit-protocol/networks@8.0.1-test.10 - - @lit-protocol/schemas@8.0.1-test.8 - -## 1.0.12-test.12 - -### Patch Changes - -- Updated dependencies - - @lit-protocol/lit-client@8.0.1-test.9 - - @lit-protocol/networks@8.0.1-test.9 - -## 1.0.12-test.11 - -### Patch Changes - -- Updated dependencies - - @lit-protocol/lit-client@8.0.1-test.8 - -## 1.0.12-test.10 - -### Patch Changes - -- Updated dependencies - - @lit-protocol/networks@8.0.1-test.8 - -## 1.0.12-test.9 - -### Patch Changes - -- Updated dependencies - - @lit-protocol/auth@8.0.1-test.9 - -## 1.0.12-test.8 - -### Patch Changes - -- Updated dependencies - - @lit-protocol/auth@8.0.1-test.8 - -## 1.0.12-test.7 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.7 - - @lit-protocol/auth@8.0.1-test.7 - - @lit-protocol/lit-client@8.0.1-test.7 - - @lit-protocol/networks@8.0.1-test.7 - - @lit-protocol/schemas@8.0.1-test.7 - -## 1.0.12-test.6 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.6 - - @lit-protocol/auth@8.0.1-test.6 - - @lit-protocol/lit-client@8.0.1-test.6 - - @lit-protocol/networks@8.0.1-test.6 - - @lit-protocol/schemas@8.0.1-test.6 - -## 1.0.12-test.5 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.5 - - @lit-protocol/auth@8.0.1-test.5 - - @lit-protocol/lit-client@8.0.1-test.5 - - @lit-protocol/networks@8.0.1-test.5 - - @lit-protocol/schemas@8.0.1-test.5 - -## 1.0.12-test.4 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.4 - - @lit-protocol/auth@8.0.1-test.4 - - @lit-protocol/lit-client@8.0.1-test.4 - - @lit-protocol/networks@8.0.1-test.4 - - @lit-protocol/schemas@8.0.1-test.4 - -## 1.0.12-test.3 - -### Patch Changes - -- put console logs to debug -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.3 - - @lit-protocol/auth@8.0.1-test.3 - - @lit-protocol/lit-client@8.0.1-test.3 - - @lit-protocol/networks@8.0.1-test.3 - - @lit-protocol/schemas@8.0.1-test.3 - -## 1.0.12-test.2 - -### Patch Changes - -- bump -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.2 - - @lit-protocol/auth@8.0.1-test.2 - - @lit-protocol/lit-client@8.0.1-test.2 - - @lit-protocol/networks@8.0.1-test.2 - - @lit-protocol/schemas@8.0.1-test.2 - -## 1.0.12-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.1 - - @lit-protocol/auth@8.0.1-test.1 - - @lit-protocol/lit-client@8.0.1-test.1 - - @lit-protocol/networks@8.0.1-test.1 - - @lit-protocol/schemas@8.0.1-test.1 - -## 1.0.12-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.1-test.0 - - @lit-protocol/auth@8.0.1-test.0 - - @lit-protocol/lit-client@8.0.1-test.0 - - @lit-protocol/networks@8.0.1-test.0 - - @lit-protocol/schemas@8.0.1-test.0 diff --git a/packages/lit-client/CHANGELOG.md b/packages/lit-client/CHANGELOG.md index bc3121634..0896ee41d 100644 --- a/packages/lit-client/CHANGELOG.md +++ b/packages/lit-client/CHANGELOG.md @@ -4,98 +4,13 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- a833c7a: test -- a833c7a: testing -- a833c7a: test -- a833c7a: testing -- 9752854: first pnpm complete release test for naga-test -- release naga-test -- 4616e56: testing -- a833c7a: test -- 4d353dd: bump -- 4616e56: put console logs to debug -- a833c7a: testing -- a833c7a: testing - 867516f: fix package metadata so bundlers load the CommonJS builds again -## 8.0.1-test.11 - -### Patch Changes - -- test - -## 8.0.1-test.10 - -### Patch Changes - -- testing - -## 8.0.1-test.9 - -### Patch Changes - -- testing - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test - ## 8.0.0 ### Major Changes @@ -108,189 +23,22 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes - 49d8f68: feat(payment): add Ledge contract ABIs - 16fc970: added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important - 0d12992: add export to index.ts -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies -- c754e60: bump version - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.18 - -### Major Changes - -- added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test - -## 8.0.0-alpha.17 - -### Major Changes - -- bump version - -## 8.0.0-alpha.16 - -### Major Changes - -- feat(payment): add Ledge contract ABIs - -## 8.0.0-alpha.15 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.14 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.13 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.12 - -### Major Changes - -- wip - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.9 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/crypto@8.0.0-alpha.8 - - @lit-protocol/logger@8.0.0-alpha.8 - - @lit-protocol/networks@8.0.0-alpha.13 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - -## 8.0.0-alpha.8 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions@8.0.0-alpha.7 - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/crypto@8.0.0-alpha.7 - - @lit-protocol/logger@8.0.0-alpha.7 - - @lit-protocol/networks@8.0.0-alpha.12 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - -## 8.0.0-alpha.7 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.6 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.5 - -### Major Changes - -- add export to index.ts - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 44b3adf19..65ed8d81f 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,139 +22,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/networks/CHANGELOG.md b/packages/networks/CHANGELOG.md index 2de6cce1d..25c226aec 100644 --- a/packages/networks/CHANGELOG.md +++ b/packages/networks/CHANGELOG.md @@ -4,7 +4,6 @@ ### Patch Changes -- 9ec9ea9: naga-test release - Updated dependencies [9ec9ea9] - @lit-protocol/contracts@0.5.3 @@ -12,18 +11,6 @@ ### Patch Changes -- a833c7a: test -- a833c7a: testing -- a833c7a: test -- 9752854: first pnpm complete release test for naga-test -- release naga-test -- 4616e56: testing -- a833c7a: test -- 4d353dd: bump -- 4616e56: put console logs to debug -- a833c7a: testing -- a833c7a: testing -- a833c7a: testing - 867516f: fix package metadata so bundlers load the CommonJS builds again - Updated dependencies [a833c7a] - Updated dependencies [a833c7a] @@ -39,99 +26,6 @@ - Updated dependencies [867516f] - @lit-protocol/contracts@0.5.2 -## 8.0.1-test.11 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.9 - -## 8.0.1-test.10 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.8 - -## 8.0.1-test.9 - -### Patch Changes - -- testing - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.7 - -## 8.0.1-test.6 - -### Patch Changes - -- test -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.6 - -## 8.0.1-test.5 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.5 - -## 8.0.1-test.4 - -### Patch Changes - -- testing -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.4 - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.3 - -## 8.0.1-test.2 - -### Patch Changes - -- bump -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.2 - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again -- Updated dependencies - - @lit-protocol/contracts@0.5.2-test.1 - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test -- Updated dependencies -- Updated dependencies [642cd0b] - - @lit-protocol/contracts@0.5.2-test.0 - ## 8.0.0 ### Major Changes @@ -144,19 +38,6 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes @@ -167,229 +48,21 @@ - f4c5151: fix import paths - 16fc970: added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test - bf201e8: add missing `withdraw` ledge abi method -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test - 851eb4c: adding "@lit-protocol/contracts": "^0.1.23", -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - 4c5541d: add payment delegation manager -- c754e60: bump version - 3e43087: add payment delegation apis - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - 47993d1: Update the project.json to point to the correct index.ts file: - d31c69f: add contracts pkg - 42e92f6: feat(networks): add naga-test support - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.27 - -### Major Changes - -- added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test - -## 8.0.0-alpha.26 - -### Major Changes - -- add missing `withdraw` ledge abi method - -## 8.0.0-alpha.25 - -### Major Changes - -- add payment delegation manager - -## 8.0.0-alpha.24 - -### Major Changes - -- add payment delegation apis - -## 8.0.0-alpha.23 - -### Major Changes - -- feat: add naga-test support - -## 8.0.0-alpha.22 - -### Major Changes - -- feat(networks): add naga-test support - -## 8.0.0-alpha.21 - -### Major Changes - -- bump version - -## 8.0.0-alpha.20 - -### Major Changes - -- feat(payment): add Ledge contract ABIs - -## 8.0.0-alpha.19 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.18 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.17 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.16 - -### Major Changes - -- wip - -## 8.0.0-alpha.15 - -### Major Changes - -- wip - -## 8.0.0-alpha.14 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.13 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.8 - - @lit-protocol/auth-helpers@8.0.0-alpha.9 - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/crypto@8.0.0-alpha.8 - - @lit-protocol/logger@8.0.0-alpha.8 - - @lit-protocol/schemas@8.0.0-alpha.8 - - @lit-protocol/types@8.0.0-alpha.8 - -## 8.0.0-alpha.12 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.7 - - @lit-protocol/auth-helpers@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/crypto@8.0.0-alpha.7 - - @lit-protocol/logger@8.0.0-alpha.7 - - @lit-protocol/schemas@8.0.0-alpha.7 - - @lit-protocol/types@8.0.0-alpha.7 - -## 8.0.0-alpha.11 - -### Major Changes - -- add contracts pkg - -## 8.0.0-alpha.10 - -### Major Changes - -- adding "@lit-protocol/contracts": "^0.1.23", - -## 8.0.0-alpha.9 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.8 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.7 - -### Major Changes - -- fix browser compatability - -## 8.0.0-alpha.6 - -### Major Changes - -- fix import paths - -## 8.0.0-alpha.5 - -### Major Changes - -- Update the project.json to point to the correct index.ts file: - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/schemas/CHANGELOG.md b/packages/schemas/CHANGELOG.md index b0fb9f41a..6bc8e7d27 100644 --- a/packages/schemas/CHANGELOG.md +++ b/packages/schemas/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,158 +22,20 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes - 16fc970: added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.15 - -### Major Changes - -- added payment manager apis, added maxPrice for signSessionKey endpoint, and updated auth service url for naga-test - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.8 - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.7 - - @lit-protocol/constants@8.0.0-alpha.7 - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 39917a009..062ea53d1 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,153 +22,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.8 - - @lit-protocol/constants@8.0.0-alpha.8 - - @lit-protocol/schemas@8.0.0-alpha.8 - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -### Patch Changes - -- Updated dependencies - - @lit-protocol/access-control-conditions-schemas@8.0.0-alpha.7 - - @lit-protocol/constants@8.0.0-alpha.7 - - @lit-protocol/schemas@8.0.0-alpha.7 - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/wasm/CHANGELOG.md b/packages/wasm/CHANGELOG.md index a89564a68..95d01398b 100644 --- a/packages/wasm/CHANGELOG.md +++ b/packages/wasm/CHANGELOG.md @@ -4,73 +4,11 @@ ### Patch Changes -- 9ec9ea9: naga-test release ## 8.0.1 ### Patch Changes -- release naga-test - -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test ## 8.0.0 @@ -84,139 +22,19 @@ - a48fbfb: Initial version after networks unification - a59f48f: Initial release for networks unification -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test - ff75c6b: merged lit-login-server & relayer as auth-services -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. ### Patch Changes - 138437b: add required dependencies - -## 8.0.0-alpha.14 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.13 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.12 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.11 - -### Major Changes - -- wip - -## 8.0.0-alpha.10 - -### Major Changes - -- wip - -## 8.0.0-alpha.9 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.8 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -## 8.0.0-alpha.7 - -### Major Changes - -- add a pipeline to check for missing dependencies - -## 8.0.0-alpha.6 - -### Patch Changes - -- add required dependencies - -## 8.0.0-alpha.5 - -### Major Changes - -- merged lit-login-server & relayer as auth-services - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/wrapped-keys-lit-actions/CHANGELOG.md b/packages/wrapped-keys-lit-actions/CHANGELOG.md index ae249bb0c..6db23e104 100644 --- a/packages/wrapped-keys-lit-actions/CHANGELOG.md +++ b/packages/wrapped-keys-lit-actions/CHANGELOG.md @@ -4,199 +4,14 @@ ### Patch Changes -- a833c7a: test -- a833c7a: test -- 9752854: first pnpm complete release test for naga-test -- 4616e56: testing -- a833c7a: test -- 4d353dd: bump -- 4616e56: put console logs to debug -- a833c7a: testing -- a833c7a: testing - 867516f: fix package metadata so bundlers load the CommonJS builds again -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test - ## 8.0.0 ### Patch Changes - 935c218: reset naga-dev contract addresses and add naga-staging network -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes - -- 0d12992: third attempt. -- 0d12992: version 4 -- b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test -- 0d12992: test -- cb6b698: Initial alpha publish. -- ca72c25: wip -- c044935: fix dependencies -- fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip -- 857e330: add a pipeline to check for missing dependencies -- c664381: wip -- c044935: fix http://naga-auth-service.getlit.dev -- c664381: fix build -- 2164678: second attempt. - -## 8.0.0-alpha.12 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.11 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.10 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.9 - -### Major Changes - -- wip - -## 8.0.0-alpha.8 - -### Major Changes - -- wip - -## 8.0.0-alpha.7 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.6 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -## 8.0.0-alpha.5 - -### Major Changes - -- add a pipeline to check for missing dependencies - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. diff --git a/packages/wrapped-keys/CHANGELOG.md b/packages/wrapped-keys/CHANGELOG.md index f03e1abf4..fb6158382 100644 --- a/packages/wrapped-keys/CHANGELOG.md +++ b/packages/wrapped-keys/CHANGELOG.md @@ -4,199 +4,22 @@ ### Patch Changes -- a833c7a: test -- a833c7a: test -- 9752854: first pnpm complete release test for naga-test -- 4616e56: testing -- a833c7a: test -- 4d353dd: bump -- 4616e56: put console logs to debug -- a833c7a: testing -- a833c7a: testing - 867516f: fix package metadata so bundlers load the CommonJS builds again -## 8.0.1-test.9 - -### Patch Changes - -- test - -## 8.0.1-test.8 - -### Patch Changes - -- testing - -## 8.0.1-test.7 - -### Patch Changes - -- test - -## 8.0.1-test.6 - -### Patch Changes - -- test - -## 8.0.1-test.5 - -### Patch Changes - -- testing - -## 8.0.1-test.4 - -### Patch Changes - -- testing - -## 8.0.1-test.3 - -### Patch Changes - -- put console logs to debug - -## 8.0.1-test.2 - -### Patch Changes - -- bump - -## 8.0.1-test.1 - -### Patch Changes - -- fix package metadata so bundlers load the CommonJS builds again - -## 8.0.1-test.0 - -### Patch Changes - -- first pnpm complete release test for naga-test - ## 8.0.0 ### Patch Changes - 935c218: reset naga-dev contract addresses and add naga-staging network -## 8.0.0-beta.1 - -### Patch Changes - -- a48fbfb: Initial version after networks unification -- Initial release for networks unification - -## 8.0.0-beta.0 - -### Major Changes - -- first naga beta release - ## 8.0.0 ### Major Changes -- 0d12992: third attempt. -- 0d12992: version 4 - b8ae37b: fix build pipeline -> dependencies order is important -- 0d12992: test -- c664381: test -- 0d12992: test - cb6b698: Initial alpha publish. -- ca72c25: wip - c044935: fix dependencies - fbfa1eb: attempt to make vite polyfill minimum -- c044935: wip - 857e330: add a pipeline to check for missing dependencies -- c664381: wip - c044935: fix http://naga-auth-service.getlit.dev - c664381: fix build -- 2164678: second attempt. - -## 8.0.0-alpha.12 - -### Major Changes - -- attempt to make vite polyfill minimum - -## 8.0.0-alpha.11 - -### Major Changes - -- wip -- fix http://naga-auth-service.getlit.dev - -## 8.0.0-alpha.10 - -### Major Changes - -- fix dependencies - -## 8.0.0-alpha.9 - -### Major Changes - -- wip - -## 8.0.0-alpha.8 - -### Major Changes - -- wip - -## 8.0.0-alpha.7 - -### Major Changes - -- test -- fix build - -## 8.0.0-alpha.6 - -### Major Changes - -- fix build pipeline -> dependencies order is important - -## 8.0.0-alpha.5 - -### Major Changes - -- add a pipeline to check for missing dependencies - -## 8.0.0-alpha.4 - -### Major Changes - -- version 4 - -## 8.0.0-alpha.3 - -### Major Changes - -- test - -## 8.0.0-alpha.2 - -### Major Changes - -- test - -## 8.0.0-alpha.1 - -### Major Changes - -- third attempt. - -## 8.0.0-alpha.2 - -### Major Changes - -- second attempt. - -## 8.0.0-alpha.1 - -### Major Changes - -- Initial alpha publish. From 8405fbef08b87c75d6127bcf03bda6df8df97fa0 Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 10 Oct 2025 22:42:23 +0100 Subject: [PATCH 2/6] feat(docs): migrate https://github.com/LIT-Protocol/docs-v2 into the monorepo --- docs/README.md | 45 + docs/changelog.mdx | 200 +++ docs/docs.json | 158 +++ docs/favicon.svg | 1 + docs/images/lit-node-arch.png | Bin 0 -> 167537 bytes docs/index.mdx | 72 ++ docs/learning-lit/backup-and-recovery.mdx | 51 + .../communicating-with-lit-nodes.mdx | 56 + docs/learning-lit/cryptoeconomic-security.mdx | 18 + .../distributed-key-generation.mdx | 21 + docs/learning-lit/how-it-works.mdx | 24 + docs/learning-lit/node-architecture.mdx | 11 + .../on-chain-coordination-mechanisms.mdx | 15 + docs/learning-lit/security.mdx | 35 + docs/logo/dark.svg | 5 + docs/logo/light.svg | 5 + .../encrypt-and-decrypt.mdx | 158 +++ .../auth-context-consumption/execute-js.mdx | 689 +++++++++++ .../sdk/auth-context-consumption/pkp-sign.mdx | 70 ++ docs/sdk/auth/eoa/eoa-auth.mdx | 97 ++ .../auth/pkp-custom-auth/pkp-custom-auth.mdx | 165 +++ .../auth/pkp-native-auth/pkp-discord-auth.mdx | 76 ++ .../sdk/auth/pkp-native-auth/pkp-eoa-auth.mdx | 114 ++ .../auth/pkp-native-auth/pkp-google-auth.mdx | 76 ++ .../pkp-stytch-2fa-totp-auth.mdx | 149 +++ .../pkp-stytch-email-otp-auth.mdx | 102 ++ .../pkp-stytch-sms-otp-auth.mdx | 110 ++ .../pkp-stytch-whatsapp-otp-auth.mdx | 111 ++ .../pkp-native-auth/pkp-webauthn-auth.mdx | 84 ++ docs/sdk/getting-started/auth-manager.mdx | 121 ++ docs/sdk/getting-started/auth-services.mdx | 241 ++++ docs/sdk/getting-started/lit-client.mdx | 89 ++ .../getting-started/payment-manager-setup.mdx | 153 +++ .../prerequisites/chain-config.mdx | 51 + .../getting-started/prerequisites/faucet.mdx | 6 + docs/sdk/introduction.mdx | 33 + docs/sdk/resources/supported-evm-chains.mdx | 117 ++ .../functions/createAccBuilder.mdx | 239 ++++ .../auth/functions/createAuthManager.mdx | 303 +++++ .../lit-client/functions/createLitClient.mdx | 1077 +++++++++++++++++ .../createLitClient/pkp-permissions.mdx | 77 ++ .../createLitClient/pkp-viem-account.mdx | 30 + .../createLitClient/pkp-view-helpers.mdx | 35 + .../sdk-reference/lit-client/reference.mdx | 4 + .../networks/functions/withOverrides.mdx | 40 + 45 files changed, 5334 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/changelog.mdx create mode 100644 docs/docs.json create mode 100644 docs/favicon.svg create mode 100644 docs/images/lit-node-arch.png create mode 100644 docs/index.mdx create mode 100644 docs/learning-lit/backup-and-recovery.mdx create mode 100644 docs/learning-lit/communicating-with-lit-nodes.mdx create mode 100644 docs/learning-lit/cryptoeconomic-security.mdx create mode 100644 docs/learning-lit/distributed-key-generation.mdx create mode 100644 docs/learning-lit/how-it-works.mdx create mode 100644 docs/learning-lit/node-architecture.mdx create mode 100644 docs/learning-lit/on-chain-coordination-mechanisms.mdx create mode 100644 docs/learning-lit/security.mdx create mode 100644 docs/logo/dark.svg create mode 100644 docs/logo/light.svg create mode 100644 docs/sdk/auth-context-consumption/encrypt-and-decrypt.mdx create mode 100644 docs/sdk/auth-context-consumption/execute-js.mdx create mode 100644 docs/sdk/auth-context-consumption/pkp-sign.mdx create mode 100644 docs/sdk/auth/eoa/eoa-auth.mdx create mode 100644 docs/sdk/auth/pkp-custom-auth/pkp-custom-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-discord-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-eoa-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-google-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-stytch-email-otp-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-stytch-sms-otp-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-stytch-whatsapp-otp-auth.mdx create mode 100644 docs/sdk/auth/pkp-native-auth/pkp-webauthn-auth.mdx create mode 100644 docs/sdk/getting-started/auth-manager.mdx create mode 100644 docs/sdk/getting-started/auth-services.mdx create mode 100644 docs/sdk/getting-started/lit-client.mdx create mode 100644 docs/sdk/getting-started/payment-manager-setup.mdx create mode 100644 docs/sdk/getting-started/prerequisites/chain-config.mdx create mode 100644 docs/sdk/getting-started/prerequisites/faucet.mdx create mode 100644 docs/sdk/introduction.mdx create mode 100644 docs/sdk/resources/supported-evm-chains.mdx create mode 100644 docs/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder.mdx create mode 100644 docs/sdk/sdk-reference/auth/functions/createAuthManager.mdx create mode 100644 docs/sdk/sdk-reference/lit-client/functions/createLitClient.mdx create mode 100644 docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-permissions.mdx create mode 100644 docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-viem-account.mdx create mode 100644 docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-view-helpers.mdx create mode 100644 docs/sdk/sdk-reference/lit-client/reference.mdx create mode 100644 docs/sdk/sdk-reference/networks/functions/withOverrides.mdx diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..ea4bdf331 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,45 @@ +# Mintlify Starter Kit + +Use the starter kit to get your docs deployed and ready to customize. + +Click the green **Use this template** button at the top of this repo to copy the Mintlify starter kit. The starter kit contains examples with + +- Guide pages +- Navigation +- Customizations +- API reference pages +- Use of popular components + +**[Follow the full quickstart guide](https://starter.mintlify.com/quickstart)** + +## Development + +Install the [Mintlify CLI](https://www.npmjs.com/package/mint) to preview your documentation changes locally. To install, use the following command: + +``` +npm i -g mint +``` + +Run the following command at the root of your documentation, where your `docs.json` is located: + +``` +mint dev +``` + +View your local preview at `http://localhost:3000`. + +## Publishing changes + +Install our GitHub app from your [dashboard](https://dashboard.mintlify.com/settings/organization/github-app) to propagate changes from your repo to your deployment. Changes are deployed to production automatically after pushing to the default branch. + +## Need help? + +### Troubleshooting + +- If your dev environment isn't running: Run `mint update` to ensure you have the most recent version of the CLI. +- If a page loads as a 404: Make sure you are running in a folder with a valid `docs.json`. + +### Resources +- [Mintlify documentation](https://mintlify.com/docs) +- [Mintlify community](https://mintlify.com/community) +# docs-v2 diff --git a/docs/changelog.mdx b/docs/changelog.mdx new file mode 100644 index 000000000..e484bf9ea --- /dev/null +++ b/docs/changelog.mdx @@ -0,0 +1,200 @@ +--- +title: "Changelog" +description: "Keep track of changes and updates across the Lit JS SDK packages" +rss: true +--- + +| Package | Latest version | Summary | +| ------- | -------------- | ------- | +| [@lit-protocol/lit-client](#lit-client) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Flit-client) | - | +| [@lit-protocol/auth](#auth) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fauth) | - | +| [@lit-protocol/networks](#networks) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fnetworks) | Updated dependencies | +| [@lit-protocol/access-control-conditions](#access-control-conditions) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Faccess-control-conditions) | - | +| [@lit-protocol/access-control-conditions-schemas](#access-control-conditions-schemas) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Faccess-control-conditions-schemas) | - | +| [@lit-protocol/auth-helpers](#auth-helpers) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fauth-helpers) | - | +| [@lit-protocol/constants](#constants) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fconstants) | Updated dependencies | +| [@lit-protocol/contracts](#contracts) | [0.5.3](https://www.npmjs.com/package/%40lit-protocol%2Fcontracts) | release `naga-test` network support | +| [@lit-protocol/crypto](#crypto) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fcrypto) | - | +| [@lit-protocol/logger](#logger) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Flogger) | - | +| [@lit-protocol/schemas](#schemas) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fschemas) | - | +| [@lit-protocol/types](#types) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Ftypes) | - | +| [@lit-protocol/wasm](#wasm) | [8.0.2](https://www.npmjs.com/package/%40lit-protocol%2Fwasm) | - | +| [@lit-protocol/wrapped-keys](#wrapped-keys) | [8.0.1](https://www.npmjs.com/package/%40lit-protocol%2Fwrapped-keys) | fix package metadata so bundlers load the CommonJS builds again | +| [@lit-protocol/wrapped-keys-lit-actions](#wrapped-keys-lit-actions) | [8.0.1](https://www.npmjs.com/package/%40lit-protocol%2Fwrapped-keys-lit-actions) | fix package metadata so bundlers load the CommonJS builds again | + + + + No release notes available. + + + + + No release notes available. + + + + + ## Patch Changes + + - Updated dependencies + - @lit-protocol/contracts@0.5.3 + + + + + No release notes available. + + + + + No release notes available. + + + + + No release notes available. + + + + + ## Patch Changes + + - Updated dependencies + - @lit-protocol/contracts@0.5.3 + + + + + ## Patch Changes + + - release `naga-test` network support + + + + + No release notes available. + + + + + No release notes available. + + + + + No release notes available. + + + + + No release notes available. + + + + + No release notes available. + + + + + ## Patch Changes + + - fix package metadata so bundlers load the CommonJS builds again + + + + + ## Patch Changes + + - fix package metadata so bundlers load the CommonJS builds again + diff --git a/docs/docs.json b/docs/docs.json new file mode 100644 index 000000000..921de2ce7 --- /dev/null +++ b/docs/docs.json @@ -0,0 +1,158 @@ +{ + "$schema": "https://mintlify.com/docs.json", + "theme": "mint", + "name": "Lit JS SDK Documentation", + "colors": { + "primary": "#EA580C", + "light": "#F97316", + "dark": "#EA580C" + }, + "favicon": "/favicon.svg", + "navigation": { + "tabs": [ + { + "tab": "Learning Lit", + "pages": [ + "index", + "learning-lit/how-it-works", + { + "group": "Security", + "pages": [ + "learning-lit/security", + "learning-lit/node-architecture", + "learning-lit/distributed-key-generation", + "learning-lit/on-chain-coordination-mechanisms", + "learning-lit/communicating-with-lit-nodes", + "learning-lit/cryptoeconomic-security", + "learning-lit/backup-and-recovery" + ] + } + ] + }, + { + "tab": "Build with Lit", + "groups": [ + { + "group": "SDK", + "pages": ["sdk/introduction"] + }, + { + "group": "Getting Started", + "pages": [ + { + "group": "Prerequisites", + "pages": [ + "sdk/getting-started/prerequisites/faucet", + "sdk/getting-started/prerequisites/chain-config" + ] + }, + "sdk/getting-started/lit-client", + "sdk/getting-started/auth-manager", + "sdk/getting-started/payment-manager-setup", + "sdk/getting-started/auth-services" + ] + }, + { + "group": "Authentication", + "pages": [ + { + "group": "PKP Native Auth", + "pages": [ + "sdk/auth/pkp-native-auth/pkp-eoa-auth", + "sdk/auth/pkp-native-auth/pkp-google-auth", + "sdk/auth/pkp-native-auth/pkp-discord-auth", + "sdk/auth/pkp-native-auth/pkp-webauthn-auth", + "sdk/auth/pkp-native-auth/pkp-stytch-email-otp-auth", + "sdk/auth/pkp-native-auth/pkp-stytch-sms-otp-auth", + "sdk/auth/pkp-native-auth/pkp-stytch-whatsapp-otp-auth", + "sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth" + ] + }, + "sdk/auth/pkp-custom-auth/pkp-custom-auth", + "sdk/auth/eoa/eoa-auth" + ] + }, + { + "group": "Core API Methods", + "pages": [ + "sdk/auth-context-consumption/pkp-sign", + "sdk/auth-context-consumption/execute-js", + "sdk/auth-context-consumption/encrypt-and-decrypt" + ] + }, + { + "group": "PKP Wallet Management", + "pages": [ + "sdk/sdk-reference/lit-client/functions/createLitClient/pkp-viem-account", + "sdk/sdk-reference/lit-client/functions/createLitClient/pkp-permissions", + "sdk/sdk-reference/lit-client/functions/createLitClient/pkp-view-helpers" + ] + }, + { + "group": "Access Control Conditions", + "pages": [ + "sdk/sdk-reference/access-control-conditions/functions/createAccBuilder" + ] + }, + { + "group": "Reference", + "pages": [ + { + "group": "@lit-protocol/lit-client", + "pages": [ + "sdk/sdk-reference/lit-client/functions/createLitClient" + ] + }, + { + "group": "@lit-protocol/auth", + "pages": ["sdk/sdk-reference/auth/functions/createAuthManager"] + }, + { + "group": "@lit-protocol/networks", + "pages": ["sdk/sdk-reference/networks/functions/withOverrides"] + } + ] + }, + { + "group": "Resources", + "pages": ["sdk/resources/supported-evm-chains"] + } + ] + }, + { + "tab": "Changelog", + "pages": ["changelog"] + } + ] + }, + "logo": { + "light": "/logo/light.svg", + "dark": "/logo/dark.svg" + }, + "navbar": { + "links": [ + { + "label": "Support", + "href": "https://developer.litprotocol.com/support/intro" + } + ] + }, + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity", + "mcp", + "cursor", + "vscode" + ] + }, + "footer": { + "socials": { + "x": "https://twitter.com/litprotocol", + "discord": "https://litgateway.com/discord" + } + } +} diff --git a/docs/favicon.svg b/docs/favicon.svg new file mode 100644 index 000000000..d537cc7fb --- /dev/null +++ b/docs/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/lit-node-arch.png b/docs/images/lit-node-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..c9894a1bfa11ae54a86bf5eb2f3477fe4cbf8644 GIT binary patch literal 167537 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 **📝 Data Oracle Kit** +> +> The [Lit Oracle Kit](https://github.com/LIT-Protocol/lit-oracle-kit) demonstrates how the Lit Network can be used to sign data pulled from the web (or another blockchain) and write it to chain. +> +> **Note:** This kit is currently built for V7 of the Lit SDK. A V8 version is coming soon! + +### AI Agents and Infrastructure + +Agent devs can use Lit's signing and compute capabilities to build autonomous, verifiable, and unruggable agents and infra solutions. If you're focused on building in this category, check out Lit's [Vincent](https://heyvincent.ai/) automation system and agent deployment kit to get started. + +### Web3 Infrastructure + +Projects in this category are focused on delivering essential infrastructure critical to various aspects Web3 application development. This includes payment infrastructure, smart contract tooling, grants management, video streaming, and more. The following projects leverage Lit's signing, encryption, and compute capabilities in a multitude of ways to deliver value to end consumers. [Request Network](https://request.network/), [Crossmint](https://www.crossmint.com/), [Gitcoin](https://www.gitcoin.co/), [Livepeer](https://www.livepeer.org/), [Hats Protocol](https://www.hatsprotocol.xyz/), [Open Campus](https://opencampus.xyz/), [CharmVerse](https://charmverse.io/), [Spheron Network](https://www.spheron.network/), and [Sign Protocol](https://sign.global/). + +## Next Steps + +To learn more about how Lit Protocol works and keeps assets and data secure, continue on to the sections ahead. + +If you're a developer looking to build with the Lit SDK, check out the [Build with Lit](https://litprotocol.mintlify.app/sdk/introduction) section to get started. diff --git a/docs/learning-lit/backup-and-recovery.mdx b/docs/learning-lit/backup-and-recovery.mdx new file mode 100644 index 000000000..23955cd20 --- /dev/null +++ b/docs/learning-lit/backup-and-recovery.mdx @@ -0,0 +1,51 @@ +--- +title: "Backup and Recovery" +--- + +## Intro + +Staking $LITKEY provides the first level of resilience for the network, ensuring that should a node want to leave the network, they do so gracefully. For an additional layer of security, a backup and recovery process has been implemented to ensure that the network can be recovered even in the case that a threshold of the active node set goes permanently offline. + +## Verifiable Backups + +All keys in the network are either root keys or derived hierarchically from the root keys. These root keys are generated during each distributed key generation process (DKG) in which each Lit node generates and holds a share of each key. To ensure these key shares are safe and can be recovered as needed, they're encrypted and backed up using a dedicated recovery party and verifiable encryption. The verifiable encryption process ensures that the ciphertext (in this case, each encrypted key share) meets certain properties which allow its public key to be used to confirm that all encrypted root key shares are genuine. Every time new root keys are produced, nodes update the backups they have stored with the new data. + +The backups ensure that if the available key shares were to ever fall below threshold the network could be recovered by importing the backups into a fresh set of nodes and decrypting them with the help of the node operators and the recovery party. + +## The Recovery Party + +To assist with the recovery process, a designated set of Recovery Party members are responsible for facilitating the decryption of encrypted root key shares. For a successful recovery, more than two-thirds of these members must participate—enabling a threshold-based decryption process that ensures no single party can perform recovery unilaterally. + +Each encrypted backup is further protected using a Blinder, a symmetric encryption key held by each node operator. This additional layer ensures that even if the Recovery Party is compromised, the backups cannot be decrypted without participation from the nodes themselves. During recovery, after the Recovery Party has met quorum and produced the necessary decryption shares, each node operator applies their Blinder to fully decrypt the backup. + +This two-step safeguard ensures that: + +- The Recovery Party alone cannot decrypt the root key shares. +- The Lit nodes alone cannot decrypt the backups without the Recovery Party's participation. +- Only with cooperation from both groups—Recovery Party quorum and node-held Blinders—can the encrypted backups be fully decrypted. + +This mechanism preserves the system's threshold security guarantees, even in the context of sensitive operations like key recovery. + +## Encrypting the Backups + +The process for encrypting the root key backups involves: + +1. The nodes generate a public encryption key and the corresponding private decryption key shares using Distributed Key Generation (DKG) and provide each Recovery Party member with a decryption key share which is a private key share corresponding to the encryption key. + +2. This public key is used for encrypting the root keys to generate the backups. + +3. Each node generates a Blinder, which is used to apply an additional encryption layer to its backup. + +4. The encrypted backups are stored securely by the Lit Protocol development company. + +## Recovery Process + +If the network needs to be restored: + +1. Node operators spin up a new node environment and input their Blinder and encrypted backup. The nodes start waiting for decryption shares from the Recovery Party members. + +2. Each Recovery Party member produces a decryption share for each root key share by combining the root key share's ciphertext with their own decryption key share. Then each Recovery Party member uploads the decryption shares they generated to the nodes. (Note that decryption shares are produced by and different from decryption key shares). + +3. Each node receives such decryption shares from the Recovery Party members for each encrypted root key share that it holds. The decryption key shares a node received for a root key share are combined above the threshold, combined with the Blinder, to fully decrypt the ciphertext in the backups. Recovery, therefore, requires participation of ⅔ of the Recovery Party, ⅔ of the node operators, and ⅔ of the encrypted backups. + +4. With the decrypted root key shares in the new node environment, the network can be restored. \ No newline at end of file diff --git a/docs/learning-lit/communicating-with-lit-nodes.mdx b/docs/learning-lit/communicating-with-lit-nodes.mdx new file mode 100644 index 000000000..60744f2e6 --- /dev/null +++ b/docs/learning-lit/communicating-with-lit-nodes.mdx @@ -0,0 +1,56 @@ +--- +title: "Communicating with Lit Nodes" +--- + +## Intro + +This section explains how communications with Lit nodes are secured when performing signing, encryption, and private compute operations within Lit Actions. + +## Secure Communication Channels + +All interactions between users and Lit nodes are encrypted using SSL/TLS. This ensures that data sent to the nodes — whether for signing, decryption, or executing a Lit Actions — is protected from interception or tampering during transmission. Each node's SSL certificate is stored within its Trusted Execution Environment (TEE), making it computationally infeasible for node operators or external parties to access or manipulate them. + +When you send a request — either performing signing, decryption, or executing a Lit Action — it is: + +- **Encrypted in transit:** Secured by SSL/TLS until it reaches the node. +- **Decrypted only inside the TEE:** Processed in its clear form within the TEE, where hardware-enforced security prevents access by node operators or others. + +## Node-to-Node Communication + +When Lit nodes communicate with one another to execute user requests, these node-to-node communications are also secured using SSL. + +Before communicating with one another, the nodes perform a handshake process to verify: + +- **Staking verification:** Confirms the node is staking the requisite protocol tokens. +- **Attestation check:** Ensures the node is running untampered, correct code within its TEE. +- **Network membership:** Validates the node is part of the active node operator set. + +Only after successful verification do nodes transmit data, ensuring sensitive information is never exposed to untrusted or compromised nodes. + +## Are Requests Publicly Visible? + +A common question is whether requests sent to the Lit network, including sensitive data, are publicly visible or retrievable. The answer is **no**: + +- **Encrypted transmission:** All requests are encrypted via SSL/TLS, preventing interception. +- **Secure processing:** Data is only decrypted and processed inside the TEE, never stored or logged in clear text outside it. +- **No public broadcast:** Requests are not broadcast in a way that makes them fetchable by anyone. Nodes only share data with other verified nodes via secure channels. + +This holds true for all network operations, including signing, decryption, and Lit Action execution. It means that neither node operators nor any external parties can see or access the contents of any request. This includes any sensitive data passed into the `jsParams` of Lit Actions, such as environment variables like API or private keys. + +## Complete Request Lifecycle + +The following is the complete request lifecycle when communicating with the Lit nodes: + +1. A user sends a request to N nodes, where N must be at or above the threshold (> two-thirds of the network), with their associated authentication material. + +2. Each node independently verifies the user's auth material, ensuring they are authorized to perform a given operation. After the verification check is complete, they each run the requested operation (signing, decryption, or Lit Action execution.) + +3. In the case of interactive requests — such as ECDSA signing with Programmable Key Pairs — the nodes communicate with one another to complete those operations as needed. + +4. All operations are driven by the user - a node can not ask another node to sign or participate unless the user has also asked the other node to perform the same operation. This means that a matching "pending request" from the requesting user must be present on **all** nodes participating in interactive operations. + +## Active Nodes + +The Naga node operator set will be selected via a staking contest following the Lit TGE. Any party interested in running a node will be able to participate, and the top 10 node operators based on "[stake weight](https://github.com/LIT-Protocol/LITKEY-Token-Paper-v1/blob/main/%24LITKEY%20Whitepaper%20-%20v1.pdf)" will make up the initial operator set. More information will be shared ahead of the launch. + +Interested in running a node? [Reach out.](https://forms.gle/n4WKtsyxaduEz8dDA) diff --git a/docs/learning-lit/cryptoeconomic-security.mdx b/docs/learning-lit/cryptoeconomic-security.mdx new file mode 100644 index 000000000..2494c6fe2 --- /dev/null +++ b/docs/learning-lit/cryptoeconomic-security.mdx @@ -0,0 +1,18 @@ +--- +title: "Cryptoeconomic Security" +--- + + +The $LITKEY token and v1 Mainnet are NOT YET LIVE, but are coming soon. +[Follow Lit Protocol on X](https://x.com/LitProtocol) to stay up to date. + + +## Overview + +While threshold cryptography and TEEs provide technical security guarantees, the $LITKEY token introduces cryptoeconomic security that adds another layer of **defense in depth**. + +**$LITKEY ensures liveness** by requiring node operators to stake tokens in order to participate in the signing, encryption, and compute operations provided by the network. Slashing has been implemented to ensure that node operators keep their machines online and responsive at all times, preventing any downtime that could disrupt the network. Unlike some other protocols where slashing may also enforce computational 'correctness,' Lit Protocol relies on Trusted Execution Environments (TEEs) and threshold consensus mechanisms to guarantee the accuracy and integrity of operations. As a result, slashing in Lit Protocol is **specifically designed to enforce availability and liveness rather than correctness.** + +Additionally, token holders who aren't node operators themselves will be able to delegate their $LITKEY tokens to a node operator(s) of their choice, curating the set of active node operators and helping distribute cryptographic security across a broader set of participants. + +You can learn more about the role and utility of the $LITKEY token by checking out the [token whitepaper](https://github.com/LIT-Protocol/LITKEY-Token-Paper-v1/blob/main/%24LITKEY%20Whitepaper%20-%20v1.pdf). diff --git a/docs/learning-lit/distributed-key-generation.mdx b/docs/learning-lit/distributed-key-generation.mdx new file mode 100644 index 000000000..3c5daf635 --- /dev/null +++ b/docs/learning-lit/distributed-key-generation.mdx @@ -0,0 +1,21 @@ +--- +title: "Distributed Key Generation" +--- + +## Intro + +All Lit Protocol node operators use a [Distributed Key Generation (DKG)](https://github.com/LIT-Protocol/whitepaper/blob/main/Lit%20Protocol%20Whitepaper%20(2024).pdf) process to collectively generate all of the signing and encryption keys managed by the network. DKG ensures that no single node or party ever has access to any key in its entirety, as the entire key never exists at all. Instead, more than a threshold of the Lit nodes must come together (more than two-thirds of the network) to generate these keys and perform signing and decryption operations. + +## Root Keys + +All signing keys are derived hierarchically from a set of root keys. These root keys are periodically refreshed or reshared (see below) and are backed up regularly. See the recovery section below for more information on the backup process. + +## Key Refresh and Resharing + +Periodically, key shares are updated with a refresh scheme. This rotates the private key shares among an existing set of participating node operators without changing the underlying private key, a process known as [Proactive Secret Sharing.](https://github.com/LIT-Protocol/whitepaper/blob/main/Lit%20Protocol%20Whitepaper%20(2024).pdf) This method helps ensure the integrity of private key material for long periods of time while minimizing the risk of key compromise. + +The key refresh protocol is performed by first linearizing all of the key shares, running the same DKG algorithm with existing participants, then checking that the public key doesn't change. + +Key resharing includes the additional ability to update the set of participating node operators. This scheme allows nodes to leave and join without disrupting the service of the network. This process involves transitioning from the existing participant set to the new participant set, and can be performed as long as there are enough existing participants with key shares. The end result is that the new node operator who is dealt into the active set holds threshold shares of the same private key. This works by having existing participants linearize their shares, and new participants set their share to zero and run the same DKG while checking that the same public key is generated. + +Key refresh can be seen as a natural case of key resharing, with the participants and threshold potentially changing. \ No newline at end of file diff --git a/docs/learning-lit/how-it-works.mdx b/docs/learning-lit/how-it-works.mdx new file mode 100644 index 000000000..f8c3c5812 --- /dev/null +++ b/docs/learning-lit/how-it-works.mdx @@ -0,0 +1,24 @@ +--- +title: "How it Works" +description: "How Does Lit Protocol Work?" +--- + +## Overview + +Lit Protocol is a decentralized and programmable key management network for signing and encryption. The network is composed of a decentralized set of independent nodes, each running inside of a sealed Trusted Execution Environment (TEE). Within the TEE each node contains a unique set of key shares alongside a JavaScript execution environment. Each individual key share corresponds to a certain threshold signing or encryption key, each managed collectively by all of the nodes participating in the network. + +Developers can write immutable JS functions (called Lit Actions) that dictate how the keys managed by the network are used. This includes creating transaction automations, spending policies, access control rules, and more. These Lit Action functions inherit the same threshold and TEE-based security assumptions as the rest of the network as they are executed within the JS execution environment present in each node. + +## Managing Keys and Other Secrets + +Each Lit Protocol node participates in a Distributed Key Generation (DKG) process to create new public/private key pairs where no one party ever holds the entire key. Instead, each node holds a key share used to perform its portion of signing and decryption operations in parallel with the rest of the network. All operations require participation from more than two-thirds of the network to be executed. At no point during signing or decryption is the underlying private key exposed to any single node or requesting client. + +The Lit network supports multiple cryptographic curves, signing schemes, and key types. Additional curves and schemes can be added as desired to enable additional interoperability with a wide variety of protocols and standards. + +## Policy Enforcement and Data Orchestration – Lit Actions + +Each Lit node contains a JavaScript execution environment which allows developers to write arbitrary code that dictates how the secrets and keys managed by the network are used. These programs are called Lit Actions, immutable JS serverless functions that govern signing and encryption / decryption operations. Lit Actions can natively fetch and process data from any on or off-chain source, be used to create complex transaction automations (e.g. dollar-cost-averaging), define rules for usage and access, create spending policies, trigger signature generation, and more. + +## Further Reading + +For an in-depth overview of how Lit keeps keys and assets secure, please check out the [security](/learning-lit/security) section. \ No newline at end of file diff --git a/docs/learning-lit/node-architecture.mdx b/docs/learning-lit/node-architecture.mdx new file mode 100644 index 000000000..20b0c2cf2 --- /dev/null +++ b/docs/learning-lit/node-architecture.mdx @@ -0,0 +1,11 @@ +--- +title: "Node Architecture" +--- + +![Lit Protocol's Node Architecture](/images/lit-node-arch.png) + +Each Lit Protocol Node starts with a sealed encrypted virtual machine (otherwise known as a Trusted Execution Environment (TEE)) running on an independently operated server. The use of the TEE guarantees that all signing, encryption, and Lit Action execution requests are processed securely, without exposing sensitive key material to node operators or end users consuming the services provided by Lit Protocol. Each time you connect to the Lit network, you do an attestation handshake with each of the nodes. The Lit SDK automatically checks this attestation against certificates provided by AMD (the secure hardware utilized by Lit is AMD’s SEV-SNP), and also checks the details of the attestation report to verify that the node is genuine and running the correct version of the code. + +Within the sealed hardware, each Lit node contains a JavaScript execution environment ([Deno](https://deno.com/)) and any given number of key shares. Each key share corresponds to a key pair that is generated collectively by all participating nodes using a process called distributed key generation (DKG). + +The diagram above illustrates the make-up of a single Lit node (left), a threshold of Lit nodes cooperating to perform a given operation (middle), and a finally collection of Lit networks interoperating across a subnet architecture (right). diff --git a/docs/learning-lit/on-chain-coordination-mechanisms.mdx b/docs/learning-lit/on-chain-coordination-mechanisms.mdx new file mode 100644 index 000000000..bc328b894 --- /dev/null +++ b/docs/learning-lit/on-chain-coordination-mechanisms.mdx @@ -0,0 +1,15 @@ +--- +title: "On-Chain Coordination Mechanisms" +--- + +While Lit Protocol itself is not a blockchain, it relies on on-chain coordination mechanisms to manage shared state and enforce cryptoeconomic security for each Lit node. This is achieved through Chronicle, an Arbitrum Orbit chain that functions as the protocol's on-chain registry and node coordination layer. + +Chronicle serves several important functions, namely: + +1. **Registering Keys and Associated Permissions:** Each Programmable Key Pair (PKP) generated by the Lit node network is minted as an ERC-721 token on Chronicle. The permissions associated with these keys are managed via the related smart contracts on-chain. + +2. **Node Staking and Rewards:** Lit nodes must stake `$LITKEY` tokens on-chain in order to participate in network operations. Staking and rewards distribution take place on Chronicle. + +3. **Service Payments:** Developers who integrate the services provided by the Lit network into their own apps pay for the service via the payment contract deployed on Chronicle. + +All Lit node operators also run a replica node for the Orbit chain, ensuring Lit's on and off-chain operations remain tightly synchronized. \ No newline at end of file diff --git a/docs/learning-lit/security.mdx b/docs/learning-lit/security.mdx new file mode 100644 index 000000000..30471cc42 --- /dev/null +++ b/docs/learning-lit/security.mdx @@ -0,0 +1,35 @@ +--- +title: "Security Model" +description: "How Lit Protocol keeps data and assets secure" +--- + +# Lit Protocol's Security Model + +## Overview + +The following section provides a highly detailed and technical overview of how the Lit network keeps data and assets secure. For an introductory overview of how Lit works, check out the [how it works](/learning-lit/how-it-works) section. + +Lit uses Multi-Party Computation Threshold Signature Schemes (MPC TSS) and Trusted Execution Environments (TEEs) to manage secrets, perform signing and decryption operations, and execute Lit Actions. Each of these is actioned by every node in parallel and requires participation from more than two-thirds of the network to be executed. + +MPC TSS eliminates the central points of failure associated with key management, preventing any single entity from compromising or unilaterally accessing the private key material and other secrets managed by the network. + +The use of TEEs provide hardware-enforced isolation, ensuring that even if an adversary gains control of a node's infrastructure, **they cannot extract private key shares, manipulate computation outputs, or interfere with cryptographic execution.** + +## Audits + +All security audit reports can be found [here](https://drive.google.com/drive/folders/1Rrht88iUkzpofwl1CvP9gEjqY60BKyFn). + +## Bug Bounty Program + +We have a bug bounty program to reward security researchers who find and report vulnerabilities in our code. We are committed to keeping our code secure and we want to reward those who help us achieve that goal. + +Our repos can be found here on [Github](https://github.com/LIT-Protocol). + +If you find something and want to report it, email [bugs@litprotocol.com](mailto:bugs@litprotocol.com) with the following information: + +- A description of the vulnerability +- Steps to reproduce the vulnerability +- A description of the impact of the vulnerability +- Your name, email address, and country of residence + +Not all our repos are covered by the bug bounty program. For example, our documentation repos and some application repos are not covered. If you are unsure if a repo is covered, please email [bugs@litprotocol.com](mailto:bugs@litprotocol.com) to check. \ No newline at end of file diff --git a/docs/logo/dark.svg b/docs/logo/dark.svg new file mode 100644 index 000000000..8bc001472 --- /dev/null +++ b/docs/logo/dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/logo/light.svg b/docs/logo/light.svg new file mode 100644 index 000000000..8bc001472 --- /dev/null +++ b/docs/logo/light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/sdk/auth-context-consumption/encrypt-and-decrypt.mdx b/docs/sdk/auth-context-consumption/encrypt-and-decrypt.mdx new file mode 100644 index 000000000..05b252c51 --- /dev/null +++ b/docs/sdk/auth-context-consumption/encrypt-and-decrypt.mdx @@ -0,0 +1,158 @@ +--- +title: "Encrypt and Decrypt" +description: "Demonstrates the complete encrypt/decrypt flow using official access control conditions builder. Alice encrypts data, Bob decrypts it using properly configured access control conditions." +--- + + + If you are here to see how auth context is consumed here, jump to + [Decrypt](#decrypts-data). + + +# Prerequisites + + +- `authContext` is required. This is the result from the authentication flow. + + +## Installation + + +```bash npm +npm install @lit-protocol/access-control-conditions +``` +```bash yarn +yarn add @lit-protocol/access-control-conditions +``` +```bash pnpm +pnpm add @lit-protocol/access-control-conditions +``` +```bash bun +bun add @lit-protocol/access-control-conditions +``` + + +# Example Walkthrough + +🔐 Encrypt & Decrypt Flow + +Alice can encrypt without authentication, Bob must authenticate to decrypt. + +- Alice: Encrypts → No AuthContext needed +- Bob: Decrypts → Requires AuthContext + + +# 👩🏼 Alice + +Alice encrypts data without needing authentication + +### Create Alice's Account + +Generate Alice's account using a random private key. Alice only needs an account for encryption - no authentication required. + +```ts +import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; + +// Alice's account (sender) +const AliceAccount = privateKeyToAccount(generatePrivateKey()); +console.log("🙋‍♀️ AliceAccount:", AliceAccount.address); +``` + +# 🧔🏻‍♂️ Bob + +Bob needs authentication to decrypt data + +### Create Bob's Account + +Generate Bob's account using a random private key. Bob will need this account for authentication to decrypt data. + +```ts +import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; + +// Bob's account (recipient) +const BobsAccount = privateKeyToAccount(generatePrivateKey()); +console.log("🧔🏻‍♂️ BobsAccount:", BobsAccount.address); +``` + +# 👩🏼 Alice Defines Access Rules + +Alice decides who can decrypt her encrypted data + + + See SDK Reference for more details on the Access Control Conditions Builder. [Access Control Conditions Builder Reference](/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder) + + +### Build Access Control Conditions + +Alice defines who can decrypt the encrypted data using official access control conditions builder. These conditions reference Bob's wallet address and will be checked during decryption. + +```ts +import { createAccBuilder } from "@lit-protocol/access-control-conditions"; + +// Build access control conditions +const builder = createAccBuilder(); + +const accs = builder + .requireWalletOwnership(BobsAccount.address) + .on("ethereum") + .and() + .requireEthBalance("0", "=") + .on("yellowstone") + .build(); +``` + +# 🧔🏻‍♂️ Bob + +### Prepares for Decryption + +Bob creates authentication context to prove he meets access conditions + +```ts +// Bob needs AuthContext for decryption +const authContext = await authManager.createEoaAuthContext({ + config: { + account: BobsAccount, + }, + authConfig: { + domain: "localhost", + statement: "Decrypt test data", + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + resources: [ + ["access-control-condition-decryption", "*"], + ["lit-action-execution", "*"], + ], + }, + litClient, +}); +``` + +# 👩🏼 Alice + +### Prepares Data + +Alice configures and encrypts the data with access control conditions + +```ts +// Alice encrypts data (no AuthContext needed) +const encryptedData = await litClient.encrypt({ + dataToEncrypt: "Hello, my love! ❤️", + unifiedAccessControlConditions: accs, + chain: "ethereum", + // metadata: { dataType: 'string' }, // auto-inferred +}); +``` + +# 🧔🏻‍♂️ Bob + +### Decrypts Data + +Bob uses his authentication context to decrypt Alice's data + +```ts +// Bob decrypts data (requires AuthContext) +const decryptedResponse = await litClient.decrypt({ + data: encryptedData, + unifiedAccessControlConditions: accs, + authContext: bobAuthContext, + chain: "ethereum", +}); +``` diff --git a/docs/sdk/auth-context-consumption/execute-js.mdx b/docs/sdk/auth-context-consumption/execute-js.mdx new file mode 100644 index 000000000..9554375c2 --- /dev/null +++ b/docs/sdk/auth-context-consumption/execute-js.mdx @@ -0,0 +1,689 @@ +--- +title: "Execute Javascript" +description: "Execute custom Lit Actions using your authenticated context. Choose between custom code or IPFS-stored actions. The execution will automatically find the most optimised price, or you can specify a custom maximum price using the userMaxPrice parameter." +--- + +# Prerequisites + + +- `authContext` is required. This is the result from the authentication flow. + + +# Quick Example + + + SDK Parameter Structure: In this SDK version, all parameters are wrapped + inside a jsParams object. This allows you to access them as properties of + jsParams in your Lit Action, making validation and parameter management much + clearer. + + + + [📚 View Full LitActions API Documentation + →](https://actions-docs.litprotocol.com/) + + + +```ts Inline JS Code +// 1. Write your Lit Action code +const litActionCode = `(async () => { + const { pubkey, username, password } = jsParams; + console.log(`Username: ${username}, Password: ${password}`); + + // Sign a message with the PKP +})();`; + +// 2. Execute Lit Action with custom code +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: { + pubkey: pkpInfo.pubkey, + username: "alice", + password: "password", + }, +}); + +```` + +```ts IPFS CID +// 1. Pin your Lit Action to IPFS using eg. Pinata + +// 2. Execute Lit Action with IPFS CID +const result = await litClient.executeJs({ + ipfsId: "QmYLeVmwJPVs7Uebk85YdVPivMyrvoeKR6X37kyVRZUXW4", + authContext: authContext, + jsParams: parsedJsParams, +}); +```` + + +# Examples + +### ⚡️ Basic Fetch Example + +This Lit Action fetches real-time temperature data from the National Weather Service API and compares it against minimum and maximum thresholds provided via jsParams. It demonstrates how external data can drive conditional logic, returning different responses based on whether the current temperature falls below, within, or above the defined range. + +```ts +const _litActionCode = async () => { + try { + const url = "https://api.weather.gov/gridpoints/TOP/31,80/forecast"; + const resp = await fetch(url).then((response) => response.json()); + const temp = resp.properties.periods[0].temperature; + console.log("Current temperature from the API:", temp); + + let response = "It's just right!"; + if (temp < jsParams.minTemp) { + response = "It's too cold!"; + } else if (temp > jsParams.maxTemp) { + response = "It's too hot!"; + } + + return Lit.Actions.setResponse({ response }); + } catch (error) { + Lit.Actions.setResponse({ response: error.message }); + } +}; + +const litActionCode = `(${_litActionCode.toString()})();`; + +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: { + minTemp: 60, + maxTemp: 80, + }, +}); + +console.log("Result:", result); +``` + +#### Important Considerations + +When your Lit Action uses fetch(), it's important to understand that the request is made by every Lit node processing the action. This distributed execution has important implications for how you design both read and write operations. + +#### Read Operations + +Fetching data (e.g., weather, prices, public APIs) is generally safe as long as you're not causing side effects. However, keep the following in mind: + +- Rate Limiting: The same HTTP request will be made once per node. Be mindful of API limits, per-request billing, or throttling. +- Non-Deterministic Responses: If your API/data source returns inconsistent or non-deterministic data (e.g., timestamps, random values, latest block), each Lit node can receive a different response. This is important to consider when processing the retrieved data. + +#### Write Operations +If your Lit Action modifies external data (e.g., using POST, PUT, or DELETE), those operations must be idempotent — meaning repeated execution produces the same effect. Otherwise, you risk duplicate entries or unintended side effects. + +#### Using runOnce() +If you need to perform your read or write operation only once, check out the built-in runOnce() function that lets you define logic to be executed only by a single Lit node. + +--- + +### ⚡️ Run Once Example + + +Return Value Requirements - The function passed to runOnce() must return a value that can be serialized with toString(). Complex objects should be converted to JSON strings or simple primitives. If serialization fails, the response will default to [ERROR]. + + +The `runOnce()` function accepts a configuration object with the following properties: + + + + Determines whether the Lit Action should wait for the selected node to complete execution before continuing. Set to false for fire-and-forget behavior where there is no need to wait for the result. + + + + + A unique identifier for the operation. This is especially helpful when using multiple runOnce() calls within the same Lit Action to distinguish between them. + + +#### Important Considerations +While runOnce() is powerful, there are several important considerations to keep in mind when using it in your Lit Actions. + +#### Node Selection +The node selection process is deterministic but not predictable. You cannot control which specific node will be chosen to execute your function. The selection is based on cryptographic algorithms that ensure fairness and security. + +#### Error Handling +If the selected node fails to execute the function (due to network issues, errors, etc.), the operation may fail entirely. Implement proper error handling within your runOnce() function to gracefully handle potential failures. + +#### Consensus and Security +Operations within runOnce() don't benefit from the same consensus mechanisms as regular Lit Action code. Only one node validates the execution, so ensure your operations are secure and don't rely on consensus for correctness. + +#### Network Latency +When waitForResponse is set to true, all nodes wait for the selected node to complete execution. This can introduce latency, especially for time-consuming operations. + +--- + +### ⚡️ Decrypting within Lit Actions + + +As shown in the code example, the decryptAndCombine function will automatically use the identity provided in the authContext for decryption, unless you explicitly pass a different authSig. + +You might explicitly set authSig when the identity permitted to decrypt the data is different from the identity used to execute the Lit Action. This approach is still secure because Lit Actions are immutable, so the executor cannot modify the code to extract decrypted data and wouldn't otherwise be able to access it unless the action is intentionally returning the decrypted data. + + +The decryptAndCombine function enables you to decrypt content directly within a Lit Action. This powerful capability allows you to perform operations over sensitive data while keeping the decrypted content secure within each Lit node's [Trusted Execution Environment (TEE)](/learning-lit/security). + +Unlike traditional client-side decryption, this approach ensures that sensitive data never leaves the secure environment of the Lit nodes, making it ideal for scenarios involving API keys, private credentials, or confidential data processing. + + + + First, encrypt your data client-side using the standard Lit encryption process. This generates the ciphertext and dataToEncryptHash needed later for decryption (can you learn more about this proccess in the [Encryption & Access Control](/sdk/auth-context-consumption/encrypt-and-decrypt) section): + + ```ts + // First, encrypt your data client-side + const accessControlConditions = createAccBuilder().requireEthBalance( + '10000000000000000', '>=' + ).on('ethereum').build(); + + const encryptedData = await litClient.encrypt({ + dataToEncrypt: 'The answer to life, the universe, and everything is 42', + unifiedAccessControlConditions: accessControlConditions, + chain: 'ethereum', + }); + ``` + + + + Use the decryptAndCombine function within your Lit Action to decrypt the content. The decrypted data remains secure within the TEE environment: + + ```ts + // Then, decrypt within your Lit Action + const _litActionCode = async () => { + try { + // Decrypt the content using decryptAndCombine + const decryptedContent = await LitActions.decryptAndCombine({ + accessControlConditions: jsParams.accessControlConditions, + ciphertext: jsParams.ciphertext, + dataToEncryptHash: jsParams.dataToEncryptHash, + // The authenticated identity from the authContext used + // to make the decryption request is automatically used + // for the decryption request + authSig: null, + chain: 'ethereum', + }); + + // Use the decrypted content for your logic + LitActions.setResponse({ + response: `Successfully decrypted: ${decryptedContent}`, + success: true + }); + } catch (error) { + LitActions.setResponse({ + response: `Decryption failed: ${error.message}`, + success: false + }); + } + }; + + const litActionCode = `(${_litActionCode.toString()})();`; + + // Execute the Lit Action + const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: { + accessControlConditions, + ciphertext: encryptedData.ciphertext, + dataToEncryptHash: encryptedData.dataToEncryptHash, + }, + }); + + console.log("Decrypted content:", result.response); + ``` + + + +--- + +### ⚡️ Getting Chain RPC URLs Example + +The getRpcUrl() function allows your Lit Actions to interact with blockchain networks by providing access to RPC endpoints for various chains. This enables you to read blockchain data, call contract methods, fetch transaction information, and perform other blockchain operations directly within your Lit Actions. + +Each Lit node maintains connections to multiple blockchain networks and provides RPC access without requiring you to manage your own infrastructure or API keys. This simplifies blockchain integration and ensures consistent access across the network. + +#### Common Use Cases for getRpcUrl() + +- Reading Blockchain Data: Fetch block information, transaction details, or account balances +- Contract Interactions: Call smart contract methods to retrieve data or validate conditions +- Transaction Broadcasting: Send signed transactions to the blockchain network +- Cross-Chain Operations: Gather data from multiple blockchains within a single Lit Action + +#### Basic Usage + +Here's a simple example of using getRpcUrl() to fetch blockchain data. By default, all nodes will execute this code in parallel and should return consistent results. + +Each Lit node gets its RPC URL for Ethereum, creates a provider, and fetches the latest block information. Since all nodes are querying the same blockchain, they should return the same results, however the returned block number might still differ due to timing. + +```ts +const _litActionCode = async () => { + // Get the RPC URL for Ethereum mainnet + const rpcUrl = await Lit.Actions.getRpcUrl({ chain: "ethereum" }); + + // Create a provider using the RPC URL + const provider = new ethers.providers.JsonRpcProvider(rpcUrl); + + // Fetch the latest block information + const latestBlock = await provider.getBlock("latest"); + + // Return block information + const blockInfo = { + blockNumber: latestBlock.number, + blockHash: latestBlock.hash, + timestamp: latestBlock.timestamp, + transactionCount: latestBlock.transactions.length + }; + + Lit.Actions.setResponse({ response: blockInfo }); +}; + +const litActionCode = `(${_litActionCode.toString()})();`; + +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: {}, +}); + +console.log("Block info from all nodes:", result); +``` + +#### Important Considerations +When using getRpcUrl() in your Lit Actions, keep these important factors in mind: + +#### Supported Chains + +The getRpcUrl() function only supports the listed supported EVM chains [here](/sdk/resources/supported-evm-chains). The returned RPC URLs are public RPC endpoints that can be subject to throttling and rate limiting, so consider using your own RPC provider for more reliable access. + +#### Single Node Execution + +For operations that don't require consensus or when you want to reduce the number of RPC calls, you can combine getRpcUrl() with runOnce() to execute blockchain queries on only one node. + +#### Network Latency and Reliability + +RPC calls are subject to network conditions and blockchain congestion. Always implement proper error handling and consider timeout scenarios, especially when making multiple sequential calls. + +Additionally, since Lit Actions have a maximum execution time, waiting for a transaction to be confirmed on-chain may not be feasible, especially on blockchains with long block times. + +#### Consensus and Consistency + +When all nodes execute RPC calls simultaneously, they might receive slightly different results due to timing differences (e.g., different latest block numbers). Because the lack of consensus on the returned data, consider using runOnce() for non-deterministic operations. + +--- + +### ⚡️ Conditional Execution + +Lit Actions can utilize [Access Control Conditions](/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder) to gate any logic within your Lit Actions, enabling sophisticated conditional execution patterns. + +This powerful feature allows you to create dynamic, context-aware applications that can make decisions based on on-chain or off-chain conditions such as token balances, NFT ownership, time constraints, smart contract states, and more. + +This example demonstrates conditional signing based on ETH balance. The Lit Action checks if the authenticated user has at least 1 Wei on Ethereum before proceeding with the signature operation. If the condition fails, it returns an error message instead of signing. + +```ts + +import { createAccBuilder } from "@lit-protocol/access-control-conditions"; +import { privateKeyToAccount } from "viem/accounts"; +import { ViemAccountAuthenticator } from "@lit-protocol/auth"; +import { createSiweMessage } from "@lit-protocol/auth-helpers"; + +const _litActionCode = async () => { + try { + // Check if the authenticated user meets the conditions + const testResult = await Lit.Actions.checkConditions({ + conditions: jsParams.conditions, + authSig: jsParams.authSig, + chain: "ethereum", + }); + + let response = "Access granted"; + + if (!testResult) { + response = "Access denied: insufficient ETH balance"; + } + + return LitActions.setResponse({ response }); + } catch (error) { + LitActions.setResponse({ response: error.message }); + } +}; + +const litActionCode = `(${_litActionCode.toString()})();`; + +const accessControlConditions = createAccBuilder().requireEthBalance( + '10000000000000000', '>=' +).on('ethereum').build(); + +const aliceViemAccount = privateKeyToAccount("0xprivateKey"); +const aliceAuthSig = await ViemAccountAuthenticator.createAuthSig( + aliceViemAccount, + await createSiweMessage({ + walletAddress: aliceViemAccount.address, + nonce: (await litClient.getContext()).latestBlockhash + }) +); + +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: { + conditions: accessControlConditions, + authSig: aliceAuthSig, + }, +}); +``` + +This example demonstrates how to generate a Sign-In With Ethereum (SIWE) message using the createSiweMessage function, and then sign it using ViemAccountAuthenticator.createAuthSig function. This signed SIWE message (called an authSig) serves as cryptographic proof that Alice controls the Ethereum address the Access Control Conditions will be checking the balance for. The Lit Action derives the address from the signed SIWE message and uses it to check the balance. + +#### Example Use Cases + +Conditional execution in Lit Actions enables a wide range of applications where cryptographic operations depend on meeting specific criteria: + + +#### Access Control Scenarios + +- Token-Gated Signing: Only sign transactions or messages for users holding specific ERC20 tokens, NFTs, or specific token balances +- Tiered Data Access: Provide different API access levels, data sets, or functionality based on user credentials or membership tiers +- Multi-Chain Requirements: Gate access based on assets or conditions across multiple blockchain networks +- DAO Membership: Restrict operations to verified DAO members or governance token holders + +#### Time-Based Logic + +- Business Hours Automation: Execute different logic during business hours vs. after hours +- Time-Locked Execution: Grant execution only after specific timestamps or during scheduled time windows +- Scheduled Operations: Combine time conditions with other criteria for complex scheduling logic + +#### Dynamic Applications + +Conditional Workflows: Create self-executing logic that responds to changing on-chain or off-chain conditions +- Premium Services: Offer enhanced features, higher rate limits, or exclusive content based on user holdings +- Risk Management: Implement safety checks and conditional approvals for high-value operations + +#### Important Considerations + +When implementing conditional execution in your Lit Actions, it's important to understand how access control conditions work and plan for potential edge cases. + +#### Condition Evaluation + + +The checkConditions function returns a boolean value indicating whether the authenticated user meets the specified conditions. Always handle both true and false cases gracefully in your logic flow. + +#### Authentication Requirements +Condition checking requires a valid authSig parameter that proves the user's identity the Access Control Conditions will be checking against. In our example usage code example, this was handled by the code: + +```ts + +const aliceViemAccount = privateKeyToAccount("0xprivateKey"); +const aliceAuthSig = await ViemAccountAuthenticator.createAuthSig( + aliceViemAccount, + await createSiweMessage({ + walletAddress: aliceViemAccount.address, + nonce: (await litClient.getContext()).latestBlockhash + }) +); +``` + +#### Available Condition Types + +For a complete list of supported access control conditions and detailed examples, visit the [Access Control Conditions](/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder) documentation. + +--- + +### ⚡️ PKP Signing Example + + +This example code uses runOnce() to ensure the transaction is only submitted once, however it's required that the signAndCombineEcdsa logic exists outside of the runOnce function. This is because 2/3 of the Lit nodes are required in order to produce the signature shares to form a complete signature for the PKP. + + +The signAndCombineEcdsa function allows you to combine PKP signature shares directly within a Lit Action, rather than combining them client-side. This powerful capability enables you to use the complete signature within your Lit Action for operations like submitting signed transactions or creating signed messages. + +When using this function, signature shares are collected from each Lit node and combined on a single node, all within the secure [Trusted Execution Environment (TEE)](/learning-lit/security). The signature shares will remain within the TEE, never being exposed to the outside world, unless you explicitly share them. + +#### Key Benefits + +- Server-Side Signing: Complete the entire signing and transaction submission process within the Lit Action +- Enhanced Security: Signature shares remain within the TEE without exposure to external environments, unless you explicitly choose to share them +- Automated Workflows: Build end-to-end transaction flows that don't require client-side intervention +- Conditional Signatures: Combine with access control conditions for sophisticated automated signing logic + +#### Basic Usage + +This example demonstrates how to sign a blockchain transaction and submit it entirely within a Lit Action. The process involves combining signature shares using signAndCombineEcdsa, formatting the signature for use with ethers.js, and then submitting the signed transaction to the blockchain. + +```ts +const _litActionCode = async () => { + try { + // Combine signature shares directly within the Lit Action + const signature = await Lit.Actions.signAndCombineEcdsa({ + toSign: jsParams.toSign, + publicKey: jsParams.publicKey, + sigName: "transactionSignature", + }); + + // Parse and format the signature for use with ethers.js + const jsonSignature = JSON.parse(signature); + jsonSignature.r = "0x" + jsonSignature.r.substring(2); + jsonSignature.s = "0x" + jsonSignature.s; + const hexSignature = ethers.utils.joinSignature(jsonSignature); + + // Serialize the signed transaction + const signedTx = ethers.utils.serializeTransaction( + jsParams.unsignedTransaction, + hexSignature + ); + + // Verify the signature by recovering the address + const recoveredAddress = ethers.utils.recoverAddress(jsParams.toSign, hexSignature); + console.log("Recovered Address:", recoveredAddress); + + // Submit the transaction using runOnce to avoid duplicate submissions + const response = await Lit.Actions.runOnce( + { waitForResponse: true, name: "txnSender" }, + async () => { + try { + const rpcUrl = await Lit.Actions.getRpcUrl({ chain: jsParams.chain }); + const provider = new ethers.providers.JsonRpcProvider(rpcUrl); + const transactionReceipt = await provider.sendTransaction(signedTx); + + return `Transaction sent successfully. Hash: ${transactionReceipt.hash}`; + } catch (error) { + return `Error sending transaction: ${error.message}`; + } + } + ); + + Lit.Actions.setResponse({ response }); + } catch (error) { + Lit.Actions.setResponse({ response: `Error: ${error.message}` }); + } +}; + +const litActionCode = `(${_litActionCode.toString()})();`; + +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: { + toSign: unsignedExampleTransactionHash, + publicKey: pkpPublicKey, + unsignedTransaction: unsignedExampleTransaction, + chain: "ethereum", + }, +}); +``` + +#### Example Use Cases + +PKP signing within Lit Actions enables powerful automated workflows that combine cryptographic operations with programmable logic: + +#### Transaction Automation +- Conditional Payments: Automatically execute payments when specific on-chain or off-chain conditions are met +- Scheduled Transactions: Execute transactions at predetermined times or intervals without manual intervention +- Cross-Chain Operations: Coordinate and execute transactions across multiple blockchain networks +#### DeFi Automation +- Automated Trading: Execute trades based on price feeds or market conditions +- Yield Farming: Automatically compound rewards or rebalance positions +- Liquidation Protection: Monitor positions and automatically adjust to prevent liquidations +#### Smart Contract Interactions +- Governance Participation: Automatically vote on proposals based on predefined criteria +- Contract Upgrades: Execute contract upgrades or parameter changes when conditions are met +- Emergency Responses: Trigger emergency actions like pausing contracts or withdrawing funds + +#### Important Considerations + +When using `signAndCombineEcdsa` within Lit Actions, there are several important factors to consider for secure and effective implementation. + +#### Signature Share Combination + +The `signAndCombineEcdsa` function collects signature shares from each Lit node and combines them on a single node. This process happens entirely within the TEE, ensuring that individual signature shares are never exposed outside the secure environment. + +#### Transaction Submission +When submitting transactions, always use `runOnce()` to prevent duplicate submissions. + +#### PKP Permissions +Ensure your PKP has the appropriate permissions to sign within the Lit Action by permitting the Lit Action's IPFS CID as a permitted Auth Method with the sign-anything capability. + +#### PKP Signing Must Happen Outside of runOnce +As mentioned above, the signAndCombineEcdsa function must be called outside of the runOnce function. This is because 2/3 of the Lit nodes are required in order to produce the signature shares to form a complete signature for the PKP. Including the signAndCombineEcdsa function within the runOnce function will result in the Lit Action timing out. + +### ⚡️ PKP Signing with EIP-191 + +The ethPersonalSignMessageEcdsa function allows you to sign messages using the [EIP-191 standard](https://eips.ethereum.org/EIPS/eip-191) directly within a Lit Action. This method automatically prepends "\x19Ethereum Signed Message:\n" and the message length to your message before hashing and signing it. + +EIP-191 message signing is commonly used for authentication by creating a cryptographic proof that a specific account holder authored a particular message. + +#### Usage + +This example demonstrates how to sign a message using the EIP-191 standard within a Lit Action. + + +The ethPersonalSignMessageEcdsa function returns a boolean value indicating whether the signing was successful, while the actual signature is automatically appended to the Lit Action result using the specified sigName as the object key (messageSignature in this example). + +```ts +const _litActionCode = async () => { + try { + // Sign the message using EIP-191 standard + const sigShare = await LitActions.ethPersonalSignMessageEcdsa({ + message: jsParams.message, + publicKey: jsParams.publicKey, + sigName: "messageSignature", + }); + + // sigShare is a boolean indicating success/failure + // The actual signature is available under the sigName key + if (sigShare) { + LitActions.setResponse({ + response: "Message signed successfully", + success: true + }); + } else { + LitActions.setResponse({ + response: "Failed to sign message", + success: false + }); + } + } catch (error) { + LitActions.setResponse({ + response: `Error: ${error.message}`, + success: false + }); + } +}; + +const litActionCode = `(${_litActionCode.toString()})();`; + +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: { + message: "Hello, this is a test message for EIP-191 signing!", + publicKey: pkpPublicKey, + }, +}); + +// The complete signature will be available in the result +console.log("Signature:", result.signatures.messageSignature); +``` + +#### Example Use Cases + +EIP-191 message signing within Lit Actions enables secure authentication and verification workflows that require cryptographic proof of message authorship: + +#### Authentication & Verification +- Login Systems: Create secure login mechanisms that verify user identity through message signing +- Message Attestation: Prove that specific messages were authored by the PKP holder +- Data Integrity: Sign data payloads to ensure they haven't been tampered with +#### Decentralized Applications +- Social Platforms: Sign posts, comments, or messages to verify authenticity +- Voting Systems: Sign votes or proposals to ensure they come from verified identities +#### Oracle & Data Services +- Data Attestation: Sign external data feeds to verify their source and integrity +- API Response Verification: Prove that API responses haven't been modified in transit +- Timestamp Services: Create verifiable timestamps for events or data points + +#### Important Considerations +When using ethPersonalSignMessageEcdsa within Lit Actions, there are several important factors to consider: + +#### EIP-191 Message Format +The function automatically formats your message according to EIP-191 by prepending "\x19Ethereum Signed Message:\n" and the message length. You don't need to format the message yourself - just provide the raw message content. + +#### Return Value Structure +ethPersonalSignMessageEcdsa returns a boolean indicating success or failure. The actual signature is made available in the execution result under the sigName you specify when calling the function. + +#### PKP Permissions +To allow your Lit Action to sign with a PKP, you must add the Lit Action's IPFS CID as a permitted Auth Method for the PKP, and grant it either the sign-anything capability to enable general-purpose signing, or restrict access to the personal-sign capability to limit the PKP to only using ethPersonalSignMessageEcdsa. The latter ensures the Lit Action can only sign personal messages, not arbitrary data or transactions via signAndCombineEcdsa. + +--- + +### ⚡️ Broadcast and Collect + +The broadcastAndCollect() function allows you to run an operation on every node in the Lit network, collect their responses, and aggregate them into a single dataset. This enables you to perform additional operations over the collected responses, such as calculating medians, averages, or other statistical operations. + +When you call this function, each node executes the same operation independently, and their responses are collected and grouped together before being returned to each node for further processing. This pattern is particularly useful for scenarios where you need consensus or statistical analysis across multiple data sources. + +#### When to use broadcastAndCollect() + +- Data Aggregation: Collect multiple API responses to calculate averages, medians, or other statistics +- Consensus Building: Gather responses from multiple sources to determine the most reliable data point +- Outlier Detection: Identify and filter out anomalous responses in your dataset + +#### Basic Usage + +```ts +const _litActionCode = async () => { + // Fetch weather data on each node + const url = "https://api.weather.gov/gridpoints/TOP/31,80/forecast"; + const resp = await fetch(url).then((response) => response.json()); + const temp = resp.properties.periods[0].temperature; + + // Collect responses from all nodes and aggregate them into an array + const temperatures = await Lit.Actions.broadcastAndCollect({ + name: "temperature", + value: temp, + }); + + // Calculate median from all node responses + const median = temperatures.sort()[Math.floor(temperatures.length / 2)]; + + Lit.Actions.setResponse({ response: median }); +}; + +const litActionCode = `(${_litActionCode.toString()})();`; + +const result = await litClient.executeJs({ + code: litActionCode, + authContext: authContext, + jsParams: {}, +}); + +console.log("Median temperature from all nodes:", result); +``` + +In this example, each node fetches weather data independently, then all responses are collected and the median temperature is calculated. + +#### Important Considerations +When using broadcastAndCollect() in your Lit Actions, keep these important factors in mind: + +#### Network Calls and Timing +Each node makes independent network calls, which may return slightly different results due to timing or API rate limits. Design your aggregation logic to handle these variations gracefully. + +#### Execution Time +Since Lit Actions have execution time limits, ensure data retrieval operations complete quickly. Consider using runOnce() for operations that don't require collection from all nodes. \ No newline at end of file diff --git a/docs/sdk/auth-context-consumption/pkp-sign.mdx b/docs/sdk/auth-context-consumption/pkp-sign.mdx new file mode 100644 index 000000000..f836755ff --- /dev/null +++ b/docs/sdk/auth-context-consumption/pkp-sign.mdx @@ -0,0 +1,70 @@ +--- +title: "PKP Sign" +description: "Use your PKP to sign a message with the selected chain and scheme. The signing operation will automatically find the most optimised price, or you can specify a custom maximum price using the userMaxPrice parameter." +--- + + + See SDK Reference for more details on the PKP Sign. [PKP Sign + Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#chain-raw-pkpsign) + + +# Prerequisites + + +- `authContext` is required. This is the result from the authentication flow. +- `pubkey` is required. This is the public key of the PKP to sign with. + + +# Quick Example + +```ts +// The message string will be UTF-8 encoded before signing. +// Hashing (e.g., Keccak256 for Ethereum, SHA256 for Bitcoin) +// is handled automatically by the Lit Protocol based on the selected chain. +const messageBytes = new TextEncoder().encode(messageToSign); + +const signatures = await litClient.chain.raw.pkpSign({ + chain: "ethereum", + signingScheme: "EcdsaK256Sha256", + pubKey: pkpInfo.pubkey, + authContext: authContext, + toSign: messageBytes, // UTF-8 encoded message +}); +``` + +--- + +# Available signing schemes + +### ECDSA Schemes + +| Scheme | Curve | +|--------|-------| +| `EcdsaK256Sha256` | secp256k1 | +| `EcdsaP256Sha256` | NIST P‑256 | +| `EcdsaP384Sha384` | NIST P‑384 | + +### EdDSA Schemes + +| Scheme | Curve | +|--------|-------| +| `SchnorrEd25519Sha512` | ed25519 | +| `SchnorrEd448Shake256` | ed448 | + +### Schnorr Variants + +| Scheme | Curve | +|--------|-------| +| `SchnorrK256Taproot` | secp256k1 | +| `SchnorrK256Sha256` | secp256k1 | +| `SchnorrP256Sha256` | NIST P‑256 | +| `SchnorrP384Sha384` | NIST P‑384 | + +### ZK/Privacy Schnorr Variants + +| Scheme | Curve | +|--------|-------| +| `SchnorrRistretto25519Sha512` | Ristretto25519 | +| `SchnorrRedJubjubBlake2b512` | Jubjub | +| `SchnorrRedDecaf377Blake2b512` | Decaf377 | +| `SchnorrkelSubstrate` | sr25519 | \ No newline at end of file diff --git a/docs/sdk/auth/eoa/eoa-auth.mdx b/docs/sdk/auth/eoa/eoa-auth.mdx new file mode 100644 index 000000000..6404cf2c4 --- /dev/null +++ b/docs/sdk/auth/eoa/eoa-auth.mdx @@ -0,0 +1,97 @@ +--- +title: "EOA Authentication" +description: "EOA Auth demonstrates direct EOA usage for PKP management. Your EOA owns and directly manages PKPs, including minting, setting permissions, and viewing permissions. This approach gives you full control over PKP management." +--- + +# Prerequisites + + + 💰 Need Test Tokens? Visit the [Chronicle Yellowstone + Faucet](https://chronicle-yellowstone-faucet.getlit.dev/) to get test tokens + for your EOA account. + + +--- + + + PKPs minted with mintWithEoa require manual permission setup before they can + be used for signing operations. + + + + + + Use your connected wallet account to own and manage PKPs. + + ```ts + import { useWalletClient } from "wagmi"; + + const { data: myAccount } = useWalletClient(); + ``` + + + + + Mint a new Programmable Key Pair (PKP) using your EOA. The PKP will be owned by your EOA account. + + You will need to manually add permissions to the PKP before it can be used for signing. + + +```ts +const mintedPkpWithEoa = await litClient.mintWithEoa({ + account: myAccount, +}); +``` + + + + + Instantiate a PKP permissions manager to control your PKP permissions. This manager allows you to add, remove, and modify permissions for your PKP. + + ```ts + const pkpPermissionsManager = await litClient.getPKPPermissionsManager({ + pkpIdentifier: { + tokenId: mintedPkpWithEoa.data.tokenId, + }, + account: myAccount, + }); + ``` + + + + + View all current permissions associated with your PKP. This shows what actions and scopes are currently allowed. + +```ts +const res = await litClient.viewPKPPermissions({ + tokenId: mintedPkpWithEoa.data.tokenId, +}); + +console.log("✅ viewPKPPermissions:", res); +``` + + + + + Add permissions to allow your PKP to be used for signing operations. This adds the "sign anything" scope which enables general signing functionality. + +```ts +// Add permissions to allow the PKP to be used for signing +const addPermissionsTx = await pkpPermissionsManager.addPermittedAction({ + ipfsId: "QmWGkjZKcfsE9nabey7cXf8ViZ5Mf5CvLFTHbsYa79s3ER", + scopes: ["sign-anything"], +}); +``` + + + + +# EOA-Based Authentications + + +Key Differences: + +- EOA Native: Direct EOA ownership and management of PKPs with manual + permission setup +- EOA Auth Method: EOA used as authentication mechanism, similar to Google/Discord auth patterns + diff --git a/docs/sdk/auth/pkp-custom-auth/pkp-custom-auth.mdx b/docs/sdk/auth/pkp-custom-auth/pkp-custom-auth.mdx new file mode 100644 index 000000000..13b14fa09 --- /dev/null +++ b/docs/sdk/auth/pkp-custom-auth/pkp-custom-auth.mdx @@ -0,0 +1,165 @@ +--- +title: "PKP Custom Authentication" +description: "Implement custom PKP authentication methods with Lit Actions" +--- + +# Prerequisites + + + 💰 Need Test Tokens? Visit the [Chronicle Yellowstone + Faucet](https://chronicle-yellowstone-faucet.getlit.dev/) to get test tokens + for your EOA account. + + +# What is Custom Authentication? + +Custom Authentication allows dApp owners to provide PKPs (Programmable Key Pairs) to their users without requiring them to understand blockchain technology or manage private keys. Instead of forcing users to learn new authentication methods, you can leverage your existing authentication systems (OAuth, APIs, databases) while providing them with powerful web3 capabilities. + +This demonstrates the complete dApp-centric custom authentication flow from both perspectives: the Site Owner who sets up the system and the User who interacts with it. + +# Overview + +In this example: + +- site owners control the PKP minting process and provide immutable validation logic via IPFS. +- Users get pre-minted PKPs and authenticate through the site owner's validation Lit Action. + +# Site Owner Walkthrough + + + + + Generate a unique authentication method type for your dApp using the dApp name. This creates a secure identifier that will be used for all PKP minting and validation. + +```ts +// Generate unique auth method type for dApp +import { utils as litUtils } from "@lit-protocol/lit-client"; + +const authMethodConfig = litUtils.generateUniqueAuthMethodType({ + uniqueDappName: "stellar-network-mrcsjy", +}); + +console.log("Auth Method Type (hex):", authMethodConfig.hex); +console.log("Auth Method Type (bigint):", authMethodConfig.bigint); +``` + + + + + Create the validation logic as a Lit Action and pin it to IPFS for immutable validation. This code will run on Lit nodes to validate user authentication attempts. + + ```ts Example Validation Lit Action + (async () => { + const dAppUniqueAuthMethodType = "0x..."; + const { pkpPublicKey, username, password, authMethodId } = jsParams; + + // Custom validation logic for awesome-platform-2dprnf + const EXPECTED_USERNAME = 'alice'; + const EXPECTED_PASSWORD = 'lit'; + const userIsValid = username === EXPECTED_USERNAME && password === EXPECTED_PASSWORD; + + // Check PKP permissions + const tokenId = await Lit.Actions.pubkeyToTokenId({ publicKey: pkpPublicKey }); + const permittedAuthMethods = await Lit.Actions.getPermittedAuthMethods({ tokenId }); + + const isPermitted = permittedAuthMethods.some((permittedAuthMethod) => { + return permittedAuthMethod["auth_method_type"] === dAppUniqueAuthMethodType && + permittedAuthMethod["id"] === authMethodId; + }); + + const isValid = isPermitted && userIsValid; + LitActions.setResponse({ response: isValid ? "true" : "false" }); + })(); + ``` + + + Opens [Lit Protocol Explorer](https://explorer.litprotocol.com/create-action) to create and pin your validation Lit Action + + + + 🔍 IPFS Visibility Required: The IPFS CID must be publicly accessible via the Lit Explorer. If the CID isn't visible on explorer.litprotocol.com, the Lit nodes won't be able to fetch and execute your validation logic. + + + + + + Mint PKPs for your users using the custom auth method type and validation CID. Each user gets their own unique PKP tied to your dApp's authentication system. + +```ts +import { utils as litUtils } from "@lit-protocol/lit-client"; + +// Mint PKP for each user, assuming that's what you want to do +for (const userId of ["alice", "bob"]) { + const authData = litUtils.generateAuthData({ + uniqueDappName: "stellar-network-mrcsjy", + uniqueAuthMethodType: authMethodConfig.bigint, + userId: userId, + }); + + const { pkpData } = await litClient.mintWithCustomAuth({ + account: siteOwnerAccount, + authData: authData, + scope: "sign-anything", + validationIpfsCid: "your-validation-cid-here", + }); + + // Store PKP info for user + database.users[userId].pkpPublicKey = pkpData.data.pubkey; +} +``` + + + + +# User Walkthrough + +How users interact with the dApp to authenticate and use their PKP + + + + User logs into the dApp frontend and retrieves their pre-minted PKP information from the dApp's backend. The dApp provides the PKP public key and validation details. + + + The following code is served as an example. It is not part of the SDK. + + + ```ts + // User login and PKP retrieval + const userDashboard = dappFrontend.login('alice', password); + const userPkpInfo = userDashboard.getMyPkpInfo(); + + console.log('User PKP Public Key:', userPkpInfo.pkpPublicKey); + console.log('Validation CID:', userPkpInfo.validationCid); + ``` + + + + + Create a custom auth context using the user's PKP and the dApp's validation IPFS CID. The Lit Action will validate the user's credentials against the dApp's authentication logic. + +```ts +// Create custom auth context for user +const customAuthContext = await authManager.createCustomAuthContext({ + pkpPublicKey: userPkpInfo.pkpPublicKey, + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 15).toISOString(), + }, + litClient: litClient, + customAuthParams: { + litActionIpfsId: userPkpInfo.validationCid, + jsParams: { + pkpPublicKey: userPkpInfo.pkpPublicKey, + username: "alice", + password: userPassword, + authMethodId: userPkpInfo.authData.authMethodId, + }, + }, +}); +``` + + + diff --git a/docs/sdk/auth/pkp-native-auth/pkp-discord-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-discord-auth.mdx new file mode 100644 index 000000000..fe9d8429b --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-discord-auth.mdx @@ -0,0 +1,76 @@ +--- +title: "Discord (SSO)" +description: "Discord Authentication uses your Discord account to authenticate via the Lit Login Server or your own Login Server. This can be used to mint a PKP and then sign messages." +--- + +# Prerequisites + + + Lit Login Server & Lit Auth Server URLs. Please refer to [Auth Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + + + + To sign in with Discord, you can use the `authenticate` function provided by the DiscordAuthenticator. + + ```ts + import { DiscordAuthenticator } from "@lit-protocol/auth"; + + const authData = await DiscordAuthenticator.authenticate( + "https://login.litgateway.com" + ); +``` + + + + + You can select an existing PKP associated with your account or mint a new one. + + + ```ts Mint a fresh PKP + const res = await litClient.authService.mintWithAuth({ + authData: authData, + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts + +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + \ No newline at end of file diff --git a/docs/sdk/auth/pkp-native-auth/pkp-eoa-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-eoa-auth.mdx new file mode 100644 index 000000000..704b008f6 --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-eoa-auth.mdx @@ -0,0 +1,114 @@ +--- +title: "EOA (External Owned Account)" +description: "Externally Owned Account (EOA) authentication uses your existing Ethereum account to authenticate and mint PKPs. You can either use a private key or connect your wallet." +--- + +# Prerequisites + + + 💰 Need Test Tokens? Visit the [Chronicle Yellowstone + Faucet](https://chronicle-yellowstone-faucet.getlit.dev/) to get test tokens + for your EOA account. + + + + + + + ```typescript wagmi + // 1. import the useWalletClient function from wagmi + import { useWalletClient } from 'wagmi'; + + // 2. Use your connected wallet as the account + const { data: myAccount } = useWalletClient(); + ``` + + ```typescript viem/accounts + // 1. import the privateKeyToAccount function from viem/accounts + import { privateKeyToAccount } from 'viem/accounts'; + + // 2. Convert your private key to a viem account object that can be used for payment operations. + const myAccount = privateKeyToAccount( + process.env.PRIVATE_KEY as `0x${string}` + ); + ``` + + + + + + +Use the WalletClientAuthenticator/ViemAccountAuthenticator to authenticate your connected wallet and generate auth data. + + + ```ts wagmi +import { WalletClientAuthenticator } from '@lit-protocol/auth'; + +const authData = await WalletClientAuthenticator.authenticate(walletClient); + ``` + + ```ts viem/accounts +import { ViemAccountAuthenticator } from '@lit-protocol/auth'; + +const authData = await ViemAccountAuthenticator.authenticate(myAccount); + ``` + + + + + + + +You can select an existing PKP associated with your account or mint a new one. + + + + ```ts Mint a fresh PKP + const mintedPkpWithEoaAuth = await litClient.mintWithAuth({ + account: myAccount, // or walletClient depending on method + authData: authData, + scopes: ['sign-anything'], + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts + +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + \ No newline at end of file diff --git a/docs/sdk/auth/pkp-native-auth/pkp-google-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-google-auth.mdx new file mode 100644 index 000000000..fd930c1d1 --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-google-auth.mdx @@ -0,0 +1,76 @@ +--- +title: "Google (SSO)" +description: "Google Authentication uses your Google account to authenticate via the Lit Login Server or your own Login Server. This can be used to mint a PKP and then sign messages." +--- + +# Prerequisites + + + Lit Login Server & Lit Auth Server URLs. Please refer to [Auth Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + + + + To sign in with Google, you can use the `authenticate` function provided by the GoogleAuthenticator. + + ```ts + import { GoogleAuthenticator } from "@lit-protocol/auth"; + + const authData = await GoogleAuthenticator.authenticate( + "https://login.litgateway.com" + ); +``` + + + + + You can select an existing PKP associated with your account or mint a new one. + + + ```ts Mint a fresh PKP + const res = await litClient.authService.mintWithAuth({ + authData: authData, + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts + +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + \ No newline at end of file diff --git a/docs/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth.mdx new file mode 100644 index 000000000..12ac1f441 --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth.mdx @@ -0,0 +1,149 @@ +--- +title: "(2FA) Stytch TOTP" +description: "Stytch TOTP 2FA Authentication is a secondary authentication method that adds an extra layer of security using TOTP (Time-based One-Time Password) from authenticator apps like Google Authenticator, Authy, or 1Password." +--- + +# Prerequisites + + + ⚠️ Backend Required: This authentication method requires a backend service + that handles Stytch Email OTP operations. The auth service already has the + implementation in place with the `/stytch/email/send-otp` and + `/stytch/email/verify-otp` endpoints, but they are disabled by default. Simply + run your auth service at the configured URL to enable Stytch Email OTP + functionality. + + + + Lit Auth Server URLs. Please refer to [Auth + Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + +# (Prerequisite) TOTP Registration + +Existing Stytch User Account required. (from primary authentication methods, such as Email, SMS, or WhatsApp) + +This step must be completed before you can authenticate with TOTP 2FA. + +- See Step 3 in [Stytch Email OTP](/sdk/auth/pkp-native-auth/pkp-stytch-email-otp-auth) for more details. +- See Step 3 in [Stytch SMS OTP](/sdk/auth/pkp-native-auth/pkp-stytch-sms-otp-auth) for more details. +- See Step 3 in [Stytch WhatsApp OTP](/sdk/auth/pkp-native-auth/pkp-stytch-whatsapp-otp-auth) for more details. + + + + +Create TOTP registration with the user ID from your email/sms/whatsapp auth + +```ts +import { StytchTotp2FAAuthenticator } from "@lit-protocol/auth"; + +const registrationData = await StytchTotp2FAAuthenticator.initiateTotpRegistration({ + userId:authData?.metadata?.userId // from your email/sms/whatsapp auth + authServiceBaseUrl: "https://naga-auth-service.onrender.com" +}); +``` + + + + + Verify TOTP setup with code from authenticator app + +```ts +const verifyResult = await StytchTotp2FAAuthenticator.verifyTotpRegistration({ + userId:authData?.metadata?.userId + totpRegistrationId: registrationData.totpRegistrationId, + totpCode: "123456", // from authenticator app + authServiceBaseUrl: "https://naga-auth-service.onrender.com" +}); +``` + + + + +# TOTP Authentication + + + +Enter your Stytch User ID (from your primary authentication) and the current 6-digit TOTP code from your authenticator app to authenticate and generate authentication data. + +```ts +import { StytchTotp2FAAuthenticator } from "@lit-protocol/auth"; + +const authData = await StytchTotp2FAAuthenticator.authenticate({ + userId: "user-test-uuid-1234", // Stytch user ID from primary auth + totpCode: "123456", // 6-digit code from authenticator app + authServiceBaseUrl: "https://naga-auth-service.onrender.com", +}); +``` + + + + +Enter the OTP code sent to your WhatsApp to verify your identity and generate authentication data. + +```ts +import { StytchWhatsAppOtpAuthenticator } from "@lit-protocol/auth"; + +const authData = await StytchWhatsAppOtpAuthenticator.authenticate({ + methodId: methodId, // from sendOtp step + code: "123456", // user-entered OTP code + authServiceBaseUrl: "https://naga-auth-service.onrender.com", +}); +``` + + + + + You can select an existing PKP associated with your account or mint a new one. + + + ```ts Mint a fresh PKP + const res = await litClient.authService.mintWithAuth({ + authData: authData, + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: + +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + + diff --git a/docs/sdk/auth/pkp-native-auth/pkp-stytch-email-otp-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-stytch-email-otp-auth.mdx new file mode 100644 index 000000000..865718a15 --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-stytch-email-otp-auth.mdx @@ -0,0 +1,102 @@ +--- +title: "Stytch Email OTP" +description: "Stytch Email OTP Authentication uses Stytch's Email OTP service to authenticate users through email verification. This method sends a one-time password (OTP) to your email address, which you then use to verify your identity and mint a PKP." +--- + +# Prerequisites + + +⚠️ Backend Required: This authentication method requires a backend service that handles Stytch Email OTP operations. The auth service already has the implementation in place with the `/stytch/email/send-otp` and `/stytch/email/verify-otp` endpoints, but they are disabled by default. Simply run your auth service at the configured URL to enable Stytch Email OTP functionality. + + + + Lit Auth Server URLs. Please refer to [Auth Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + + + + + + Enter your email address to receive a one-time password (OTP). The OTP will be sent via Stytch's email service through your backend. + + ```ts + import { StytchEmailOtpAuthenticator } from "@lit-protocol/auth"; + + const { methodId } = await StytchEmailOtpAuthenticator.sendOtp({ + email: "user@example.com", + authServiceBaseUrl: "https://naga-auth-service.onrender.com" + }); + ``` + + + + Enter the OTP code sent to your email to verify your identity and generate authentication data. + + ```ts + import { StytchEmailOtpAuthenticator } from "@lit-protocol/auth"; + + const authData = await StytchEmailOtpAuthenticator.authenticate({ + methodId: methodId, // from sendOtp step + code: "123456", // user-entered OTP code + authServiceBaseUrl: "https://naga-auth-service.onrender.com" + }); + ``` + + + + Add an extra layer of security to your account by setting up TOTP (Time-based One-Time Password) 2FA. This will allow you to use authenticator apps like Google Authenticator, Authy, or 1Password for future logins. + + See [TOTP 2FA](/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth) for more details. + + + + You can select an existing PKP associated with your account or mint a new one. + + + ```ts Mint a fresh PKP + const res = await litClient.authService.mintWithAuth({ + authData: authData, + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts + +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + \ No newline at end of file diff --git a/docs/sdk/auth/pkp-native-auth/pkp-stytch-sms-otp-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-stytch-sms-otp-auth.mdx new file mode 100644 index 000000000..6ceff065b --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-stytch-sms-otp-auth.mdx @@ -0,0 +1,110 @@ +--- +title: "Stytch SMS OTP" +description: "Stytch SMS OTP Authentication uses Stytch's SMS OTP service to authenticate users through mobile phone verification. This method sends a one-time password (OTP) to your phone number, which you then use to verify your identity and mint a PKP." +--- + +# Prerequisites + + + ⚠️ Backend Required: This authentication method requires a backend service + that handles Stytch Email OTP operations. The auth service already has the + implementation in place with the `/stytch/email/send-otp` and + `/stytch/email/verify-otp` endpoints, but they are disabled by default. Simply + run your auth service at the configured URL to enable Stytch Email OTP + functionality. + + + + Lit Auth Server URLs. Please refer to [Auth + Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + + + + Enter your phone number to receive a one-time password (OTP). The OTP will be sent via Stytch's SMS service through your backend. + +```ts +import { StytchSmsOtpAuthenticator } from "@lit-protocol/auth"; + +const { methodId } = await StytchSmsOtpAuthenticator.sendOtp({ + phoneNumber: "+1234567890", + authServiceBaseUrl: "https://naga-auth-service.onrender.com", +}); +``` + + + + +Enter the OTP code sent to your phone to verify your identity and generate authentication data. + +```ts +import { StytchSmsOtpAuthenticator } from "@lit-protocol/auth"; + +const authData = await StytchSmsOtpAuthenticator.authenticate({ + methodId: methodId, // from sendOtp step + code: "123456", // user-entered OTP code + authServiceBaseUrl: "https://naga-auth-service.onrender.com", +}); +``` + + + + + Add an extra layer of security to your account by setting up TOTP (Time-based One-Time Password) 2FA. This will allow you to use authenticator apps like Google Authenticator, Authy, or 1Password for future logins. + + See [TOTP 2FA](/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth) for more details. + + + + You can select an existing PKP associated with your account or mint a new one. + + + ```ts Mint a fresh PKP + const res = await litClient.authService.mintWithAuth({ + authData: authData, + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: + +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + + diff --git a/docs/sdk/auth/pkp-native-auth/pkp-stytch-whatsapp-otp-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-stytch-whatsapp-otp-auth.mdx new file mode 100644 index 000000000..c6a860598 --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-stytch-whatsapp-otp-auth.mdx @@ -0,0 +1,111 @@ +--- +title: "Stytch WhatsApp OTP" +description: "Enter your phone number to receive a one-time password (OTP) via WhatsApp. The OTP will be sent through Stytch's WhatsApp service via your backend to your WhatsApp account." +--- + +# Prerequisites + + + ⚠️ Backend Required: This authentication method requires a backend service + that handles Stytch Email OTP operations. The auth service already has the + implementation in place with the `/stytch/email/send-otp` and + `/stytch/email/verify-otp` endpoints, but they are disabled by default. Simply + run your auth service at the configured URL to enable Stytch Email OTP + functionality. + + + + Lit Auth Server URLs. Please refer to [Auth + Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + + + +Enter your phone number to receive a one-time password (OTP) via WhatsApp. The OTP will be sent through Stytch's WhatsApp service via your backend to your WhatsApp account. + +```ts +import { StytchWhatsAppOtpAuthenticator } from "@lit-protocol/auth"; + +const { methodId } = await StytchWhatsAppOtpAuthenticator.sendOtp({ + phoneNumber: "+1234567890", + authServiceBaseUrl: "https://naga-auth-service.onrender.com", +}); +``` + + + + +Enter the OTP code sent to your WhatsApp to verify your identity and generate authentication data. + +```ts +import { StytchWhatsAppOtpAuthenticator } from "@lit-protocol/auth"; + +const authData = await StytchWhatsAppOtpAuthenticator.authenticate({ + methodId: methodId, // from sendOtp step + code: "123456", // user-entered OTP code + authServiceBaseUrl: "https://naga-auth-service.onrender.com" +}); +``` + + + + + Add an extra layer of security to your account by setting up TOTP (Time-based One-Time Password) 2FA. This will allow you to use authenticator apps like Google Authenticator, Authy, or 1Password for future logins. + + See [TOTP 2FA](/sdk/auth/pkp-native-auth/pkp-stytch-2fa-totp-auth) for more details. + + + + + You can select an existing PKP associated with your account or mint a new one. + + + ```ts Mint a fresh PKP + const res = await litClient.authService.mintWithAuth({ + authData: authData, + }); + ``` + + ```ts Using an existing PKP + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: + +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + + diff --git a/docs/sdk/auth/pkp-native-auth/pkp-webauthn-auth.mdx b/docs/sdk/auth/pkp-native-auth/pkp-webauthn-auth.mdx new file mode 100644 index 000000000..2afc98bd4 --- /dev/null +++ b/docs/sdk/auth/pkp-native-auth/pkp-webauthn-auth.mdx @@ -0,0 +1,84 @@ +--- +title: "WebAuthn" +description: "WebAuthn Authentication uses your device's secure hardware (such as fingerprint sensor, facial recognition, or security key) to authenticate you via the FIDO2/WebAuthn standard. This can be used to mint a PKP and then sign messages." +--- + +# Prerequisites + + + Lit Auth Server URLs. Please refer to [Auth Services](/sdk/getting-started/auth-services#naga-dev-network) section. + + + + + 1a. Register a new WebAuthn credential using the options obtained from the server. This will prompt you to use your device's authentication method (fingerprint, face ID, etc.). Then, we immediately mint a PKP and associate it with it. + + 1b. If you already have a registered WebAuthn credential, you can authenticate with it directly. + + Each WebAuthn credential is bound to a single PKP; you cannot mint another with it. + + + + ```ts Register a new WebAuthn credential and mint a PKP + import { WebAuthnAuthenticator } from "@lit-protocol/auth"; + + const { pkpInfo, webAuthnPublicKey } = await WebAuthnAuthenticator.registerAndMintPKP({ + authServiceBaseUrl: "https://naga-auth-service.onrender.com", + scopes: ["sign-anything"], + }); + ``` + + ```ts Using an existing WebAuthn credential + import { WebAuthnAuthenticator } from "@lit-protocol/auth"; + + const authData = await WebAuthnAuthenticator.authenticate({ + authServiceBaseUrl: "https://naga-auth-service.onrender.com", + }); + ``` + + + + + + + + ```ts + const result = await litClient.viewPKPsByAuthData({ + authData: { + authMethodType: authData.authMethodType, + authMethodId: authData.authMethodId, + }, + pagination: { + limit: 5, + offset: 0, + } + }); + ``` + + + +Use your newly minted PKP to create an AuthContext. This method will cache two things: +1. session key pair - a temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + - A public key - shared with the Lit nodes + - A secret key (private key) - kept securely on the client +2. Delegation AuthSig aka. the inner auth sig - a cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP. + +```ts + +const authContext = await authManager.createPkpAuthContext({ + authData: authData, // <-- Retrieved earlier + pkpPublicKey: pkpInfo.pubkey, // <-- Minted earlier + authConfig: { + resources: [ + ["pkp-signing", "*"], + ["lit-action-execution", "*"], + ], + expiration: new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(), + statement: "", + domain: window.location.origin, + }, + litClient: litClient, +}); +``` + + \ No newline at end of file diff --git a/docs/sdk/getting-started/auth-manager.mdx b/docs/sdk/getting-started/auth-manager.mdx new file mode 100644 index 000000000..d1f84c6c5 --- /dev/null +++ b/docs/sdk/getting-started/auth-manager.mdx @@ -0,0 +1,121 @@ +--- +title: "Auth Manager Setup" +description: "Configure the authentication manager with storage options and auth methods" +--- + + +See SDK Reference for more details on the Auth Manager. [Auth Manager Reference](/sdk/sdk-reference/auth/functions/createAuthManager) + + +## Overview & Key Concepts + +The Auth Manager handles authentication flows and session persistence. + +### AuthContext Creation + +This method caches two components: + +**Session Key Pair**: A temporary cryptographic key pair generated on the client side that acts as a temporary identity for the client application. It consists of: + +- **Public key** - shared with the Lit nodes +- **Secret key (private key)** - kept securely on the client + +**Delegation AuthSig (Inner Auth Sig)**: A cryptographic attestation from the Lit Protocol nodes that authorises your session key to act on behalf of your PKP + + + + +Run the following command to install the SDK: + + + +```bash npm +npm i @lit-protocol/auth +``` + +```bash yarn +yarn add @lit-protocol/auth +``` + +```bash pnpm +pnpm add @lit-protocol/auth +``` + +```bash bun +bun add @lit-protocol/auth +``` + + + + + Choose the appropriate network based on your development stage and requirements, then create your Lit Client instance. + + + +```typescript browser +import { createAuthManager, storagePlugins } from "@lit-protocol/auth"; + +const authManager = createAuthManager({ + storage: storagePlugins.localStorage({ + appName: "my-app", + networkName: "naga-dev", + }), +}); +``` + +```typescript node.js +import { createAuthManager, storagePlugins } from "@lit-protocol/auth"; + +const authManager = createAuthManager({ + storage: storagePlugins.localStorageNode({ + appName: "my-node-app", + networkName: "naga-dev", + storagePath: "./lit-auth-storage", + }), +}); +``` + +```typescript custom +import { createAuthManager } from "@lit-protocol/auth"; + +// Custom storage plugin example +const customStorage = { + async write({ address, authData }) { + // Your custom write logic + await myDatabase.set(`lit-auth:${address}`, authData); + }, + async read({ address }) { + // Your custom read logic + return await myDatabase.get(`lit-auth:${address}`); + }, + async writeInnerDelegationAuthSig({ publicKey, authSig }) { + // Store delegation auth signature + await myDatabase.set(`lit-delegation:${publicKey}`, authSig); + }, + async readInnerDelegationAuthSig({ publicKey }) { + // Retrieve delegation auth signature + return await myDatabase.get(`lit-delegation:${publicKey}`); + }, + // ... implement other required methods +}; + +const authManager = createAuthManager({ + storage: customStorage, +}); +``` + + + + + + + +## Storage Options Comparison + +Select the appropriate network environment based on your development stage and requirements. Each network offers different characteristics for testing and production use cases. + +| Storage Type | Persistence | Use Case | Environment | +| -------------------- | --------------------------------------- | -------------------------------------------------- | ------------ | +| **localStorage** | Survives page refresh & browser restart | Web applications, client-side storage | Browser | +| **localStorageNode** | File-based persistent storage | Node.js applications, server-side scripts | Node.js only | +| **custom** | Depends on implementation | Database storage, encrypted storage, cloud storage | Custom | diff --git a/docs/sdk/getting-started/auth-services.mdx b/docs/sdk/getting-started/auth-services.mdx new file mode 100644 index 000000000..f34a7c894 --- /dev/null +++ b/docs/sdk/getting-started/auth-services.mdx @@ -0,0 +1,241 @@ +--- +title: "Auth Services Setup" +description: "Configure auth services for the Lit JS SDK" +--- + + + 💰 Need Test Tokens? Visit the [Chronicle Yellowstone + Faucet](https://chronicle-yellowstone-faucet.getlit.dev/) to get test tokens + for your EOA account. + + +## Overview + +The Lit Protocol Auth Services package helps you run the infrastructure required to mint Programmable Key Pairs (PKPs) and power OAuth-based sign-in flows. + +- `Auth Service`: Handles PKP minting for supported auth methods and exposes APIs consumed by the Lit JS SDK. +- `Login Server`: Manages OAuth flows (Google, Discord, etc.) and issues short-lived session tokens that the Auth Service consumes. + +## Hosted Auth Services + +Lit hosts default Auth Service instances so you can build without deploying infrastructure on day one. Point your application to the URL that matches the network you're targeting: + +| Network | Auth Service URL | Login Server | Usage | +| ----------- | ------------------------------------------- | ------------------------------ | ----- | +| `naga-dev` | `https://naga-dev-auth-service.getlit.dev` | `https://login.litgateway.com` | Use Lit's hosted endpoints while you prototype. Configure your SDK or environment variables with the URLs in this table. | +| `naga-test` | `https://naga-test-auth-service.getlit.dev` | `https://login.litgateway.com` | Start with the hosted endpoints for staging, then switch to your own infrastructure as you scale. | +| `naga` | `Run your own (recommended)` | `Run your own (recommended)` | Lit does not operate public Auth Service or Login Server endpoints for `naga` | + + + The hosted services are best suited for prototyping. Self-host the Auth + Service and Login Server for production traffic or when you need custom + configuration. + + + +### Install the SDK + +Run the following command to install the SDK: (Only available using Bun to install at the moment.) + + + +```bash npm +npm i @lit-protocol/auth-services +``` + +```bash yarn +yarn add @lit-protocol/auth-services +``` + +```bash pnpm +pnpm add @lit-protocol/auth-services +``` + +```bash bun +bun add @lit-protocol/auth-services +``` + + + +### Lit Auth Service + +Choose how to run: + +- One-click Deploy (Railway) +- Container image (Docker) +- Use the package (Node.js) + +#### One-click Deploy (Railway) + +[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/OYOevk?referralCode=RP1REI&utm_medium=integration&utm_source=template&utm_campaign=generic) + +#### Container image + +- Image: ghcr.io/lit-protocol/lit-auth-server + +```bash +docker run \ + -p 6380:6380 \ + --env-file .env \ + ghcr.io/lit-protocol/lit-auth-server:latest +``` + +#### Use the package (Node.js) + + + + Create the Lit Auth Service instance. + + ```typescript + // Auth Server Setup + import { createLitAuthServer } from "@lit-protocol/auth-services"; + + const litAuthServer = createLitAuthServer({ + port: process.env.PORT || 6380, + network: process.env.NETWORK || "naga-dev", + litTxsenderRpcUrl: process.env['LIT_TXSENDER_RPC_URL'], + litTxsenderPrivateKey: process.env['LIT_TXSENDER_PRIVATE_KEY'], + litDelegationRootMnemonic: process.env['LIT_DELEGATION_ROOT_MNEMONIC'], + enableApiKeyGate: process.env['ENABLE_API_KEY_GATE'] === "true", + }); + + // Start the auth server + await litAuthServer.start(); + ``` + + + + + +```ts +// Worker Setup +import { startAuthServiceWorker } from "@lit-protocol/auth-services"; + +// Start the background worker for processing PKP minting operations +await startAuthServiceWorker(); + +// The worker handles: +// - Background PKP minting operations (non-blocking) +// - Job queue processing with BullMQ +// - Redis connection management +// - Error handling and retry logic for minting jobs +``` + + + + + Setup the environment variables. + + ```bash + +# Network configuration (supports naga-dev, naga-test, naga) +NETWORK=naga-dev +LOG_LEVEL=debug + +# Lit transaction sender settings +LIT_TXSENDER_RPC_URL=https://yellowstone-rpc.litprotocol.com +LIT_TXSENDER_PRIVATE_KEY=your_private_key +LIT_DELEGATION_ROOT_MNEMONIC= + +# Redis settings for job queue and caching +REDIS_URL=redis://user:pass@redis-host.com:12345 +PORT=6380 + +# Rate limiting configuration +ENABLE_API_KEY_GATE=true +MAX_REQUESTS_PER_WINDOW=10 +WINDOW_MS=10000 + +# Stytch configuration (for OTP services) +STYTCH_PUBLIC_TOKEN=your_stytch_public_token +STYTCH_SECRET=your_stytch_secret + +```` + + + + +### Lit Login Server + +#### Prerequisites + +- Google OAuth 2.0 (Web) client ID and client secret. Use the official guide: Get your Google API client ID. +- Discord application client ID and client secret. Follow the official guide: Discord OAuth2. + + + You should set the callback/redirect URLs to the same domain as the Login + Server. eg. > - https://your-domain.com/auth/discord/callback > - + https://your-domain.com/auth/google/callback + + +#### One-click Deploy (Railway) + +[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/RO0wsZ?referralCode=RP1REI&utm_medium=integration&utm_source=template&utm_campaign=generic) + +#### Container image + +- Image: ghcr.io/lit-protocol/lit-login-server + +```bash +docker run \ + -p 3300:3300 \ + -e GOOGLE_CLIENT_ID=your_google_client_id \ + -e GOOGLE_CLIENT_SECRET=your_google_client_secret \ + -e DISCORD_CLIENT_ID=your_discord_client_id \ + -e DISCORD_CLIENT_SECRET=your_discord_client_secret \ + ghcr.io/lit-protocol/lit-login-server:latest +```` + +#### Use the package (Node.js) + + + + Create the Lit Login Server instance. + ```typescript + // Login Server Setup + import { createLitLoginServer } from "@lit-protocol/auth-services"; + + const litLoginServer = createLitLoginServer({ + port: 3300, + host: "0.0.0.0", + stateExpirySeconds: 30, + + // OAuth provider configuration + socialProviders: { + google: { + clientId: process.env.GOOGLE_CLIENT_ID!, + clientSecret: process.env.GOOGLE_CLIENT_SECRET!, + }, + discord: { + clientId: process.env.DISCORD_CLIENT_ID!, + clientSecret: process.env.DISCORD_CLIENT_SECRET!, + }, + }, + }); + + // Start the login server + await litLoginServer.start(); + ``` + + + + +```bash +# OAuth provider credentials + +# Google +GOOGLE_CLIENT_ID=your_google_client_id +GOOGLE_CLIENT_SECRET=your_google_client_secret + +# Discord +DISCORD_CLIENT_ID=your_discord_client_id +DISCORD_CLIENT_SECRET=your_discord_client_secret + +``` + + + + + When you run a custom Login Server, the `DISCORD_CLIENT_ID` is embedded into the `authMethodId` that Lit nodes use to locate the correct PKP. Make sure the value matches the client ID you used when minting the Discord auth method. + +``` diff --git a/docs/sdk/getting-started/lit-client.mdx b/docs/sdk/getting-started/lit-client.mdx new file mode 100644 index 000000000..49d0a4974 --- /dev/null +++ b/docs/sdk/getting-started/lit-client.mdx @@ -0,0 +1,89 @@ +--- +title: "Lit Client Setup" +description: "Configure the Lit Protocol client for the Lit JS SDK" +--- + + +See SDK Reference for more details on the Lit Client. [Lit Client Reference](/sdk/sdk-reference/lit-client/functions/createLitClient) + + +## Overview + +The Lit Client is the core interface for interacting with the Lit Protocol network. + + + + Run the following command to install the SDK: + + + + ```bash npm + npm i @lit-protocol/lit-client @lit-protocol/networks + ``` + + ```bash yarn + yarn add @lit-protocol/lit-client @lit-protocol/networks + ``` + + ```bash pnpm + pnpm add @lit-protocol/lit-client @lit-protocol/networks + ``` + + ```bash bun + bun add @lit-protocol/lit-client @lit-protocol/networks + ``` + + + + + + + Choose the appropriate network based on your development stage and requirements, then create your Lit Client instance. + + Choose the appropriate network based on your development stage and requirements, then create your Lit Client instance. + + + +```typescript dev +import { nagaDev } from "@lit-protocol/networks"; +import { createLitClient } from "@lit-protocol/lit-client"; + +const litClient = await createLitClient({ + network: nagaDev, +}); +``` + +```typescript test +// ❗️ Currently in development. Coming soon... +import { nagaTest } from "@lit-protocol/networks"; +import { createLitClient } from "@lit-protocol/lit-client"; + +const litClient = await createLitClient({ + network: nagaTest, +}); +``` + +```typescript production +// ❗️ Currently in development. Coming soon... +import { nagaProduction } from "@lit-protocol/networks"; +import { createLitClient } from "@lit-protocol/lit-client"; + +const litClient = await createLitClient({ + network: nagaProduction, +}); +``` + + + + + + +## Network Comparison + +Select the appropriate network environment based on your development stage and requirements. Each network offers different characteristics for testing and production use cases. + +| Network | Type | Key Persistence | Payment Required | Use Case | Status | +| -------------- | ------------- | ---------------- | ---------------- | ---------------------- | -------------- | +| **Dev** | Centralised | ❌ Temporary | ❌ Free | Development & Testing | ✅ Available | +| **Test** | Decentralised | ⚠️ No guarantees | ✅ Required | Pre-production Testing | ❌ Coming Soon | +| **Production** | Decentralised | ✅ Persistent | ✅ Required | Live Applications | ❌ Coming Soon | diff --git a/docs/sdk/getting-started/payment-manager-setup.mdx b/docs/sdk/getting-started/payment-manager-setup.mdx new file mode 100644 index 000000000..008fd7d14 --- /dev/null +++ b/docs/sdk/getting-started/payment-manager-setup.mdx @@ -0,0 +1,153 @@ +--- +title: "Payment Manager Setup" +description: "Configure payment system for the Lit JS SDK" +--- + + + ❗️ Currently free on the dev network, so no need to deposit funds. More + details coming soon for test and production networks. + + + + 💰 Need Test Tokens? Visit the [Chronicle Yellowstone + Faucet](https://chronicle-yellowstone-faucet.getlit.dev/) to get test tokens + for your EOA account. + + + + See SDK Reference for more details on the Payment Manager. [Payment Manager + Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#getpaymentmanager) + + +## Overview + +The Payment Manager demonstrates Lit Protocol's payment system - a billing system for decentralised cryptographic services. Users pay for compute resources on the Lit network to access core services like: + +- Encryption/Decryption - Secure data with programmable access control +- PKP Signing - Cryptographic keys that can sign transactions based on conditions +- Lit Actions - Serverless functions with cryptographic capabilities + +Similar to how you pay AWS for cloud computing, this\system ensures the decentralised network can sustain itself and pay node operators. You can deposit funds, request withdrawals with security delays, and manage balances for yourself or other users (enabling applications to sponsor their users' costs for better UX). + + + + +```typescript +import { createLitClient } from '@lit-protocol/lit-client'; +import { nagaTest } from '@lit-protocol/networks'; + +// 1. Create lit client +const litClient = await createLitClient({ network: nagaTest }); + +// 2. Get PaymentManager instance (requires account for transactions) +const paymentManager = await litClient.getPaymentManager({ +account: yourAccount // viem account instance +}); +```` + + + + + + +```typescript wagmi +// 1. import the useWalletClient function from wagmi +import { useWalletClient } from 'wagmi'; + +// 2. Use your connected wallet as the account +const { data: myAccount } = useWalletClient(); +```` + +```typescript viem/accounts +// 1. import the privateKeyToAccount function from viem/accounts +import { privateKeyToAccount } from "viem/accounts"; + +// 2. Convert your private key to a viem account object that can be used for payment operations. +const myAccount = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); +``` + + + + + + + +```typescript Deposit funds to your own account +// 1. Deposit funds to your own account +const result = await paymentManager.deposit({ + amountInEth: "0.1", +}); + +console.log(`Deposit successful: ${result.hash}`); +// Returns: { hash: string, receipt: object } +``` + +```typescript Deposit for another user +// 1. Deposit funds for another user +const result = await paymentManager.depositForUser({ + userAddress: "0x742d35Cc6638Cb49f4E7c9ce71E02ef18C53E1d5", + amountInEth: "0.05", +}); + +console.log(`Deposit successful: ${result.hash}`); +// Returns: { hash: string, receipt: object } +``` + + + + + + +## Auth Service API Endpoints + +Leverage the hosted Auth Service to manage delegation without exposing private keys in your application: + +- `POST /register-payer` - Send your `x-api-key` header to receive a delegated payer address and `payerSecretKey`. Persist this secret securely; it is required for all future delegation calls. +- `POST /add-users` - Provide headers `x-api-key` and `payer-secret-key` plus a JSON body containing an array of user addresses. The Auth Service uses the Payment Manager internally to delegate payments to each address in a single transaction. + +> The legacy capacity-credit minting flow has been removed. Payment delegation now interacts directly with the Payment Manager contracts. + +```typescript +import { createLitClient } from '@lit-protocol/lit-client'; +import { nagaTest } from '@lit-protocol/networks'; + +// 1. Create the Lit client for the naga-test environment +const litClient = await createLitClient({ network: nagaTest }); + +const authServiceBaseUrl = 'https://naga-test-auth-service.example.com'; +const apiKey = process.env.LIT_API_KEY!; + +// 3. Register a payer wallet (store the secret securely server-side) +const registerResponse = await litClient.authService.registerPayer({ +authServiceBaseUrl, +apiKey, +}); + +console.log('Payer wallet:', registerResponse.payerWalletAddress); +console.log('Payer secret (store securely!):', registerResponse.payerSecretKey); + +// 4. Later on, delegate payments for multiple users using the saved secret +const delegateResponse = await litClient.authService.delegateUsers({ +authServiceBaseUrl, +apiKey, +payerSecretKey: registerResponse.payerSecretKey, +userAddresses: [ + '0x1234...abcd', + '0xabcd...1234', +], +}); + +console.log('Delegation submitted with tx hash:', delegateResponse.txHash); + +// 5. Continue to use the same payer secret for future delegation calls +```` + +### How the Auth Service derives payer wallets + +- The service holds a single root mnemonic (`LIT_DELEGATION_ROOT_MNEMONIC`). +- `/register-payer` combines the `x-api-key` header with a freshly generated `payerSecretKey`. That pair is hashed into a deterministic derivation index, which is then used with the root mnemonic to derive a unique child wallet. +- The response includes the derived wallet address and the random `payerSecretKey`. The server does not store this secret; you must persist it securely on the client side. +- Later, `/add-users` expects both headers (`x-api-key` and `payer-secret-key`). The service recomputes the same derivation index and wallet on the fly, so the same header pair always maps to the same child wallet. +- Calling `/register-payer` again with the same API key issues a new random `payerSecretKey`, which leads to a different child wallet. Choose whether to rotate secrets or keep the original one depending on your application needs. + +![](https://www.plantuml.com/plantuml/png/XPAn3jCm48PtFyMfKw8IiKSAQcab1a1K58c1CXpEaLWaJcHVIlFs6DkKcBHYYy-Vl_Floyuo6fxwJh3YZc0_SGjdCbSb2KuuzwGPZjHHWwm6BSJeS2NLYAw-ENJAxMy0BOJFT7ifyz3lGbodv3l5qG3lKMD3nlFn-ndh6RTyr3lSFTN5MYo96Xc_eINOh8F2OT1iKFeUzuKGLGKVgL6MoS28CnceAX5lNhnQ1YpXzE7y2LwQY1SUl-ZiLk2eYXyqvsA1hqw_8Kq6cKARCqb3VD57CkfAy1ExZXY-cw67NbC_Q2LX2quCJfnwdJXSi0ogp_xilguDMNlH2_rRcdt2-0m4aoLZ_viGwxhmv3BSYz2iiDuSAXxwydMLEmwaX8RYBBDSnABR_plY4fmCcToZEbUgMM1Ub0uxGoc7INCk0XNJf509Ibj6pGfvPVyNhUCZnRfzZIpRp4VCHGgxu_TVo1zSlAxuim75WoPy0qEIrCWhPJeBZxPeswUpjvEKP2rix-IET3trtIy0) diff --git a/docs/sdk/getting-started/prerequisites/chain-config.mdx b/docs/sdk/getting-started/prerequisites/chain-config.mdx new file mode 100644 index 000000000..50e763df0 --- /dev/null +++ b/docs/sdk/getting-started/prerequisites/chain-config.mdx @@ -0,0 +1,51 @@ +--- +title: "Chain Config" +--- + +### Chronicle Yellowstone - Lit Protocol Testnet + +| Property | Value | +| -------- | ----- | +| ChainID | 175188 (0x2ac54) | +| Currency | tstLPX | +| RPC URL | `https://yellowstone-rpc.litprotocol.com/` | + +Also see [Chainlist](https://chainlist.org/chain/175188) for more details. + + +### Viem Chain Config for the Chronicle Yellowstone network + +```ts +import { Chain, http } from "viem"; + +export const viemChainConfig: Readonly = Object.freeze({ + id: 175188, + name: "Chronicle Yellowstone", + nativeCurrency: { + name: "Chronicle Yellowstone", + symbol: "tstLPX", + decimals: 18, + }, + rpcUrls: { + default: { + http: ["https://yellowstone-rpc.litprotocol.com/"], + }, + public: { + http: ["https://yellowstone-rpc.litprotocol.com/"], + }, + }, + blockExplorers: { + default: { + name: "Yellowstone Explorer", + url: "https://yellowstone-explorer.litprotocol.com/", + }, + }, +}); +``` + +Alternatively, we also provide a helper function to get the viem chain config. You can use + +```ts +litClient.getChainConfig().viemConfig +``` +to get the viem chain config. See [Lit Client Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#getchainconfig) for more details. diff --git a/docs/sdk/getting-started/prerequisites/faucet.mdx b/docs/sdk/getting-started/prerequisites/faucet.mdx new file mode 100644 index 000000000..35c74c175 --- /dev/null +++ b/docs/sdk/getting-started/prerequisites/faucet.mdx @@ -0,0 +1,6 @@ +--- +title: "Faucet" +--- + +💰 Visit the [Chronicle Yellowstone +Faucet](https://chronicle-yellowstone-faucet.getlit.dev/) to get some test tokens. \ No newline at end of file diff --git a/docs/sdk/introduction.mdx b/docs/sdk/introduction.mdx new file mode 100644 index 000000000..ceaeb6c4e --- /dev/null +++ b/docs/sdk/introduction.mdx @@ -0,0 +1,33 @@ +--- +title: "Introduction" +description: "Explore our JS SDK for building applications with Lit Protocol" +--- + +# SDK Reference + +The Lit JS SDK provides a comprehensive toolkit for integrating Lit Protocol's decentralised authentication and cryptographic capabilities into your applications. This reference documentation covers all the methods, classes, and configuration options available in the SDK. + +### 1. Client Setup Layer + +- **[Lit Client Setup](/sdk/getting-started/lit-client)**: Configure the Lit Protocol client +- **[Auth Manager Setup](/sdk/getting-started/auth-manager)**: Set up authentication management with configurable storage options +- **[Payment Manager Setup](/sdk/getting-started/payment-setup)**: Configure payment processing capabilities +- **[Auth Services Setup](/sdk/getting-started/auth-services)**: Configure auth services + +### 2. Authentication Options + +- **[PKP Native Authentication](/sdk/auth/pkp-native-auth)**: Programmable Key Pair native authentication options +- **[PKP Custom Authentication](/sdk/auth/pkp-custom-auth)**: Custom PKP authentication implementations +- **[EOA Authentication](/sdk/auth/eoa-auth)**: Externally Owned Account authentication + +### 3. Auth Context Consumption / Core API Methods + +- **[pkpSign](/sdk/auth-context-consumption/pkp-sign)**: - Use your PKP to sign a message +- **[executeJs](/sdk/auth-context-consumption/execute-js)**: - Use your PKP to execute a JavaScript function +- **[encryptAndDecrypt](/sdk/auth-context-consumption/encrypt-and-decrypt)**: - Use your PKP to encrypt and decrypt data + +### 4. PKP Wallet Management + +- **[PKP Permissions](/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-permissions)**: - Manage PKP permissions +- **[PKP Viem Account](/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-viem-account)**: - Manage PKP Viem account +- **[PKP View Helpers](/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-view-helpers)**: - View PKP permissions \ No newline at end of file diff --git a/docs/sdk/resources/supported-evm-chains.mdx b/docs/sdk/resources/supported-evm-chains.mdx new file mode 100644 index 000000000..af1b4a01a --- /dev/null +++ b/docs/sdk/resources/supported-evm-chains.mdx @@ -0,0 +1,117 @@ +--- +title: Supported EVM Chains +--- + +# Supported EVM Chains + +## Intro + +Lit Protocol supports access control conditions across **78 EVM-compatible blockchains**. This means you can create conditions that check balances, token ownership, NFT holdings, and smart contract states across multiple networks. + +Each supported chain uses its native cryptocurrency for balance checks and can be referenced by its unique **Lit Identifier** when building Access Control Conditions. + +## Popular Chains + +Here are some of the popular chains used for access control conditions: + +| Chain | Chain ID | Native Token | Lit Identifier | +|-------|----------|--------------|----------------| +| **Chronicle Yellowstone - Lit Protocol Testnet** | 175188 | tstLPX | `yellowstone` | +| **Ethereum** | 1 | ETH | `ethereum` | +| **Sepolia Testnet** | 11155111 | ETH | `sepolia` | +| **Base Mainnet** | 8453 | ETH | `base` | +| **Polygon** | 137 | MATIC | `polygon` | +| **Arbitrum** | 42161 | AETH | `arbitrum` | +| **Optimism** | 10 | ETH | `optimism` | +| **Avalanche** | 43114 | AVAX | `avalanche` | + +## All Supported Chains + +Browse the complete list of supported EVM chains below. You can search by chain name, native token symbol, or chain ID to find specific networks. + +### Complete Chain List + +| Chain | Chain ID | Native Token | Lit Identifier | Block Explorer | +|-------|----------|--------------|----------------|----------------| +| **Alfajores** | 44787 | CELO | `alfajores` | [🔗](https://alfajores-blockscout.celo-testnet.org) | +| **Amoy** | 80002 | POL | `amoy` | [🔗](https://amoy.polygonscan.com) | +| **Arbitrum** | 42161 | AETH | `arbitrum` | [🔗](https://arbiscan.io/) | +| **Arbitrum Sepolia** | 421614 | ETH | `arbitrumSepolia` | [🔗](https://sepolia.arbiscan.io/) | +| **Aurora** | 1313161554 | ETH | `aurora` | [🔗](https://aurorascan.dev) | +| **Avalanche** | 43114 | AVAX | `avalanche` | [🔗](https://snowtrace.io/) | +| **Base Mainnet** | 8453 | ETH | `base` | [🔗](https://basescan.org) | +| **Base Goerli** | 84531 | ETH | `baseGoerli` | [🔗](https://goerli.basescan.org) | +| **Base Sepolia** | 84532 | ETH | `baseSepolia` | [🔗](https://sepolia.basescan.org) | +| **BitTorrent Testnet** | 1028 | BTT | `bitTorrentTestnet` | [🔗](https://testnet.bttcscan.com) | +| **Binance Smart Chain** | 56 | BNB | `bsc` | [🔗](https://bscscan.com/) | +| **BSC Testnet** | 97 | BNB | `bscTestnet` | [🔗](https://testnet.bscscan.com/) | +| **Camp Network** | 325000 | ETH | `campNetwork` | [🔗](https://explorer.camp-network-testnet.gelato.digital/) | +| **Camp Testnet** | 325000 | ETH | `campTestnet` | [🔗](https://camp-network-testnet.blockscout.com) | +| **Celo** | 42220 | CELO | `celo` | [🔗](https://explorer.celo.org) | +| **Chiado** | 10200 | XDAI | `chiado` | [🔗](https://blockscout.chiadochain.net) | +| **Chiliz Mainnet** | 88888 | CHZ | `chilizMainnet` | [🔗](https://chiliscan.com/) | +| **Chiliz Spicy Testnet** | 88882 | CHZ | `chilizTestnet` | [🔗](https://testnet.chiliscan.com/) | +| **Core DAO** | 1116 | CORE | `coreDao` | [🔗](https://scan.coredao.org/) | +| **Cronos** | 25 | CRO | `cronos` | [🔗](https://cronos.org/explorer/) | +| **Eluvio** | 955305 | ELV | `eluvio` | [🔗](https://explorer.eluv.io) | +| **Ethereum** | 1 | ETH | `ethereum` | [🔗](https://etherscan.io) | +| **EVMOS** | 9001 | EVMOS | `evmos` | [🔗](https://evm.evmos.org) | +| **EVMOS Testnet** | 9000 | EVMOS | `evmosTestnet` | [🔗](https://evm.evmos.dev) | +| **Fantom** | 250 | FTM | `fantom` | [🔗](https://ftmscan.com) | +| **Fhenix Helium** | 8008135 | tFHE | `fhenixHelium` | [🔗](https://explorer.helium.fhenix.zone) | +| **Filecoin** | 314 | FIL | `filecoin` | [🔗](https://filfox.info/) | +| **Filecoin Calibration Testnet** | 314159 | tFIL | `filecoinCalibrationTestnet` | [🔗](https://calibration.filscan.io/) | +| **Avalanche FUJI Testnet** | 43113 | AVAX | `fuji` | [🔗](https://testnet.snowtrace.io/) | +| **Fuse** | 122 | FUSE | `fuse` | [🔗](https://explorer.fuse.io/) | +| **Goerli** | 5 | ETH | `goerli` | [🔗](https://goerli.etherscan.io) | +| **Harmony** | 1666600000 | ONE | `harmony` | [🔗](https://explorer.harmony.one/) | +| **Hedera Testnet** | 296 | HBAR | `hederaTestnet` | [🔗](https://hashscan.io/testnet/dashboard) | +| **Hushed Northstar Devnet** | 42161 | ETH | `hushedNorthstar` | [🔗](https://explorer.buildbear.io/yielddev/transactions) | +| **Filecoin Hyperspace testnet** | 3141 | tFIL | `hyperspace` | [🔗](https://hyperspace.filscan.io/) | +| **Klaytn** | 8217 | KLAY | `klaytn` | [🔗](https://www.klaytnfinder.io/) | +| **Linea Testnet** | 59140 | ETH | `lineaGoerli` | [🔗](https://explorer.goerli.linea.build) | +| **Linea Sepolia Testnet** | 59141 | ETH | `lineaSepolia` | [🔗](https://explorer.sepolia.linea.build) | +| **Lisk** | 1135 | ETH | `lisk` | [🔗](https://blockscout.lisk.com/) | +| **Lukso** | 42 | ETH | `lukso` | [🔗](https://explorer.execution.mainnet.lukso.network/) | +| **Lukso Testnet** | 4201 | ETH | `luksoTestnet` | [🔗](https://explorer.execution.testnet.lukso.network) | +| **Mantle** | 5000 | MNT | `mantle` | [🔗](https://explorer.mantle.xyz/) | +| **Mantle Testnet** | 5001 | MNT | `mantleTestnet` | [🔗](https://explorer.testnet.mantle.xyz/) | +| **Matchain** | 698 | BNB | `matchain` | [🔗](https://matchscan.io) | +| **Moonbase Alpha** | 1287 | DEV | `moonbaseAlpha` | [🔗](https://moonbase.moonscan.io/) | +| **Moonbeam** | 1284 | GLMR | `moonbeam` | [🔗](https://moonscan.io) | +| **Moonriver** | 1285 | MOVR | `moonriver` | [🔗](https://moonriver.moonscan.io) | +| **Mumbai** | 80001 | MATIC | `mumbai` | [🔗](https://mumbai.polygonscan.com) | +| **Optimism** | 10 | ETH | `optimism` | [🔗](https://optimistic.etherscan.io) | +| **Optimism Goerli** | 420 | ETH | `optimismGoerli` | [🔗](https://goerli-optimism.etherscan.io/) | +| **Polygon** | 137 | MATIC | `polygon` | [🔗](https://explorer.matic.network) | +| **Public Goods Network** | 424 | ETH | `publicGoodsNetwork` | [🔗](https://explorer.publicgoods.network/) | +| **Scroll** | 534352 | ETH | `scroll` | [🔗](https://scrollscan.com/) | +| **Scroll Sepolia Testnet** | 534351 | ETH | `scrollSepolia` | [🔗](https://sepolia.scrollscan.com) | +| **Sepolia Testnet** | 11155111 | ETH | `sepolia` | [🔗](https://sepolia.etherscan.io/) | +| **SKALE Nebula Hub Mainnet** | 1482601649 | sFUEL | `skale` | [🔗](https://green-giddy-denebola.explorer.mainnet.skalenodes.com) | +| **SKALE Calypso Hub Mainnet** | 1564830818 | sFUEL | `skaleCalypso` | [🔗](https://giant-half-dual-testnet.explorer.testnet.skalenodes.com/) | +| **SKALE Calypso Hub Testnet** | 974399131 | sFUEL | `skaleCalypsoTestnet` | [🔗](https://giant-half-dual-testnet.explorer.testnet.skalenodes.com/) | +| **SKALE Europa DeFI Hub** | 2046399126 | sFUEL | `skaleEuropa` | [🔗](https://elated-tan-skat.explorer.mainnet.skalenodes.com/) | +| **SKALE Europa DeFi Hub Testnet** | 1444673419 | sFUEL | `skaleEuropaTestnet` | [🔗](https://juicy-low-small-testnet.explorer.testnet.skalenodes.com/) | +| **SKALE Nebula Hub Testnet** | 37084624 | sFUEL | `skaleTestnet` | [🔗](https://lanky-ill-funny-testnet.explorer.testnet.skalenodes.com) | +| **SKALE Titan AI Hub** | 1350216234 | sFUEL | `skaleTitan` | [🔗](https://parallel-stormy-spica.explorer.mainnet.skalenodes.com/) | +| **SKALE Titan AI Hub Testnet** | 1020352220 | sFUEL | `skaleTitanTestnet` | [🔗](https://aware-fake-trim-testnet.explorer.testnet.skalenodes.com/) | +| **Story Odyssey** | 1516 | IP | `storyOdyssey` | [🔗](https://odyssey.storyscan.xyz) | +| **Vana** | 1480 | VANA | `vana` | [🔗](https://vanascan.io) | +| **Vanar Vanguard** | 78600 | VANRY | `vanar` | [🔗](https://explorer-vanguard.vanarchain.com) | +| **Verify Testnet** | 1833 | MATIC | `verifyTestnet` | [🔗](https://verify-testnet.blockscout.com/) | +| **Waev Eclipse Devnet** | 91006 | ecWAEV | `waevEclipseDevnet` | [🔗](http://waev.explorer.modular.cloud/) | +| **Waev Eclipse Testnet** | 91006 | ecWAEV | `waevEclipseTestnet` | [🔗](http://waev.explorer.modular.cloud/) | +| **xDai** | 100 | xDai | `xdai` | [🔗](https://blockscout.com/xdai/mainnet) | +| **XDC Blockchain** | 50 | XDC | `xdc` | [🔗](https://explorer.xinfin.network) | +| **Chronicle Yellowstone - Lit Protocol Testnet** | 175188 | tstLPX | `yellowstone` | [🔗](https://yellowstone-explorer.litprotocol.com/) | +| **ZKcandy Sepolia Testnet** | 302 | ETH | `zkCandySepoliaTestnet` | [🔗](https://sepolia.explorer.zkcandy.io) | +| **zkEvm** | 1101 | ETH | `zkEvm` | [🔗](https://zkevm.polygonscan.com/) | +| **zkSync Era Mainnet** | 324 | ETH | `zksync` | [🔗](https://explorer.zksync.io/) | +| **zkSync Era Testnet** | 280 | ETH | `zksyncTestnet` | [🔗](https://goerli.explorer.zksync.io/) | +| **Zora** | 7777777 | ETH | `zora` | [🔗](https://explorer.zora.energy) | +| **Zora Goerli** | 999 | ETH | `zoraGoerli` | [🔗](https://testnet.explorer.zora.energy) | + +--- + +*Showing 78 of 78 supported EVM chains* \ No newline at end of file diff --git a/docs/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder.mdx b/docs/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder.mdx new file mode 100644 index 000000000..183cae2b1 --- /dev/null +++ b/docs/sdk/sdk-reference/access-control-conditions/functions/createAccBuilder.mdx @@ -0,0 +1,239 @@ +--- +title: createAccBuilder +--- + + + +- Calling `.on(chain)` is required after each convenience method to set the target chain, except for `requireLitAction`. +- Use `validate()` during development to catch operator ordering and empty builder issues. +- For advanced conditions, prefer `unifiedAccs()` when you already have canonical unified condition objects. + + +# Installation + + +```bash npm +npm install @lit-protocol/access-control-conditions +``` +```bash yarn +yarn add @lit-protocol/access-control-conditions +``` +```bash pnpm +pnpm add @lit-protocol/access-control-conditions +``` +```bash bun +bun add @lit-protocol/access-control-conditions +``` + + +# Examples + +### Using the convenience helpers + +```ts +import { createAccBuilder } from '@lit-protocol/access-control-conditions'; + +// Simple ETH balance check on Ethereum +const simple = createAccBuilder() + .requireEthBalance('1000000000000000000') + .on('ethereum') + .build(); + +// Weather-gated content using Lit Action +const weatherGated = createAccBuilder() + .requireLitAction('Qm...IPFSCID', 'checkTemperature', ['40'], 'true') + .build(); + +// Complex: (ETH >= 0.001 on ethereum) OR (ERC20 >= 1000 on polygon) AND (Wallet ownership on ethereum) +const complex = createAccBuilder() + .requireEthBalance('1000000000000000').on('ethereum') + .or() + .requireTokenBalance('0x123...', '1000').on('polygon') + .and() + .requireWalletOwnership('0x123...').on('ethereum') + .build(); +``` + +See [Weather Check Lit Action](https://explorer.litprotocol.com/ipfs/QmcgbVu2sJSPpTeFhBd174FnmYmoVYvUFJeDkS7eYtwoFY) for more details. + +### Using the raw conditions + +```ts +import { createAccBuilder } from '@lit-protocol/access-control-conditions'; + +const rawCondition = { + conditionType: 'evmBasic', + contractAddress: '', + standardContractType: '', + chain: 'ethereum', + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: '1000000000000000000', + }, +}; + +const conditions = createAccBuilder() + .unifiedAccs(rawCondition) + .build(); +``` + + +# Reference + +## Functions + +> **createAccBuilder**() + +Builder for Access Control Conditions (ACC) supporting EVM, Solana, Cosmos, and Lit Actions with boolean logic, grouping, and helpers. + +### Parameters + +No parameters. + +### Returns + + + Fluent builder with convenience methods, boolean operators, grouping, and utilities. + + +#### Custom Access Control Conditions + +Manually supply the access control conditions instead of using the chainable helper methods. + + + + + + + +#### EVM Conditions + + + Require ETH balance on a chain. + + + Minimum balance required (wei as string or normalised amount per your app). + + + Defaults to '>='. + + + +```ts +const conditions = createAccBuilder() + .requireEthBalance('1000000000000000000') // 1 ETH + .on('ethereum') + .build(); +``` + + + + + Require ERC‑20 token balance. + + + + + + + + + Require ERC‑721 or ERC‑1155 ownership. + + + + If provided, assumes ERC‑721; otherwise ERC‑1155 with default tokenId '1'. + + + + + + Verify that :userAddress equals the provided address. + + + + Compare latest block timestamp using comparator (default '>='). + + + + Check membership for MolochDAOv2.1. + + + + Check POAP event ownership. + + +#### Solana Conditions + + + + + +#### Cosmos Conditions + + + + + + + + + + Defaults to '='. + + + + + +#### Lit Action Conditions + + + Create a condition validated by a Lit Action. + + + + + + + Defaults to '='. + + + + + + +```ts +const conditions = createAccBuilder() + .requireLitAction( + 'QmcgbVu2sJSPpTeFhBd174FnmYmoVYvUFJeDkS7eYtwoFY', // Weather check Lit Action + 'go', + ['40'], // Max temperature 40°F + 'true' + ) + .build(); +``` + + +See [Weather Check Lit Action](https://explorer.litprotocol.com/ipfs/QmcgbVu2sJSPpTeFhBd174FnmYmoVYvUFJeDkS7eYtwoFY) + + +#### Boolean operations + + + + +--- + +#### Build and utilities + + + Finalise and return the conditions array (unformatted; canonical formatting occurs downstream). + + + + + + Generate a human-readable explanation of the built conditions. + \ No newline at end of file diff --git a/docs/sdk/sdk-reference/auth/functions/createAuthManager.mdx b/docs/sdk/sdk-reference/auth/functions/createAuthManager.mdx new file mode 100644 index 000000000..fe8027478 --- /dev/null +++ b/docs/sdk/sdk-reference/auth/functions/createAuthManager.mdx @@ -0,0 +1,303 @@ +--- +title: createAuthManager +--- + +# Functions + +> **createAuthManager**(`authManagerParams`) + + +## Parameters + + + The storage provider used by the Auth Manager. + ```ts + import { createAuthManager, storagePlugins } from "@lit-protocol/auth"; + const authManager = createAuthManager({ + storage: storagePlugins.localStorageNode({ + appName: "my-app", + networkName: "naga-local", + storagePath: "./lit-auth-local", + }), + }); + ``` + + +## Returns + + + Complete AuthManager object with all returned methods. + + +--- + +### createEoaAuthContext + +Create an EOA (Externally Owned Account) auth context adapter for signing and session issuance. + +#### Parameters + + + + + EOA configuration for the adapter. + + + The EOA used for auth/signing. + + + + + + Configuration for statements, resources, expiration, etc. + + + SIWE statement suffix appended to Auth message. + + + Domain used in auth message. + + + Capability resources to include (e.g., ['lit-action-execution','*']). + + + Optional capability signatures. + + + Session expiration timestamp (e.g., new Date(Date.now() + 1000*60*15).toISOString()). + + + + + + The Lit client instance used for network interactions. + + + + +#### Returns + + + + + The EOA used for signing. + + + The authenticator used (e.g., ViemAccountAuthenticator, WalletClientAuthenticator). + + + Auth data produced by the authenticator. + + + Callback that returns an AuthSig for session issuance when needed. + + + Ephemeral session key pair associated with the context. + + + + + + + + + + + + + +#### Example + +```ts +import { createAuthManager, storagePlugins } from '@lit-protocol/auth'; + +const authManager = createAuthManager({ + storage: storagePlugins.localStorageNode({ + appName: 'my-app', + networkName: 'naga-local', + storagePath: './lit-auth-local' + }) +}); + +const eoaAuthContext = await authManager.createEoaAuthContext({ + config: { account: myViemAccount }, + authConfig: { + statement: 'I authorize this action.', + domain: 'example.com', + resources: [ ['lit-action-execution','*'], ['pkp-signing','*'] ], + expiration: new Date(Date.now()+1000*60*15).toISOString() + }, + litClient +}); + +// Use with litClient +await litClient.executeJs({ code: '...', authContext: eoaAuthContext }); +``` + +--- + +### createPkpAuthContext + +Create a PKP auth context adapter using a user's AuthData and a PKP public key. + +#### Parameters + + + + + Authentication data (e.g., from ViemAccountAuthenticator.authenticate(account)). + + + The PKP public key to bind the context to. + + + Config controlling resources and expiration for the PKP session. + + + + + + + + Optional cache hints. + + + Whether to cache/store a delegationAuthSig if created. + + + + + + +#### Returns + + + + + Currently 'ethereum'. + + + + + + + + + + + + + + + + + +#### Example + +```ts +import { ViemAccountAuthenticator } from '@lit-protocol/auth'; + +const authData = await ViemAccountAuthenticator.authenticate(myViemAccount); +const pkpAuthContext = await authManager.createPkpAuthContext({ + authData, + pkpPublicKey: myPkp.publicKey, + authConfig: { + resources: [ ['pkp-signing','*'], ['lit-action-execution','*'] ], + expiration: new Date(Date.now()+1000*60*30).toISOString() + }, + litClient +}); + +// Example: sign via PKP Viem account integration +const pkpAccount = await litClient.getPkpViemAccount({ + pkpPublicKey: myPkp.publicKey, + authContext: pkpAuthContext, + chainConfig: myChain +}); +``` + +--- + +### createCustomAuthContext + +Create a Custom auth context that validates using a Lit Action (by inline code or IPFS CID). + +#### Parameters + + + + + PKP public key used in the custom auth flow. + + + Config controlling resources and expiration for the session. + + + + Custom Lit Action parameters. + + + Inline Lit Action code (base64-encoding handled externally if needed). + + + IPFS CID of the Lit Action to run. + + + Arbitrary parameters exposed inside the Lit Action. Note: The implementation nests your provided object under a top-level key `jsParams` before sending to nodes. + + + + + + +#### Returns + + + + + Currently 'ethereum'. + + + + + + + + Note: Adapter nests your provided object under a top-level key 'jsParams' before sending to nodes. + + + + + + + + + + + + + + + + + +#### Example + +```ts +const customAuthContext = await authManager.createCustomAuthContext({ + pkpPublicKey: evePkp.publicKey, + authConfig: { + resources: [ ['pkp-signing','*'], ['lit-action-execution','*'] ], + expiration: new Date(Date.now()+1000*60*30).toISOString() + }, + litClient, + customAuthParams: { + litActionIpfsId: 'QmYourLitActionCID', + jsParams: { + userId: 'eve', + password: 'password' + } +}); + +await litClient.executeJs({ ipfsId: 'QmYourLitActionCID', authContext: customAuthContext }); +``` \ No newline at end of file diff --git a/docs/sdk/sdk-reference/lit-client/functions/createLitClient.mdx b/docs/sdk/sdk-reference/lit-client/functions/createLitClient.mdx new file mode 100644 index 000000000..f62160754 --- /dev/null +++ b/docs/sdk/sdk-reference/lit-client/functions/createLitClient.mdx @@ -0,0 +1,1077 @@ +--- +title: createLitClient +--- + +# Functions + +> **createLitClient**(`{ network }`) + +## Parameters + + + The network to connect to. + ```ts + import { nagaDev } from "@lit-protocol/networks"; + const litClient = await createLitClient({ network: nagaDev }); + ``` + + +## Returns + + + Complete litClient object with all returned methods. + + +### chain.raw.pkpSign + +Signs arbitrary bytes with a PKP using the specified signing scheme on the chosen chain. + +#### Parameters + + + + + 0x‑prefixed PKP public key. + + + + Bytes to sign. If hashing is enabled, the hash of this payload is signed. + + + + Signing scheme to use. + + + ECDSA over secp256k1 with SHA‑256 prehash. + + + ECDSA over P‑256 with SHA‑256 prehash. + + + ECDSA over P‑384 with SHA‑384 prehash. + + + Schnorr over Ed25519 with SHA‑512 prehash. + + + Schnorr over secp256k1 with SHA‑256 prehash. + + + Schnorr over P‑256 with SHA‑256 prehash. + + + Schnorr over P‑384 with SHA‑384 prehash. + + + Schnorr over Ristretto25519 with SHA‑512 prehash. + + + Schnorr over Ed448 with SHAKE‑256 prehash. + + + Schnorr over Jubjub (red) with BLAKE2b‑512 prehash. + + + Schnorr over secp256k1 (Taproot) variant. + + + Schnorr over Decaf377 (red) with BLAKE2b‑512 prehash. + + + Schnorrkel (Substrate) variant. + + + + + Defaults to EcdsaK256Sha256. + + + Supports EcdsaK256Sha256, SchnorrK256Sha256, SchnorrK256Taproot. + + + + + + Target chain; determines hashing (e.g. keccak256 for ethereum, sha256 for bitcoin). + + + Uses keccak256 prehashing when hashing is enabled. + + + Uses SHA‑256 prehashing when hashing is enabled. + + + Reserved in schema. + + + Reserved in schema. + + + + + + Authorisation/session context + + + + Optional maximum price the user is willing to pay for this request. + + + + Optional. Controls message pre‑hashing before signing. + + + Do not transform toSign; the payload is signed as‑is. Use when you already + computed the digest (e.g. EIP‑712 typed data, pre‑computed tx/message hash). + + + + Auto‑hash toSign according to signingScheme and chain via LitMessageSchema. + + + + + + Hash function used before signing. + + + Hash function used before signing. + + + Hash function used before signing. + + + Hash function used before signing. + + + Hash function used before signing. + + + Hash function used before signing. + + + + + + No hashing is applied; toSign is signed as‑is. + + + + + + Auto‑hash mapping is not defined; avoid relying on auto‑hash with these chains. + + + Compute the EIP‑712 digest client‑side and set bypassAutoHashing=true to sign the digest directly. + + + + + + + +#### Returns + + + + + The final signature for the request. + + + + 0x‑prefixed verifying (compressed) public key used to produce the signature. + + + + 0x‑prefixed hex of the exact payload that was signed (post‑hashing if applicable). + + + + Recovery identifier when applicable to the scheme (0 or 1; may be null). + + + + 0x‑prefixed PKP public key associated with the signature. + + + + The signature type/scheme used + + + + + +### executeJs + +Execute a Lit Action (JS) on the network. + +#### Parameters + + + + + Inline JS code to run. Either code or ipfsId must be provided. + + + IPFS CID of a Lit Action to run. Either code or ipfsId must be provided. + + + Parameters injected into the Lit Action runtime before execution. + + + Authorisation/session context for node authorisation. + + + Optional maximum price the user is willing to pay. + + + + +#### Returns + + + + + + The action-defined response payload. + + + Aggregated logs from nodes. + + + Signature map when action performs signing. + + + Optional claim results when present. + + + Optional debug info (allNodeResponses, allNodeLogs, rawNodeHTTPResponses). + + + + + +### encrypt + +Encrypt data with access control conditions using BLS. + +#### Parameters + + + + + The data to encrypt. Strings/objects/arrays are internally converted to bytes. Objects/arrays are JSON-stringified first. + + + + Target chain context for condition evaluation. + + + + Standard access control conditions (ACC). Provide one of ACC, evmContractConditions, solRpcConditions, or unifiedAccessControlConditions. + + + + EVM-specific contract conditions (mutually exclusive with other condition types). + + + + Solana RPC conditions (mutually exclusive with other condition types). + + + + Unified access control conditions (mutually exclusive with other condition types). + + + + Optional metadata to describe the data being encrypted. + + + Expected data type for downstream conversion on decrypt. + + + MIME type for file-like data. + + + Original filename for file-like data. + + + File size in bytes. + + + Arbitrary custom metadata. + + + + + + + +#### Returns + + + + + Base64-encoded ciphertext. + + + SHA-256 hash (hex) of the plaintext data. + + + Echo of provided metadata or inferred data type where applicable. + + + + +### decrypt + +Decrypt data previously encrypted with access control conditions. + +#### Parameters + + + + + Optional. Pass the full encrypted object from encrypt(). If omitted, provide fields below individually. + + + + Base64-encoded ciphertext (required if data is not provided). + + + SHA-256 hash (hex) of the original plaintext (required if data is not provided). + + + + One of ACC, evmContractConditions, solRpcConditions, or unifiedAccessControlConditions (must match encryption). + + + + + + + Target chain context for condition evaluation. + + + + Authorisation/session context for node authorisation. + + + + Optional maximum price the user is willing to pay for this request. + + + + + +#### Returns + + + + + The raw decrypted bytes. + + + Present when metadata.dataType was provided and conversion is applicable. + + + Metadata echo including dataType and optional file info. + + + + +### mintWithEoa + +Mint a PKP using an EOA. + +#### Parameters + + + + + The signing account that will perform the mint on-chain. + + + + +#### Returns + + + + + Transaction hash of the mint. + + + + PKP token ID. + 0x-hex uncompressed public key. + Derived 0x-hex Ethereum address. + + + + + +### mintWithAuth + +Mint a PKP using an authentication method. + +#### Parameters + + + + + The signing account that will perform the mint on-chain. + + + Auth method payload (e.g., from ViemAccountAuthenticator): includes authMethodType, authMethodId, optional accessToken. + + + Permission scopes to attach to the minted PKP. + + + + +#### Returns + + + + + + + + +### mintWithCustomAuth + +Mint a PKP using custom authentication (Lit Action validator or IPFS CID). + +#### Parameters + + + + + The signing account for on-chain operations. + + + Authentication method details used alongside the validation Lit Action. + + + Lit Action IPFS CID (must start with "Qm" and be ≥ 46 chars). + + + Initial permission scope to grant. + + + If true, add the PKP's own address as a permitted address. + + + If true, transfers the PKP to itself after minting. + + + + +#### Returns + + + + + Echo of the provided Lit Action CID. + + + Mint result and PKP details from the chain API. + + + + +### authService.mintWithAuth + +Mint a PKP via the Auth Service. Parameters and returns mirror `mintWithAuth`. + +#### Parameters + + + + + + + + Optional. Override the Auth Service base URL; defaults to the network’s configured value. + + + + +#### Returns + + + +### getPKPPermissionsManager + +Create a PKP permissions manager instance. + +#### Parameters + + + + + PKP identifier. Exactly one of the following must be provided. + + + PKP token ID (stringified bigint). + + + 0x‑prefixed uncompressed PKP public key. + + + 0x‑prefixed PKP Ethereum address. + + + + + Account used for permission transactions and reads. + + + + +#### Returns + + + + + Add a permitted Lit Action. + + + Lit Action IPFS CID. + + + Permission scopes (e.g., 'sign-anything'). + + + +```ts +await manager.addPermittedAction({ ipfsId: "Qm...", scopes: ["sign-anything"] }); +``` + + + + + Add a permitted address. + + + 0x‑prefixed address to permit. + + + Permission scopes. + + + +```ts +await manager.addPermittedAddress({ address: "0xUser...", scopes: ["sign-anything"] }); +``` + + + + + Permit an authentication method. + + + + + + + +```ts +await manager.addPermittedAuthMethod({ authMethodType: 1, authMethodId: "0x...", userPubkey: "0x...", scopes: ["sign-anything"] }); +``` + + + + + Permit a scope for an auth method. + + + + + + +```ts +await manager.addPermittedAuthMethodScope({ authMethodType: 1, authMethodId: "0x...", scopeId: 0 }); +``` + + + + + + + + +```ts +await manager.removePermittedAction({ ipfsId: "Qm..." }); +``` + + + + + + + + +```ts +await manager.removePermittedAddress({ address: "0xUser..." }); +``` + + + + + + + + + +```ts +await manager.removePermittedAuthMethod({ authMethodType: 1, authMethodId: "0x..." }); +``` + + + + + + + + + + +```ts +await manager.removePermittedAuthMethodScope({ authMethodType: 1, authMethodId: "0x...", scopeId: 0 }); +``` + + + + + + + + +```ts +const ok = await manager.isPermittedAction({ ipfsId: "Qm..." }); +``` + + + + + + + + +```ts +const ok = await manager.isPermittedAddress({ address: "0xUser..." }); +``` + + + + + + + + + + + + + + + + + Returns consolidated permissions (actions, addresses, authMethods). + + + + Batch perform add/remove operations. + + + + + + + + + + + +```ts +await manager.batchUpdatePermissions([ + { type: 'addAddress', address: '0xUser...', scopes: ['sign-anything'] }, + { type: 'addAction', ipfsId: 'Qm...', scopes: ['sign-anything'] }, +]); +``` + + + + + Remove all addresses, auth methods, and known test actions. + + + + +### getPaymentManager + +Get a Payment Manager for Ledger contract operations. + +#### Parameters + + + + + The account used for deposits, withdrawals, and queries. + + + + +#### Returns + + + + + Deposit funds to your own account. + + + Amount to deposit in ETH (string), internally converted to Wei. + + + +```ts +await paymentManager.deposit({ amountInEth: "0.1" }); +``` + + + + + Deposit funds for another user. + + + + + +```ts +await paymentManager.depositForUser({ userAddress: "0x...", amountInEth: "0.25" }); +``` + + + + + Get total and available balances for a user. + + + + +```ts +const bal = await paymentManager.getBalance({ userAddress: "0x..." }); +console.log(bal.totalBalance, bal.availableBalance); +``` + + + + + Request withdrawal (starts delay period). + + + + +```ts +await paymentManager.requestWithdraw({ amountInEth: "0.05" }); +``` + + + + + Execute withdrawal after delay. + + + + +```ts +await paymentManager.withdraw({ amountInEth: "0.05" }); +``` + + + + + Get current withdrawal request for a user. + + + + +```ts +const info = await paymentManager.getWithdrawRequest({ userAddress: "0x..." }); +``` + + + + + Get global withdrawal delay in seconds. + +```ts +const delay = await paymentManager.getWithdrawDelay(); +``` + + + + + Check whether a user's withdrawal can be executed now. + + + + +```ts +const { canExecute, timeRemaining } = await paymentManager.canExecuteWithdraw({ userAddress: "0x..." }); +``` + + + + + Delegate payments to a user. + + + + +```ts +await paymentManager.delegatePayments({ userAddress: "0xUser..." }); +``` + + + + + Undelegate payments from a user. + + + + +```ts +await paymentManager.undelegatePayments({ userAddress: "0xUser..." }); +``` + + + + + Delegate payments to multiple users. + + + + +```ts +await paymentManager.delegatePaymentsBatch({ userAddresses: ["0xA...","0xB..."] }); +``` + + + + + Undelegate payments from multiple users. + + + + +```ts +await paymentManager.undelegatePaymentsBatch({ userAddresses: ["0xA...","0xB..."] }); +``` + + + + + Set payment restriction for caller. + + + + + + +```ts +await paymentManager.setRestriction({ totalMaxPrice: "1000000000000000000", requestsPerPeriod: "100", periodSeconds: "86400" }); +``` + + + + + List payers for a user. + + + + +```ts +const payers = await paymentManager.getPayers({ userAddress: "0xUser..." }); +``` + + + + + List users for a payer. + + + + +```ts +const users = await paymentManager.getUsers({ payerAddress: "0xPayer..." }); +``` + + + + + Get restriction for a payer. + + + + +```ts +const r = await paymentManager.getRestriction({ payerAddress: "0xPayer..." }); +``` + + + + + Batch get payers and restrictions for users. + + + + +```ts +const res = await paymentManager.getPayersAndRestrictions({ userAddresses: ["0xA...","0xB..."] }); +``` + + + + + + +### viewPKPPermissions + +View current permissions context for a PKP. + +#### Parameters + + + +#### Returns + + + + + + + + + +### viewPKPsByAddress + +List PKPs owned by an address. + +#### Parameters + + + + + Address whose PKPs to fetch. + + + + + + +#### Returns + + + + + + + + +### getPkpViemAccount + +Create a Viem-compatible account backed by a PKP. + +#### Parameters + + + + + 0x-prefixed PKP public key. + + + Authorisation context used for signing sessions. + + + Viem chain configuration used by the returned account. + + + + +#### Returns + + + + + Standard Viem account methods that route to PKP signing under the hood. + + + + +#### Returns + + + + + The final signature for the request. + + + + 0x‑prefixed verifying (compressed) public key used to produce the signature. + + + + 0x‑prefixed hex of the exact payload that was signed (post‑hashing if applicable). + + + + Recovery identifier when applicable to the scheme (0 or 1; may be null). + + + + 0x‑prefixed PKP public key associated with the signature. + + + + The signature type/scheme used (e.g. ECDSA, Schnorr). + + + + + +### getChainConfig + +Returns the chain configuration for the current network. + +#### Parameters + +none + +#### Returns + + + + + Viem chain configuration used by the returned account. + + + RPC URL for the chain. + + + + +### disconnect +Stop background state updates and release resources. + +#### Parameters +none + +#### Returns +void \ No newline at end of file diff --git a/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-permissions.mdx b/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-permissions.mdx new file mode 100644 index 000000000..68b3ebca0 --- /dev/null +++ b/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-permissions.mdx @@ -0,0 +1,77 @@ +--- +title: PKP Permissions +--- + + + See SDK Reference for more details on the PKP Permissions. [PKP Permissions + Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#getpkppermissionsmanager) + + +### What it is + +The PKP Permissions Manager is a high‑level helper that manages who and what may use a PKP. It provides a unified interface over the underlying on‑chain permissions, covering three dimensions: permitted addresses, permitted Lit Actions (by IPFS CID), and permitted authentication methods with fine‑grained scopes. + +```ts +const pkpPermissionsManager = await litClient.getPKPPermissionsManager({ + pkpIdentifier: { tokenId: myPkp.tokenId }, + account: pkpViemAccount, +}); +``` + +### Core capabilities + +- **Read a unified context**: fetch a normalised snapshot of current permissions (addresses, actions, auth methods) with helper checks (e.g., is an address permitted?). +- **Manage addresses**: allow or remove EVM addresses that can operate the PKP. +- **Manage Lit Actions**: allow or remove Lit Actions by IPFS CID to constrain what code can execute with the PKP. +- **Manage auth methods and scopes**: bind supported auth methods to the PKP and adjust their scopes (e.g., a scope like `sign-anything`) for least‑privilege access. + +### Quick Examples + +```ts +// 1) Initialise a PKP‑scoped viem account and permissions manager +const pkpViemAccount = await litClient.getPkpViemAccount({ + pkpPublicKey: myPkp.publicKey, + authContext, + chainConfig: litClient.getChainConfig().viemConfig, +}); + +const pkpPermissionsManager = await litClient.getPKPPermissionsManager({ + pkpIdentifier: { tokenId: myPkp.tokenId }, + account: pkpViemAccount, +}); + +// 2) Read current permissions and perform checks +const ctx = await pkpPermissionsManager.getPermissionsContext(); +console.log(ctx.addresses, ctx.actions, ctx.authMethods); + +const isAddrAllowed = await pkpPermissionsManager.isPermittedAddress({ + address: "0xabc...def", +}); + +// 3) Manage an auth method and its scopes (requires PKP ownership) +const addTx = await pkpPermissionsManager.addPermittedAuthMethod({ + authMethodType: 1, // EthWallet + authMethodId: "0x1234567890abcdef1234567890abcdef12345678", + userPubkey: + "0x04abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + scopes: ["sign-anything"], +}); +await addTx.receipt; + +// Remove a specific scope (e.g. scopeId 1) from that auth method +const removeScopeTx = + await pkpPermissionsManager.removePermittedAuthMethodScope({ + authMethodType: 1, + authMethodId: "0x1234567890abcdef1234567890abcdef12345678", + scopeId: 1, + }); +await removeScopeTx.receipt; + +// Optionally remove the auth method entirely +const removeAuthMethodTx = + await pkpPermissionsManager.removePermittedAuthMethod({ + authMethodType: 1, + authMethodId: "0x1234567890abcdef1234567890abcdef12345678", + }); +await removeAuthMethodTx.receipt; +``` diff --git a/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-viem-account.mdx b/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-viem-account.mdx new file mode 100644 index 000000000..bbadedf47 --- /dev/null +++ b/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-viem-account.mdx @@ -0,0 +1,30 @@ +--- +title: PKP Viem Account +--- + + + See SDK Reference for more details on the PKP Viem Account. [PKP Viem Account + Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#getpkpviemaccount) + + +### What it is + +A drop‑in, Viem‑compatible `account` that behaves like an EOA account, but is backed by a PKP. It exposes `signMessage`, `signTransaction`, and `signTypedData` so existing Viem workflows continue to work unchanged, while signatures are produced by the Lit Network using your PKP. + +### Examples + +Creates a Viem account instance that can sign transactions using a PKP + +```typescript +const pkpAccount = await litClient.getPkpViemAccount({ + pkpPublicKey: '0x...', + authContext: { ... }, + chainConfig: mainnet // from viem/chains +}); + +const txHash = await viemClient.sendTransaction({ + account: pkpAccount, + to: '0x...', + value: parseEther('0.1') +}); +``` diff --git a/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-view-helpers.mdx b/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-view-helpers.mdx new file mode 100644 index 000000000..40aea0951 --- /dev/null +++ b/docs/sdk/sdk-reference/lit-client/functions/createLitClient/pkp-view-helpers.mdx @@ -0,0 +1,35 @@ +--- +title: PKP View Helpers +--- + +These helper methods are useful for getting information about PKPs. + +## viewPKPPermissions + +Returns the current permissions for a PKP (permitted addresses, Lit Actions, and auth methods with scopes) + +```ts +const permissions = await litClient.viewPKPPermissions({...}); +``` + +[See Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#viewpkppermissions) + +## viewPKPsByAuthData + +Lists PKPs linked to a given authentication data payload + +```ts +const pkps = await litClient.viewPKPsByAuthData({...}); +``` + +[See Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#viewpkpsbyauthdata) + +## viewPKPsByAddress + +Lists PKPs that permit a specific EVM address (which PKPs that address can operate). + +```ts +const pkps = await litClient.viewPKPsByAddress({...}); +``` + +[See Reference](/sdk/sdk-reference/lit-client/functions/createLitClient#viewpkpsbyaddress) diff --git a/docs/sdk/sdk-reference/lit-client/reference.mdx b/docs/sdk/sdk-reference/lit-client/reference.mdx new file mode 100644 index 000000000..fd02e03e2 --- /dev/null +++ b/docs/sdk/sdk-reference/lit-client/reference.mdx @@ -0,0 +1,4 @@ +--- +title: "@lit-protocol/lit-client" +description: "Reference for the @lit-protocol/lit-client package" +--- \ No newline at end of file diff --git a/docs/sdk/sdk-reference/networks/functions/withOverrides.mdx b/docs/sdk/sdk-reference/networks/functions/withOverrides.mdx new file mode 100644 index 000000000..23b8f3193 --- /dev/null +++ b/docs/sdk/sdk-reference/networks/functions/withOverrides.mdx @@ -0,0 +1,40 @@ +--- +title: withOverrides +--- + +# Functions + +> **withOverrides**(`overrides`) + +Create a network module instance with runtime overrides (primarily for RPC URL). Use this to direct SDK operations to your own private RPC endpoint. + +## Parameters + + + Optional overrides. Provide `rpcUrl` to replace the chain RPC used by the module instance. + ```ts + { rpcUrl: "https://my-private-rpc.example.com" } + ``` + + +## Returns + + + A new module instance with overrides applied. Pass this into `createLitClient( + {network})`. + + +## Example + +### Override RPC at runtime + +```ts +import { createLitClient } from "@lit-protocol/lit-client"; +import { nagaDev } from "@lit-protocol/networks"; + +const network = nagaDev.withOverrides({ + rpcUrl: "https://my-private-rpc.example.com", +}); + +const litClient = await createLitClient({ network }); +``` From 262adf580851f25b12ce8b9a7d8f45d7e4d709d2 Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 10 Oct 2025 22:45:11 +0100 Subject: [PATCH 3/6] chore: update .prettierignore and package.json; add sync:docs-changelog script and ignore docs and changelog files --- .prettierignore | 4 +++- package.json | 4 +++- packages/contracts/CHANGELOG.md | 13 +++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.prettierignore b/.prettierignore index 1cf4e1142..90eac4f17 100644 --- a/.prettierignore +++ b/.prettierignore @@ -14,4 +14,6 @@ tools /packages/wasm/rust/* /packages/wasm/src/pkg/* -**/*/dist \ No newline at end of file +**/*/dist +/docs +/packages/**/CHANGELOG.md \ No newline at end of file diff --git a/package.json b/package.json index 26a3ee1bf..e7cb582aa 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "license": "MIT", "scripts": { "sync:contracts": "nx run contracts:sync", + "sync:docs-changelog": "node tools/sync-docs-changelog.js", "reset": "rimraf .nx dist node_modules packages/**/node_modules tmp", "build": "nx run-many --parallel=false --target=build --all --exclude=wrapped-keys,wrapped-keys-lit-actions", "gen:local-network-context": "dotenvx run --env-file=.env -- node --conditions=import --import tsx packages/networks/src/networks/vNaga/shared/scripts/generate-abi-signatures.ts", @@ -103,5 +104,6 @@ }, "workspaces": [ "packages/*" - ] + ], + "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee" } diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 0ae98bba8..63765f7da 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1 +1,14 @@ # @lit-protocol/contracts + +## 0.5.3 + +### Patch Changes + +- release `naga-test` network support + + +## 0.5.2 + +### Patch Changes + +- initial release From 2567abb3a1d8a822d3f49e73b426db87d4327845 Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 10 Oct 2025 22:45:26 +0100 Subject: [PATCH 4/6] feat(docs): add sync-docs-changelog script to automate changelog updates for packages --- tools/sync-docs-changelog.js | 458 +++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 tools/sync-docs-changelog.js diff --git a/tools/sync-docs-changelog.js b/tools/sync-docs-changelog.js new file mode 100644 index 000000000..87c282e20 --- /dev/null +++ b/tools/sync-docs-changelog.js @@ -0,0 +1,458 @@ +#!/usr/bin/env node + +const fs = require('fs/promises'); +const path = require('path'); + +const ROOT = path.resolve(__dirname, '..'); +const PACKAGES_DIR = path.join(ROOT, 'packages'); + +function resolveDocsChangelogPaths() { + const arg = process.argv.find((value) => value.startsWith('--docs=')); + const argPath = arg ? valueFromFlag(arg, '--docs=') : null; + const envDirectPath = process.env.DOCS_CHANGELOG_PATH || null; + const envRepoPath = process.env.DOCS_REPO_PATH || null; + + const candidates = []; + + if (argPath) { + candidates.push({ path: argPath, allowCreate: true }); + } + + if (envDirectPath) { + candidates.push({ path: envDirectPath, allowCreate: true }); + } + + if (envRepoPath) { + candidates.push({ path: path.join(envRepoPath, 'changelog.mdx'), allowCreate: false }); + } + + candidates.push({ path: path.resolve(ROOT, 'docs', 'changelog.mdx'), allowCreate: false }); + candidates.push({ path: path.resolve(ROOT, '..', 'docs-v2', 'changelog.mdx'), allowCreate: false }); + candidates.push({ path: path.resolve(ROOT, '..', 'naga-doc', 'changelog.mdx'), allowCreate: false }); + + const resolved = []; + const seen = new Set(); + + for (const candidate of candidates) { + if (!candidate || !candidate.path) { + continue; + } + + const absolute = path.isAbsolute(candidate.path) ? candidate.path : path.resolve(ROOT, candidate.path); + if (seen.has(absolute)) { + continue; + } + + resolved.push({ + path: absolute, + allowCreate: Boolean(candidate.allowCreate), + }); + seen.add(absolute); + } + + return resolved; +} + +function valueFromFlag(flag, prefix) { + return flag.slice(prefix.length); +} + +async function fileExists(filePath) { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } +} + +function slugify(value) { + return value + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +async function readLatestRelease(changelogPath) { + const raw = await fs.readFile(changelogPath, 'utf8'); + const lines = raw.split(/\r?\n/); + + let version = null; + const contentLines = []; + + for (let i = 0; i < lines.length; i += 1) { + const line = lines[i]; + + if (version === null) { + const match = line.match(/^##\s+([0-9][^\s]*)/); + if (match) { + version = match[1]; + } + continue; + } + + if (/^##\s+/.test(line)) { + break; + } + + contentLines.push(line); + } + + if (!version) { + return null; + } + + while (contentLines.length && contentLines[0].trim() === '') { + contentLines.shift(); + } + while (contentLines.length && contentLines[contentLines.length - 1].trim() === '') { + contentLines.pop(); + } + + return { + version, + content: contentLines.join('\n'), + }; +} + +function escapeAttribute(value) { + return value + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/ { + if (current && current.items.length > 0) { + sections.push(current); + } + current = null; + }; + + const lines = content.split('\n'); + + for (const rawLine of lines) { + const line = rawLine.trimEnd(); + if (!line.trim()) { + continue; + } + + const headingMatch = line.match(/^###\s+(.*)$/); + if (headingMatch) { + flushSection(); + current = { title: headingMatch[1].trim(), items: [] }; + continue; + } + + const bulletMatch = line.match(/^\s*-\s+(.*)$/); + if (bulletMatch) { + if (!current) { + current = { title: 'Highlights', items: [] }; + } + + current.items.push(normalizeBulletContent(bulletMatch[1])); + continue; + } + + const text = normalizeBulletContent(line); + if (text) { + if (!current) { + current = { title: 'Highlights', items: [] }; + } + current.items.push(text); + } + } + + flushSection(); + + return sections; +} + +function buildUpdateBody(sections) { + const lines = []; + + for (const section of sections) { + if (!section.items.length) { + continue; + } + + lines.push(` ## ${section.title}`); + lines.push(''); + for (const item of section.items) { + lines.push(` - ${item}`); + } + lines.push(''); + } + + while (lines.length && lines[lines.length - 1] === '') { + lines.pop(); + } + + if (!lines.length) { + return ' No release notes available.'; + } + + return lines.join('\n'); +} + +function buildTagsLiteral(sections) { + const tags = []; + + for (const section of sections) { + if (section.items.length && !tags.includes(section.title)) { + tags.push(section.title); + } + } + + if (!tags.length) { + tags.push('Release'); + } + + const literal = `[${tags.map((tag) => JSON.stringify(tag)).join(', ')}]`; + return literal; +} + +function buildUpdateId(packageName) { + const trimmed = packageName.replace(/^@lit-protocol\//, ''); + return slugify(trimmed); +} + +function escapeTableCell(value) { + return value.replace(/\|/g, '\\|'); +} + +function buildSummaryTable(updates) { + const header = '| Package | Latest version | Summary |'; + const separator = '| ------- | -------------- | ------- |'; + + if (!updates.length) { + return [header, separator, '| _No packages found_ | - | - |'].join('\n'); + } + + const rows = updates.map((update) => { + const summary = update.summary || '-'; + const npmUrl = `https://www.npmjs.com/package/${encodeURIComponent(update.packageName)}`; + const packageLink = `[${update.packageName}](#${update.anchorId})`; + const versionLink = `[${escapeTableCell(update.version)}](${npmUrl})`; + return `| ${packageLink} | ${versionLink} | ${escapeTableCell(summary)} |`; + }); + + return [header, separator, ...rows].join('\n'); +} + +async function main() { + const candidateDocsPaths = resolveDocsChangelogPaths(); + let target = null; + + const preferredCandidate = candidateDocsPaths.find((candidate) => candidate.allowCreate) || null; + if (preferredCandidate) { + target = preferredCandidate; + if (!(await fileExists(target.path))) { + await fs.mkdir(path.dirname(target.path), { recursive: true }); + } + } else { + for (const candidate of candidateDocsPaths) { + if (await fileExists(candidate.path)) { + target = candidate; + break; + } + } + } + + if (!target) { + console.error('Unable to locate docs changelog. Checked:'); + for (const candidate of candidateDocsPaths) { + console.error(` - ${candidate.path}`); + } + process.exit(1); + } + const targetPath = target.path; + + const packageEntries = await fs.readdir(PACKAGES_DIR, { withFileTypes: true }); + const packageDirs = packageEntries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(); + + const updates = []; + + for (const pkgDir of packageDirs) { + const changelogPath = path.join(PACKAGES_DIR, pkgDir, 'CHANGELOG.md'); + if (!(await fileExists(changelogPath))) { + continue; + } + + const latest = await readLatestRelease(changelogPath); + if (!latest) { + continue; + } + + const packageJsonPath = path.join(PACKAGES_DIR, pkgDir, 'package.json'); + let packageName = pkgDir; + if (await fileExists(packageJsonPath)) { + try { + const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')); + if (typeof packageJson.name === 'string' && packageJson.name.trim()) { + packageName = packageJson.name.trim(); + } + } catch (error) { + console.warn(`Unable to read package name from ${packageJsonPath}: ${error.message}`); + } + } + + const sections = parseReleaseSections(latest.content); + const labelText = `${packageName.replace('@lit-protocol/', '')}`; + const label = escapeAttribute(labelText); + let descriptionText = null; + for (const section of sections) { + if (section.items.length) { + descriptionText = section.items[0]; + break; + } + } + + if (!descriptionText) { + descriptionText = deriveDescription(latest.content); + } + + const summary = descriptionText || '-'; + const rssTitleLiteral = JSON.stringify(labelText); + const rssDescriptionLiteral = JSON.stringify(descriptionText || 'No release notes provided yet.'); + const descriptionLiteral = JSON.stringify(`v${latest.version}`); + const id = buildUpdateId(packageName); + const bodyContent = buildUpdateBody(sections); + const tagsLiteral = buildTagsLiteral(sections); + + const block = [ + '', + '', + bodyContent, + '', + ].join('\n'); + + updates.push({ + packageName, + packageDir: pkgDir, + version: latest.version, + summary, + anchorId: id, + block, + }); + } + + const priorityNames = [ + '@lit-protocol/lit-client', + '@lit-protocol/auth', + '@lit-protocol/networks', + '@lit-protocol/auth-services', + ]; + const priorityDirs = ['lit-client', 'auth', 'networks', 'auth-services']; + + const getPriorityIndex = (pkgName, pkgDir) => { + const byName = priorityNames.indexOf(pkgName); + if (byName !== -1) { + return byName; + } + const byDir = priorityDirs.indexOf(pkgDir); + if (byDir !== -1) { + return byDir; + } + return priorityNames.length + priorityDirs.length; + }; + + updates.sort((a, b) => { + const aPriority = getPriorityIndex(a.packageName, a.packageDir); + const bPriority = getPriorityIndex(b.packageName, b.packageDir); + if (aPriority !== bPriority) { + return aPriority - bPriority; + } + return a.packageName.localeCompare(b.packageName); + }); + + const frontMatter = [ + '---', + 'title: "Changelog"', + 'description: "Keep track of changes and updates across the Lit JS SDK packages"', + 'rss: true', + '---', + ].join('\n'); + + let body = '*No release notes available.*'; + if (updates.length > 0) { + body = updates.map((item) => item.block).join('\n\n'); + } + + const summaryTable = buildSummaryTable(updates); + const output = `${frontMatter}\n\n${summaryTable}\n\n${body}\n`; + + await fs.writeFile(targetPath, output, 'utf8'); + console.log(`Updated docs changelog at ${targetPath} with ${updates.length} package releases.`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); From d4fdbf34e96b9c8e2ad4a92ac4a2ccd88ee7428c Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 10 Oct 2025 22:49:35 +0100 Subject: [PATCH 5/6] chore(workflows): add steps to sync and commit docs changelog automatically --- .github/workflows/e2e-naga.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/e2e-naga.yml b/.github/workflows/e2e-naga.yml index 85502ad7d..231fa7e70 100644 --- a/.github/workflows/e2e-naga.yml +++ b/.github/workflows/e2e-naga.yml @@ -169,3 +169,18 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} + + - name: Sync docs changelog + run: pnpm sync:docs-changelog + + - name: Commit docs changelog + run: | + if git diff --quiet docs/changelog.mdx; then + echo "Docs changelog already up to date." + exit 0 + fi + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add docs/changelog.mdx + git commit -m "chore: sync docs changelog" + git push origin ${{ github.ref_name }} From dfb7c0857bdcc2d92855a28ec248d2b8bbfcc733 Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 10 Oct 2025 22:56:15 +0100 Subject: [PATCH 6/6] fix(sync-docs-changelog): - resolve https://github.com/LIT-Protocol/js-sdk/pull/948#discussion_r2422151517 - resolve https://github.com/LIT-Protocol/js-sdk/pull/948#discussion_r2422151520 --- tools/sync-docs-changelog.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/sync-docs-changelog.js b/tools/sync-docs-changelog.js index 87c282e20..2b73bdfb4 100644 --- a/tools/sync-docs-changelog.js +++ b/tools/sync-docs-changelog.js @@ -5,6 +5,7 @@ const path = require('path'); const ROOT = path.resolve(__dirname, '..'); const PACKAGES_DIR = path.join(ROOT, 'packages'); +const ORG_SCOPE = '@lit-protocol/'; function resolveDocsChangelogPaths() { const arg = process.argv.find((value) => value.startsWith('--docs=')); @@ -28,7 +29,6 @@ function resolveDocsChangelogPaths() { candidates.push({ path: path.resolve(ROOT, 'docs', 'changelog.mdx'), allowCreate: false }); candidates.push({ path: path.resolve(ROOT, '..', 'docs-v2', 'changelog.mdx'), allowCreate: false }); - candidates.push({ path: path.resolve(ROOT, '..', 'naga-doc', 'changelog.mdx'), allowCreate: false }); const resolved = []; const seen = new Set(); @@ -358,7 +358,9 @@ async function main() { } const sections = parseReleaseSections(latest.content); - const labelText = `${packageName.replace('@lit-protocol/', '')}`; + const labelText = packageName.startsWith(ORG_SCOPE) + ? packageName.slice(ORG_SCOPE.length) + : packageName; const label = escapeAttribute(labelText); let descriptionText = null; for (const section of sections) { @@ -404,10 +406,10 @@ async function main() { } const priorityNames = [ - '@lit-protocol/lit-client', - '@lit-protocol/auth', - '@lit-protocol/networks', - '@lit-protocol/auth-services', + `${ORG_SCOPE}lit-client`, + `${ORG_SCOPE}auth`, + `${ORG_SCOPE}networks`, + `${ORG_SCOPE}auth-services`, ]; const priorityDirs = ['lit-client', 'auth', 'networks', 'auth-services'];