Compare commits
326
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b7010eccb | ||
|
|
041c01341b | ||
|
|
439a377aa7 | ||
|
|
4f52c29611 | ||
|
|
374671fd9a | ||
|
|
0a9fc269ff | ||
|
|
2e3cc7cdd4 | ||
|
|
3ba15366be | ||
|
|
771bd1e1b2 | ||
|
|
1baa98fba4 | ||
|
|
39e79282ac | ||
|
|
13d5b86ae5 | ||
|
|
8edb3f1b34 | ||
|
|
69c3eb910f | ||
|
|
c8f881c2b9 | ||
|
|
71ac41adae | ||
|
|
ddb2121c67 | ||
|
|
558dc10a63 | ||
|
|
c9f1fd8fc2 | ||
|
|
e75b48cfe9 | ||
|
|
173b3b2ad9 | ||
|
|
654aaa2171 | ||
|
|
627d209927 | ||
|
|
57320957aa | ||
|
|
6fdade6c45 | ||
|
|
6d25586d08 | ||
|
|
4d89dc1efa | ||
|
|
a5653f07f8 | ||
|
|
7f35caff5d | ||
|
|
bf90fa5005 | ||
|
|
3d63a2cb69 | ||
|
|
466b1e75dc | ||
|
|
3dfc003902 | ||
|
|
b34737d27a | ||
|
|
1a5d41cc8a | ||
|
|
a5541a1c55 | ||
|
|
13e389a63e | ||
|
|
6884815428 | ||
|
|
f29f91d7e0 | ||
|
|
212b2e7bc2 | ||
|
|
3f2ee85a1a | ||
|
|
24450ed7ac | ||
|
|
ba978f55b0 | ||
|
|
94e4dc9aab | ||
|
|
67656c7131 | ||
|
|
dccb9ddd0e | ||
|
|
c3b264982d | ||
|
|
0efd0f9d26 | ||
|
|
7af35a0133 | ||
|
|
9caf201f24 | ||
|
|
ea7da5fb77 | ||
|
|
89641e3378 | ||
|
|
dcb6afa148 | ||
|
|
324330d354 | ||
|
|
056643ad83 | ||
|
|
e21f7bb171 | ||
|
|
148e6a9166 | ||
|
|
9a23de2be0 | ||
|
|
c377e868ed | ||
|
|
c4f1309dcd | ||
|
|
2e057827e3 | ||
|
|
9e1455294a | ||
|
|
e11e645c74 | ||
|
|
d2322fc404 | ||
|
|
e249a56892 | ||
|
|
7a74bd9c8a | ||
|
|
f6599fdc8b | ||
|
|
ed1a3e06a8 | ||
|
|
4a822298dd | ||
|
|
90a2f2d435 | ||
|
|
43dcc14568 | ||
|
|
a11b1d49bd | ||
|
|
cb103bf935 | ||
|
|
4c8716947c | ||
|
|
abbd255efa | ||
|
|
6047d67daa | ||
|
|
749a12f92f | ||
|
|
c4edead2db | ||
|
|
f689033bc5 | ||
|
|
415f2aa83b | ||
|
|
6dac95bd48 | ||
|
|
517d9a8f94 | ||
|
|
5d56700866 | ||
|
|
bc2f7cb927 | ||
|
|
eb6544ffc8 | ||
|
|
0ca92533a2 | ||
|
|
051b319c34 | ||
|
|
e100168979 | ||
|
|
3cb53c4a2a | ||
|
|
ead1e425a9 | ||
|
|
38b0f55db1 | ||
|
|
09ea738981 | ||
|
|
71de335e10 | ||
|
|
d3637a160d | ||
|
|
27c00ef779 | ||
|
|
756d5cc960 | ||
|
|
0f9b88ab68 | ||
|
|
30f16cac6d | ||
|
|
ece19ef7d3 | ||
|
|
7d18c3edea | ||
|
|
7d07490ed3 | ||
|
|
22571ba0a9 | ||
|
|
0ff90b8fba | ||
|
|
e66e906650 | ||
|
|
b3cf65b9db | ||
|
|
f953c72c4e | ||
|
|
bbc2e092b8 | ||
|
|
4c3c840d88 | ||
|
|
cf606665fc | ||
|
|
3871068aa6 | ||
|
|
d00ca7fd2a | ||
|
|
9ee3c21eac | ||
|
|
ed3afd418c | ||
|
|
b90fa2cc29 | ||
|
|
2ab517aa49 | ||
|
|
e46dd0254f | ||
|
|
1a5627f72d | ||
|
|
b808e942fd | ||
|
|
7fdb1715e4 | ||
|
|
ae2fcf7e00 | ||
|
|
94a8f7960a | ||
|
|
c410a1c18a | ||
|
|
81c46e2298 | ||
|
|
f369bffe5a | ||
|
|
fed1313a19 | ||
|
|
b7d4dee446 | ||
|
|
23db97cca5 | ||
|
|
0f54e99141 | ||
|
|
c701c388c6 | ||
|
|
328ef5dc9c | ||
|
|
07fbb799be | ||
|
|
699f31c20a | ||
|
|
c97e51b855 | ||
|
|
e10173bf8a | ||
|
|
dbfa73d75a | ||
|
|
1b1212d9fb | ||
|
|
065f85bf71 | ||
|
|
09bafa9aeb | ||
|
|
fe30c88cc3 | ||
|
|
3a9538259c | ||
|
|
0c730e57e0 | ||
|
|
33c9f6b1ab | ||
|
|
2346396bdf | ||
|
|
de5ebc9093 | ||
|
|
42c4c33d30 | ||
|
|
046603ac54 | ||
|
|
bcfa9463bb | ||
|
|
42bda873b4 | ||
|
|
d2001ca464 | ||
|
|
c8ba5cf863 | ||
|
|
85842c1596 | ||
|
|
0fb2f1fc5e | ||
|
|
497677f359 | ||
|
|
15ae5e7f95 | ||
|
|
5a0283d083 | ||
|
|
9496606964 | ||
|
|
b50e4a41b5 | ||
|
|
e595d4d92f | ||
|
|
3e526d46fa | ||
|
|
a36c7e8331 | ||
|
|
7bb054e45c | ||
|
|
cd87be4a24 | ||
|
|
aefc4cda4c | ||
|
|
cfe81b4432 | ||
|
|
72c0bb10d6 | ||
|
|
ca618ea0c9 | ||
|
|
d20e789856 | ||
|
|
a135857c7a | ||
|
|
34546c24c7 | ||
|
|
61c62b3f07 | ||
|
|
f2390b64e8 | ||
|
|
4ae1cd63bb | ||
|
|
a4339818a0 | ||
|
|
b3394277c7 | ||
|
|
fdf19b0a26 | ||
|
|
9798a31a9a | ||
|
|
f93bd325e1 | ||
|
|
97ba1fbd42 | ||
|
|
28fc3736aa | ||
|
|
06805217c2 | ||
|
|
b833250053 | ||
|
|
9455912932 | ||
|
|
4c488aa31f | ||
|
|
b0ecfd2d8d | ||
|
|
2b4f1c8e55 | ||
|
|
e79b293562 | ||
|
|
2861dff1f0 | ||
|
|
61b6a00214 | ||
|
|
b02fb91a54 | ||
|
|
8bf3be88be | ||
|
|
fb5095bff5 | ||
|
|
d28097f508 | ||
|
|
a27b10c5c3 | ||
|
|
8c2d4e5ea7 | ||
|
|
507496627b | ||
|
|
f5b89987af | ||
|
|
4bb8f5b15e | ||
|
|
914befda16 | ||
|
|
b5bbe2bd43 | ||
|
|
68288436ac | ||
|
|
d4ce855e5f | ||
|
|
47b0ed5171 | ||
|
|
00b9eea9ec | ||
|
|
bf27b88728 | ||
|
|
17fe41d42b | ||
|
|
36600decef | ||
|
|
e09221f1e0 | ||
|
|
62cc785c4a | ||
|
|
7c45941b57 | ||
|
|
7a2e0edab4 | ||
|
|
fb0cb676b9 | ||
|
|
12d85dec10 | ||
|
|
1094a03a04 | ||
|
|
6cc38b0680 | ||
|
|
7abb36a7ec | ||
|
|
6832b19fc5 | ||
|
|
1c4cbedb6a | ||
|
|
8ff87be631 | ||
|
|
e43beec36a | ||
|
|
c5b7fef5ba | ||
|
|
4c5e40ae4e | ||
|
|
ab2dfd4f5c | ||
|
|
13029e3286 | ||
|
|
44c9ccd65d | ||
|
|
7912c26323 | ||
|
|
69d68f5a25 | ||
|
|
836be52724 | ||
|
|
9f993dcc1e | ||
|
|
61760a180f | ||
|
|
a3f3e160e0 | ||
|
|
b1190914a9 | ||
|
|
e79a952061 | ||
|
|
480ed721d1 | ||
|
|
42c7436827 | ||
|
|
16e9e8b64d | ||
|
|
23ab897e32 | ||
|
|
6fcdec7c12 | ||
|
|
b734f05525 | ||
|
|
30ea9c6bf7 | ||
|
|
6de3a19b86 | ||
|
|
06e59cf916 | ||
|
|
3f3a484a3a | ||
|
|
05e52114bf | ||
|
|
1a421d3b5d | ||
|
|
97fdbc8f64 | ||
|
|
ebf4025718 | ||
|
|
a81a5285b7 | ||
|
|
95c9d56ea4 | ||
|
|
18552f3a22 | ||
|
|
9187e0f2cf | ||
|
|
20d0f53b46 | ||
|
|
0dcb15b7e6 | ||
|
|
ba49a82463 | ||
|
|
8d1b8a47e6 | ||
|
|
b90d3af5b8 | ||
|
|
c34ac468fb | ||
|
|
fefeaeef18 | ||
|
|
91c2352b03 | ||
|
|
9f454d1e08 | ||
|
|
59e5541094 | ||
|
|
8e104b443e | ||
|
|
0eed017bb9 | ||
|
|
789700cf60 | ||
|
|
570d71e8d6 | ||
|
|
961ef644d1 | ||
|
|
6fcd09ddbd | ||
|
|
a9d32f3c90 | ||
|
|
8ec0d00c75 | ||
|
+3 |
0acc530f8b | ||
|
|
7a6f516b4f | ||
|
|
7461e2a914 | ||
|
|
178609a062 | ||
|
|
8ea8f6e954 | ||
|
|
b49efc24ac | ||
|
|
6853e87a49 | ||
|
|
4197d1bf3f | ||
|
|
3faa9f21ef | ||
|
|
a75e4cc80a | ||
|
|
f7bda0904f | ||
|
|
fe7be4dd8d | ||
|
|
0f15ee5963 | ||
|
|
4fa09df6d0 | ||
|
|
b6f72c566c | ||
|
|
1934ef5fac | ||
|
|
467c9eeedc | ||
|
|
7ff0b4d547 | ||
|
|
5917e626b0 | ||
|
|
6028a88111 | ||
|
|
80def43d44 | ||
|
|
0b748f31ce | ||
|
|
0358722c1a | ||
|
|
b6267599f5 | ||
|
|
44f258d6bf | ||
|
|
4cb6e287c8 | ||
|
|
db0bbf5173 | ||
|
|
41fd6f9395 | ||
|
|
4374bd4e16 | ||
|
|
042459fe34 | ||
|
|
cc6511351f | ||
|
|
d1743a3279 | ||
|
|
f3fb440fb5 | ||
|
|
2307f11ab3 | ||
|
|
d8d48a9516 | ||
|
|
5ffbcfc302 | ||
|
|
d27a3dee83 | ||
|
|
7080ff29fc | ||
|
|
638afd8e08 | ||
|
|
947e3345ef | ||
|
|
ea51a50bfc | ||
|
|
c6f59e1b01 | ||
|
|
6d1eabe9f9 | ||
|
|
c238fde877 | ||
|
|
548601981f | ||
|
|
05481aa8c0 | ||
|
|
1cc26e43e5 | ||
|
|
99d7ec06ec | ||
|
|
ff996646b2 | ||
|
|
01260009be | ||
|
|
7dea0975ec | ||
|
|
a63f5dc7cb | ||
|
|
fd7a9f0998 | ||
|
|
246b0d4aac | ||
|
|
42ba15f2c0 | ||
|
|
aa9f48d136 | ||
|
|
64138642e8 | ||
|
|
223008b1f7 |
+11
-1
@@ -15,7 +15,17 @@
|
||||
"access": "public",
|
||||
"baseBranch": "main",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": ["e2e-cra-5", "e2e-next-13", "e2e-vite-3"],
|
||||
"ignore": [
|
||||
"e2e-cra-5",
|
||||
"e2e-next-13",
|
||||
"e2e-vite-3",
|
||||
"bundlers-esbuild",
|
||||
"bundlers-vite",
|
||||
"bundlers-webpack",
|
||||
"bundlers-swc",
|
||||
"runtimes-node-commonjs",
|
||||
"runtimes-node-module"
|
||||
],
|
||||
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
|
||||
"updateInternalDependents": "always",
|
||||
"onlyUpdatePeerDependentsWhenOutOfRange": true
|
||||
|
||||
@@ -31,6 +31,11 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 25
|
||||
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- name: Install
|
||||
uses: ./.github/composite-actions/install
|
||||
|
||||
@@ -59,6 +64,11 @@ jobs:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
@@ -84,6 +94,12 @@ jobs:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
|
||||
# we use bun for some test suites
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
@@ -114,6 +130,12 @@ jobs:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
|
||||
# we use bun for some test suites
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
name: Dispatch Doc Generation
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
dispatch:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Repository Dispatch
|
||||
uses: peter-evans/[email protected]
|
||||
with:
|
||||
token: ${{ secrets.REPO_ACCESS_TOKEN }}
|
||||
repository: thirdweb-dev/docs
|
||||
event-type: generate-docs
|
||||
@@ -0,0 +1,68 @@
|
||||
# On the Version Packages branch
|
||||
# Generate and Commit the Typedoc JSON files and the Snippets JSON files
|
||||
|
||||
name: Commit Release Artifacts
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- changeset-release/main
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
release-artifacts:
|
||||
timeout-minutes: 15
|
||||
runs-on: ubuntu-latest-16
|
||||
steps:
|
||||
- name: Checkout branch
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# bun setup is required, because pnpm typdoc will run pnpm build and some packages uses bun for build
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- name: Install
|
||||
uses: ./.github/composite-actions/install
|
||||
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
|
||||
- name: Typedoc
|
||||
run: pnpm typedoc
|
||||
|
||||
- name: Generate Docs
|
||||
run: |
|
||||
cd packages/sdk
|
||||
pnpm generate-docs
|
||||
cd ../react-core
|
||||
pnpm generate-docs
|
||||
cd ../react
|
||||
pnpm generate-docs
|
||||
cd ../..
|
||||
|
||||
- name: Generate Snippets
|
||||
run: pnpm generate-snippets
|
||||
|
||||
- name: Commit changes
|
||||
run: |
|
||||
git config --local user.email "[email protected]"
|
||||
git config --local user.name "GitHub Action"
|
||||
git status
|
||||
git add packages/react/typedoc/documentation.json.gz
|
||||
git add packages/react-core/typedoc/documentation.json.gz
|
||||
git add packages/react-native/typedoc/documentation.json.gz
|
||||
git add packages/sdk/typedoc/documentation.json.gz
|
||||
git add packages/storage/typedoc/documentation.json.gz
|
||||
git add packages/wallets/typedoc/documentation.json.gz
|
||||
git add snippets/feature_snippets_react.json
|
||||
git add snippets/feature_snippets_sdk.json
|
||||
git add snippets/snippets.json
|
||||
git commit -m "Commit Release Artifacts [skip ci]"
|
||||
git push
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -26,6 +26,11 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- name: Install
|
||||
uses: ./.github/composite-actions/install
|
||||
|
||||
|
||||
@@ -67,6 +67,11 @@ jobs:
|
||||
repository: ${{ fromJson(steps.get_pull_request_ref.outputs.data).head.repo.full_name }}
|
||||
ref: ${{ fromJson(steps.get_pull_request_ref.outputs.data).head.ref }}
|
||||
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- name: Install
|
||||
uses: ./.github/composite-actions/install
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# Using CUSTOM_GITHUB_TOKEN instead of GITHUB_TOKEN is required to trigger workflows in "Version Packages" PR created by changesets/action
|
||||
# CUSTOM_GITHUB_TOKEN should be a PAT with write access to the repo and has to be created and set as a secret in the repo manually
|
||||
|
||||
name: Release Nightly & Stable
|
||||
|
||||
on:
|
||||
@@ -25,6 +28,13 @@ jobs:
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
# Do not use the GITHUB_TOKEN by default
|
||||
token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
|
||||
|
||||
- name: Setup bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- name: Install
|
||||
uses: ./.github/composite-actions/install
|
||||
@@ -41,7 +51,7 @@ jobs:
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
|
||||
|
||||
- name: Create @nightly release
|
||||
if: steps.changesets.outputs.published != 'true'
|
||||
@@ -51,4 +61,4 @@ jobs:
|
||||
pnpm release:nightly
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
|
||||
|
||||
@@ -14,6 +14,8 @@ jobs:
|
||||
|
||||
- name: Install bun
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: 1.0.21
|
||||
|
||||
- name: Run chains sync
|
||||
run: bun run db:sync
|
||||
@@ -22,10 +24,23 @@ jobs:
|
||||
- name: Check for Changes
|
||||
id: git-check
|
||||
run: |
|
||||
git diff --exit-code || echo "step.git-check.outputs.changes=true" >> $GITHUB_ENV
|
||||
if git diff --quiet; then
|
||||
echo "CHANGES_FOUND=false" >> $GITHUB_ENV
|
||||
else
|
||||
echo "CHANGES_FOUND=true" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Create or Update sync-chains.md
|
||||
if: env.CHANGES_FOUND == 'true'
|
||||
run: |
|
||||
echo '---' > .changeset/sync-chains.md
|
||||
echo '"@thirdweb-dev/chains": patch' >> .changeset/sync-chains.md
|
||||
echo '---' >> .changeset/sync-chains.md
|
||||
echo '' >> .changeset/sync-chains.md
|
||||
echo 'Synced Chains Package' >> .changeset/sync-chains.md
|
||||
|
||||
- name: Commit Changes
|
||||
if: env.step.git-check.outputs.changes == 'true'
|
||||
if: env.CHANGES_FOUND == 'true'
|
||||
run: |
|
||||
git config --local user.email "[email protected]"
|
||||
git config --local user.name "GitHub Action"
|
||||
@@ -33,10 +48,10 @@ jobs:
|
||||
git commit -m "chore(chains): sync from db"
|
||||
|
||||
- name: Create or Update Pull Request
|
||||
if: env.step.git-check.outputs.changes == 'true'
|
||||
if: env.CHANGES_FOUND == 'true'
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
title: "chore(chains): update chains"
|
||||
branch: "sync-chains" # You can specify a different branch name if you wish
|
||||
branch: "sync-chains"
|
||||
body: "This PR was automatically created by a GitHub Action. It updates the chains package with the latest changes from the database."
|
||||
commit-message: "chore(chains): sync from db"
|
||||
|
||||
+6
-4
@@ -7,13 +7,15 @@
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
"node": ">=18"
|
||||
},
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
"test": "turbo run test --filter=./packages/*",
|
||||
"e2e": "turbo run e2e",
|
||||
"build": "turbo run build --filter=./packages/*",
|
||||
"typedoc": "turbo run typedoc",
|
||||
"generate-snippets": "node ./scripts/generate-snippets/index.mjs",
|
||||
"build:release": "turbo run build --force --filter=./packages/*",
|
||||
"dev": "turbo run dev --no-cache --parallel --continue",
|
||||
"fix:repo": "manypkg fix",
|
||||
@@ -45,10 +47,10 @@
|
||||
"@playwright/test": "1.31.2",
|
||||
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
|
||||
"@types/node": "^18.17.1",
|
||||
"eslint": "^8.45.0",
|
||||
"eslint": "^8.56.0",
|
||||
"mocha": "^10.2.0",
|
||||
"prettier": "^3.0.0",
|
||||
"turbo": "^1.10.12",
|
||||
"prettier": "^3.1.1",
|
||||
"turbo": "^1.11.3",
|
||||
"yalc": "1.0.0-pre.53"
|
||||
},
|
||||
"manypkg": {
|
||||
|
||||
@@ -1,5 +1,233 @@
|
||||
# @thirdweb-dev/auth
|
||||
|
||||
## 4.1.29
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.4.7
|
||||
|
||||
## 4.1.28
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`3ba15366`](https://github.com/thirdweb-dev/js/commit/3ba15366be8b57e577b871c44e386978dc9d4a8a)]:
|
||||
- @thirdweb-dev/wallets@2.4.6
|
||||
|
||||
## 4.1.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.4.5
|
||||
|
||||
## 4.1.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2106](https://github.com/thirdweb-dev/js/pull/2106) [`1a5d41cc`](https://github.com/thirdweb-dev/js/commit/1a5d41cc8afeef5f9882753473aad3bc0c7757ac) Thanks [@hsynlms](https://github.com/hsynlms)! - Add support for Next.js App Router
|
||||
|
||||
- Updated dependencies [[`a5653f07`](https://github.com/thirdweb-dev/js/commit/a5653f07f82e3f94e193d2b90c9d0c163223583c), [`bf90fa50`](https://github.com/thirdweb-dev/js/commit/bf90fa5005358e040475627ae23a474f7b263803), [`6fdade6c`](https://github.com/thirdweb-dev/js/commit/6fdade6c45f5d93fb3571d33720ab8103a7d002c), [`4d89dc1e`](https://github.com/thirdweb-dev/js/commit/4d89dc1efa2412b1e121cd14b1e2e72c667fceb0)]:
|
||||
- @thirdweb-dev/wallets@2.4.4
|
||||
|
||||
## 4.1.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.4.3
|
||||
|
||||
## 4.1.24
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.4.2
|
||||
|
||||
## 4.1.23
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`90a2f2d4`](https://github.com/thirdweb-dev/js/commit/90a2f2d435df796fa9cee4e78d540ecfa10d9166), [`27c00ef7`](https://github.com/thirdweb-dev/js/commit/27c00ef779fd6386b529598a65346bdd1d6ecc70)]:
|
||||
- @thirdweb-dev/wallets@2.4.1
|
||||
|
||||
## 4.1.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`22571ba0`](https://github.com/thirdweb-dev/js/commit/22571ba0a9bd238f9ee16f548bc17ccad2e7ad1f), [`e66e9066`](https://github.com/thirdweb-dev/js/commit/e66e906650e04a63e084bc869a62681bd956e0bb)]:
|
||||
- @thirdweb-dev/wallets@2.4.0
|
||||
|
||||
## 4.1.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`cf606665`](https://github.com/thirdweb-dev/js/commit/cf606665fcfdad7b08259350d39b60313278a8dc)]:
|
||||
- @thirdweb-dev/wallets@2.3.4
|
||||
|
||||
## 4.1.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`e46dd025`](https://github.com/thirdweb-dev/js/commit/e46dd0254f157c3c4d50fe3e4f44e2e24eaf34a8)]:
|
||||
- @thirdweb-dev/wallets@2.3.3
|
||||
|
||||
## 4.1.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`c410a1c1`](https://github.com/thirdweb-dev/js/commit/c410a1c18a704d118555215db9ba7d92c3b24d8c), [`81c46e22`](https://github.com/thirdweb-dev/js/commit/81c46e22984cdb5b33b2e6eb99a0ebf0e4fbdb33)]:
|
||||
- @thirdweb-dev/wallets@2.3.2
|
||||
|
||||
## 4.1.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.3.1
|
||||
|
||||
## 4.1.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`33c9f6b1`](https://github.com/thirdweb-dev/js/commit/33c9f6b1ab3e65187b2c49c083412d39a1334bba), [`de5ebc90`](https://github.com/thirdweb-dev/js/commit/de5ebc9093aaf5fc08bc0d2d414138b520fe17fe), [`e10173bf`](https://github.com/thirdweb-dev/js/commit/e10173bf8aeaaabdb45231109b4da0c52c91b9da), [`09bafa9a`](https://github.com/thirdweb-dev/js/commit/09bafa9aebadb01641214747148c67d0b39c1275)]:
|
||||
- @thirdweb-dev/wallets@2.3.0
|
||||
|
||||
## 4.1.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.2.1
|
||||
|
||||
## 4.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`94966069`](https://github.com/thirdweb-dev/js/commit/9496606964d65268f8ee6bf9f78b2786e99d33ac), [`15ae5e7f`](https://github.com/thirdweb-dev/js/commit/15ae5e7f95a482a9736923c0e10916a0a6115c3d)]:
|
||||
- @thirdweb-dev/wallets@2.2.0
|
||||
|
||||
## 4.1.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`a36c7e83`](https://github.com/thirdweb-dev/js/commit/a36c7e8331744879a169f84e97b66abf0ab44f56), [`4ae1cd63`](https://github.com/thirdweb-dev/js/commit/4ae1cd63bb7b471cae48a27bf6554c4953c1dc82), [`61c62b3f`](https://github.com/thirdweb-dev/js/commit/61c62b3f07a082ffd7620c949e3bcc6b75c104b5), [`7bb054e4`](https://github.com/thirdweb-dev/js/commit/7bb054e45c75450c8f465809d23eb66371f6ef8e)]:
|
||||
- @thirdweb-dev/wallets@2.1.11
|
||||
|
||||
## 4.1.13
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`8c2d4e5e`](https://github.com/thirdweb-dev/js/commit/8c2d4e5ea7c38b3efa4d8d94c9822a92d271e59b), [`2b4f1c8e`](https://github.com/thirdweb-dev/js/commit/2b4f1c8e55de091100fb5279887bcb19ea31d38c)]:
|
||||
- @thirdweb-dev/wallets@2.1.10
|
||||
|
||||
## 4.1.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`b5bbe2bd`](https://github.com/thirdweb-dev/js/commit/b5bbe2bd438179c38451bc2cfa20a54fc79e4f3a)]:
|
||||
- @thirdweb-dev/wallets@2.1.9
|
||||
|
||||
## 4.1.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1973](https://github.com/thirdweb-dev/js/pull/1973) [`36600dec`](https://github.com/thirdweb-dev/js/commit/36600decefca7b9ebb1924757b4186b559e439f6) Thanks [@assimovt](https://github.com/assimovt)! - add logging to authenticate
|
||||
|
||||
- Updated dependencies [[`1094a03a`](https://github.com/thirdweb-dev/js/commit/1094a03a04f3e7ade84af0f7a6073794c0904cb1)]:
|
||||
- @thirdweb-dev/wallets@2.1.8
|
||||
|
||||
## 4.1.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`6832b19f`](https://github.com/thirdweb-dev/js/commit/6832b19fc5eedc7c17e69940a361840de0a84881), [`7abb36a7`](https://github.com/thirdweb-dev/js/commit/7abb36a7ec39766dd7da03015ccef401ef7a7863), [`1c4cbedb`](https://github.com/thirdweb-dev/js/commit/1c4cbedb6a3c9f9014ffbf83c02b998768958d96)]:
|
||||
- @thirdweb-dev/wallets@2.1.7
|
||||
|
||||
## 4.1.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`ab2dfd4f`](https://github.com/thirdweb-dev/js/commit/ab2dfd4f5cf4256fa62d76f84ca804992afab1e4)]:
|
||||
- @thirdweb-dev/wallets@2.1.6
|
||||
|
||||
## 4.1.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`69d68f5a`](https://github.com/thirdweb-dev/js/commit/69d68f5a25877bf5ea694719d2cf4ca8388f3091)]:
|
||||
- @thirdweb-dev/wallets@2.1.5
|
||||
|
||||
## 4.1.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`9f993dcc`](https://github.com/thirdweb-dev/js/commit/9f993dcc1e60cc087850b8fb9ce09524073ce0b5)]:
|
||||
- @thirdweb-dev/wallets@2.1.4
|
||||
|
||||
## 4.1.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`6fcdec7c`](https://github.com/thirdweb-dev/js/commit/6fcdec7c12e4a3c0d10f3a67771e19cfad5c8ab5), [`42c74368`](https://github.com/thirdweb-dev/js/commit/42c743682739de77c264c11cc1692ed752f929a6), [`480ed721`](https://github.com/thirdweb-dev/js/commit/480ed721d1c736049fa8b6ee4cbdbdf3cce18abd), [`16e9e8b6`](https://github.com/thirdweb-dev/js/commit/16e9e8b64d7d1a97a5b32fc855479e992b7ed3a8), [`b1190914`](https://github.com/thirdweb-dev/js/commit/b1190914a97a9c4d9019c4ce8ee49ad345aed18c)]:
|
||||
- @thirdweb-dev/wallets@2.1.3
|
||||
|
||||
## 4.1.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1927](https://github.com/thirdweb-dev/js/pull/1927) [`05e52114`](https://github.com/thirdweb-dev/js/commit/05e52114bf4f0ee352f393ed20115a904a18c310) Thanks [@alecananian](https://github.com/alecananian)! - Update Fastify login route response to match Express/Next
|
||||
|
||||
- Updated dependencies [[`3f3a484a`](https://github.com/thirdweb-dev/js/commit/3f3a484a3aa6e9f784e4d44458461bac0d3d4c6b), [`a81a5285`](https://github.com/thirdweb-dev/js/commit/a81a5285b7ef4ddf47fd2779ab80ebbef4bd9e0e), [`30ea9c6b`](https://github.com/thirdweb-dev/js/commit/30ea9c6bf74b483a98592a1d8d64589b7f1b22a3), [`97fdbc8f`](https://github.com/thirdweb-dev/js/commit/97fdbc8f6443dcd08a7610e4437bd4c9d6b0e8c8)]:
|
||||
- @thirdweb-dev/wallets@2.1.2
|
||||
|
||||
## 4.1.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`20d0f53b`](https://github.com/thirdweb-dev/js/commit/20d0f53b46a2975a0a14ddaa4a377f2f758804db)]:
|
||||
- @thirdweb-dev/wallets@2.1.1
|
||||
|
||||
## 4.1.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`0acc530f`](https://github.com/thirdweb-dev/js/commit/0acc530f8bbee59672d9705724edc278bd853d9a)]:
|
||||
- @thirdweb-dev/wallets@2.1.0
|
||||
|
||||
## 4.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`3faa9f21`](https://github.com/thirdweb-dev/js/commit/3faa9f21efb1ae29a57747d6f0b8fb1151930ab4)]:
|
||||
- @thirdweb-dev/wallets@2.0.10
|
||||
|
||||
## 4.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1855](https://github.com/thirdweb-dev/js/pull/1855) [`b6f72c56`](https://github.com/thirdweb-dev/js/commit/b6f72c566c9cec5c2d0a0ebe709d6177b2af68e4) Thanks [@jnsdls](https://github.com/jnsdls)! - require minimum node version: `>=18`
|
||||
|
||||
- Updated dependencies [[`4fa09df6`](https://github.com/thirdweb-dev/js/commit/4fa09df6d0ece89e5e6f1c8f9b530a4bd6c266d7), [`4cb6e287`](https://github.com/thirdweb-dev/js/commit/4cb6e287c857e3597ae9f3c92c9c3961ca7a9f4e), [`5917e626`](https://github.com/thirdweb-dev/js/commit/5917e626b0744af369b67a2e44d9361422a8045d), [`44f258d6`](https://github.com/thirdweb-dev/js/commit/44f258d6bf801b553ca67a5dcebe213a4772e8a1), [`7ff0b4d5`](https://github.com/thirdweb-dev/js/commit/7ff0b4d54715afc86fc72e297a4d8bbe6897e49c), [`b6f72c56`](https://github.com/thirdweb-dev/js/commit/b6f72c566c9cec5c2d0a0ebe709d6177b2af68e4), [`042459fe`](https://github.com/thirdweb-dev/js/commit/042459fe3424add527209ac273913b494b5e426c)]:
|
||||
- @thirdweb-dev/wallets@2.0.9
|
||||
|
||||
## 4.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#1801](https://github.com/thirdweb-dev/js/pull/1801) [`99d7ec06`](https://github.com/thirdweb-dev/js/commit/99d7ec06ec4f31308627edc87d3122c21a884b5a) Thanks [@adam-maj](https://github.com/adam-maj)! - Add support for fastify
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1812](https://github.com/thirdweb-dev/js/pull/1812) [`c238fde8`](https://github.com/thirdweb-dev/js/commit/c238fde8777fd14b39837117e2d3fda1dd301029) Thanks [@adam-maj](https://github.com/adam-maj)! - Update to call uuidv4 to generate jti
|
||||
|
||||
- [#1811](https://github.com/thirdweb-dev/js/pull/1811) [`54860198`](https://github.com/thirdweb-dev/js/commit/548601981f6dd8706d7a9bd4ca48e4abc7723a1d) Thanks [@adam-maj](https://github.com/adam-maj)! - Expose buildJWT function
|
||||
|
||||
- [#1812](https://github.com/thirdweb-dev/js/pull/1812) [`c238fde8`](https://github.com/thirdweb-dev/js/commit/c238fde8777fd14b39837117e2d3fda1dd301029) Thanks [@adam-maj](https://github.com/adam-maj)! - Update to use uuidv4 for default jti
|
||||
|
||||
- Updated dependencies [[`5ffbcfc3`](https://github.com/thirdweb-dev/js/commit/5ffbcfc302f74167768b196d93a328f979344036), [`d27a3dee`](https://github.com/thirdweb-dev/js/commit/d27a3dee8398d5707d2d1343c428abf8e03f67e3), [`ff996646`](https://github.com/thirdweb-dev/js/commit/ff996646b228d4d095eea04b05004dd26fc7e522), [`aa9f48d1`](https://github.com/thirdweb-dev/js/commit/aa9f48d1361194fc81146da530c95a3409bd0799), [`fd7a9f09`](https://github.com/thirdweb-dev/js/commit/fd7a9f09989e39b02a93d9dfd01cc7378e6ead53), [`2307f11a`](https://github.com/thirdweb-dev/js/commit/2307f11ab311aa4a775edd23e777d10f8015ce86), [`64138642`](https://github.com/thirdweb-dev/js/commit/64138642e84d8b56b254762eca613d443cca292b)]:
|
||||
- @thirdweb-dev/wallets@2.0.8
|
||||
|
||||
## 4.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"main": "dist/thirdweb-dev-auth-fastify.cjs.js",
|
||||
"module": "dist/thirdweb-dev-auth-fastify.esm.js",
|
||||
"browser": {
|
||||
"./dist/thirdweb-dev-auth-fastify.esm.js": "./dist/thirdweb-dev-auth-fastify.browser.esm.js"
|
||||
}
|
||||
}
|
||||
+30
-12
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/auth",
|
||||
"version": "4.0.7",
|
||||
"version": "4.1.29",
|
||||
"main": "dist/thirdweb-dev-auth.cjs.js",
|
||||
"module": "dist/thirdweb-dev-auth.esm.js",
|
||||
"browser": {
|
||||
@@ -35,6 +35,13 @@
|
||||
},
|
||||
"default": "./express/dist/thirdweb-dev-auth-express.cjs.js"
|
||||
},
|
||||
"./fastify": {
|
||||
"module": {
|
||||
"browser": "./fastify/dist/thirdweb-dev-auth-fastify.browser.esm.js",
|
||||
"default": "./fastify/dist/thirdweb-dev-auth-fastify.esm.js"
|
||||
},
|
||||
"default": "./fastify/dist/thirdweb-dev-auth-fastify.cjs.js"
|
||||
},
|
||||
"./next-auth": {
|
||||
"module": {
|
||||
"browser": "./next-auth/dist/thirdweb-dev-auth-next-auth.browser.esm.js",
|
||||
@@ -51,7 +58,7 @@
|
||||
"scripts": {
|
||||
"build": "preconstruct build",
|
||||
"format": "prettier --write 'src/**/*'",
|
||||
"lint": "eslint src/",
|
||||
"lint": "eslint src/ && bunx publint --strict --level warning",
|
||||
"fix": "eslint src/ --fix",
|
||||
"clean": "rm -rf dist/ && rm -rf node_modules/",
|
||||
"test": "mocha --config './test/.mocharc.json' --timeout 30000 --parallel './test/**/*.test.ts'",
|
||||
@@ -63,6 +70,7 @@
|
||||
"express/index.ts",
|
||||
"next/index.ts",
|
||||
"next-auth/index.ts",
|
||||
"fastify/index.ts",
|
||||
"evm/index.ts"
|
||||
],
|
||||
"exports": {
|
||||
@@ -72,14 +80,14 @@
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.22.9",
|
||||
"@babel/preset-env": "^7.22.9",
|
||||
"@babel/preset-typescript": "^7.22.5",
|
||||
"@babel/core": "^7.23.7",
|
||||
"@babel/preset-env": "^7.23.8",
|
||||
"@babel/preset-typescript": "^7.23.3",
|
||||
"@microsoft/api-documenter": "^7.22.30",
|
||||
"@microsoft/api-extractor": "^7.36.3",
|
||||
"@microsoft/tsdoc": "^0.14.1",
|
||||
"@preconstruct/cli": "2.7.0",
|
||||
"@swc-node/register": "^1.6.6",
|
||||
"@swc-node/register": "^1.6.8",
|
||||
"@swc/core": "^1.3.71",
|
||||
"@thirdweb-dev/tsconfig": "workspace:*",
|
||||
"@types/chai": "^4.3.5",
|
||||
@@ -89,10 +97,10 @@
|
||||
"@types/mocha": "^10.0.0",
|
||||
"@types/uuid": "^9.0.5",
|
||||
"@typescript-eslint/eslint-plugin": "^6.2.0",
|
||||
"@typescript-eslint/parser": "^6.2.0",
|
||||
"@typescript-eslint/parser": "^6.19.1",
|
||||
"chai": "^4.3.6",
|
||||
"cookie-parser": "^1.4.6",
|
||||
"eslint": "^8.45.0",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-config-prettier": "^8.9.0",
|
||||
"eslint-config-thirdweb": "workspace:*",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
@@ -101,17 +109,19 @@
|
||||
"eslint-plugin-tsdoc": "^0.2.16",
|
||||
"ethers": "^5.7.2",
|
||||
"express": "^4.18.1",
|
||||
"fastify": "^4.25.2",
|
||||
"mocha": "^10.2.0",
|
||||
"next": "^12.3.4",
|
||||
"next": "^13.4",
|
||||
"next-auth": "^4.22.3",
|
||||
"prettier": "^3.0.0",
|
||||
"typescript": "^5.1.6"
|
||||
"prettier": "^3.1.1",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"cookie-parser": "^1.4.6",
|
||||
"ethers": "^5",
|
||||
"express": "^4",
|
||||
"next": "^12 || ^13",
|
||||
"fastify": "^4.25.2",
|
||||
"next": "^12 || ^13 || ^14",
|
||||
"next-auth": "^4"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
@@ -124,6 +134,9 @@
|
||||
"express": {
|
||||
"optional": true
|
||||
},
|
||||
"fastify": {
|
||||
"optional": true
|
||||
},
|
||||
"next": {
|
||||
"optional": true
|
||||
},
|
||||
@@ -132,9 +145,14 @@
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@fastify/cookie": "^9.1.0",
|
||||
"@thirdweb-dev/wallets": "workspace:*",
|
||||
"cookie": "^0.5.0",
|
||||
"fastify-type-provider-zod": "^1.1.9",
|
||||
"uuid": "^9.0.1",
|
||||
"zod": "^3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,10 @@ function base64decode(data: string): string {
|
||||
/**
|
||||
* Build JWT token based on the authentication payload
|
||||
*/
|
||||
async function buildJWT({ wallet, payload }: BuildJwtParams): Promise<string> {
|
||||
export async function buildJWT({
|
||||
wallet,
|
||||
payload,
|
||||
}: BuildJwtParams): Promise<string> {
|
||||
const payloadData = AuthenticationPayloadDataSchema.parse(payload);
|
||||
|
||||
const message = JSON.stringify(payloadData);
|
||||
|
||||
@@ -3,6 +3,7 @@ export { ThirdwebAuth } from "./auth";
|
||||
|
||||
// Export individual auth functions
|
||||
export {
|
||||
buildJWT,
|
||||
generateJWT,
|
||||
parseJWT,
|
||||
refreshJWT,
|
||||
|
||||
@@ -9,7 +9,7 @@ export const AuthenticationPayloadDataSchema = z.object({
|
||||
exp: RawDateSchema,
|
||||
nbf: RawDateSchema,
|
||||
iat: RawDateSchema,
|
||||
jti: z.string().default(uuidv4()),
|
||||
jti: z.string().default(() => uuidv4()),
|
||||
ctx: JsonSchema.optional(),
|
||||
});
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ export const LoginPayloadDataSchema = z.object({
|
||||
uri: z.string().optional(),
|
||||
version: z.string().default("1"),
|
||||
chain_id: z.string().optional(),
|
||||
nonce: z.string().default(uuidv4()),
|
||||
nonce: z.string().default(() => uuidv4()),
|
||||
issued_at: z
|
||||
.date()
|
||||
.default(new Date())
|
||||
|
||||
@@ -2,7 +2,7 @@ import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { Json } from "../../core/schema";
|
||||
import { Json } from "../../core";
|
||||
import { ThirdwebAuthContext, ThirdwebAuthUser } from "../types";
|
||||
import { Request } from "express";
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { GenerateOptions } from "../../core";
|
||||
import { GenerateOptionsWithOptionalDomain } from "../../core";
|
||||
import { LoginPayloadBodySchema, ThirdwebAuthContext } from "../types";
|
||||
import { serialize } from "cookie";
|
||||
import { Request, Response } from "express";
|
||||
@@ -41,7 +41,7 @@ export default async function handler(
|
||||
? new Date(Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds)
|
||||
: undefined;
|
||||
|
||||
const generateOptions: GenerateOptions = {
|
||||
const generateOptions: GenerateOptionsWithOptionalDomain = {
|
||||
verifyOptions: {
|
||||
statement: ctx.authOptions?.statement,
|
||||
uri: ctx.authOptions?.uri,
|
||||
@@ -68,6 +68,10 @@ export default async function handler(
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onToken) {
|
||||
await ctx.callbacks.onToken(token, req);
|
||||
}
|
||||
|
||||
const {
|
||||
payload: { exp },
|
||||
} = ctx.auth.parseToken(token);
|
||||
@@ -84,7 +88,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
),
|
||||
serialize(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE, payload.payload.address, {
|
||||
@@ -93,7 +97,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
]);
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(Date.now() + 5 * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: cookieExpiration,
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
]);
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
),
|
||||
serialize(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE, user.address, {
|
||||
@@ -62,7 +62,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -52,17 +52,21 @@ export type ThirdwebAuthConfig<
|
||||
domain?: string;
|
||||
path?: string;
|
||||
sameSite?: "lax" | "strict" | "none";
|
||||
secure?: boolean;
|
||||
};
|
||||
callbacks?: {
|
||||
onLogin?:
|
||||
| ((address: string, req?: Request) => void | TSession)
|
||||
| ((address: string, req?: Request) => Promise<void | TSession>);
|
||||
| ((address: string, req: Request) => void | TSession)
|
||||
| ((address: string, req: Request) => Promise<void | TSession>);
|
||||
onToken?:
|
||||
| ((token: string, req: Request) => void)
|
||||
| ((token: string, req: Request) => Promise<void>);
|
||||
onUser?:
|
||||
| ((user: User<TSession>, req?: Request) => void | TData)
|
||||
| ((user: User<TSession>, req?: Request) => Promise<void | TData>);
|
||||
| ((user: User<TSession>, req: Request) => void | TData)
|
||||
| ((user: User<TSession>, req: Request) => Promise<void | TData>);
|
||||
onLogout?:
|
||||
| ((user: User, req?: Request) => void)
|
||||
| ((user: User, req?: Request) => Promise<void>);
|
||||
| ((user: User, req: Request) => void)
|
||||
| ((user: User, req: Request) => Promise<void>);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { Json } from "../../core";
|
||||
import { ThirdwebAuthContext, ThirdwebAuthUser } from "../types";
|
||||
import { FastifyRequest } from "fastify";
|
||||
|
||||
export function getCookie(
|
||||
req: FastifyRequest,
|
||||
cookie: string,
|
||||
): string | undefined {
|
||||
return req.cookies[cookie];
|
||||
}
|
||||
|
||||
export function getActiveCookie(req: FastifyRequest): string | undefined {
|
||||
if (!req.cookies) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const activeAccount = getCookie(req, THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE);
|
||||
if (activeAccount) {
|
||||
return `${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${activeAccount}`;
|
||||
}
|
||||
|
||||
// If active account is not present, then use the old default
|
||||
return THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @param req
|
||||
* @returns
|
||||
*/
|
||||
export function getToken(req: FastifyRequest): string | undefined {
|
||||
if (req.headers.authorization) {
|
||||
const authorizationHeader = req.headers.authorization.split(" ");
|
||||
if (authorizationHeader?.length === 2) {
|
||||
return authorizationHeader[1];
|
||||
}
|
||||
}
|
||||
|
||||
if (!req.cookies) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const activeCookie = getActiveCookie(req);
|
||||
if (!activeCookie) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return getCookie(req, activeCookie);
|
||||
}
|
||||
|
||||
export async function getUser<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
>(
|
||||
req: FastifyRequest,
|
||||
ctx: ThirdwebAuthContext<TData, TSession>,
|
||||
): Promise<ThirdwebAuthUser<TData, TSession> | null> {
|
||||
const token = getToken(req);
|
||||
|
||||
if (!token) {
|
||||
console.error("Error: No auth token found");
|
||||
return null;
|
||||
}
|
||||
|
||||
let authenticatedUser: ThirdwebAuthUser<TData, TSession>;
|
||||
try {
|
||||
authenticatedUser = await ctx.auth.authenticate<TSession>(token, {
|
||||
validateTokenId: async (tokenId: string) => {
|
||||
if (ctx.authOptions?.validateTokenId) {
|
||||
await ctx.authOptions?.validateTokenId(tokenId);
|
||||
}
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(`Authenticate Error: ${(err as Error)?.message}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!ctx.callbacks?.onUser) {
|
||||
return authenticatedUser;
|
||||
}
|
||||
|
||||
const data = await ctx.callbacks.onUser(authenticatedUser, req);
|
||||
if (!data) {
|
||||
return authenticatedUser;
|
||||
}
|
||||
|
||||
return { ...authenticatedUser, data: data };
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
import { FastifyInstance, FastifyPluginOptions, FastifyRequest } from "fastify";
|
||||
import { Json, ThirdwebAuth as ThirdwebAuthSDK } from "../core";
|
||||
import fastifyCookie, { FastifyCookie } from "@fastify/cookie";
|
||||
import { payloadHandler } from "./routes/payload";
|
||||
import { loginHandler } from "./routes/login";
|
||||
import { userHandler } from "./routes/user";
|
||||
import { logoutHandler } from "./routes/logout";
|
||||
import { switchAccountHandler } from "./routes/switch-account";
|
||||
import {
|
||||
ZodTypeProvider,
|
||||
serializerCompiler,
|
||||
validatorCompiler,
|
||||
} from "fastify-type-provider-zod";
|
||||
import { getUser } from "./helpers/user";
|
||||
import {
|
||||
ThirdwebAuthConfig,
|
||||
ThirdwebAuthContext,
|
||||
ThirdwebAuthUser,
|
||||
} from "./types";
|
||||
|
||||
export * from "./types";
|
||||
export { getToken } from "./helpers/user";
|
||||
|
||||
type ThirdwebAuthReturnType<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
> = {
|
||||
authRouter: (
|
||||
fastify: FastifyInstance,
|
||||
opts: FastifyPluginOptions,
|
||||
done: (err?: Error | undefined) => void,
|
||||
) => void;
|
||||
authMiddleware: FastifyCookie;
|
||||
getUser: (
|
||||
req: FastifyRequest,
|
||||
) => Promise<ThirdwebAuthUser<TData, TSession> | null>;
|
||||
};
|
||||
|
||||
export function ThirdwebAuth<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
>(
|
||||
cfg: ThirdwebAuthConfig<TData, TSession>,
|
||||
): ThirdwebAuthReturnType<TData, TSession> {
|
||||
const ctx = {
|
||||
...cfg,
|
||||
auth: new ThirdwebAuthSDK(cfg.wallet, cfg.domain),
|
||||
};
|
||||
|
||||
const authRouter = async (
|
||||
fastify: FastifyInstance,
|
||||
_opts: FastifyPluginOptions,
|
||||
done: (err?: Error | undefined) => void,
|
||||
) => {
|
||||
// Setup plugin to use zod as a type provider
|
||||
fastify.setValidatorCompiler(validatorCompiler);
|
||||
fastify.setSerializerCompiler(serializerCompiler);
|
||||
const plugin = fastify.withTypeProvider<ZodTypeProvider>();
|
||||
|
||||
// Register the fastify cookie middleware with this plugin
|
||||
await plugin.register(fastifyCookie);
|
||||
|
||||
// Register individual auth endpoints
|
||||
payloadHandler(plugin, ctx as ThirdwebAuthContext);
|
||||
loginHandler(plugin, ctx as ThirdwebAuthContext);
|
||||
logoutHandler(plugin, ctx as ThirdwebAuthContext);
|
||||
userHandler(plugin, ctx as ThirdwebAuthContext);
|
||||
switchAccountHandler(plugin, ctx as ThirdwebAuthContext);
|
||||
|
||||
// Mark plugin creation as complete
|
||||
done();
|
||||
};
|
||||
|
||||
return {
|
||||
authRouter,
|
||||
authMiddleware: fastifyCookie,
|
||||
getUser: (req: FastifyRequest) => {
|
||||
return getUser<TData, TSession>(req, ctx);
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
import {
|
||||
FastifyInstanceWithZod,
|
||||
LoginPayloadBodySchema,
|
||||
ThirdwebAuthContext,
|
||||
} from "../types";
|
||||
import { GenerateOptionsWithOptionalDomain } from "../../core";
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { z } from "zod";
|
||||
|
||||
export const loginHandler = (
|
||||
fastify: FastifyInstanceWithZod,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) => {
|
||||
fastify.route<{
|
||||
Body: z.infer<typeof LoginPayloadBodySchema>;
|
||||
}>({
|
||||
method: "POST",
|
||||
url: "/login",
|
||||
schema: {
|
||||
body: LoginPayloadBodySchema,
|
||||
response: {
|
||||
200: z.object({
|
||||
token: z.string(),
|
||||
}),
|
||||
},
|
||||
},
|
||||
handler: async (req, res) => {
|
||||
const validateNonce = async (nonce: string) => {
|
||||
if (ctx.authOptions?.validateNonce) {
|
||||
await ctx.authOptions?.validateNonce(nonce);
|
||||
}
|
||||
};
|
||||
|
||||
const getSession = async (address: string) => {
|
||||
if (ctx.callbacks?.onLogin) {
|
||||
return ctx.callbacks.onLogin(address, req);
|
||||
}
|
||||
};
|
||||
|
||||
const expirationTime = ctx.authOptions?.tokenDurationInSeconds
|
||||
? new Date(Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds)
|
||||
: undefined;
|
||||
|
||||
const generateOptions: GenerateOptionsWithOptionalDomain = {
|
||||
verifyOptions: {
|
||||
statement: ctx.authOptions?.statement,
|
||||
uri: ctx.authOptions?.uri,
|
||||
version: ctx.authOptions?.version,
|
||||
chainId: ctx.authOptions?.chainId,
|
||||
validateNonce,
|
||||
resources: ctx.authOptions?.resources,
|
||||
},
|
||||
expirationTime,
|
||||
session: getSession,
|
||||
};
|
||||
|
||||
let token: string;
|
||||
try {
|
||||
// Generate an access token with the SDK using the signed payload
|
||||
token = await ctx.auth.generate(req.body.payload, generateOptions);
|
||||
} catch (err: any) {
|
||||
if (err.message) {
|
||||
return res.status(400).send({ error: err.message });
|
||||
} else if (typeof err === "string") {
|
||||
return res.status(400).send({ error: err });
|
||||
} else {
|
||||
return res.status(400).send({ error: "Invalid login payload" });
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onToken) {
|
||||
await ctx.callbacks.onToken(token, req);
|
||||
}
|
||||
|
||||
const {
|
||||
payload: { exp },
|
||||
} = ctx.auth.parseToken(token);
|
||||
|
||||
// Securely set httpOnly cookie on request to prevent XSS on frontend
|
||||
// And set path to / to enable thirdweb_auth_token usage on all endpoints
|
||||
res.setCookie(
|
||||
`${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${req.body.payload.payload.address}`,
|
||||
token,
|
||||
{
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
);
|
||||
res.setCookie(
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
req.body.payload.payload.address,
|
||||
{
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
);
|
||||
|
||||
// Send token in body and as cookie for frontend and backend use cases
|
||||
return res.status(200).send({ token });
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,52 @@
|
||||
import { z } from "zod";
|
||||
import { getActiveCookie, getUser } from "../helpers/user";
|
||||
import {
|
||||
ErrorResponseSchema,
|
||||
FastifyInstanceWithZod,
|
||||
ThirdwebAuthContext,
|
||||
} from "../types";
|
||||
|
||||
export const logoutHandler = (
|
||||
fastify: FastifyInstanceWithZod,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) => {
|
||||
fastify.route({
|
||||
method: "POST",
|
||||
url: "/logout",
|
||||
schema: {
|
||||
response: {
|
||||
200: z.object({
|
||||
message: z.string(),
|
||||
}),
|
||||
400: ErrorResponseSchema,
|
||||
},
|
||||
},
|
||||
handler: async (req, res) => {
|
||||
const activeCookie = getActiveCookie(req);
|
||||
if (!activeCookie) {
|
||||
return res.status(400).send({
|
||||
error: "No logged in user to logout.",
|
||||
});
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onLogout) {
|
||||
const user = await getUser(req, ctx);
|
||||
if (user) {
|
||||
await ctx.callbacks.onLogout(user, req);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the access token to 'none' and expire in 5 seconds
|
||||
res.setCookie(activeCookie, "", {
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(Date.now() + 5 * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
return res.status(200).send({ message: "Successfully logged out" });
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,41 @@
|
||||
import {
|
||||
FastifyInstanceWithZod,
|
||||
PayloadBodySchema,
|
||||
ThirdwebAuthContext,
|
||||
} from "../types";
|
||||
import { z } from "zod";
|
||||
|
||||
export const payloadHandler = (
|
||||
fastify: FastifyInstanceWithZod,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) => {
|
||||
fastify.route<{
|
||||
Body: z.infer<typeof PayloadBodySchema>;
|
||||
}>({
|
||||
method: "POST",
|
||||
url: "/payload",
|
||||
schema: {
|
||||
body: PayloadBodySchema,
|
||||
response: {
|
||||
200: z.any(),
|
||||
},
|
||||
},
|
||||
handler: async (req, res) => {
|
||||
const payload = await ctx.auth.payload({
|
||||
address: req.body.address,
|
||||
statement: ctx.authOptions?.statement,
|
||||
uri: ctx.authOptions?.uri,
|
||||
version: ctx.authOptions?.version,
|
||||
chainId: req.body.chainId || ctx.authOptions?.chainId,
|
||||
resources: ctx.authOptions?.resources,
|
||||
expirationTime: ctx.authOptions?.loginPayloadDurationInSeconds
|
||||
? new Date(
|
||||
Date.now() + 1000 * ctx.authOptions.loginPayloadDurationInSeconds,
|
||||
)
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return res.status(200).send({ payload });
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,68 @@
|
||||
import {
|
||||
ActiveBodySchema,
|
||||
ErrorResponseSchema,
|
||||
FastifyInstanceWithZod,
|
||||
ThirdwebAuthContext,
|
||||
} from "../types";
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { getCookie } from "../helpers/user";
|
||||
import { z } from "zod";
|
||||
|
||||
export const switchAccountHandler = (
|
||||
fastify: FastifyInstanceWithZod,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) => {
|
||||
fastify.route<{
|
||||
Body: z.infer<typeof ActiveBodySchema>;
|
||||
}>({
|
||||
method: "POST",
|
||||
url: "/switch-account",
|
||||
schema: {
|
||||
body: ActiveBodySchema,
|
||||
response: {
|
||||
200: z.any(),
|
||||
400: ErrorResponseSchema,
|
||||
},
|
||||
},
|
||||
handler: async (req, res) => {
|
||||
let cookieExpiration: Date;
|
||||
const cookie = getCookie(
|
||||
req,
|
||||
`${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${req.body.address}`,
|
||||
);
|
||||
|
||||
if (cookie) {
|
||||
// If the new account is already logged in, get the expiration time from the cookie
|
||||
const {
|
||||
payload: { exp },
|
||||
} = ctx.auth.parseToken(cookie);
|
||||
cookieExpiration = new Date(exp * 1000);
|
||||
} else if (ctx.authOptions?.tokenDurationInSeconds) {
|
||||
// Otherwise, if we have a token duration in seconds, set it to that
|
||||
cookieExpiration = new Date(
|
||||
Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds,
|
||||
);
|
||||
} else {
|
||||
// Otherwise, just default to 24 hours
|
||||
cookieExpiration = new Date(
|
||||
Date.now() + 1000 * THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
|
||||
);
|
||||
}
|
||||
|
||||
res.setCookie(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE, req.body.address, {
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: cookieExpiration,
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
return res.status(200).send();
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,80 @@
|
||||
import { getToken, getUser } from "../helpers/user";
|
||||
import { FastifyInstanceWithZod, ThirdwebAuthContext } from "../types";
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_DEFAULT_REFRESH_INTERVAL_IN_SECONDS,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { z } from "zod";
|
||||
|
||||
export const userHandler = (
|
||||
fastify: FastifyInstanceWithZod,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) => {
|
||||
fastify.route({
|
||||
method: "GET",
|
||||
url: "/user",
|
||||
schema: {
|
||||
response: {
|
||||
200: z.any(),
|
||||
},
|
||||
},
|
||||
handler: async (req, res) => {
|
||||
const user = await getUser(req, ctx);
|
||||
|
||||
// Importantly, make sure the user was actually logged in before refreshing
|
||||
if (user) {
|
||||
const token = getToken(req);
|
||||
if (token) {
|
||||
const payload = ctx.auth.parseToken(token);
|
||||
|
||||
const refreshDate = ctx.authOptions?.refreshIntervalInSeconds
|
||||
? new Date(
|
||||
payload.payload.iat * 1000 +
|
||||
ctx.authOptions.refreshIntervalInSeconds * 1000,
|
||||
)
|
||||
: new Date(
|
||||
payload.payload.iat * 1000 +
|
||||
THIRDWEB_AUTH_DEFAULT_REFRESH_INTERVAL_IN_SECONDS * 1000,
|
||||
);
|
||||
|
||||
if (new Date() > refreshDate) {
|
||||
const expirationTime = ctx.authOptions?.tokenDurationInSeconds
|
||||
? new Date(
|
||||
Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds,
|
||||
)
|
||||
: undefined;
|
||||
const refreshedToken = await ctx.auth.refresh(
|
||||
token,
|
||||
expirationTime,
|
||||
);
|
||||
const refreshedPayload = ctx.auth.parseToken(refreshedToken);
|
||||
|
||||
res.setCookie(
|
||||
`${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${user.address}`,
|
||||
refreshedToken,
|
||||
{
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
);
|
||||
res.setCookie(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE, user.address, {
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res.status(200).send(user);
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -1,8 +1,14 @@
|
||||
import { GenericAuthWallet } from "@thirdweb-dev/wallets";
|
||||
import { Json, LoginPayloadOutputSchema, ThirdwebAuth, User } from "../../core";
|
||||
import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
|
||||
import { GetServerSidePropsContext, NextApiRequest } from "next";
|
||||
import { NextRequest } from "next/server";
|
||||
import {
|
||||
FastifyBaseLogger,
|
||||
FastifyInstance,
|
||||
FastifyRequest,
|
||||
RawServerDefault,
|
||||
} from "fastify";
|
||||
import { z } from "zod";
|
||||
import { IncomingMessage, ServerResponse } from "http";
|
||||
import { ZodTypeProvider } from "fastify-type-provider-zod";
|
||||
|
||||
export const PayloadBodySchema = z.object({
|
||||
address: z.string(),
|
||||
@@ -17,17 +23,9 @@ export const LoginPayloadBodySchema = z.object({
|
||||
payload: LoginPayloadOutputSchema,
|
||||
});
|
||||
|
||||
type RequestType =
|
||||
| GetServerSidePropsContext["req"]
|
||||
| NextRequest
|
||||
| NextApiRequest;
|
||||
|
||||
export type ThirdwebAuthRoute =
|
||||
| "payload"
|
||||
| "login"
|
||||
| "logout"
|
||||
| "user"
|
||||
| "switch-account";
|
||||
export const ErrorResponseSchema = z.object({
|
||||
error: z.string(),
|
||||
});
|
||||
|
||||
export type ThirdwebAuthUser<
|
||||
TData extends Json = Json,
|
||||
@@ -62,23 +60,21 @@ export type ThirdwebAuthConfig<
|
||||
domain?: string;
|
||||
path?: string;
|
||||
sameSite?: "lax" | "strict" | "none";
|
||||
secure?: boolean;
|
||||
};
|
||||
callbacks?: {
|
||||
onLogin?:
|
||||
| ((address: string, req?: NextApiRequest) => void | TSession)
|
||||
| ((address: string, req?: NextApiRequest) => Promise<void | TSession>);
|
||||
| ((address: string, req: FastifyRequest) => void | TSession)
|
||||
| ((address: string, req: FastifyRequest) => Promise<void | TSession>);
|
||||
onToken?:
|
||||
| ((token: string, req: FastifyRequest) => void)
|
||||
| ((token: string, req: FastifyRequest) => Promise<void>);
|
||||
onUser?:
|
||||
| (<TRequestType extends RequestType = RequestType>(
|
||||
user: User<TSession>,
|
||||
req?: TRequestType,
|
||||
) => void | TData)
|
||||
| (<TRequestType extends RequestType = RequestType>(
|
||||
user: User<TSession>,
|
||||
req?: TRequestType,
|
||||
) => Promise<void | TData>);
|
||||
| ((user: User<TSession>, req: FastifyRequest) => void | TData)
|
||||
| ((user: User<TSession>, req: FastifyRequest) => Promise<void | TData>);
|
||||
onLogout?:
|
||||
| ((user: User, req?: NextApiRequest) => void)
|
||||
| ((user: User, req?: NextApiRequest) => Promise<void>);
|
||||
| ((user: User, req: FastifyRequest) => void)
|
||||
| ((user: User, req: FastifyRequest) => Promise<void>);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -88,3 +84,11 @@ export type ThirdwebAuthContext<
|
||||
> = Omit<Omit<ThirdwebAuthConfig<TData, TSession>, "wallet">, "domain"> & {
|
||||
auth: ThirdwebAuth;
|
||||
};
|
||||
|
||||
export type FastifyInstanceWithZod = FastifyInstance<
|
||||
RawServerDefault,
|
||||
IncomingMessage,
|
||||
ServerResponse<IncomingMessage>,
|
||||
FastifyBaseLogger,
|
||||
ZodTypeProvider
|
||||
>;
|
||||
@@ -0,0 +1,62 @@
|
||||
import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
|
||||
import { z } from "zod";
|
||||
|
||||
import { Json, LoginPayloadOutputSchema, User } from "../../core";
|
||||
|
||||
export const PayloadBodySchema = z.object({
|
||||
address: z.string(),
|
||||
chainId: z.string().optional(),
|
||||
});
|
||||
|
||||
export const ActiveBodySchema = z.object({
|
||||
address: z.string(),
|
||||
});
|
||||
|
||||
export const LoginPayloadBodySchema = z.object({
|
||||
payload: LoginPayloadOutputSchema,
|
||||
});
|
||||
|
||||
export type ThirdwebAuthRoute =
|
||||
| "payload"
|
||||
| "login"
|
||||
| "logout"
|
||||
| "user"
|
||||
| "switch-account";
|
||||
|
||||
export type ThirdwebAuthUser<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
> = User<TSession> & {
|
||||
data?: TData;
|
||||
};
|
||||
|
||||
export type ThirdwebAuthConfigShared = {
|
||||
domain: string;
|
||||
wallet: GenericAuthWallet;
|
||||
authOptions?: {
|
||||
statement?: string;
|
||||
uri?: string;
|
||||
version?: string;
|
||||
chainId?: string;
|
||||
resources?: string[];
|
||||
validateNonce?:
|
||||
| ((nonce: string) => void)
|
||||
| ((nonce: string) => Promise<void>);
|
||||
validateTokenId?:
|
||||
| ((tokenId: string) => void)
|
||||
| ((tokenId: string) => Promise<void>);
|
||||
loginPayloadDurationInSeconds?: number;
|
||||
tokenDurationInSeconds?: number;
|
||||
refreshIntervalInSeconds?: number;
|
||||
};
|
||||
cookieOptions?: {
|
||||
domain?: string;
|
||||
path?: string;
|
||||
sameSite?: "lax" | "strict" | "none";
|
||||
secure?: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
export type ThirdwebNextContext = {
|
||||
params?: Record<string, string | string[]>
|
||||
};
|
||||
@@ -1,77 +1,21 @@
|
||||
import { Json, ThirdwebAuth as ThirdwebAuthSDK } from "../core";
|
||||
import { getUser } from "./helpers/user";
|
||||
import payloadHandler from "./routes/payload";
|
||||
import loginHandler from "./routes/login";
|
||||
import logoutHandler from "./routes/logout";
|
||||
import userHandler from "./routes/user";
|
||||
import switchAccountHandler from "./routes/switch-account";
|
||||
import {
|
||||
// Next.js Pages Router support
|
||||
// default and backward compatible
|
||||
export { ThirdwebAuth } from './router-pages'
|
||||
export type {
|
||||
ThirdwebAuthConfig,
|
||||
ThirdwebAuthContext,
|
||||
} from './router-pages/types'
|
||||
|
||||
// Next.js App Router support
|
||||
export { ThirdwebAuth as ThirdwebAuthAppRouter } from './router-app'
|
||||
export type {
|
||||
ThirdwebAuthConfig as ThirdwebAuthAppRouterConfig,
|
||||
ThirdwebAuthContext as ThirdwebAuthAppRouterContext,
|
||||
} from './router-app/types'
|
||||
|
||||
// common types
|
||||
export type {
|
||||
ThirdwebAuthRoute,
|
||||
} from "./types";
|
||||
import { NextRequest } from "next/server";
|
||||
import {
|
||||
GetServerSidePropsContext,
|
||||
NextApiRequest,
|
||||
NextApiResponse,
|
||||
} from "next/types";
|
||||
|
||||
export * from "./types";
|
||||
|
||||
async function ThirdwebAuthRouter(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
// Catch-all route must be named with [...thirdweb]
|
||||
const { thirdweb } = req.query;
|
||||
const action = thirdweb?.[0] as ThirdwebAuthRoute;
|
||||
|
||||
switch (action) {
|
||||
case "payload":
|
||||
return await payloadHandler(req, res, ctx);
|
||||
case "login":
|
||||
return await loginHandler(req, res, ctx);
|
||||
case "user":
|
||||
return await userHandler(req, res, ctx);
|
||||
case "logout":
|
||||
return await logoutHandler(req, res, ctx);
|
||||
case "switch-account":
|
||||
return await switchAccountHandler(req, res, ctx);
|
||||
default:
|
||||
return res.status(400).json({
|
||||
message: "Invalid route for authentication.",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function ThirdwebAuth<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
>(cfg: ThirdwebAuthConfig<TData, TSession>) {
|
||||
const ctx = {
|
||||
...cfg,
|
||||
auth: new ThirdwebAuthSDK(cfg.wallet, cfg.domain),
|
||||
};
|
||||
|
||||
function ThirdwebAuthHandler(
|
||||
...args: [] | [NextApiRequest, NextApiResponse]
|
||||
) {
|
||||
if (args.length === 0) {
|
||||
return async (req: NextApiRequest, res: NextApiResponse) =>
|
||||
await ThirdwebAuthRouter(req, res, ctx as ThirdwebAuthContext);
|
||||
}
|
||||
|
||||
return ThirdwebAuthRouter(args[0], args[1], ctx as ThirdwebAuthContext);
|
||||
}
|
||||
|
||||
return {
|
||||
ThirdwebAuthHandler,
|
||||
getUser: (
|
||||
req: GetServerSidePropsContext["req"] | NextRequest | NextApiRequest,
|
||||
) => {
|
||||
return getUser<TData, TSession>(req, ctx);
|
||||
},
|
||||
};
|
||||
}
|
||||
ThirdwebAuthUser,
|
||||
ThirdwebNextContext,
|
||||
} from './common/types'
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
import { cookies, headers } from "next/headers";
|
||||
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../../constants";
|
||||
import type { Json } from "../../../core";
|
||||
import type { ThirdwebAuthUser } from "../../common/types";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
|
||||
export function getCookie(cookie: string): string | undefined {
|
||||
return cookies().get(cookie)?.value;
|
||||
}
|
||||
|
||||
export function getActiveCookie(): string | undefined {
|
||||
const activeAccount = getCookie(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE);
|
||||
if (activeAccount) {
|
||||
return `${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${activeAccount}`;
|
||||
}
|
||||
|
||||
// If active account is not present, then use the old default
|
||||
return THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX;
|
||||
}
|
||||
|
||||
export function getToken(): string | undefined {
|
||||
const headerList = headers();
|
||||
|
||||
if (headerList.has("authorization")) {
|
||||
const authorizationHeader = headerList.get("authorization")?.split(" ");
|
||||
if (authorizationHeader?.length === 2) {
|
||||
return authorizationHeader[1];
|
||||
}
|
||||
}
|
||||
|
||||
const activeCookie = getActiveCookie();
|
||||
if (!activeCookie) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return getCookie(activeCookie);
|
||||
}
|
||||
|
||||
export async function getUser<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
>(
|
||||
ctx: ThirdwebAuthContext<TData, TSession>
|
||||
): Promise<ThirdwebAuthUser<TData, TSession> | null> {
|
||||
const token = getToken();
|
||||
if (!token) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let authenticatedUser: ThirdwebAuthUser<TData, TSession>;
|
||||
try {
|
||||
authenticatedUser = await ctx.auth.authenticate<TSession>(token, {
|
||||
validateTokenId: async (tokenId: string) => {
|
||||
if (ctx.authOptions?.validateTokenId) {
|
||||
await ctx.authOptions?.validateTokenId(tokenId);
|
||||
}
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onUser) {
|
||||
const data = await ctx.callbacks.onUser(authenticatedUser);
|
||||
if (data) {
|
||||
return { ...authenticatedUser, data };
|
||||
}
|
||||
}
|
||||
|
||||
return authenticatedUser;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
|
||||
import type { Json } from "../../core";
|
||||
import { ThirdwebAuth as ThirdwebAuthSDK } from "../../core";
|
||||
import { getUser } from "./helpers/user";
|
||||
import payloadHandler from "./routes/payload";
|
||||
import loginHandler from "./routes/login";
|
||||
import logoutHandler from "./routes/logout";
|
||||
import userHandler from "./routes/user";
|
||||
import switchAccountHandler from "./routes/switch-account";
|
||||
import type {
|
||||
ThirdwebAuthConfig,
|
||||
ThirdwebAuthContext,
|
||||
} from "./types";
|
||||
import type {
|
||||
ThirdwebAuthRoute,
|
||||
ThirdwebNextContext,
|
||||
} from "../common/types";
|
||||
|
||||
export type {
|
||||
ThirdwebAuthConfig,
|
||||
ThirdwebAuthContext,
|
||||
} from "./types";
|
||||
|
||||
export async function ThirdwebAuthRouter(
|
||||
req: NextRequest,
|
||||
ctx: ThirdwebNextContext,
|
||||
authCtx: ThirdwebAuthContext,
|
||||
) {
|
||||
// Catch-all route must be named with [...thirdweb]
|
||||
const action = ctx.params?.thirdweb?.[0] as ThirdwebAuthRoute;
|
||||
|
||||
switch (action) {
|
||||
case "payload":
|
||||
return await payloadHandler(req, authCtx);
|
||||
case "login":
|
||||
return await loginHandler(req, authCtx);
|
||||
case "user":
|
||||
return await userHandler(req, authCtx);
|
||||
case "logout":
|
||||
return await logoutHandler(req, authCtx);
|
||||
case "switch-account":
|
||||
return await switchAccountHandler(req, authCtx);
|
||||
default:
|
||||
return Response.json(
|
||||
{ message: "Invalid route for authentication." },
|
||||
{ status: 400},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function ThirdwebAuth<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
>(cfg: ThirdwebAuthConfig<TData, TSession>) {
|
||||
const authCtx = {
|
||||
...cfg,
|
||||
auth: new ThirdwebAuthSDK(cfg.wallet, cfg.domain),
|
||||
};
|
||||
|
||||
async function ThirdwebAuthHandler(...args: [] | [NextRequest, ThirdwebNextContext]) {
|
||||
if (args.length === 0) {
|
||||
return async (req: NextRequest, ctx: ThirdwebNextContext): Promise<void | Response> =>
|
||||
await ThirdwebAuthRouter(req, ctx, authCtx as ThirdwebAuthContext);
|
||||
}
|
||||
|
||||
return ThirdwebAuthRouter(args[0], args[1], authCtx as ThirdwebAuthContext);
|
||||
}
|
||||
|
||||
return {
|
||||
ThirdwebAuthHandler,
|
||||
getUser: async () => {
|
||||
return await getUser<TData, TSession>(authCtx);
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../../constants";
|
||||
import type { GenerateOptionsWithOptionalDomain } from "../../../core";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { LoginPayloadBodySchema } from "../types";
|
||||
|
||||
export default async function handler(
|
||||
req: NextRequest,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return Response.json(
|
||||
{ error: "Invalid method. Only POST supported" },
|
||||
{ status: 405 },
|
||||
);
|
||||
}
|
||||
|
||||
const reqBody = await req.json();
|
||||
const parsedPayload = LoginPayloadBodySchema.safeParse(reqBody);
|
||||
|
||||
// Get signed login payload from the frontend
|
||||
if (!parsedPayload.success) {
|
||||
return Response.json(
|
||||
{ error: "Invalid login payload" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
const payload = parsedPayload.data.payload;
|
||||
|
||||
const validateNonce = async (nonce: string) => {
|
||||
if (ctx.authOptions?.validateNonce) {
|
||||
await ctx.authOptions?.validateNonce(nonce);
|
||||
}
|
||||
};
|
||||
|
||||
const getSession = async (address: string) => {
|
||||
if (ctx.callbacks?.onLogin) {
|
||||
return ctx.callbacks.onLogin(address);
|
||||
}
|
||||
};
|
||||
|
||||
const expirationTime = ctx.authOptions?.tokenDurationInSeconds
|
||||
? new Date(Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds)
|
||||
: undefined;
|
||||
|
||||
const generateOptions: GenerateOptionsWithOptionalDomain = {
|
||||
verifyOptions: {
|
||||
statement: ctx.authOptions?.statement,
|
||||
uri: ctx.authOptions?.uri,
|
||||
version: ctx.authOptions?.version,
|
||||
chainId: ctx.authOptions?.chainId,
|
||||
validateNonce,
|
||||
resources: ctx.authOptions?.resources,
|
||||
},
|
||||
expirationTime,
|
||||
session: getSession,
|
||||
};
|
||||
|
||||
let token: string;
|
||||
try {
|
||||
// Generate an access token with the SDK using the signed payload
|
||||
token = await ctx.auth.generate(payload, generateOptions);
|
||||
} catch (err: any) {
|
||||
if (err.message) {
|
||||
return Response.json(
|
||||
{ error: err.message },
|
||||
{ status: 400 },
|
||||
);
|
||||
} else if (typeof err === "string") {
|
||||
return Response.json(
|
||||
{ error: err },
|
||||
{ status: 400 },
|
||||
);
|
||||
} else {
|
||||
return Response.json(
|
||||
{ error: "Invalid login payload" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onToken) {
|
||||
await ctx.callbacks.onToken(token);
|
||||
}
|
||||
|
||||
const {
|
||||
payload: { exp },
|
||||
} = ctx.auth.parseToken(token);
|
||||
|
||||
// Securely set httpOnly cookie on request to prevent XSS on frontend
|
||||
// And set path to / to enable thirdweb_auth_token usage on all endpoints
|
||||
const response = NextResponse.json({ token }, { status: 200 });
|
||||
response.cookies.set({
|
||||
name: `${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${payload.payload.address}`,
|
||||
value: token,
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
response.cookies.set({
|
||||
name: THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
value: payload.payload.address,
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
// Send token in body and as cookie for frontend and backend use cases
|
||||
return response;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
import { getActiveCookie, getUser } from "../helpers/user";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
|
||||
export default async function handler(
|
||||
req: NextRequest,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return Response.json(
|
||||
{ error: "Invalid method. Only POST supported" },
|
||||
{ status: 405 },
|
||||
);
|
||||
}
|
||||
|
||||
const activeCookie = getActiveCookie();
|
||||
if (!activeCookie) {
|
||||
return Response.json(
|
||||
{ error: "No logged in user to logout" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onLogout) {
|
||||
const user = await getUser(ctx);
|
||||
if (user) {
|
||||
await ctx.callbacks.onLogout(user);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the access token to 'none' and expire in 5 seconds
|
||||
const response = NextResponse.json(
|
||||
{ message: "Successfully logged out" },
|
||||
{ status: 200 },
|
||||
);
|
||||
|
||||
response.cookies.set({
|
||||
name: activeCookie,
|
||||
value: '',
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(Date.now() + 5 * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
return response;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { PayloadBodySchema } from "../types";
|
||||
|
||||
export default async function handler(
|
||||
req: NextRequest,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return Response.json(
|
||||
{ error: "Invalid method. Only POST supported" },
|
||||
{ status: 405 },
|
||||
);
|
||||
}
|
||||
|
||||
const reqBody = await req.json();
|
||||
const parsedPayload = PayloadBodySchema.safeParse(reqBody);
|
||||
|
||||
if (!parsedPayload.success) {
|
||||
return Response.json(
|
||||
{ error: "Please provide an address" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: Add nonce generation + custom expiration + invalid before
|
||||
const payload = await ctx.auth.payload({
|
||||
address: parsedPayload.data.address,
|
||||
statement: ctx.authOptions?.statement,
|
||||
uri: ctx.authOptions?.uri,
|
||||
version: ctx.authOptions?.version,
|
||||
chainId: parsedPayload.data.chainId || ctx.authOptions?.chainId,
|
||||
resources: ctx.authOptions?.resources,
|
||||
expirationTime: ctx.authOptions?.loginPayloadDurationInSeconds
|
||||
? new Date(
|
||||
Date.now() + 1000 * ctx.authOptions.loginPayloadDurationInSeconds,
|
||||
)
|
||||
: undefined,
|
||||
});
|
||||
|
||||
const response = Response.json({ payload }, { status: 200 });
|
||||
return response;
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { ActiveBodySchema } from "../types";
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../../constants";
|
||||
import { getCookie } from "../helpers/user";
|
||||
|
||||
export default async function handler(
|
||||
req: NextRequest,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return Response.json(
|
||||
{ error: "Invalid method. Only POST supported" },
|
||||
{ status: 405 },
|
||||
);
|
||||
}
|
||||
|
||||
const reqBody = await req.json();
|
||||
const parsedPayload = ActiveBodySchema.safeParse(reqBody);
|
||||
|
||||
if (!parsedPayload.success) {
|
||||
return Response.json(
|
||||
{ error: "Please provide an address" },
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
let cookieExpiration: Date;
|
||||
|
||||
const cookie = getCookie(`${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${parsedPayload.data.address}`);
|
||||
if (cookie) {
|
||||
// If the new account is already logged in, get the expiration time from the cookie
|
||||
const {
|
||||
payload: { exp },
|
||||
} = ctx.auth.parseToken(cookie);
|
||||
cookieExpiration = new Date(exp * 1000);
|
||||
} else if (ctx.authOptions?.tokenDurationInSeconds) {
|
||||
// Otherwise, if we have a token duration in seconds, set it to that
|
||||
cookieExpiration = new Date(
|
||||
Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds,
|
||||
);
|
||||
} else {
|
||||
// Otherwise, just default to 24 hours
|
||||
cookieExpiration = new Date(
|
||||
Date.now() + 1000 * THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
|
||||
);
|
||||
}
|
||||
|
||||
const response = NextResponse.json('', { status: 200 });
|
||||
response.cookies.set({
|
||||
name: THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
value: parsedPayload.data.address,
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: cookieExpiration,
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
return response;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_DEFAULT_REFRESH_INTERVAL_IN_SECONDS,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../../constants";
|
||||
import { getToken, getUser } from "../helpers/user";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
|
||||
export default async function handler(
|
||||
req: NextRequest,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
if (req.method !== "GET") {
|
||||
return Response.json(
|
||||
{ error: "Invalid method. Only GET supported" },
|
||||
{ status: 405 },
|
||||
);
|
||||
}
|
||||
|
||||
const user = await getUser(ctx);
|
||||
|
||||
const response = NextResponse.json(user, { status: 200 });
|
||||
|
||||
// Importantly, make sure the user was actually logged in before refreshing
|
||||
if (user) {
|
||||
const token = getToken();
|
||||
if (token) {
|
||||
const payload = ctx.auth.parseToken(token);
|
||||
|
||||
const refreshDate = ctx.authOptions?.refreshIntervalInSeconds
|
||||
? new Date(
|
||||
payload.payload.iat * 1000 +
|
||||
ctx.authOptions.refreshIntervalInSeconds * 1000,
|
||||
)
|
||||
: new Date(
|
||||
payload.payload.iat * 1000 +
|
||||
THIRDWEB_AUTH_DEFAULT_REFRESH_INTERVAL_IN_SECONDS * 1000,
|
||||
);
|
||||
|
||||
if (new Date() > refreshDate) {
|
||||
const expirationTime = ctx.authOptions?.tokenDurationInSeconds
|
||||
? new Date(Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds)
|
||||
: undefined;
|
||||
const refreshedToken = await ctx.auth.refresh(token, expirationTime);
|
||||
const refreshedPayload = ctx.auth.parseToken(refreshedToken);
|
||||
|
||||
response.cookies.set({
|
||||
name: `${THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX}_${user.address}`,
|
||||
value: refreshedToken,
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
|
||||
response.cookies.set({
|
||||
name: THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
value: user.address,
|
||||
domain: ctx.cookieOptions?.domain,
|
||||
path: ctx.cookieOptions?.path || "/",
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import type { Json, ThirdwebAuth, User } from "../../../core";
|
||||
import type { ThirdwebAuthConfigShared } from '../../common/types'
|
||||
|
||||
export {
|
||||
ActiveBodySchema,
|
||||
LoginPayloadBodySchema,
|
||||
PayloadBodySchema
|
||||
} from '../../common/types'
|
||||
|
||||
export type ThirdwebAuthConfig<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
> = ThirdwebAuthConfigShared & {
|
||||
callbacks?: {
|
||||
onLogin?:
|
||||
| ((address: string) => void | TSession)
|
||||
| ((address: string) => Promise<void | TSession>);
|
||||
onToken?:
|
||||
| ((token: string) => void)
|
||||
| ((token: string) => Promise<void>);
|
||||
onUser?:
|
||||
| ((user: User<TSession>) => void | TData)
|
||||
| ((user: User<TSession>) => Promise<void | TData>);
|
||||
onLogout?:
|
||||
| ((user: User) => void)
|
||||
| ((user: User) => Promise<void>);
|
||||
};
|
||||
};
|
||||
|
||||
export type ThirdwebAuthContext<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
> = Omit<Omit<ThirdwebAuthConfig<TData, TSession>, "wallet">, "domain"> & {
|
||||
auth: ThirdwebAuth;
|
||||
};
|
||||
+7
-6
@@ -1,18 +1,19 @@
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { Json } from "../../core/schema";
|
||||
import { ThirdwebAuthContext, ThirdwebAuthUser } from "../types";
|
||||
import { GetServerSidePropsContext, NextApiRequest } from "next";
|
||||
import { NextRequest } from "next/server";
|
||||
} from "../../../constants";
|
||||
import type { Json } from "../../../core";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import type { ThirdwebAuthUser } from "../../common/types";
|
||||
import type { GetServerSidePropsContext, NextApiRequest } from "next";
|
||||
import type { NextRequest } from "next/server";
|
||||
|
||||
export function getCookie(
|
||||
req: GetServerSidePropsContext["req"] | NextRequest | NextApiRequest,
|
||||
cookie: string,
|
||||
): string | undefined {
|
||||
if (typeof req.cookies.get === "function") {
|
||||
return req.cookies.get(cookie);
|
||||
return req.cookies.get(cookie)?.value;
|
||||
}
|
||||
|
||||
return (req.cookies as any)[cookie];
|
||||
@@ -0,0 +1,77 @@
|
||||
import { Json, ThirdwebAuth as ThirdwebAuthSDK } from "../../core";
|
||||
import { getUser } from "./helpers/user";
|
||||
import payloadHandler from "./routes/payload";
|
||||
import loginHandler from "./routes/login";
|
||||
import logoutHandler from "./routes/logout";
|
||||
import userHandler from "./routes/user";
|
||||
import switchAccountHandler from "./routes/switch-account";
|
||||
import {
|
||||
ThirdwebAuthConfig,
|
||||
ThirdwebAuthContext,
|
||||
ThirdwebAuthRoute,
|
||||
} from "./types";
|
||||
import { NextRequest } from "next/server";
|
||||
import {
|
||||
GetServerSidePropsContext,
|
||||
NextApiRequest,
|
||||
NextApiResponse,
|
||||
} from "next/types";
|
||||
|
||||
export * from "./types";
|
||||
|
||||
async function ThirdwebAuthRouter(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse,
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
// Catch-all route must be named with [...thirdweb]
|
||||
const { thirdweb } = req.query;
|
||||
const action = thirdweb?.[0] as ThirdwebAuthRoute;
|
||||
|
||||
switch (action) {
|
||||
case "payload":
|
||||
return await payloadHandler(req, res, ctx);
|
||||
case "login":
|
||||
return await loginHandler(req, res, ctx);
|
||||
case "user":
|
||||
return await userHandler(req, res, ctx);
|
||||
case "logout":
|
||||
return await logoutHandler(req, res, ctx);
|
||||
case "switch-account":
|
||||
return await switchAccountHandler(req, res, ctx);
|
||||
default:
|
||||
return res.status(400).json({
|
||||
message: "Invalid route for authentication.",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function ThirdwebAuth<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
>(cfg: ThirdwebAuthConfig<TData, TSession>) {
|
||||
const ctx = {
|
||||
...cfg,
|
||||
auth: new ThirdwebAuthSDK(cfg.wallet, cfg.domain),
|
||||
};
|
||||
|
||||
function ThirdwebAuthHandler(
|
||||
...args: [] | [NextApiRequest, NextApiResponse]
|
||||
) {
|
||||
if (args.length === 0) {
|
||||
return async (req: NextApiRequest, res: NextApiResponse) =>
|
||||
await ThirdwebAuthRouter(req, res, ctx as ThirdwebAuthContext);
|
||||
}
|
||||
|
||||
return ThirdwebAuthRouter(args[0], args[1], ctx as ThirdwebAuthContext);
|
||||
}
|
||||
|
||||
return {
|
||||
ThirdwebAuthHandler,
|
||||
getUser: (
|
||||
req: GetServerSidePropsContext["req"] | NextRequest | NextApiRequest,
|
||||
) => {
|
||||
return getUser<TData, TSession>(req, ctx);
|
||||
},
|
||||
};
|
||||
}
|
||||
+12
-7
@@ -1,11 +1,12 @@
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
import { GenerateOptions } from "../../core";
|
||||
import { LoginPayloadBodySchema, ThirdwebAuthContext } from "../types";
|
||||
} from "../../../constants";
|
||||
import type { GenerateOptionsWithOptionalDomain } from "../../../core";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { LoginPayloadBodySchema } from "../types";
|
||||
import { serialize } from "cookie";
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
@@ -41,7 +42,7 @@ export default async function handler(
|
||||
? new Date(Date.now() + 1000 * ctx.authOptions.tokenDurationInSeconds)
|
||||
: undefined;
|
||||
|
||||
const generateOptions: GenerateOptions = {
|
||||
const generateOptions: GenerateOptionsWithOptionalDomain = {
|
||||
verifyOptions: {
|
||||
statement: ctx.authOptions?.statement,
|
||||
uri: ctx.authOptions?.uri,
|
||||
@@ -68,6 +69,10 @@ export default async function handler(
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx.callbacks?.onToken) {
|
||||
await ctx.callbacks.onToken(token, req);
|
||||
}
|
||||
|
||||
const {
|
||||
payload: { exp },
|
||||
} = ctx.auth.parseToken(token);
|
||||
@@ -84,7 +89,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
),
|
||||
serialize(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE, payload.payload.address, {
|
||||
@@ -93,7 +98,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
]);
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
import { getActiveCookie, getUser } from "../helpers/user";
|
||||
import { ThirdwebAuthContext } from "../types";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { serialize } from "cookie";
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
@@ -10,14 +10,14 @@ export default async function handler(
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({
|
||||
error: "Invalid method. Only POST supported.",
|
||||
error: "Invalid method. Only POST supported",
|
||||
});
|
||||
}
|
||||
|
||||
const activeCookie = getActiveCookie(req);
|
||||
if (!activeCookie) {
|
||||
return res.status(400).json({
|
||||
error: "No logged in user to logout.",
|
||||
error: "No logged in user to logout",
|
||||
});
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(Date.now() + 5 * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
);
|
||||
|
||||
+4
-3
@@ -1,5 +1,6 @@
|
||||
import { PayloadBodySchema, ThirdwebAuthContext } from "../types";
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { PayloadBodySchema } from "../types";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
@@ -8,7 +9,7 @@ export default async function handler(
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({
|
||||
error: "Invalid method. Only POST supported.",
|
||||
error: "Invalid method. Only POST supported",
|
||||
});
|
||||
}
|
||||
|
||||
+6
-5
@@ -1,12 +1,13 @@
|
||||
import { serialize } from "cookie";
|
||||
import { getCookie } from "../helpers/user";
|
||||
import { ActiveBodySchema, ThirdwebAuthContext } from "../types";
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import { ActiveBodySchema } from "../types";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
} from "../../../constants";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
@@ -15,7 +16,7 @@ export default async function handler(
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({
|
||||
error: "Invalid method. Only POST supported.",
|
||||
error: "Invalid method. Only POST supported",
|
||||
});
|
||||
}
|
||||
|
||||
@@ -55,7 +56,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: cookieExpiration,
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
]);
|
||||
|
||||
+7
-7
@@ -3,10 +3,10 @@ import {
|
||||
THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE,
|
||||
THIRDWEB_AUTH_DEFAULT_REFRESH_INTERVAL_IN_SECONDS,
|
||||
THIRDWEB_AUTH_TOKEN_COOKIE_PREFIX,
|
||||
} from "../../constants";
|
||||
} from "../../../constants";
|
||||
import { getToken, getUser } from "../helpers/user";
|
||||
import { ThirdwebAuthContext } from "../types";
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import type { ThirdwebAuthContext } from "../types";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
@@ -14,8 +14,8 @@ export default async function handler(
|
||||
ctx: ThirdwebAuthContext,
|
||||
) {
|
||||
if (req.method !== "GET") {
|
||||
return res.status(400).json({
|
||||
error: "Invalid method. Only GET supported.",
|
||||
return res.status(405).json({
|
||||
error: "Invalid method. Only GET supported",
|
||||
});
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
},
|
||||
),
|
||||
serialize(THIRDWEB_AUTH_ACTIVE_ACCOUNT_COOKIE, user.address, {
|
||||
@@ -62,7 +62,7 @@ export default async function handler(
|
||||
sameSite: ctx.cookieOptions?.sameSite || "none",
|
||||
expires: new Date(refreshedPayload.payload.exp * 1000),
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
secure: ctx.cookieOptions?.secure || true,
|
||||
}),
|
||||
]);
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import type { Json, ThirdwebAuth, User } from "../../../core";
|
||||
import type { GetServerSidePropsContext, NextApiRequest } from "next";
|
||||
import type { NextRequest } from "next/server";
|
||||
import type { ThirdwebAuthConfigShared } from '../../common/types'
|
||||
|
||||
export {
|
||||
ActiveBodySchema,
|
||||
LoginPayloadBodySchema,
|
||||
PayloadBodySchema
|
||||
} from '../../common/types'
|
||||
|
||||
type RequestType =
|
||||
| GetServerSidePropsContext["req"]
|
||||
| NextRequest
|
||||
| NextApiRequest;
|
||||
|
||||
export type ThirdwebAuthConfig<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
> = ThirdwebAuthConfigShared & {
|
||||
callbacks?: {
|
||||
onLogin?:
|
||||
| ((address: string, req: NextApiRequest) => void | TSession)
|
||||
| ((address: string, req: NextApiRequest) => Promise<void | TSession>);
|
||||
onToken?:
|
||||
| ((token: string, req: NextApiRequest) => void)
|
||||
| ((token: string, req: NextApiRequest) => Promise<void>);
|
||||
onUser?:
|
||||
| (<TRequestType extends RequestType = RequestType>(
|
||||
user: User<TSession>,
|
||||
req: TRequestType,
|
||||
) => void | TData)
|
||||
| (<TRequestType extends RequestType = RequestType>(
|
||||
user: User<TSession>,
|
||||
req: TRequestType,
|
||||
) => Promise<void | TData>);
|
||||
onLogout?:
|
||||
| ((user: User, req: NextApiRequest) => void)
|
||||
| ((user: User, req: NextApiRequest) => Promise<void>);
|
||||
};
|
||||
};
|
||||
|
||||
export type ThirdwebAuthContext<
|
||||
TData extends Json = Json,
|
||||
TSession extends Json = Json,
|
||||
> = Omit<Omit<ThirdwebAuthConfig<TData, TSession>, "wallet">, "domain"> & {
|
||||
auth: ThirdwebAuth;
|
||||
};
|
||||
@@ -1,5 +1,111 @@
|
||||
# @thirdweb-dev/chains
|
||||
|
||||
## 0.1.69
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2247](https://github.com/thirdweb-dev/js/pull/2247) [`374671fd`](https://github.com/thirdweb-dev/js/commit/374671fd9ac97a93263b09c6c0a53cfd129881d7) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
|
||||
|
||||
## 0.1.68
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2245](https://github.com/thirdweb-dev/js/pull/2245) [`771bd1e1`](https://github.com/thirdweb-dev/js/commit/771bd1e1b280681992195103c22aafa1fb98f7e0) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
|
||||
|
||||
## 0.1.67
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2243](https://github.com/thirdweb-dev/js/pull/2243) [`39e79282`](https://github.com/thirdweb-dev/js/commit/39e79282acb70959ba8140c779fa521c41c80a5f) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
|
||||
|
||||
- [#2240](https://github.com/thirdweb-dev/js/pull/2240) [`69c3eb91`](https://github.com/thirdweb-dev/js/commit/69c3eb910feb2265833a07b7472e32fac5a79d90) Thanks [@jnsdls](https://github.com/jnsdls)! - sync chains
|
||||
|
||||
## 0.1.66
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2232](https://github.com/thirdweb-dev/js/pull/2232) [`627d2099`](https://github.com/thirdweb-dev/js/commit/627d20992770670ab0c954ceea0b8679ce4f3088) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Update chains
|
||||
|
||||
## 0.1.65
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2203](https://github.com/thirdweb-dev/js/pull/2203) [`3f2ee85a`](https://github.com/thirdweb-dev/js/commit/3f2ee85a1ab70e74aefe7f458379a2ccaf4058a9) Thanks [@iketw](https://github.com/iketw)! - Syncs Chains
|
||||
|
||||
## 0.1.64
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2187](https://github.com/thirdweb-dev/js/pull/2187) [`e21f7bb1`](https://github.com/thirdweb-dev/js/commit/e21f7bb171334fa3003c954060e60c1ce8c1228f) Thanks [@gerrysaporito](https://github.com/gerrysaporito)! - synced chains package with chains db
|
||||
|
||||
## 0.1.63
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2145](https://github.com/thirdweb-dev/js/pull/2145) [`d3637a16`](https://github.com/thirdweb-dev/js/commit/d3637a160d088dde6e35dc213ee611b73b831c3f) Thanks [@jnsdls](https://github.com/jnsdls)! - update chains
|
||||
|
||||
## 0.1.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2084](https://github.com/thirdweb-dev/js/pull/2084) [`c410a1c1`](https://github.com/thirdweb-dev/js/commit/c410a1c18a704d118555215db9ba7d92c3b24d8c) Thanks [@MananTank](https://github.com/MananTank)! - JSDoc comments Improvements
|
||||
|
||||
## 0.1.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2066](https://github.com/thirdweb-dev/js/pull/2066) [`d2001ca4`](https://github.com/thirdweb-dev/js/commit/d2001ca464aa699ac821c97eb37de7409ba865f3) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Updatechains
|
||||
|
||||
## 0.1.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2019](https://github.com/thirdweb-dev/js/pull/2019) [`b8332500`](https://github.com/thirdweb-dev/js/commit/b833250053320c8608109053f5cffe2dc96ce70a) Thanks [@jnsdls](https://github.com/jnsdls)! - add & update chains
|
||||
|
||||
- [#2024](https://github.com/thirdweb-dev/js/pull/2024) [`28fc3736`](https://github.com/thirdweb-dev/js/commit/28fc3736aa30c89690084aa2c62556c183796352) Thanks [@kien-ngo](https://github.com/kien-ngo)! - Add Base Sepolia to defaultChains
|
||||
|
||||
- [#2023](https://github.com/thirdweb-dev/js/pull/2023) [`06805217`](https://github.com/thirdweb-dev/js/commit/06805217c26de203a57c21246acba22def8a78fa) Thanks [@kien-ngo](https://github.com/kien-ngo)! - Add Eth Sepolia to defaultChains
|
||||
|
||||
## 0.1.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1967](https://github.com/thirdweb-dev/js/pull/1967) [`47b0ed51`](https://github.com/thirdweb-dev/js/commit/47b0ed5171be5608ae23c19481a1b04948443c6a) Thanks [@kien-ngo](https://github.com/kien-ngo)! - Add Arbitrum Sepolia to defaultChains
|
||||
|
||||
- [#1990](https://github.com/thirdweb-dev/js/pull/1990) [`d4ce855e`](https://github.com/thirdweb-dev/js/commit/d4ce855e5f5e6c4206a3efa250e92e690ae87281) Thanks [@jnsdls](https://github.com/jnsdls)! - deprecate `allChains` `getChainById` and `getChainBySlug`
|
||||
|
||||
all of these would (necessarily) pull in every single chain in the package (>600kb)
|
||||
|
||||
instead these can be replaced with their async variants:
|
||||
|
||||
- `allChains` -> `await fetchChains()`
|
||||
- `getChainById(chainId)` -> `await getChainByIdAsync(chainId)`
|
||||
- `getChainBySlug(chainSlug)` -> `await getChainBySlugAsync(chainSlug)`
|
||||
|
||||
these async functions will return the same data as their sync counterparts, but without having to pull in every single chain at build-time.
|
||||
|
||||
## 0.1.58
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1911](https://github.com/thirdweb-dev/js/pull/1911) [`0dcb15b7`](https://github.com/thirdweb-dev/js/commit/0dcb15b7e647acd038b0ec8b1a2b200808aae00e) Thanks [@iketw](https://github.com/iketw)! - Syncs Chains
|
||||
|
||||
## 0.1.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1865](https://github.com/thirdweb-dev/js/pull/1865) [`a75e4cc8`](https://github.com/thirdweb-dev/js/commit/a75e4cc80a5a36bf6baeeb40e8ae3be485d35618) Thanks [@jnsdls](https://github.com/jnsdls)! - sync chains
|
||||
|
||||
## 0.1.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1843](https://github.com/thirdweb-dev/js/pull/1843) [`6028a881`](https://github.com/thirdweb-dev/js/commit/6028a88111d9071155370c7aeaf22d4ee0c3ec93) Thanks [@jnsdls](https://github.com/jnsdls)! - sync chains
|
||||
|
||||
- [#1855](https://github.com/thirdweb-dev/js/pull/1855) [`b6f72c56`](https://github.com/thirdweb-dev/js/commit/b6f72c566c9cec5c2d0a0ebe709d6177b2af68e4) Thanks [@jnsdls](https://github.com/jnsdls)! - require minimum node version: `>=18`
|
||||
|
||||
- [#1805](https://github.com/thirdweb-dev/js/pull/1805) [`cc651135`](https://github.com/thirdweb-dev/js/commit/cc6511351fea568246ddf49f687a5616d484d2a4) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Spicy Chain deployments
|
||||
|
||||
## 0.1.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -2,6 +2,9 @@ import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "ETH",
|
||||
"chainId": 1,
|
||||
"ens": {
|
||||
"registry": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"
|
||||
},
|
||||
"explorers": [
|
||||
{
|
||||
"name": "etherscan",
|
||||
@@ -11,16 +14,33 @@ export default {
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://eth.blockscout.com",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
|
||||
"width": 551,
|
||||
"height": 540,
|
||||
"format": "png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "dexguru",
|
||||
"url": "https://ethereum.dex.guru",
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmRaASKRSjQ5btoUQ2rNTJNxKtx2a2RoewgA7DMQkLVEne",
|
||||
"width": 83,
|
||||
"height": 82,
|
||||
"format": "svg"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [
|
||||
{
|
||||
"name": "EIP1559"
|
||||
"name": "EIP155"
|
||||
},
|
||||
{
|
||||
"name": "EIP155"
|
||||
"name": "EIP1559"
|
||||
}
|
||||
],
|
||||
"icon": {
|
||||
@@ -36,9 +56,11 @@ export default {
|
||||
"symbol": "ETH",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 1,
|
||||
"redFlags": [],
|
||||
"rpc": [
|
||||
"https://ethereum.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet.infura.io/v3/${INFURA_API_KEY}",
|
||||
"wss://mainnet.infura.io/ws/v3/${INFURA_API_KEY}",
|
||||
"https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
|
||||
@@ -47,9 +69,13 @@ export default {
|
||||
"https://ethereum.publicnode.com",
|
||||
"wss://ethereum.publicnode.com",
|
||||
"https://mainnet.gateway.tenderly.co",
|
||||
"wss://mainnet.gateway.tenderly.co"
|
||||
"wss://mainnet.gateway.tenderly.co",
|
||||
"https://rpc.blocknative.com/boost",
|
||||
"https://rpc.flashbots.net/fast",
|
||||
"https://rpc.mevblocker.io/fullprivacy"
|
||||
],
|
||||
"shortName": "eth",
|
||||
"slip44": 60,
|
||||
"slug": "ethereum",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -11,7 +11,24 @@ export default {
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://optimism.blockscout.com",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
|
||||
"width": 551,
|
||||
"height": 540,
|
||||
"format": "png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "dexguru",
|
||||
"url": "https://optimism.dex.guru",
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmRaASKRSjQ5btoUQ2rNTJNxKtx2a2RoewgA7DMQkLVEne",
|
||||
"width": 83,
|
||||
"height": 82,
|
||||
"format": "svg"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
@@ -29,9 +46,11 @@ export default {
|
||||
"symbol": "ETH",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 10,
|
||||
"redFlags": [],
|
||||
"rpc": [
|
||||
"https://optimism.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://optimism-mainnet.infura.io/v3/${INFURA_API_KEY}",
|
||||
"https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
|
||||
"https://mainnet.optimism.io",
|
||||
|
||||
@@ -6,12 +6,29 @@ export default {
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://gnosis.blockscout.com",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
|
||||
"width": 551,
|
||||
"height": 540,
|
||||
"format": "png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "gnosisscan",
|
||||
"url": "https://gnosisscan.io",
|
||||
"standard": "EIP3091"
|
||||
},
|
||||
{
|
||||
"name": "dexguru",
|
||||
"url": "https://gnosis.dex.guru",
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmRaASKRSjQ5btoUQ2rNTJNxKtx2a2RoewgA7DMQkLVEne",
|
||||
"width": 83,
|
||||
"height": 82,
|
||||
"format": "svg"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [
|
||||
@@ -19,7 +36,6 @@ export default {
|
||||
"https://stakely.io/faucet/gnosis-chain-xdai",
|
||||
"https://faucet.prussia.dev/xdai"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeidk4swpgdyqmpz6shd5onvpaujvwiwthrhypufnwr6xh3dausz2dm",
|
||||
"width": 1800,
|
||||
@@ -33,9 +49,10 @@ export default {
|
||||
"symbol": "XDAI",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100,
|
||||
"rpc": [
|
||||
"https://gnosis.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.gnosischain.com",
|
||||
"https://rpc.gnosis.gateway.fm",
|
||||
"https://rpc.ankr.com/gnosis",
|
||||
@@ -50,6 +67,7 @@ export default {
|
||||
"wss://gnosis.publicnode.com"
|
||||
],
|
||||
"shortName": "gno",
|
||||
"slip44": 700,
|
||||
"slug": "gnosis",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://gton.capital",
|
||||
"name": "GTON Mainnet",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "GCD",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1000,
|
||||
"parent": {
|
||||
"type": "L2",
|
||||
"chain": "eip155-1"
|
||||
},
|
||||
"rpc": [
|
||||
"https://gton.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1000.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.gton.network/"
|
||||
],
|
||||
"shortName": "gton",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 10000,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://smartbch.org/",
|
||||
"name": "Smart Bitcoin Cash",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "BCH",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10000,
|
||||
"rpc": [
|
||||
"https://smart-bitcoin-cash.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10000.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://smartbch.greyh.at",
|
||||
"https://rpc-mainnet.smartbch.org",
|
||||
"https://smartbch.fountainhead.cash/mainnet",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 100000,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Root",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100000,
|
||||
"rpc": [
|
||||
"https://quarkchain-root.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100000.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"http://jrpc.mainnet.quarkchain.io:38391"
|
||||
],
|
||||
"shortName": "qkc-r",
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 0",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100001,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-0.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100001.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s0-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39000"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 1",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100002,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-1.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100002.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s1-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39001"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 2",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100003,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-2.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100003.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s2-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39002"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 3",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100004,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-3.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100004.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s3-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39003"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 4",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100005,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-4.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100005.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s4-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39004"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 5",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100006,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-5.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100006.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s5-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39005"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 6",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100007,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-6.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100007.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s6-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39006"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.quarkchain.io",
|
||||
"name": "QuarkChain Mainnet Shard 7",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,14 @@ export default {
|
||||
"symbol": "QKC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100008,
|
||||
"parent": {
|
||||
"type": "shard",
|
||||
"chain": "eip155-100000"
|
||||
},
|
||||
"rpc": [
|
||||
"https://quarkchain-shard-7.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://100008.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-s7-ethapi.quarkchain.io",
|
||||
"http://eth-jrpc.mainnet.quarkchain.io:39007"
|
||||
],
|
||||
|
||||
@@ -15,7 +15,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://vechain.org",
|
||||
"name": "VeChain",
|
||||
"nativeCurrency": {
|
||||
@@ -23,7 +22,7 @@ export default {
|
||||
"symbol": "VET",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100009,
|
||||
"rpc": [],
|
||||
"shortName": "vechain",
|
||||
"slug": "vechain",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 10001,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "http://smartbch.org/",
|
||||
"name": "Smart Bitcoin Cash Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -12,13 +11,15 @@ export default {
|
||||
"symbol": "BCHT",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10001,
|
||||
"rpc": [
|
||||
"https://smart-bitcoin-cash-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10001.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc-testnet.smartbch.org",
|
||||
"https://smartbch.devops.cash/testnet"
|
||||
],
|
||||
"shortName": "smartbchtest",
|
||||
"slip44": 1,
|
||||
"slug": "smart-bitcoin-cash-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -12,7 +12,6 @@ export default {
|
||||
"faucets": [
|
||||
"https://faucet.vecha.in"
|
||||
],
|
||||
"features": [],
|
||||
"infoURL": "https://vechain.org",
|
||||
"name": "VeChain Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -20,9 +19,10 @@ export default {
|
||||
"symbol": "VET",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 100010,
|
||||
"rpc": [],
|
||||
"shortName": "vechain-testnet",
|
||||
"slip44": 1,
|
||||
"slug": "vechain-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -2,7 +2,13 @@ import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "KLAY",
|
||||
"chainId": 1001,
|
||||
"explorers": [],
|
||||
"explorers": [
|
||||
{
|
||||
"name": "klaytnscope",
|
||||
"url": "https://scope.klaytn.com",
|
||||
"standard": "EIP3091"
|
||||
}
|
||||
],
|
||||
"faucets": [
|
||||
"https://baobab.wallet.klaytn.com/access?next=faucet"
|
||||
],
|
||||
@@ -14,12 +20,16 @@ export default {
|
||||
"symbol": "KLAY",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 1001,
|
||||
"redFlags": [],
|
||||
"rpc": [
|
||||
"https://klaytn-testnet-baobab.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1001.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://klaytn-baobab.blockpi.network/v1/rpc/public",
|
||||
"https://api.baobab.klaytn.net:8651"
|
||||
],
|
||||
"shortName": "Baobab",
|
||||
"slip44": 1,
|
||||
"slug": "klaytn-testnet-baobab",
|
||||
"testnet": true
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -0,0 +1,26 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "CHI1",
|
||||
"chainId": 100100,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeidk4swpgdyqmpz6shd5onvpaujvwiwthrhypufnwr6xh3dausz2dm",
|
||||
"width": 1800,
|
||||
"height": 1800,
|
||||
"format": "png"
|
||||
},
|
||||
"infoURL": "https://docs.gnosischain.com",
|
||||
"name": "Deprecated CHI",
|
||||
"nativeCurrency": {
|
||||
"name": "Chiado xDAI",
|
||||
"symbol": "xDAI",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 100100,
|
||||
"rpc": [],
|
||||
"shortName": "chi1",
|
||||
"slug": "deprecated-chi",
|
||||
"status": "deprecated",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmPtiJGaApbW3ATZhPW3pKJpw3iGVrRGsZLWhrDKF9ZK18",
|
||||
"width": 1024,
|
||||
@@ -23,9 +22,10 @@ export default {
|
||||
"symbol": "GT",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10024,
|
||||
"rpc": [
|
||||
"https://gon-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10024.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://node1.testnet.gaiaopen.network",
|
||||
"https://node1.mainnet.gon.network",
|
||||
"https://node2.mainnet.gon.network",
|
||||
|
||||
@@ -6,11 +6,16 @@ export default {
|
||||
{
|
||||
"name": "Tectum explorer",
|
||||
"url": "https://explorer.tectum.io",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYvFVprVdAGJH4iHUCXGEmy7pq8MMfxEjM64SuXutz9qx",
|
||||
"width": 256,
|
||||
"height": 256,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://softnote.com",
|
||||
"name": "Tectum Emission Token",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +23,10 @@ export default {
|
||||
"symbol": "TET",
|
||||
"decimals": 8
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1003,
|
||||
"rpc": [
|
||||
"https://tectum-emission-token.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1003.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.softnote.com/"
|
||||
],
|
||||
"shortName": "tet",
|
||||
|
||||
@@ -6,11 +6,16 @@ export default {
|
||||
{
|
||||
"name": "test-ektascan",
|
||||
"url": "https://test.ektascan.io",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmfMd564KUPK8eKZDwGCT71ZC2jMnUZqP6LCtLpup3rHH1",
|
||||
"width": 2100,
|
||||
"height": 2100,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmfMd564KUPK8eKZDwGCT71ZC2jMnUZqP6LCtLpup3rHH1",
|
||||
"width": 2100,
|
||||
@@ -24,12 +29,14 @@ export default {
|
||||
"symbol": "T-EKTA",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1004,
|
||||
"rpc": [
|
||||
"https://t-ekta.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1004.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://test.ekta.io:8545"
|
||||
],
|
||||
"shortName": "t-ekta",
|
||||
"slug": "t-ekta",
|
||||
"testnet": true
|
||||
"testnet": true,
|
||||
"title": "EKTA Testnet T-EKTA"
|
||||
} as const satisfies Chain;
|
||||
@@ -10,20 +10,25 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://plian.org/",
|
||||
"name": "Plian Testnet Subchain 1",
|
||||
"nativeCurrency": {
|
||||
"name": "Plian Token",
|
||||
"symbol": "PI",
|
||||
"symbol": "TPI",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10067275,
|
||||
"parent": {
|
||||
"type": "L2",
|
||||
"chain": "eip155-16658437"
|
||||
},
|
||||
"rpc": [
|
||||
"https://plian-testnet-subchain-1.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10067275.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://testnet.plian.io/child_test"
|
||||
],
|
||||
"shortName": "plian-testnet-l2",
|
||||
"slip44": 1,
|
||||
"slug": "plian-testnet-subchain-1",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 1007,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.newtonproject.org/",
|
||||
"name": "Newton Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -12,12 +11,14 @@ export default {
|
||||
"symbol": "NEW",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1007,
|
||||
"rpc": [
|
||||
"https://newton-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1007.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc1.newchain.newtonproject.org"
|
||||
],
|
||||
"shortName": "tnew",
|
||||
"slip44": 1,
|
||||
"slug": "newton-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -6,11 +6,16 @@ export default {
|
||||
{
|
||||
"name": "eurusexplorer",
|
||||
"url": "https://explorer.eurus.network",
|
||||
"standard": "none"
|
||||
"standard": "none",
|
||||
"icon": {
|
||||
"url": "ipfs://QmaGd5L9jGPbfyGXBFhu9gjinWJ66YtNrXq8x6Q98Eep9e",
|
||||
"width": 471,
|
||||
"height": 471,
|
||||
"format": "svg"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmaGd5L9jGPbfyGXBFhu9gjinWJ66YtNrXq8x6Q98Eep9e",
|
||||
"width": 471,
|
||||
@@ -24,9 +29,10 @@ export default {
|
||||
"symbol": "EUN",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1008,
|
||||
"rpc": [
|
||||
"https://eurus.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1008.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet.eurus.network/"
|
||||
],
|
||||
"shortName": "eun",
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.japanopenchain.org/",
|
||||
"name": "Japan Open Chain Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -18,13 +17,15 @@ export default {
|
||||
"symbol": "JOCT",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10081,
|
||||
"rpc": [
|
||||
"https://japan-open-chain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10081.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc-1.testnet.japanopenchain.org:8545",
|
||||
"https://rpc-2.testnet.japanopenchain.org:8545"
|
||||
],
|
||||
"shortName": "joct",
|
||||
"slip44": 1,
|
||||
"slug": "japan-open-chain-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 10086,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://sjis.me",
|
||||
"name": "SJATSH",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "ETH",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10086,
|
||||
"rpc": [
|
||||
"https://sjatsh.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10086.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"http://geth.free.idcfengye.com"
|
||||
],
|
||||
"shortName": "SJ",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 101,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://einc.io",
|
||||
"name": "EtherInc",
|
||||
"nativeCurrency": {
|
||||
@@ -12,12 +11,14 @@ export default {
|
||||
"symbol": "ETI",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1,
|
||||
"rpc": [
|
||||
"https://etherinc.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://101.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://api.einc.io/jsonrpc/mainnet"
|
||||
],
|
||||
"shortName": "eti",
|
||||
"slip44": 464,
|
||||
"slug": "etherinc",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 1010,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://evrice.com",
|
||||
"name": "Evrice Network",
|
||||
"nativeCurrency": {
|
||||
@@ -12,12 +11,14 @@ export default {
|
||||
"symbol": "EVC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1010,
|
||||
"rpc": [
|
||||
"https://evrice-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1010.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://meta.evrice.com"
|
||||
],
|
||||
"shortName": "EVC",
|
||||
"slip44": 1020,
|
||||
"slug": "evrice-network",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 10101,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.xixoio.com/",
|
||||
"name": "Blockchain Genesis Mainnet",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "GEN",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10101,
|
||||
"rpc": [
|
||||
"https://blockchain-genesis.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10101.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://eu.mainnet.xixoio.com",
|
||||
"https://us.mainnet.xixoio.com",
|
||||
"https://asia.mainnet.xixoio.com"
|
||||
|
||||
@@ -12,7 +12,6 @@ export default {
|
||||
"faucets": [
|
||||
"https://faucet.soverun.com"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmTYazUzgY9Nn2mCjWwFUSLy3dG6i2PvALpwCNQvx1zXyi",
|
||||
"width": 1154,
|
||||
@@ -26,12 +25,14 @@ export default {
|
||||
"symbol": "SVRN",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 101010,
|
||||
"rpc": [
|
||||
"https://soverun-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://101010.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://testnet-rpc.soverun.com"
|
||||
],
|
||||
"shortName": "SVRNt",
|
||||
"slip44": 1,
|
||||
"slug": "soverun-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -12,7 +12,6 @@ export default {
|
||||
"faucets": [
|
||||
"https://faucet.soverun.com"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmTYazUzgY9Nn2mCjWwFUSLy3dG6i2PvALpwCNQvx1zXyi",
|
||||
"width": 1154,
|
||||
@@ -26,9 +25,10 @@ export default {
|
||||
"symbol": "SVRN",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10101010,
|
||||
"rpc": [
|
||||
"https://soverun.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10101010.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://mainnet-rpc.soverun.com"
|
||||
],
|
||||
"shortName": "SVRNm",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 1012,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.newtonproject.org/",
|
||||
"name": "Newton",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "NEW",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1012,
|
||||
"rpc": [
|
||||
"https://newton.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1012.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://global.rpc.mainnet.newtonproject.org"
|
||||
],
|
||||
"shortName": "new",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 102,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmUc57w3UTHiWapNW9oQb1dP57ymtdemTTbpvGkjVHBRCo",
|
||||
"width": 192,
|
||||
@@ -18,14 +17,16 @@ export default {
|
||||
"symbol": "W3G",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 102,
|
||||
"rpc": [
|
||||
"https://web3games-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://102.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://testnet-rpc-0.web3games.org/evm",
|
||||
"https://testnet-rpc-1.web3games.org/evm",
|
||||
"https://testnet-rpc-2.web3games.org/evm"
|
||||
],
|
||||
"shortName": "tw3g",
|
||||
"slip44": 1,
|
||||
"slug": "web3games-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -6,13 +6,18 @@ export default {
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://gnosis-chiado.blockscout.com",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
|
||||
"width": 551,
|
||||
"height": 540,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [
|
||||
"https://gnosisfaucet.com"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeidk4swpgdyqmpz6shd5onvpaujvwiwthrhypufnwr6xh3dausz2dm",
|
||||
"width": 1800,
|
||||
@@ -26,9 +31,10 @@ export default {
|
||||
"symbol": "XDAI",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10200,
|
||||
"rpc": [
|
||||
"https://gnosis-chiado-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10200.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.chiadochain.net",
|
||||
"https://rpc.chiado.gnosis.gateway.fm",
|
||||
"wss://rpc.chiadochain.net/wss",
|
||||
@@ -36,6 +42,7 @@ export default {
|
||||
"wss://gnosis-chiado.publicnode.com"
|
||||
],
|
||||
"shortName": "chi",
|
||||
"slip44": 1,
|
||||
"slug": "gnosis-chiado-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -12,7 +12,6 @@ export default {
|
||||
"faucets": [
|
||||
"https://faucet.maxxchain.org"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmRhQG9TZrXDdbQeTzBmjg3pqgwaD5TKVZj8k4kaz8AoZx",
|
||||
"width": 1021,
|
||||
@@ -26,9 +25,10 @@ export default {
|
||||
"symbol": "PWR",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10201,
|
||||
"rpc": [
|
||||
"https://maxxchain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10201.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.maxxchain.org",
|
||||
"https://rpc1.maxxchain.org",
|
||||
"https://rpc2.maxxchain.org"
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 1022,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://clover.finance/sakura",
|
||||
"name": "Sakura",
|
||||
"nativeCurrency": {
|
||||
@@ -12,7 +11,7 @@ export default {
|
||||
"symbol": "SKU",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1022,
|
||||
"rpc": [],
|
||||
"shortName": "sku",
|
||||
"slug": "sakura",
|
||||
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 1023,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://clover.finance",
|
||||
"name": "Clover Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "CLV",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1023,
|
||||
"rpc": [],
|
||||
"shortName": "tclv",
|
||||
"slip44": 1,
|
||||
"slug": "clover-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -4,7 +4,6 @@ export default {
|
||||
"chainId": 1024,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://clv.org",
|
||||
"name": "CLV Parachain",
|
||||
"nativeCurrency": {
|
||||
@@ -12,9 +11,10 @@ export default {
|
||||
"symbol": "CLV",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1024,
|
||||
"rpc": [
|
||||
"https://clv-parachain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1024.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://api-para.clover.finance"
|
||||
],
|
||||
"shortName": "clv",
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "AA",
|
||||
"chainId": 10242,
|
||||
"explorers": [
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://explorer.arthera.net",
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
|
||||
"width": 551,
|
||||
"height": 540,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmYQp3e52KjkT4bYdAvB6ACEEpXs2D8DozsDitaADRY2Ak",
|
||||
"width": 1024,
|
||||
"height": 998,
|
||||
"format": "png"
|
||||
},
|
||||
"infoURL": "https://docs.arthera.net/build/developing-sc/using-hardhat",
|
||||
"name": "Arthera Mainnet",
|
||||
"nativeCurrency": {
|
||||
"name": "Arthera",
|
||||
"symbol": "AA",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 10242,
|
||||
"rpc": [
|
||||
"https://arthera.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10242.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.arthera.net"
|
||||
],
|
||||
"shortName": "aa",
|
||||
"slip44": 10242,
|
||||
"slug": "arthera",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -6,13 +6,18 @@ export default {
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://explorer-test.arthera.net",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
|
||||
"width": 551,
|
||||
"height": 540,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [
|
||||
"https://faucet.arthera.net"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmYQp3e52KjkT4bYdAvB6ACEEpXs2D8DozsDitaADRY2Ak",
|
||||
"width": 1024,
|
||||
@@ -26,12 +31,14 @@ export default {
|
||||
"symbol": "AA",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10243,
|
||||
"rpc": [
|
||||
"https://arthera-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10243.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc-test.arthera.net"
|
||||
],
|
||||
"shortName": "aa",
|
||||
"shortName": "aat",
|
||||
"slip44": 1,
|
||||
"slug": "arthera-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://www.0xtrade.finance/",
|
||||
"name": "0XTade",
|
||||
"nativeCurrency": {
|
||||
@@ -18,9 +17,10 @@ export default {
|
||||
"symbol": "0XT",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10248,
|
||||
"rpc": [
|
||||
"https://0xtade.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10248.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://node.0xtchain.com"
|
||||
],
|
||||
"shortName": "0xt",
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://bittorrentchain.io/",
|
||||
"name": "BitTorrent Chain Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -18,12 +17,14 @@ export default {
|
||||
"symbol": "BTT",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1028,
|
||||
"rpc": [
|
||||
"https://bittorrent-chain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1028.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://testrpc.bittorrentchain.io/"
|
||||
],
|
||||
"shortName": "tbtt",
|
||||
"slip44": 1,
|
||||
"slug": "bittorrent-chain-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmYZNTfK3byhgLsTjXP8vPubVHRz2CWsBrTJxZrQmKq6JZ",
|
||||
"width": 3509,
|
||||
@@ -21,12 +20,13 @@ export default {
|
||||
"name": "Worldland Mainnet",
|
||||
"nativeCurrency": {
|
||||
"name": "Worldland",
|
||||
"symbol": "WL",
|
||||
"symbol": "WLC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 103,
|
||||
"rpc": [
|
||||
"https://worldland.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://103.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://seoul.worldland.foundation"
|
||||
],
|
||||
"shortName": "WLC",
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://bafkreifj7n24u2dslfijfihwqvpdeigt5aj3k3sxv6s35lv75sxsfr3ojy",
|
||||
"width": 460,
|
||||
@@ -24,9 +23,10 @@ export default {
|
||||
"symbol": "CFX",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1030,
|
||||
"rpc": [
|
||||
"https://conflux-espace.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1030.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://evm.confluxrpc.com"
|
||||
],
|
||||
"shortName": "cfx",
|
||||
|
||||
@@ -6,11 +6,16 @@ export default {
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://scan.crystaleum.org",
|
||||
"standard": "EIP3091"
|
||||
"standard": "EIP3091",
|
||||
"icon": {
|
||||
"url": "ipfs://Qmbry1Uc6HnXmqFNXW5dFJ7To8EezCCjNr4TqqvAyzXS4h",
|
||||
"width": 150,
|
||||
"height": 150,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://Qmbry1Uc6HnXmqFNXW5dFJ7To8EezCCjNr4TqqvAyzXS4h",
|
||||
"width": 150,
|
||||
@@ -24,9 +29,10 @@ export default {
|
||||
"symbol": "◈",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1,
|
||||
"rpc": [
|
||||
"https://crystaleum.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://103090.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://evm.cryptocurrencydevs.org",
|
||||
"https://rpc.crystaleum.org"
|
||||
],
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"infoURL": "https://theproxy.network",
|
||||
"name": "Proxy Network Testnet",
|
||||
"nativeCurrency": {
|
||||
@@ -18,12 +17,14 @@ export default {
|
||||
"symbol": "PRX",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1031,
|
||||
"rpc": [
|
||||
"https://proxy-network-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1031.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"http://128.199.94.183:8041"
|
||||
],
|
||||
"shortName": "prx",
|
||||
"slip44": 1,
|
||||
"slug": "proxy-network-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -0,0 +1,31 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "Avalanche",
|
||||
"chainId": 103454,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
|
||||
"width": 256,
|
||||
"height": 256,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://avacloud.io",
|
||||
"name": "Masa Testnet",
|
||||
"nativeCurrency": {
|
||||
"name": "Masa Testnet Token",
|
||||
"symbol": "tMASA",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 103454,
|
||||
"redFlags": [],
|
||||
"rpc": [
|
||||
"https://masa-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://103454.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://subnets.avax.network/masatestne/testnet/rpc"
|
||||
],
|
||||
"shortName": "Masa Testnet",
|
||||
"slug": "masa-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -6,13 +6,18 @@ export default {
|
||||
{
|
||||
"name": "Bronos Testnet Explorer",
|
||||
"url": "https://tbroscan.bronos.org",
|
||||
"standard": "none"
|
||||
"standard": "none",
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeifkgtmhnq4sxu6jn22i7ass7aih6ubodr77k6ygtu4tjbvpmkw2ga",
|
||||
"width": 500,
|
||||
"height": 500,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [
|
||||
"https://faucet.bronos.org"
|
||||
],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeifkgtmhnq4sxu6jn22i7ass7aih6ubodr77k6ygtu4tjbvpmkw2ga",
|
||||
"width": 500,
|
||||
@@ -26,12 +31,14 @@ export default {
|
||||
"symbol": "tBRO",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1038,
|
||||
"rpc": [
|
||||
"https://bronos-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://1038.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://evm-testnet.bronos.org"
|
||||
],
|
||||
"shortName": "bronos-testnet",
|
||||
"slip44": 1,
|
||||
"slug": "bronos-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -6,11 +6,16 @@ export default {
|
||||
{
|
||||
"name": "Bronos Explorer",
|
||||
"url": "https://broscan.bronos.org",
|
||||
"standard": "none"
|
||||
"standard": "none",
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeifkgtmhnq4sxu6jn22i7ass7aih6ubodr77k6ygtu4tjbvpmkw2ga",
|
||||
"width": 500,
|
||||
"height": 500,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://bafybeifkgtmhnq4sxu6jn22i7ass7aih6ubodr77k6ygtu4tjbvpmkw2ga",
|
||||
"width": 500,
|
||||
@@ -24,7 +29,7 @@ export default {
|
||||
"symbol": "BRO",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 1039,
|
||||
"rpc": [],
|
||||
"shortName": "bronos-mainnet",
|
||||
"slug": "bronos",
|
||||
|
||||
@@ -10,7 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmYZNTfK3byhgLsTjXP8vPubVHRz2CWsBrTJxZrQmKq6JZ",
|
||||
"width": 3509,
|
||||
@@ -21,15 +20,17 @@ export default {
|
||||
"name": "Worldland Testnet",
|
||||
"nativeCurrency": {
|
||||
"name": "Worldland",
|
||||
"symbol": "WL",
|
||||
"symbol": "WLC",
|
||||
"decimals": 18
|
||||
},
|
||||
"redFlags": [],
|
||||
"networkId": 10395,
|
||||
"rpc": [
|
||||
"https://worldland-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://10395.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://gwangju.worldland.foundation"
|
||||
],
|
||||
"shortName": "TWLC",
|
||||
"slip44": 1,
|
||||
"slug": "worldland-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user