Compare commits

...
Author SHA1 Message Date
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
73bee2bed1 Version Packages (#1121)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-06-08 22:35:52 -06:00
2a443365bd [Smart Wallet] Fix Celo support (#1153)
Co-authored-by: Joaquim Verges <[email protected]>
2023-06-09 04:22:15 +00:00
Manan TankandGitHub ed47fd5310 [sdk] Reduce circular dependencies (#1152) 2023-06-08 22:01:35 +00:00
Manan TankandGitHub 2a0294d8e6 [react] Fix wrong balance in ConnectWallet (#1151) 2023-06-08 20:09:52 +00:00
Manan TankandGitHub 65ecf072eb [react] Improve rendering of long Network List in ConnectWallet Modal (#1149) 2023-06-08 19:10:45 +00:00
Manan TankandGitHub 9ce3eb6aad [react-core] Remove WalletConfig.config, Remove circular dependency (#1144) 2023-06-08 09:43:16 +00:00
Nacho IacovinoandGitHub e32faeb57a [React] Fix return type for useIsSmartWalletDeployed (#1146) 2023-06-08 00:38:59 +00:00
Nacho IacovinoandGitHub 6a19426200 [React] Add useIsSmartWalletDeployed hook (#1145) 2023-06-07 23:40:11 +00:00
iketwandGitHub 2bcad4b716 [ReactNative] make links optional (#1143) 2023-06-07 20:57:22 +00:00
FirekeeperandGitHub 193de1e9d8 [unity-js-bridge] WebGL SW Multi EOA Support (#1142) 2023-06-07 09:35:17 +00:00
645b0303cc feat: create Taro Testnet (#1138)
Co-authored-by: Jonas Daniels <[email protected]>
2023-06-07 05:22:09 +00:00
YashandGitHub 16232de9ea [Chains] Update chains (#1140) 2023-06-06 23:36:12 +00:00
Joaquim VergesandGitHub 52056edfd6 [SDK] Fix contract.call documentation (#1139) 2023-06-06 19:53:17 +00:00
iketwandGitHub dec4c4a8cf [ReactNative] Exports WCV1 and V2 abstract classes to facilitate creation of wallet connect based wallets (#1137) 2023-06-06 17:22:58 +00:00
Manan TankandGitHub 9a015a23cd [react-core] Logout user on account switch (#1136) 2023-06-06 10:39:43 +00:00
iketwandGitHub 15ef4779e0 [ReactNative] Exports base UI components for external use (#1135) 2023-06-05 22:22:37 +00:00
FirekeeperandGitHub b8498c2a10 [unity-js-bridge] sw lw persistence webgl & export (#1133) 2023-06-05 16:38:48 +00:00
56f85e57df [sdk] Reduce circular dependencies (#1124)
Co-authored-by: Joaquim Verges <[email protected]>
2023-06-05 15:22:02 +00:00
Manan TankandGitHub 197a6838f6 [wallets] Clear localWallet.ethersWallet when calling localWallet.disconnect (#1132) 2023-06-05 15:10:59 +00:00
YashandGitHub 3bf7f37593 [SDK] Fix handling of standard contracts (#1131) 2023-06-03 23:30:21 +00:00
YashandGitHub 6803c3e97c Fix any evm deploy: when not autoFactory (#1129) 2023-06-03 02:43:58 +00:00
YashandGitHub b672860397 [SDK] Enable ZKSync mainnet deployments (#1128) 2023-06-03 01:02:58 +00:00
Adam MajmudarandGitHub ab14cd8938 [Auth] Add expiration date to cookies (#1126) 2023-06-02 23:28:39 +00:00
YashandGitHub 8687d6ac3a Add missing exports (#1127) 2023-06-02 23:27:30 +00:00
YashandGitHub a5f16b6dc5 Check standard deploy type (#1125) 2023-06-02 22:19:18 +00:00
6a91b6a025 [SDK] Publish flow updates (#1016)
Co-authored-by: Nacho Iacovino <[email protected]>
2023-06-02 20:59:45 +00:00
Nacho IacovinoandGitHub 54cfd6d891 [React] Update useCreateSmartWallet (#1123) 2023-06-02 19:56:14 +00:00
Manan TankandGitHub 522453fd56 [sdk] Reduce circular dependencies (#1120) 2023-06-02 18:01:57 +00:00
Nacho IacovinoandGitHub 0cba69ca40 Export smart wallet factory hooks (#1119) 2023-06-02 17:48:15 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
96b43b8488 Version Packages (#1106)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-06-02 10:33:56 -07:00
b4c9515937 Add Smart Wallet Factory hooks (#1115)
Co-authored-by: Krishang <[email protected]>
2023-06-02 16:19:24 +00:00
Manan TankandGitHub 9b20fc9ad2 [wallets, react] Remove chain restriction in paper wallet, Fix email validation in paper & magic (#1118) 2023-06-02 15:54:48 +00:00
Manan TankandGitHub 51bbd3d1bc [sdk] Reduce circular dependencies (#1117) 2023-06-02 13:58:26 +00:00
Manan TankandGitHub 356f7aa643 [react] Fix missing connectionStatus on localWallet connection, Metamask QR connection (#1116) 2023-06-02 12:35:14 +00:00
Adam MajmudarandGitHub 2283e71aca [Auth] Switch to server-side payload generation (#1114) 2023-06-02 00:38:35 +00:00
iketwandGitHub 90ab9ab031 [RN] fix lint warning (#1113) 2023-06-01 22:13:39 +00:00
Manan TankandGitHub 6aee041343 [sdk] Reduce circular dependencies (#1112) 2023-06-01 22:07:36 +00:00
Adam MajmudarandGitHub 21627c03d1 Update auth expiration (#1111) 2023-06-01 18:48:26 +00:00
ce36322b38 [SDK] Added getNonce() & updated airdrop (#1104)
Co-authored-by: Joaquim Verges <[email protected]>
Co-authored-by: Jonas Daniels <[email protected]>
2023-06-01 17:43:55 +00:00
nkrishangandGitHub 564eaccf48 Smart Wallet Factory class for creating accounts and fetching data about them. (#1095) 2023-06-01 14:31:32 +00:00
Manan TankandGitHub aa9e952cb5 [sdk] Reduce circular dependencies (#1110) 2023-06-01 14:28:30 +00:00
Manan TankandGitHub 85a6162137 [sdk] Reduce circular deps (#1109) 2023-06-01 13:30:29 +00:00
Manan TankandGitHub e93aa70ef0 [sdk] Reduce circular deps (#1108) 2023-06-01 12:43:31 +00:00
Manan TankandGitHub 6e86123403 [sdk] Reduce circular dependencies (#1107) 2023-06-01 12:13:22 +00:00
Manan TankandGitHub c60658ed8c [sdk] Reduce circular deps (#1105) 2023-06-01 11:29:45 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
df5f016d31 Version Packages (#1099)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-05-31 16:52:33 -07:00
iketwandGitHub 89102b0c89 [RN] fix bug after scanning wc uri (#1103) 2023-05-31 23:44:10 +00:00
Adam MajmudarandGitHub e1846c4469 [Auth] Default invalid before state to 5 minutes ago (#1101) 2023-05-31 22:05:16 +00:00
Manan TankandGitHub cc56037e64 [sdk] Reduce circular dependencies (#1102) 2023-05-31 21:23:03 +00:00
Manan TankandGitHub 23d90b3e77 [sdk] Reduce circular dependencies (#1100) 2023-05-31 19:58:48 +00:00
Manan TankandGitHub 6745078947 add sideEffects: false on auth, storage, unity-js-bridge (#1098) 2023-05-31 18:52:05 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
55d1f5c550 Version Packages (#1045)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-05-31 11:43:16 -07:00
iketwandGitHub b694f3c300 [Readme] fix react native title (#1097) 2023-05-31 17:58:09 +00:00
iketwandGitHub 217879ace1 [ReactNative] Make magic deps and camera deps optional (#1096) 2023-05-31 17:52:20 +00:00
Adam MajmudarandGitHub 35984362b0 [Wallets] Update gnosis safe signMessage function (#1087) 2023-05-31 00:47:23 +00:00
YashandGitHub bdabbef71a Fix create2 factory deployment (#1094) 2023-05-30 23:30:33 +00:00
Manan TankandGitHub 2f1df0b535 [sdk] reduce circular deps (#1093) 2023-05-30 22:16:06 +00:00
Joaquim VergesandGitHub da57610802 [SDK] return data from DeployTransaction.simulate() (#1091) 2023-05-30 21:51:46 +00:00
iketwandGitHub 119e785461 [RN] fix supportedWallets type (#1092) 2023-05-30 21:27:41 +00:00
Joaquim VergesandGitHub 5f1e6abb39 [Chains] add base-goerli as default chain (#1090) 2023-05-30 21:11:09 +00:00
Manan TankandGitHub 59206233e1 [sdk] reduce circular deps (#1089) 2023-05-30 20:52:34 +00:00
iketwandGitHub 4f99ccb49c [ReactNative/Wallets] Add sendTransaction for WCV1 handler (#1088) 2023-05-30 18:43:33 +00:00
Manan TankandGitHub 292a321a95 [wallets] Fix disconnect on switchChain in MetaMask (#1085) 2023-05-30 16:30:03 +00:00
Manan TankandGitHub 74f898ac28 [react] Fix Local wallet backup (#1084) 2023-05-30 15:20:32 +00:00
iketwandGitHub 431445e3c6 [Wallets] Fix bug getting account address (#1083) 2023-05-30 12:36:04 +00:00
fd7111d544 [react, react-core] add theme in WalletConfig.selectUI (#1068)
Co-authored-by: ikethirdweb <[email protected]>
2023-05-30 12:05:56 +00:00
ciaranightingaleandGitHub f3b2ae3f6d [SDK] add data to getAddress for Smart Wallet (#1073) 2023-05-27 01:17:39 +00:00
Manan TankandGitHub f5ae61aeba useSwitchChain instead of wallet.switchChain (#1078) 2023-05-26 21:50:37 +00:00
iketwandGitHub 37e0af5753 [ReactNative] Auto-connect sw with one EOA (#1077) 2023-05-26 20:56:37 +00:00
Manan TankandGitHub a034b0321f [sdk] reduce circular deps (#1075) 2023-05-26 18:48:28 +00:00
iketwandGitHub 8ffc597c06 [ReactNative] implement send_transaction for wcv2 (#1076) 2023-05-26 18:38:03 +00:00
Manan TankandGitHub 8eecf4c2d5 [sdk] reduce circular deps (#1072) 2023-05-26 10:54:33 +00:00
32cc54423e [CLI] De-duplicate addresses on generate (#1066)
Co-authored-by: Joaquim Verges <[email protected]>
2023-05-26 00:12:14 +00:00
iketwandGitHub bd86661f54 [ReactNative] Sign in with email/phone number (#1065) 2023-05-25 23:10:55 +00:00
Manan TankandGitHub ee4c7de25c [sdk] reduce circular deps (#1071) 2023-05-25 22:05:33 +00:00
Manan TankandGitHub c68a4bdd1f [sdk] reduce cyclic deps (#1069) 2023-05-25 20:24:39 +00:00
Joaquim VergesandGitHub 68fa1896f7 [Wallets] Expose smartWallet.deploy() and smartWallet.isDeployed() (#1070) 2023-05-25 19:17:23 +00:00
Manan TankandGitHub e21bdd0328 [react-core] return wallet instance from useConnect (#1067) 2023-05-25 16:37:31 +00:00
Manan TankandGitHub c85810eee3 [wallets] don't cache signer (#1064) 2023-05-24 23:17:20 +00:00
YashandGitHub d24a6146d8 [CLI] Add support for ZKSync (#1003) 2023-05-24 23:07:51 +00:00
FirekeeperandGitHub e94b7fdfed [thirdweb-unity-bridge] smart wallet webgl (#1063) 2023-05-24 22:39:44 +00:00
Joaquim VergesandGitHub 98efd090f6 [SDK] add transferFrom for 1155 contracts (#1062) 2023-05-24 21:24:21 +00:00
Joaquim VergesandGitHub 189daf0280 [SDK] add transferFrom for erc721 (#1061) 2023-05-24 19:54:29 +00:00
Joaquim VergesandGitHub f7b352a585 [SDK] Expose getSignerAddress on tx object (#1060) 2023-05-24 17:57:58 +00:00
iketwandGitHub 56ad0867bd [RN] Use walletConfig's selectUI to render Choose your Wallet item (#1059) 2023-05-24 14:16:00 +00:00
Manan TankandGitHub d565100614 [sdk] reduce cyclic deps (#1055) 2023-05-23 16:34:33 +00:00
Manan TankandGitHub edaa5b2e6c [sdk] reduce cyclic deps (#1054) 2023-05-23 14:08:45 +00:00
iketwandGitHub 77123a9a5a [ReactNative] Adds WC qrcode support for Connect an App (#1052) 2023-05-23 00:26:39 +00:00
Manan TankandGitHub 6fd10f94b4 [chains] Fix tree shaking in thirdweb-dev/chains package (#1047) 2023-05-22 22:42:05 +00:00
Nacho IacovinoandGitHub afae0873b0 [JS] Fix check for erc1155 claim conditions (#1051) 2023-05-22 21:55:20 +00:00
Nacho IacovinoandGitHub 4a1d758110 [JS] Fix creator phase check (#1049) 2023-05-22 21:09:21 +00:00
YashandGitHub c6e74ef0b0 [SDK] Allow overrides for read actions (#1043) 2023-05-22 19:43:30 +00:00
iketwandGitHub bba9767adf [ReactNative-Wallets] Enables SmartWallet to connect to an app, with implementation in React Native (#1010) 2023-05-22 17:58:12 +00:00
Manan TankandGitHub a5e509438d [react-core] do not re-throw auto-connect error (#1044) 2023-05-22 16:14:35 +00:00
Manan TankandGitHub f461290216 [react] Fix smart wallet config type (#1042) 2023-05-22 16:01:24 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
8febea4db0 Version Packages (#1041)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-05-21 13:45:57 -07:00
Joaquim VergesandGitHub 30e5593dd1 [Wallets] deploy smart wallet contract before signing messages (#1040) 2023-05-20 21:01:38 +00:00
483 changed files with 18667 additions and 12731 deletions
+8 -8
View File
@@ -20,14 +20,14 @@
## Packages
| Package | Description | Latest Version |
| --------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [/sdk](./packages/sdk) | Best in class web3 SDK for Browser, Node and Mobile apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/sdk"><img src="https://img.shields.io/npm/v/@thirdweb-dev/sdk?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react](./packages/react) | Ultimate collection of React hooks for your web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react](./packages/react-native) | Ultimate collection of React hooks for your native web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react-native"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react-native?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/auth](./packages/auth) | Best in class wallet authentication for Node backends | <a href="https://www.npmjs.com/package/@thirdweb-dev/auth"><img src="https://img.shields.io/npm/v/@thirdweb-dev/auth?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/storage](./packages/storage) | Best in class decentralized storage SDK for Browser and Node | <a href="https://www.npmjs.com/package/@thirdweb-dev/storage"><img src="https://img.shields.io/npm/v/@thirdweb-dev/storage?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/cli](./packages/cli) | Publish and deploy smart contracts without dealing with private keys | <a href="https://www.npmjs.com/package/thirdweb"><img src="https://img.shields.io/npm/v/thirdweb?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| Package | Description | Latest Version |
| ---------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [/sdk](./packages/sdk) | Best in class web3 SDK for Browser, Node and Mobile apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/sdk"><img src="https://img.shields.io/npm/v/@thirdweb-dev/sdk?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react](./packages/react) | Ultimate collection of React hooks for your web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react-native](./packages/react-native) | Ultimate collection of React hooks for your native mobile web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react-native"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react-native?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/auth](./packages/auth) | Best in class wallet authentication for Node backends | <a href="https://www.npmjs.com/package/@thirdweb-dev/auth"><img src="https://img.shields.io/npm/v/@thirdweb-dev/auth?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/storage](./packages/storage) | Best in class decentralized storage SDK for Browser and Node | <a href="https://www.npmjs.com/package/@thirdweb-dev/storage"><img src="https://img.shields.io/npm/v/@thirdweb-dev/storage?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/cli](./packages/cli) | Publish and deploy smart contracts without dealing with private keys | <a href="https://www.npmjs.com/package/thirdweb"><img src="https://img.shields.io/npm/v/thirdweb?color=red&label=npm&logo=npm" alt="npm version"/></a> |
## Documentation
+47
View File
@@ -1,5 +1,52 @@
# @thirdweb-dev/auth
## 3.1.1
### Patch Changes
- [#1126](https://github.com/thirdweb-dev/js/pull/1126) [`ab14cd89`](https://github.com/thirdweb-dev/js/commit/ab14cd89385aefad7f32e20a22baa9fce42b98e2) Thanks [@adam-maj](https://github.com/adam-maj)! - Add expiration date to cookie
- Updated dependencies [[`2a443365`](https://github.com/thirdweb-dev/js/commit/2a443365bdc3d47d0f41fc895f70256dcde423f5), [`197a6838`](https://github.com/thirdweb-dev/js/commit/197a6838f69ae8b9ad46524e7c469fc757d0a2cb)]:
- @thirdweb-dev/wallets@0.2.26
## 3.1.0
### Minor Changes
- [#1114](https://github.com/thirdweb-dev/js/pull/1114) [`2283e71a`](https://github.com/thirdweb-dev/js/commit/2283e71acaaf3d15eb2d6121682f1d2a81eec4f3) Thanks [@adam-maj](https://github.com/adam-maj)! - Switch to server-side payload generation
### Patch Changes
- [#1111](https://github.com/thirdweb-dev/js/pull/1111) [`21627c03`](https://github.com/thirdweb-dev/js/commit/21627c03d1bb1658fee19b12d580faa6c7f048d9) Thanks [@adam-maj](https://github.com/adam-maj)! - Update expiration dates for auth
- Updated dependencies [[`9b20fc9a`](https://github.com/thirdweb-dev/js/commit/9b20fc9ad2d303edc31f44fbd2ea3b4dcf35d11e)]:
- @thirdweb-dev/wallets@0.2.25
## 3.0.23
### Patch Changes
- [#1101](https://github.com/thirdweb-dev/js/pull/1101) [`e1846c44`](https://github.com/thirdweb-dev/js/commit/e1846c44696bcb25a6a137d63e117e7d2ce9d979) Thanks [@adam-maj](https://github.com/adam-maj)! - Bump invalid before with 5 minute window
- [#1098](https://github.com/thirdweb-dev/js/pull/1098) [`67450789`](https://github.com/thirdweb-dev/js/commit/67450789473b6008b86453ee4f4c7b99461223a6) Thanks [@MananTank](https://github.com/MananTank)! - add sideEffects: false in package.json
- Updated dependencies []:
- @thirdweb-dev/wallets@0.2.24
## 3.0.22
### Patch Changes
- Updated dependencies [[`bba9767a`](https://github.com/thirdweb-dev/js/commit/bba9767adfe20e41055450b86e4448fcb2119855), [`bd86661f`](https://github.com/thirdweb-dev/js/commit/bd86661f54ca2f1eb09cbae35c704dc79be1b63a), [`68fa1896`](https://github.com/thirdweb-dev/js/commit/68fa1896f75d3514e00cc380924fd8bc623064f0), [`292a321a`](https://github.com/thirdweb-dev/js/commit/292a321a95ed2d847097eed205353dd69eeb8d54), [`f3b2ae3f`](https://github.com/thirdweb-dev/js/commit/f3b2ae3f6d9c66356c521d3b9c2a6c096dbb4b57), [`4f99ccb4`](https://github.com/thirdweb-dev/js/commit/4f99ccb49c584946de709fbc01017611d2828b76), [`c85810ee`](https://github.com/thirdweb-dev/js/commit/c85810eee318b10eee4ada61828adaa51f94ea6c), [`35984362`](https://github.com/thirdweb-dev/js/commit/35984362b0a60e5b9c3d3c9731450a8f47deb1c4)]:
- @thirdweb-dev/wallets@0.2.23
## 3.0.21
### Patch Changes
- Updated dependencies [[`30e5593d`](https://github.com/thirdweb-dev/js/commit/30e5593dd1ce9abd809ad216a1cfce77b897093c)]:
- @thirdweb-dev/wallets@0.2.22
## 3.0.20
### Patch Changes
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "3.0.20",
"version": "3.1.1",
"main": "dist/thirdweb-dev-auth.cjs.js",
"module": "dist/thirdweb-dev-auth.esm.js",
"browser": {
@@ -54,6 +54,7 @@
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/auth",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
"sideEffects": false,
"scripts": {
"build": "preconstruct build",
"format": "prettier --write 'src/**/*'",
+34 -14
View File
@@ -6,7 +6,6 @@ import {
LoginPayloadDataSchema,
AuthenticationPayloadDataSchema,
AuthenticationPayloadData,
LoginOptionsSchema,
VerifyOptionsSchema,
VerifyOptions,
GenerateOptionsSchema,
@@ -14,6 +13,8 @@ import {
AuthenticateOptions,
User,
Json,
LoginOptionsSchema,
AuthenticationPayload,
} from "./schema";
import { isBrowser } from "./utils";
import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
@@ -31,7 +32,7 @@ export class ThirdwebAuth {
this.wallet = wallet;
}
public async login(options?: LoginOptions): Promise<LoginPayload> {
public async payload(options?: LoginOptions): Promise<LoginPayloadData> {
const parsedOptions = LoginOptionsSchema.parse(options);
let chainId: string | undefined = parsedOptions?.chainId;
@@ -43,30 +44,40 @@ export class ThirdwebAuth {
}
}
const payloadData = LoginPayloadDataSchema.parse({
return LoginPayloadDataSchema.parse({
type: this.wallet.type,
domain: parsedOptions?.domain || this.domain,
address: await this.wallet.getAddress(),
address: parsedOptions?.address || (await this.wallet.getAddress()),
statement: parsedOptions?.statement,
version: parsedOptions?.version,
uri: parsedOptions?.uri,
chain_id: chainId,
nonce: parsedOptions?.nonce,
expiration_time:
parsedOptions?.expirationTime || new Date(Date.now() + 1000 * 60 * 5),
invalid_before: parsedOptions?.invalidBefore,
parsedOptions?.expirationTime || new Date(Date.now() + 1000 * 60 * 10),
invalid_before:
parsedOptions?.invalidBefore || new Date(Date.now() - 1000 * 60 * 10),
resources: parsedOptions?.resources,
});
}
const message = this.generateMessage(payloadData);
public async loginWithPayload(
payload: LoginPayloadData,
): Promise<LoginPayload> {
const message = this.generateMessage(payload);
const signature = await this.wallet.signMessage(message);
return {
payload: payloadData,
payload,
signature,
};
}
public async login(options?: LoginOptions): Promise<LoginPayload> {
const payloadData = await this.payload(options);
return await this.loginWithPayload(payloadData);
}
public async verify(
payload: LoginPayload,
options?: VerifyOptions,
@@ -276,12 +287,7 @@ export class ThirdwebAuth {
const parsedOptions = AuthenticateOptionsSchema.parse(options);
const domain = parsedOptions?.domain || this.domain;
const encodedPayload = token.split(".")[1];
const encodedSignature = token.split(".")[2];
const payload: AuthenticationPayloadData = JSON.parse(
Buffer.from(encodedPayload, "base64").toString(),
);
const signature = Buffer.from(encodedSignature, "base64").toString();
const { payload, signature } = this.parseToken(token);
// Check that the payload unique ID is valid
if (parsedOptions?.validateTokenId !== undefined) {
@@ -349,6 +355,20 @@ export class ThirdwebAuth {
};
}
public parseToken(token: string): AuthenticationPayload {
const encodedPayload = token.split(".")[1];
const encodedSignature = token.split(".")[2];
const payload: AuthenticationPayloadData = JSON.parse(
Buffer.from(encodedPayload, "base64").toString(),
);
const signature = Buffer.from(encodedSignature, "base64").toString();
return {
payload,
signature,
};
}
private async verifySignature(
message: string,
signature: string,
+1
View File
@@ -34,6 +34,7 @@ const JsonSchema: z.ZodType<Json> = z.lazy(
export const LoginOptionsSchema = z
.object({
domain: z.string().optional(),
address: z.string().optional(),
statement: z.string().optional(),
uri: z.string().optional(),
version: z.string().optional(),
+8
View File
@@ -1,5 +1,6 @@
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";
@@ -47,6 +48,13 @@ export function ThirdwebAuth<
router.use(express.json());
router.use(cookieMiddleware);
router.post(
"/payload",
asyncHandler((req: Request, res: Response) =>
payloadHandler(req, res, ctx as ThirdwebAuthContext),
),
);
router.post(
"/login",
asyncHandler((req: Request, res: Response) =>
@@ -64,6 +64,10 @@ export default async function handler(
}
}
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.setHeader(
@@ -72,6 +76,7 @@ export default async function handler(
domain: ctx.cookieOptions?.domain,
path: ctx.cookieOptions?.path || "/",
sameSite: ctx.cookieOptions?.sameSite || "none",
expires: new Date(exp * 1000),
httpOnly: true,
secure: true,
}),
@@ -0,0 +1,31 @@
import { Request, Response } from "express";
import { PayloadBodySchema, ThirdwebAuthContext } from "../types";
export default async function handler(
req: Request,
res: Response,
ctx: ThirdwebAuthContext,
) {
if (req.method !== "POST") {
return res.status(405).json({
error: "Invalid method. Only POST supported.",
});
}
const parsedPayload = PayloadBodySchema.safeParse(req.body);
if (!parsedPayload.success) {
return res.status(400).json({ error: "Please provide an address" });
}
// 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: ctx.authOptions?.chainId,
resources: ctx.authOptions?.resources,
});
return res.status(200).json({ payload });
}
+4
View File
@@ -4,6 +4,10 @@ import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
import { Request } from "express";
import { z } from "zod";
export const PayloadBodySchema = z.object({
address: z.string(),
});
export const LoginPayloadBodySchema = z.object({
payload: LoginPayloadOutputSchema,
});
+3
View File
@@ -1,5 +1,6 @@
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";
@@ -27,6 +28,8 @@ async function ThirdwebAuthRouter(
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":
+5
View File
@@ -64,6 +64,10 @@ export default async function handler(
}
}
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.setHeader(
@@ -72,6 +76,7 @@ export default async function handler(
domain: ctx.cookieOptions?.domain,
path: ctx.cookieOptions?.path || "/",
sameSite: ctx.cookieOptions?.sameSite || "none",
expires: new Date(exp * 1000),
httpOnly: true,
secure: true,
}),
+31
View File
@@ -0,0 +1,31 @@
import { PayloadBodySchema, ThirdwebAuthContext } from "../types";
import { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
ctx: ThirdwebAuthContext,
) {
if (req.method !== "POST") {
return res.status(405).json({
error: "Invalid method. Only POST supported.",
});
}
const parsedPayload = PayloadBodySchema.safeParse(req.body);
if (!parsedPayload.success) {
return res.status(400).json({ error: "Please provide an address" });
}
// 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: ctx.authOptions?.chainId,
resources: ctx.authOptions?.resources,
});
return res.status(200).json({ payload });
}
+5 -1
View File
@@ -5,6 +5,10 @@ import { GetServerSidePropsContext, NextApiRequest } from "next";
import { NextRequest } from "next/server";
import { z } from "zod";
export const PayloadBodySchema = z.object({
address: z.string(),
});
export const LoginPayloadBodySchema = z.object({
payload: LoginPayloadOutputSchema,
});
@@ -14,7 +18,7 @@ type RequestType =
| NextRequest
| NextApiRequest;
export type ThirdwebAuthRoute = "login" | "logout" | "user";
export type ThirdwebAuthRoute = "payload" | "login" | "logout" | "user";
export type ThirdwebAuthUser<
TData extends Json = Json,
+26
View File
@@ -1,5 +1,31 @@
# @thirdweb-dev/chains
## 0.1.20
### Patch Changes
- [#1140](https://github.com/thirdweb-dev/js/pull/1140) [`16232de9`](https://github.com/thirdweb-dev/js/commit/16232de9eab9966e24e335929b2a3919346af265) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Update chains
- [#1138](https://github.com/thirdweb-dev/js/pull/1138) [`645b0303`](https://github.com/thirdweb-dev/js/commit/645b0303cc1a9cbb0a0e9cbd67d11c3b865e4584) Thanks [@jcstein](https://github.com/jcstein)! - feat: create Taro Testnet
## 0.1.19
### Patch Changes
- [#1065](https://github.com/thirdweb-dev/js/pull/1065) [`bd86661f`](https://github.com/thirdweb-dev/js/commit/bd86661f54ca2f1eb09cbae35c704dc79be1b63a) Thanks [@iketw](https://github.com/iketw)! - [Chains] update chains
- [#1064](https://github.com/thirdweb-dev/js/pull/1064) [`c85810ee`](https://github.com/thirdweb-dev/js/commit/c85810eee318b10eee4ada61828adaa51f94ea6c) Thanks [@MananTank](https://github.com/MananTank)! - Do not cache signer in wallets
- [#1047](https://github.com/thirdweb-dev/js/pull/1047) [`6fd10f94`](https://github.com/thirdweb-dev/js/commit/6fd10f94b469dc5659e2ff4ce92a5aff86f3c89d) Thanks [@MananTank](https://github.com/MananTank)! - Fix tree-shaking issue in `@thirdweb-dev/chains`
- [#1090](https://github.com/thirdweb-dev/js/pull/1090) [`5f1e6abb`](https://github.com/thirdweb-dev/js/commit/5f1e6abb391f5c58dbdb207f569b3dd0b5d4729c) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Add base-goerli to default chains
## 0.1.18
### Patch Changes
- [#1040](https://github.com/thirdweb-dev/js/pull/1040) [`30e5593d`](https://github.com/thirdweb-dev/js/commit/30e5593dd1ce9abd809ad216a1cfce77b897093c) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Update chains
## 0.1.17
### Patch Changes
+5 -2
View File
@@ -11,20 +11,23 @@ export default {
"rpc": [
"https://gnosis.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.gnosischain.com",
"https://rpc.gnosis.gateway.fm",
"https://rpc.ankr.com/gnosis",
"https://gnosischain-rpc.gateway.pokt.network",
"https://gnosis-mainnet.public.blastapi.io",
"https://gnosis.api.onfinality.io/public",
"https://gnosis.blockpi.network/v1/rpc/public",
"https://web3endpoints.com/gnosischain-mainnet",
"wss://rpc.gnosischain.com/wss"
],
"faucets": [
"https://gnosisfaucet.com",
"https://faucet.gimlu.com/gnosis",
"https://stakely.io/faucet/gnosis-chain-xdai",
"https://faucet.prussia.dev/xdai"
],
"nativeCurrency": {
"name": "xDAI",
"symbol": "xDAI",
"symbol": "XDAI",
"decimals": 18
},
"infoURL": "https://docs.gnosischain.com",
+7 -6
View File
@@ -1,7 +1,7 @@
import type { Chain } from "../src/types";
export default {
"name": "Chiado Testnet",
"chain": "CHI",
"name": "Gnosis Chiado Testnet",
"chain": "GNO",
"icon": {
"url": "ipfs://bafybeidk4swpgdyqmpz6shd5onvpaujvwiwthrhypufnwr6xh3dausz2dm",
"width": 1800,
@@ -9,16 +9,17 @@ export default {
"format": "png"
},
"rpc": [
"https://chiado-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gnosis-chiado-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.chiadochain.net",
"https://rpc.eu-central-2.gateway.fm/v3/gnosis/archival/chiado"
"https://rpc.chiado.gnosis.gateway.fm",
"wss://rpc.chiadochain.net/wss"
],
"faucets": [
"https://gnosisfaucet.com"
],
"nativeCurrency": {
"name": "Chiado xDAI",
"symbol": "xDAI",
"symbol": "XDAI",
"decimals": 18
},
"infoURL": "https://docs.gnosischain.com",
@@ -39,5 +40,5 @@ export default {
}
],
"testnet": true,
"slug": "chiado-testnet"
"slug": "gnosis-chiado-testnet"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "Siberium Test Network",
"chain": "SBR",
"rpc": [
"https://siberium-test-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.test.siberium.net"
],
"faucets": [],
"nativeCurrency": {
"name": "TestSIBR",
"symbol": "SIBR",
"decimals": 18
},
"infoURL": "https://siberium.net",
"shortName": "testsbr",
"chainId": 111000,
"networkId": 111000,
"icon": {
"url": "ipfs://QmYeMdWDZ1iaBFeSPorRyPi7RuSXTdDKTgW3rfnUf3W5ne",
"width": 512,
"height": 512,
"format": "svg"
},
"explorers": [
{
"name": "Siberium Testnet Explorer - blockscout",
"url": "https://explorer.test.siberium.net",
"icon": {
"url": "ipfs://QmYeMdWDZ1iaBFeSPorRyPi7RuSXTdDKTgW3rfnUf3W5ne",
"width": 512,
"height": 512,
"format": "svg"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "siberium-test-network"
} as const satisfies Chain;
+10 -10
View File
@@ -10,7 +10,7 @@ export default {
"faucets": [],
"nativeCurrency": {
"name": "Siberium",
"symbol": "SBR",
"symbol": "SIBR",
"decimals": 18
},
"infoURL": "https://siberium.net",
@@ -18,9 +18,9 @@ export default {
"chainId": 111111,
"networkId": 111111,
"icon": {
"url": "ipfs://QmVDeoGo2TZPDWiaNDdPCnH2tz2BCQ7viw8ugdDWnU5LFq",
"width": 1920,
"height": 1920,
"url": "ipfs://QmYeMdWDZ1iaBFeSPorRyPi7RuSXTdDKTgW3rfnUf3W5ne",
"width": 512,
"height": 512,
"format": "svg"
},
"explorers": [
@@ -28,9 +28,9 @@ export default {
"name": "Siberium Mainnet Explorer - blockscout - 1",
"url": "https://explorer.main.siberium.net",
"icon": {
"url": "ipfs://QmVDeoGo2TZPDWiaNDdPCnH2tz2BCQ7viw8ugdDWnU5LFq",
"width": 1920,
"height": 1920,
"url": "ipfs://QmYeMdWDZ1iaBFeSPorRyPi7RuSXTdDKTgW3rfnUf3W5ne",
"width": 512,
"height": 512,
"format": "svg"
},
"standard": "EIP3091"
@@ -39,9 +39,9 @@ export default {
"name": "Siberium Mainnet Explorer - blockscout - 2",
"url": "https://explorer.main.siberium.net.ru",
"icon": {
"url": "ipfs://QmVDeoGo2TZPDWiaNDdPCnH2tz2BCQ7viw8ugdDWnU5LFq",
"width": 1920,
"height": 1920,
"url": "ipfs://QmYeMdWDZ1iaBFeSPorRyPi7RuSXTdDKTgW3rfnUf3W5ne",
"width": 512,
"height": 512,
"format": "svg"
},
"standard": "EIP3091"
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "Origin Testnet",
"chain": "Origin",
"rpc": [
"https://origin-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://json-rpc.origin.uptick.network"
],
"faucets": [],
"nativeCurrency": {
"name": "Origin",
"symbol": "UOC",
"decimals": 18
},
"infoURL": "https://www.uptick.network",
"shortName": "auoc",
"chainId": 1170,
"networkId": 1170,
"icon": {
"url": "ipfs://QmRGJ6PqYHDTWuUQ6xfnK8S82NzRXiMjTnSGat9qtLuaLP",
"width": 400,
"height": 400,
"format": "png"
},
"explorers": [
{
"name": "Origin Explorer",
"url": "https://evm-explorer.origin.uptick.network",
"icon": {
"url": "ipfs://QmRGJ6PqYHDTWuUQ6xfnK8S82NzRXiMjTnSGat9qtLuaLP",
"width": 400,
"height": 400,
"format": "png"
},
"standard": "none"
}
],
"testnet": true,
"slug": "origin-testnet"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Living Assets Mainnet",
"chain": "LAS",
"icon": {
"url": "ipfs://QmRidubY7BVwC737BQwGEttenP1npAXN7ZNryktE416uUW",
"width": 500,
"height": 500,
"format": "jpg"
},
"rpc": [
"https://living-assets.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://beta.mainnet.livingassets.io/rpc",
"https://gamma.mainnet.livingassets.io/rpc"
],
"faucets": [],
"nativeCurrency": {
"name": "LAS",
"symbol": "LAS",
"decimals": 18
},
"infoURL": "https://dev.livingassets.io/",
"shortName": "LAS",
"chainId": 1440,
"networkId": 1440,
"testnet": false,
"slug": "living-assets"
} as const satisfies Chain;
+29
View File
@@ -0,0 +1,29 @@
import type { Chain } from "../src/types";
export default {
"name": "ChainX-EVM",
"chain": "ChainX",
"rpc": [
"https://chainx-evm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet.chainx.org/rpc",
"https://mainnet2.chainx.org/rpc"
],
"faucets": [],
"nativeCurrency": {
"name": "BTC",
"symbol": "BTC",
"decimals": 18
},
"infoURL": "https://chainx.org",
"shortName": "chainx",
"chainId": 1501,
"networkId": 1501,
"explorers": [
{
"name": "chainx-evm scan",
"url": "https://evm.chainx.org",
"standard": "none"
}
],
"testnet": false,
"slug": "chainx-evm"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "Taro Testnet",
"chain": "gETH",
"shortName": "Taro",
"chainId": 1582,
"testnet": true,
"icon": {
"format": "svg",
"url": "ipfs://bafybeibfpls2ealp4e5fdeoxessfjjkldgjnrcx2erph7524pg7alskk6a/1f9cb.svg",
"width": 512,
"height": 512
},
"rpc": [
"https://taro-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://taro-testnet.calderachain.xyz/http"
],
"nativeCurrency": {
"decimals": 18,
"name": "Ether",
"symbol": "gETH"
},
"explorers": [
{
"url": "https://explorer.tarotestnet.com",
"name": "Taro Testnet Explorer",
"standard": "EIP3091"
}
],
"faucets": [
"https://tarotestnet.com"
],
"infoURL": "https://tarotestnet.com",
"networkId": 1582,
"slug": "taro-testnet"
} as const satisfies Chain;
-34
View File
@@ -1,34 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "Taiko (Alpha-2 Testnet)",
"chain": "ETH",
"icon": {
"url": "ipfs://QmWMUDmNHzCtism9dYK1JooerZJ4da6kGt67HAQmLiEykc",
"width": 1001,
"height": 1001,
"format": "png"
},
"rpc": [
"https://taiko-alpha-2-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.a2.taiko.xyz"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://taiko.xyz",
"shortName": "taiko-a2",
"chainId": 167004,
"networkId": 167004,
"explorers": [
{
"name": "blockscout",
"url": "https://explorer.a2.taiko.xyz",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "taiko-alpha-2-testnet"
} as const satisfies Chain;
+35
View File
@@ -0,0 +1,35 @@
import type { Chain } from "../src/types";
export default {
"name": "Taiko (Alpha-3 Testnet)",
"chain": "ETH",
"status": "active",
"icon": {
"url": "ipfs://QmcHdmVr5VRUJq13jnM6tgah5Ge7hn3Dm14eY6vwivJ5ui",
"width": 288,
"height": 258,
"format": "png"
},
"rpc": [
"https://taiko-alpha-3-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.test.taiko.xyz"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://taiko.xyz",
"shortName": "taiko-a3",
"chainId": 167005,
"networkId": 167005,
"explorers": [
{
"name": "blockscout",
"url": "https://explorer.test.taiko.xyz",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "taiko-alpha-3-testnet"
} as const satisfies Chain;
+4 -4
View File
@@ -4,17 +4,17 @@ export default {
"chain": "TSCS",
"rpc": [
"https://super-smart-chain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet.superexchain.com:8544"
"https://testnetrpc.scschain.com"
],
"faucets": [
"https://testnet.superexchain.com"
"https://testnet.scschain.com"
],
"nativeCurrency": {
"name": "Super Chain Native Token",
"symbol": "TSCS",
"decimals": 18
},
"infoURL": "https://testnet.superexchain.com",
"infoURL": "https://testnet.scschain.com",
"shortName": "tscs",
"chainId": 1969,
"networkId": 1969,
@@ -27,7 +27,7 @@ export default {
"explorers": [
{
"name": "blockscout",
"url": "https://testnetscan.superexchain.com",
"url": "https://testnetscan.scschain.com",
"standard": "EIP3091"
}
],
+3 -3
View File
@@ -4,7 +4,7 @@ export default {
"chain": "SCS",
"rpc": [
"https://super-smart-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://superexchain.com:8545"
"https://rpc.scschain.com"
],
"faucets": [],
"nativeCurrency": {
@@ -12,7 +12,7 @@ export default {
"symbol": "SCS",
"decimals": 18
},
"infoURL": "https://superexchain.com",
"infoURL": "https://scschain.com",
"shortName": "scs",
"chainId": 1970,
"networkId": 1970,
@@ -25,7 +25,7 @@ export default {
"explorers": [
{
"name": "blockscout",
"url": "https://scan.superexchain.com",
"url": "https://scan.scschain.com",
"standard": "EIP3091"
}
],
+4 -4
View File
@@ -12,15 +12,15 @@ export default {
"symbol": "BTT",
"decimals": 18
},
"infoURL": "https://bittorrentchain.io/",
"infoURL": "https:/bt.io",
"shortName": "BTT",
"chainId": 199,
"networkId": 199,
"explorers": [
{
"name": "bttcscan",
"url": "https://scan.bittorrentchain.io",
"standard": "none"
"name": "BitTorrent Chain Explorer",
"url": "https://bttcscan.com",
"standard": "EIP3091"
}
],
"testnet": false,
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "WhiteBIT Network Testnet",
"chain": "WBT",
"rpc": [
"https://whitebit-network-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-testnet.whitebit.network"
],
"faucets": [
"https://explorer.whitebit.network/testnet/faucet"
],
"nativeCurrency": {
"name": "WhiteBIT Coin",
"symbol": "WBT",
"decimals": 18
},
"infoURL": "https://whitebit.com/wbt",
"shortName": "twbt",
"chainId": 2625,
"networkId": 2625,
"icon": {
"url": "ipfs://QmQqAAn2F98TH5ouRyvReKxQdaGKjE7WJQPEPW6mFFVXUT",
"width": 32,
"height": 32,
"format": "svg"
},
"explorers": [
{
"name": "wb-explorer-testnet",
"url": "https://explorer.whitebit.network/testnet",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "whitebit-network-testnet"
} as const satisfies Chain;
+3 -3
View File
@@ -4,7 +4,7 @@ export default {
"chain": "SHIB",
"rpc": [
"https://shibachain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.shibachain.net"
"https://rpc.shibchain.org"
],
"faucets": [],
"nativeCurrency": {
@@ -12,14 +12,14 @@ export default {
"symbol": "SHIB",
"decimals": 18
},
"infoURL": "https://www.shibachain.net",
"infoURL": "https://shibchain.org",
"shortName": "shib",
"chainId": 27,
"networkId": 27,
"explorers": [
{
"name": "Shiba Explorer",
"url": "https://exp.shibachain.net",
"url": "https://exp.shibchain.org",
"standard": "none"
}
],
+3 -3
View File
@@ -3,9 +3,9 @@ export default {
"name": "LaChain",
"chain": "LaChain",
"icon": {
"url": "ipfs://bafkreiecoqvit2mikpbpbtzy2zrn6e7fvqdegm72sdcathdwmgiyuzey7u",
"width": 104,
"height": 114,
"url": "ipfs://QmQxGA6rhuCQDXUueVcNvFRhMEWisyTmnF57TqL7h6k6cZ",
"width": 1280,
"height": 1280,
"format": "png"
},
"rpc": [
-37
View File
@@ -1,37 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "Optimism on Gnosis",
"chain": "OGC",
"rpc": [
"https://optimism-on-gnosis.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://optimism.gnosischain.com",
"wss://optimism.gnosischain.com/wss"
],
"faucets": [
"https://faucet.gimlu.com/gnosis"
],
"nativeCurrency": {
"name": "xDAI",
"symbol": "xDAI",
"decimals": 18
},
"infoURL": "https://www.xdaichain.com/for-developers/optimism-optimistic-rollups-on-gc",
"shortName": "ogc",
"chainId": 300,
"networkId": 300,
"explorers": [
{
"name": "blockscout",
"url": "https://blockscout.com/xdai/optimism",
"icon": {
"url": "ipfs://bafybeifu5tpui7dk5cjoo54kde7pmuthvnl7sdykobuarsxgu7t2izurnq",
"width": 512,
"height": 512,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "optimism-on-gnosis"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Canxium Mainnet",
"chain": "CAU",
"rpc": [
"https://canxium.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.canxium.org"
],
"faucets": [],
"nativeCurrency": {
"name": "Canxium",
"symbol": "CAU",
"decimals": 18
},
"infoURL": "https://canxium.org",
"shortName": "cau",
"chainId": 3003,
"networkId": 3003,
"explorers": [
{
"name": "canxium explorer",
"url": "https://explorer.canxium.org",
"standard": "none"
}
],
"testnet": false,
"slug": "canxium"
} as const satisfies Chain;
+45
View File
@@ -0,0 +1,45 @@
import type { Chain } from "../src/types";
export default {
"name": "PLAYA3ULL GAMES",
"chain": "3ULL",
"rpc": [
"https://playa3ull-games.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://api.mainnet.playa3ull.games"
],
"faucets": [],
"nativeCurrency": {
"name": "3ULL",
"symbol": "3ULL",
"decimals": 18
},
"features": [
{
"name": "EIP1559"
}
],
"infoURL": "https://playa3ull.games",
"shortName": "3ULL",
"chainId": 3011,
"networkId": 3011,
"icon": {
"url": "ipfs://bafkreib62bv2d65d7nidojgpkgatrt7smee2l4ov6i6ozqhpfaqsonxku4",
"width": 512,
"height": 443,
"format": "png"
},
"explorers": [
{
"name": "PLAYA3ULL GAMES Explorer",
"url": "https://3011.routescan.io",
"icon": {
"url": "ipfs://bafkreib62bv2d65d7nidojgpkgatrt7smee2l4ov6i6ozqhpfaqsonxku4",
"width": 512,
"height": 443,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "playa3ull-games"
} as const satisfies Chain;
+48
View File
@@ -0,0 +1,48 @@
import type { Chain } from "../src/types";
export default {
"name": "Neurochain Testnet",
"chain": "NCN",
"rpc": [
"https://neurochain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://nc-rpc-test1.neurochain.io"
],
"faucets": [],
"nativeCurrency": {
"name": "Neurochain",
"symbol": "tNCN",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://www.neurochain.ai",
"shortName": "ncnt",
"chainId": 303,
"networkId": 303,
"icon": {
"url": "ipfs://Qmc9zDWXar67cMUodp28mbN5pnwbVibxGXhwa8YCDvxmTR",
"width": 62,
"height": 59,
"format": "svg"
},
"explorers": [
{
"name": "neuroscan",
"url": "https://testnet.ncnscan.com",
"icon": {
"url": "ipfs://Qmc9zDWXar67cMUodp28mbN5pnwbVibxGXhwa8YCDvxmTR",
"width": 62,
"height": 59,
"format": "svg"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "neurochain-testnet"
} as const satisfies Chain;
+49
View File
@@ -0,0 +1,49 @@
import type { Chain } from "../src/types";
export default {
"name": "Neurochain Mainnet",
"chain": "NCN",
"rpc": [
"https://neurochain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://nc-rpc-prd1.neurochain.io",
"https://nc-rpc-prd2.neurochain.io"
],
"faucets": [],
"nativeCurrency": {
"name": "Neurochain",
"symbol": "NCN",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://www.neurochain.ai",
"shortName": "ncn",
"chainId": 313,
"networkId": 313,
"icon": {
"url": "ipfs://Qmc9zDWXar67cMUodp28mbN5pnwbVibxGXhwa8YCDvxmTR",
"width": 62,
"height": 59,
"format": "svg"
},
"explorers": [
{
"name": "neuroscan",
"url": "https://ncnscan.com",
"icon": {
"url": "ipfs://Qmc9zDWXar67cMUodp28mbN5pnwbVibxGXhwa8YCDvxmTR",
"width": 62,
"height": 59,
"format": "svg"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "neurochain"
} as const satisfies Chain;
-59
View File
@@ -1,59 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "Filecoin - Hyperspace testnet",
"chain": "FIL",
"icon": {
"url": "ipfs://QmS9r9XQkMHVomWcSBNDkKkz9n87h9bH9ssabeiKZtANoU",
"width": 1000,
"height": 1000,
"format": "png"
},
"rpc": [
"https://filecoin-hyperspace-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://api.hyperspace.node.glif.io/rpc/v1",
"https://rpc.ankr.com/filecoin_testnet",
"https://filecoin-hyperspace.chainstacklabs.com/rpc/v1"
],
"faucets": [
"https://hyperspace.yoga/#faucet"
],
"nativeCurrency": {
"name": "testnet filecoin",
"symbol": "tFIL",
"decimals": 18
},
"infoURL": "https://filecoin.io",
"shortName": "filecoin-hyperspace",
"chainId": 3141,
"networkId": 3141,
"slip44": 1,
"explorers": [
{
"name": "Filfox - Hyperspace",
"url": "https://hyperspace.filfox.info/en",
"standard": "none"
},
{
"name": "Glif Explorer - Hyperspace",
"url": "https://explorer.glif.io/?network=hyperspace",
"standard": "none"
},
{
"name": "Beryx",
"url": "https://beryx.zondax.ch",
"standard": "none"
},
{
"name": "Dev.storage",
"url": "https://dev.storage",
"standard": "none"
},
{
"name": "Filscan - Hyperspace",
"url": "https://hyperspace.filscan.io",
"standard": "none"
}
],
"testnet": true,
"slug": "filecoin-hyperspace-testnet"
} as const satisfies Chain;
-31
View File
@@ -1,31 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "Filecoin - Wallaby testnet",
"chain": "FIL",
"icon": {
"url": "ipfs://QmS9r9XQkMHVomWcSBNDkKkz9n87h9bH9ssabeiKZtANoU",
"width": 1000,
"height": 1000,
"format": "png"
},
"rpc": [
"https://filecoin-wallaby-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://wallaby.node.glif.io/rpc/v1"
],
"faucets": [
"https://wallaby.yoga/#faucet"
],
"nativeCurrency": {
"name": "testnet filecoin",
"symbol": "tFIL",
"decimals": 18
},
"infoURL": "https://filecoin.io",
"shortName": "filecoin-wallaby",
"chainId": 31415,
"networkId": 31415,
"slip44": 1,
"explorers": [],
"testnet": true,
"slug": "filecoin-wallaby-testnet"
} as const satisfies Chain;
+14 -1
View File
@@ -10,7 +10,10 @@ export default {
},
"rpc": [
"https://filecoin-calibration-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://api.calibration.node.glif.io/rpc/v1"
"https://api.calibration.node.glif.io/rpc/v1",
"https://rpc.ankr.com/filecoin_testnet",
"https://filecoin-calibration.chainstacklabs.com/rpc/v1",
"https://filecoin-calibration.chainup.net/rpc/v1"
],
"faucets": [
"https://faucet.calibration.fildev.network/"
@@ -40,6 +43,16 @@ export default {
"name": "Filfox - Calibration",
"url": "https://calibration.filfox.info",
"standard": "none"
},
{
"name": "Glif Explorer - Calibration",
"url": "https://explorer.glif.io/?network=calibration",
"standard": "none"
},
{
"name": "Beryx",
"url": "https://beryx.zondax.ch",
"standard": "none"
}
],
"testnet": true,
+48
View File
@@ -0,0 +1,48 @@
import type { Chain } from "../src/types";
export default {
"name": "Aves Testnet",
"chain": "AVST",
"rpc": [
"https://aves-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://test.rpc.avescoin.io"
],
"faucets": [],
"nativeCurrency": {
"name": "AvesT",
"symbol": "AVST",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://ethereum.org",
"shortName": "avst",
"chainId": 333331,
"networkId": 333331,
"icon": {
"url": "ipfs://QmeKQVv2QneHaaggw2NfpZ7DGMdjVhPywTdse5RzCs4oGn",
"width": 232,
"height": 232,
"format": "png"
},
"explorers": [
{
"name": "avescan",
"url": "https://testnet.avescoin.io",
"icon": {
"url": "ipfs://QmeKQVv2QneHaaggw2NfpZ7DGMdjVhPywTdse5RzCs4oGn",
"width": 232,
"height": 232,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "aves-testnet"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "SecureChain Testnet",
"chain": "SCAI",
"icon": {
"url": "ipfs://Qme2Z8VFYjhHGfLQPBnfseNpEdRfmTDy7VXqrdH4AHETJf",
"width": 150,
"height": 150,
"format": "png"
},
"rpc": [
"https://securechain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.securechain.ai"
],
"faucets": [
"https://faucet.securechain.ai"
],
"nativeCurrency": {
"name": "SCAI",
"symbol": "SCAI",
"decimals": 18
},
"infoURL": "https://securechain.ai",
"shortName": "SCAIt",
"chainId": 3434,
"networkId": 3434,
"explorers": [
{
"name": "SecureChain",
"url": "https://testnet.securechain.ai",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "securechain-testnet"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "Bitfinity Network Testnet",
"chain": "BFT",
"rpc": [
"https://bitfinity-network-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet.bitfinity.network"
],
"faucets": [
"https://bitfinity.network/faucet"
],
"nativeCurrency": {
"name": "BITFINITY",
"symbol": "BFT",
"decimals": 18
},
"infoURL": "https://bitfinity.network",
"shortName": "Bitfinity",
"chainId": 355113,
"networkId": 355113,
"explorers": [
{
"name": "Bitfinity Block Explorer",
"url": "https://explorer.bitfinity.network",
"icon": {
"url": "ipfs://bafkreiczbhnoc5wpjikskmehexmg3xmqr4fchrny64db4wmk3lrygqik5e",
"width": 796,
"height": 129,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "bitfinity-network-testnet"
} as const satisfies Chain;
+7
View File
@@ -18,6 +18,13 @@ export default {
"shortName": "TelosEVMTestnet",
"chainId": 41,
"networkId": 41,
"explorers": [
{
"name": "teloscan",
"url": "https://testnet.teloscan.io",
"standard": "EIP3091"
}
],
"testnet": true,
"icon": {
"url": "ipfs://QmdkgQDtDedsNNth3ZVgWfwRZPCePLA13MtLvV4CEYSuTR/TLOS.png",
+3 -3
View File
@@ -3,9 +3,9 @@ export default {
"name": "LaTestnet",
"chain": "LaTestnet",
"icon": {
"url": "ipfs://bafkreiecoqvit2mikpbpbtzy2zrn6e7fvqdegm72sdcathdwmgiyuzey7u",
"width": 104,
"height": 114,
"url": "ipfs://QmQxGA6rhuCQDXUueVcNvFRhMEWisyTmnF57TqL7h6k6cZ",
"width": 1280,
"height": 1280,
"format": "png"
},
"rpc": [
+31 -22
View File
@@ -1,37 +1,46 @@
import type { Chain } from "../src/types";
export default {
"name": "Kovan",
"title": "Ethereum Testnet Kovan",
"chain": "ETH",
"name": "LUKSO Mainnet",
"chain": "LUKSO",
"icon": {
"url": "ipfs://Qmeg9sFF5tAGi6MCx7YjtVHW6a23zqvHRK1xwzSdp9iE7z",
"width": 512,
"height": 512,
"format": "png"
},
"rpc": [
"https://kovan.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://kovan.poa.network",
"http://kovan.poa.network:8545",
"https://kovan.infura.io/v3/${INFURA_API_KEY}",
"wss://kovan.infura.io/ws/v3/${INFURA_API_KEY}",
"ws://kovan.poa.network:8546"
],
"faucets": [
"http://fauceth.komputing.org?chain=42&address=${ADDRESS}",
"https://faucet.kovan.network",
"https://gitter.im/kovan-testnet/faucet"
"https://lukso.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.mainnet.lukso.network",
"wss://ws-rpc.mainnet.lukso.network"
],
"faucets": [],
"nativeCurrency": {
"name": "Kovan Ether",
"symbol": "ETH",
"name": "LUKSO",
"symbol": "LYX",
"decimals": 18
},
"explorers": [
{
"name": "etherscan",
"url": "https://kovan.etherscan.io",
"name": "Blockscout",
"url": "https://explorer.execution.mainnet.lukso.network",
"standard": "EIP3091"
}
],
"infoURL": "https://kovan-testnet.github.io/website",
"shortName": "kov",
"infoURL": "https://lukso.network",
"shortName": "lukso",
"chainId": 42,
"networkId": 42,
"testnet": true,
"slug": "kovan"
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"redFlags": [
"reusedChainId"
],
"testnet": false,
"slug": "lukso"
} as const satisfies Chain;
+45
View File
@@ -0,0 +1,45 @@
import type { Chain } from "../src/types";
export default {
"name": "LUKSO Testnet",
"chain": "LUKSO Testnet",
"icon": {
"url": "ipfs://Qmeg9sFF5tAGi6MCx7YjtVHW6a23zqvHRK1xwzSdp9iE7z",
"width": 512,
"height": 512,
"format": "png"
},
"rpc": [
"https://lukso-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.testnet.lukso.network",
"wss://ws-rpc.testnet.lukso.network"
],
"faucets": [
"https://faucet.testnet.lukso.network"
],
"nativeCurrency": {
"name": "TestLYX",
"symbol": "LYXt",
"decimals": 18
},
"explorers": [
{
"name": "Blockscout",
"url": "https://explorer.execution.testnet.lukso.network",
"standard": "none"
}
],
"infoURL": "https://lukso.network",
"shortName": "lukso-testnet",
"chainId": 4201,
"networkId": 4201,
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"testnet": true,
"slug": "lukso-testnet"
} as const satisfies Chain;
+21
View File
@@ -0,0 +1,21 @@
import type { Chain } from "../src/types";
export default {
"name": "Patex Sepolia Testnet",
"chain": "ETH",
"rpc": [
"https://patex-sepolia-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://test-rpc.patex.io/"
],
"faucets": [],
"nativeCurrency": {
"name": "Sepolia Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://patex.io/",
"shortName": "psep",
"chainId": 471100,
"networkId": 471100,
"testnet": true,
"slug": "patex-sepolia-testnet"
} as const satisfies Chain;
+12 -5
View File
@@ -1,11 +1,18 @@
import type { Chain } from "../src/types";
export default {
"name": "Floripa",
"title": "Wireshape Testnet Floripa",
"name": "Wireshape Floripa Testnet",
"title": "Wireshape Floripa Testnet",
"chain": "Wireshape",
"icon": {
"url": "ipfs://QmTAyT3YrW2654CBRqRkec2cCznv6EBsbsRc2y6WQPbvXx",
"width": 1280,
"height": 1280,
"format": "png"
},
"rpc": [
"https://floripa.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-floripa.wireshape.org"
"https://wireshape-floripa-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-floripa.wireshape.org",
"https://floripa.rpc.thirdweb.com"
],
"faucets": [],
"nativeCurrency": {
@@ -25,5 +32,5 @@ export default {
}
],
"testnet": true,
"slug": "floripa"
"slug": "wireshape-floripa-testnet"
} as const satisfies Chain;
+2 -2
View File
@@ -8,8 +8,8 @@ export default {
],
"faucets": [],
"nativeCurrency": {
"name": "BitDAO",
"symbol": "BIT",
"name": "Mantle",
"symbol": "MNT",
"decimals": 18
},
"infoURL": "https://mantle.xyz",
+2 -2
View File
@@ -10,8 +10,8 @@ export default {
"https://faucet.testnet.mantle.xyz"
],
"nativeCurrency": {
"name": "Testnet BitDAO",
"symbol": "BIT",
"name": "Testnet Mantle",
"symbol": "MNT",
"decimals": 18
},
"infoURL": "https://mantle.xyz",
+25
View File
@@ -0,0 +1,25 @@
import type { Chain } from "../src/types";
export default {
"name": "Scroll Sepolia Testnet",
"chain": "ETH",
"status": "incubating",
"rpc": [],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://scroll.io",
"shortName": "scr-sepolia",
"chainId": 534351,
"networkId": 534351,
"explorers": [],
"parent": {
"type": "L2",
"chain": "eip155-11155111",
"bridges": []
},
"testnet": true,
"slug": "scroll-sepolia-testnet"
} as const satisfies Chain;
+1
View File
@@ -2,6 +2,7 @@ import type { Chain } from "../src/types";
export default {
"name": "Scroll",
"chain": "ETH",
"status": "incubating",
"rpc": [],
"faucets": [],
"nativeCurrency": {
+2 -2
View File
@@ -2,7 +2,7 @@ import type { Chain } from "../src/types";
export default {
"name": "Scroll Alpha Testnet",
"chain": "ETH",
"status": "incubating",
"status": "active",
"rpc": [
"https://scroll-alpha-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://alpha-rpc.scroll.io/l2"
@@ -25,7 +25,7 @@ export default {
},
{
"name": "Scroll Alpha Testnet Block Explorer",
"url": "https://scrollexplorer.unifra.io",
"url": "https://scrollscan.co",
"standard": "EIP3091"
}
],
-30
View File
@@ -1,30 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "Scroll Pre-Alpha Testnet",
"chain": "ETH",
"rpc": [
"https://scroll-pre-alpha-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://prealpha-rpc.scroll.io/l2"
],
"faucets": [
"https://prealpha.scroll.io/faucet"
],
"nativeCurrency": {
"name": "Ether",
"symbol": "TSETH",
"decimals": 18
},
"infoURL": "https://scroll.io",
"shortName": "scr-prealpha",
"chainId": 534354,
"networkId": 534354,
"explorers": [
{
"name": "Scroll L2 Block Explorer",
"url": "https://l2scan.scroll.io",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "scroll-pre-alpha-testnet"
} as const satisfies Chain;
+2
View File
@@ -5,6 +5,8 @@ export default {
"rpc": [
"https://syscoin.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.syscoin.org",
"https://rpc.ankr.com/syscoin/${ANKR_API_KEY}",
"https://syscoin.public-rpc.com",
"wss://rpc.syscoin.org/wss"
],
"faucets": [
+31
View File
@@ -0,0 +1,31 @@
import type { Chain } from "../src/types";
export default {
"name": "Rollux Mainnet",
"chain": "SYS",
"rpc": [
"https://rollux.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.rollux.com",
"wss://rpc.rollux.com/wss"
],
"faucets": [
"https://rollux.id/faucetapp"
],
"nativeCurrency": {
"name": "Syscoin",
"symbol": "SYS",
"decimals": 18
},
"infoURL": "https://rollux.com",
"shortName": "sys-rollux",
"chainId": 570,
"networkId": 570,
"explorers": [
{
"name": "Rollux Explorer",
"url": "https://explorer.rollux.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "rollux"
} as const satisfies Chain;
+11 -8
View File
@@ -1,29 +1,32 @@
import type { Chain } from "../src/types";
export default {
"name": "Syscoin Rollux Testnet",
"name": "Rollux Testnet",
"chain": "SYS",
"rpc": [
"https://syscoin-rollux-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rollux-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-tanenbaum.rollux.com",
"https://rpc.ankr.com/rollux_testnet/${ANKR_API_KEY}",
"wss://rpc-tanenbaum.rollux.com/wss"
],
"faucets": [],
"faucets": [
"https://rollux.id/faucetapp"
],
"nativeCurrency": {
"name": "Rollux Testnet Syscoin",
"symbol": "tSYS",
"name": "Testnet Syscoin",
"symbol": "TSYS",
"decimals": 18
},
"infoURL": "https://syscoin.org",
"infoURL": "https://rollux.com",
"shortName": "tsys-rollux",
"chainId": 57000,
"networkId": 57000,
"explorers": [
{
"name": "Syscoin Rollux Testnet Explorer",
"name": "Rollux Testnet Explorer",
"url": "https://rollux.tanenbaum.io",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "syscoin-rollux-testnet"
"slug": "rollux-testnet"
} as const satisfies Chain;
+2 -2
View File
@@ -7,8 +7,8 @@ export default {
"https://linea-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.goerli.linea.build",
"wss://rpc.goerli.linea.build",
"https://consensys-zkevm-goerli-prealpha.infura.io/v3/${INFURA_API_KEY}",
"wss://consensys-zkevm-goerli-prealpha.infura.io/v3/${INFURA_API_KEY}"
"https://linea-goerli.infura.io/v3/${INFURA_API_KEY}",
"wss://linea-goerli.infura.io/v3/${INFURA_API_KEY}"
],
"faucets": [
"https://faucetlink.to/goerli"
+1
View File
@@ -4,6 +4,7 @@ export default {
"chain": "ASTR",
"rpc": [
"https://astar.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://evm.astar.network",
"https://rpc.astar.network:8545"
],
"faucets": [],
+39
View File
@@ -0,0 +1,39 @@
import type { Chain } from "../src/types";
export default {
"name": "UPTN Testnet",
"chain": "UPTN",
"icon": {
"url": "ipfs://Qma6cGPCDcJPFxy5KQaMBrLtuVQiqeLncXVybcBoQuhai5",
"width": 128,
"height": 128,
"format": "png"
},
"rpc": [
"https://uptn-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://node-api.alp.uptn.io/v1/ext/rpc"
],
"features": [
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "UPTN",
"symbol": "UPTN",
"decimals": 18
},
"infoURL": "https://uptn.io",
"shortName": "UPTN-TEST",
"chainId": 6118,
"networkId": 6118,
"explorers": [
{
"name": "UPTN Testnet Explorer",
"url": "https://testnet.explorer.uptn.io",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "uptn-testnet"
} as const satisfies Chain;
+39
View File
@@ -0,0 +1,39 @@
import type { Chain } from "../src/types";
export default {
"name": "UPTN",
"chain": "UPTN",
"icon": {
"url": "ipfs://Qma6cGPCDcJPFxy5KQaMBrLtuVQiqeLncXVybcBoQuhai5",
"width": 128,
"height": 128,
"format": "png"
},
"rpc": [
"https://uptn.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://node-api.uptn.io/v1/ext/rpc"
],
"features": [
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "UPTN",
"symbol": "UPTN",
"decimals": 18
},
"infoURL": "https://uptn.io",
"shortName": "UPTN",
"chainId": 6119,
"networkId": 6119,
"explorers": [
{
"name": "UPTN Explorer",
"url": "https://explorer.uptn.io",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "uptn"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "AxelChain Dev-Net",
"chain": "AXEL",
"rpc": [
"https://axelchain-dev-net.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://aium-rpc-dev.viacube.com"
],
"faucets": [],
"nativeCurrency": {
"name": "Axelium",
"symbol": "AIUM",
"decimals": 18
},
"infoURL": "https://www.axel.org",
"shortName": "aium-dev",
"chainId": 61800,
"networkId": 61800,
"icon": {
"url": "ipfs://QmNx8FRacfNeawhkjk5p57EKzDHkLGMaBBmK2VRL5CB2P2",
"width": 40,
"height": 40,
"format": "svg"
},
"explorers": [
{
"name": "AxelChain Dev-Net Explorer",
"url": "https://devexplorer2.viacube.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "axelchain-dev-net"
} as const satisfies Chain;
+44
View File
@@ -0,0 +1,44 @@
import type { Chain } from "../src/types";
export default {
"name": "Fox Testnet Network",
"chain": "FOX",
"rpc": [
"https://fox-testnet-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-testnet-v1.foxchain.app/",
"https://rpc2-testnet-v1.foxchain.app/",
"https://rpc3-testnet-v1.foxchain.app"
],
"faucets": [
"https://faucet.foxchain.app"
],
"nativeCurrency": {
"name": "FOX Native Token",
"symbol": "tFOX",
"decimals": 18
},
"infoURL": "https://foxchain.app",
"shortName": "fox",
"chainId": 6565,
"networkId": 6565,
"icon": {
"url": "ipfs://Qmbp1rwhtRr6JQRyYqyfLqkbmzXr1T17zbmChsi2ouvg3M",
"width": 100,
"height": 100,
"format": "png"
},
"explorers": [
{
"name": "FOX Testnet Explorer",
"icon": {
"url": "ipfs://Qmbp1rwhtRr6JQRyYqyfLqkbmzXr1T17zbmChsi2ouvg3M",
"width": 100,
"height": 100,
"format": "png"
},
"url": "https://testnet.foxscan.app",
"standard": "none"
}
],
"testnet": true,
"slug": "fox-testnet-network"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Shibarium Beta",
"chain": "Shibarium",
"icon": {
"url": "ipfs://QmYNVkoZgRjDBQzJz6kog9mA2yPzQFW2oSKvhnkwuBhLQE",
"width": 2000,
"height": 2000,
"format": "png"
},
"rpc": [
"https://shibarium-beta.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://puppynet.shibrpc.com"
],
"faucets": [],
"nativeCurrency": {
"name": "BONE",
"symbol": "BONE",
"decimals": 18
},
"infoURL": "https://beta.shibariumtech.com",
"shortName": "shibarium",
"chainId": 719,
"networkId": 719,
"explorers": [
{
"name": "shibscan",
"url": "https://puppyscan.shib.io",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "shibarium-beta"
} as const satisfies Chain;
+43
View File
@@ -0,0 +1,43 @@
import type { Chain } from "../src/types";
export default {
"name": "Dragonfly Mainnet (Hexapod)",
"chain": "Dragonfly",
"icon": {
"url": "ipfs://QmPXhdPGufjcPzZ9Y6nY6QyW8MgA6793L88iPMRh1Q3gjJ",
"width": 512,
"height": 366,
"format": "png"
},
"rpc": [
"https://dragonfly-hexapod.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://dragonfly-rpc.switch.ch",
"https://dragonfly-rpc.kore-technologies.ch",
"https://dragonfly-rpc.phoenix-systems.io",
"https://dragonfly-rpc.block-spirit.ch"
],
"faucets": [],
"nativeCurrency": {
"name": "Dragonfly",
"symbol": "DFLY",
"decimals": 18
},
"infoURL": "https://hexapod.network",
"shortName": "dfly",
"chainId": 78281,
"networkId": 78281,
"explorers": [
{
"name": "Dragonfly Blockscout",
"url": "https://blockscout.dragonfly.hexapod.network",
"icon": {
"url": "ipfs://bafybeifu5tpui7dk5cjoo54kde7pmuthvnl7sdykobuarsxgu7t2izurnq",
"width": 512,
"height": 512,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "dragonfly-hexapod"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "MAAL Sharia Chain",
"chain": "MAAL",
"icon": {
"url": "ipfs://bafkreiexfqfe2x4impvwhra3xxa5eb25gv25zi3kkaoatdnld7wbxdzf2a",
"width": 512,
"height": 512,
"format": "png"
},
"rpc": [
"https://maal-sharia-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://node1-mainnet.maalscan.io/",
"https://node2-mainnet.maalscan.io/",
"https://node3-mainnet.maalscan.io/"
],
"faucets": [],
"nativeCurrency": {
"name": "MAAL",
"symbol": "MAAL",
"decimals": 18
},
"infoURL": "https://www.maalblockchain.com/",
"shortName": "maal",
"chainId": 786,
"networkId": 786,
"explorers": [
{
"name": "maalscan",
"url": "https://maalscan.io",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "maal-sharia-chain"
} as const satisfies Chain;
+21
View File
@@ -0,0 +1,21 @@
import type { Chain } from "../src/types";
export default {
"name": "Patex",
"chain": "ETH",
"rpc": [
"https://patex.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.patex.io/"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://patex.io/",
"shortName": "peth",
"chainId": 789,
"networkId": 789,
"testnet": false,
"slug": "patex"
} as const satisfies Chain;
+37
View File
@@ -0,0 +1,37 @@
import type { Chain } from "../src/types";
export default {
"name": "Nautilus Chain",
"title": "Nautilus Trition Testnet",
"chain": "ETH",
"icon": {
"url": "ipfs://QmNutSgM7n6aJPPDiofe9Dm1epy1RcYTMvugukLUK2vmPM",
"width": 500,
"height": 500,
"format": "png"
},
"rpc": [
"https://nautilus-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://triton.api.nautchain.xyz"
],
"faucets": [
"https://faucet.eclipse.builders"
],
"nativeCurrency": {
"name": "Nautilus Zebec Testnet Tokens",
"symbol": "tZBC",
"decimals": 18
},
"infoURL": "https://docs.nautchain.xyz",
"shortName": "NAUT",
"chainId": 91002,
"networkId": 91002,
"explorers": [
{
"name": "Nautscan",
"url": "https://triton.nautscan.com",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "nautilus-chain"
} as const satisfies Chain;
+47
View File
@@ -0,0 +1,47 @@
import type { Chain } from "../src/types";
export default {
"name": "Mantis Testnet (Hexapod)",
"chain": "Mantis",
"icon": {
"url": "ipfs://Qma8dDhxSSVUyzV8Pu5bo252WaZEEikYFndRh7LVktvQEy",
"width": 512,
"height": 330,
"format": "png"
},
"rpc": [
"https://mantis-testnet-hexapod.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mantis-rpc.switch.ch",
"https://mantis-rpc.kore-technologies.ch",
"https://mantis-rpc.phoenix-systems.io"
],
"faucets": [
"https://mantis.switch.ch/faucet",
"https://mantis.kore-technologies.ch/faucet",
"https://mantis.phoenix-systems.io/faucet",
"https://mantis.block-spirit.ch/faucet"
],
"nativeCurrency": {
"name": "Mantis",
"symbol": "MANTIS",
"decimals": 18
},
"infoURL": "https://hexapod.network",
"shortName": "mantis",
"chainId": 96970,
"networkId": 96970,
"explorers": [
{
"name": "Mantis Blockscout",
"url": "https://blockscout.mantis.hexapod.network",
"icon": {
"url": "ipfs://bafybeifu5tpui7dk5cjoo54kde7pmuthvnl7sdykobuarsxgu7t2izurnq",
"width": 512,
"height": 512,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "mantis-testnet-hexapod"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "PepeNetwork Mainnet",
"chain": "PepeNetwork",
"rpc": [
"https://pepenetwork.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-mainnet.pepenetwork.io"
],
"faucets": [],
"nativeCurrency": {
"name": "Pepe",
"symbol": "WPEPE",
"decimals": 18
},
"infoURL": "https://pepenetwork.io",
"shortName": "pn",
"chainId": 9779,
"networkId": 9779,
"icon": {
"url": "ipfs://QmPX3uipdwd195z1MJff7uj8hpZdSuVvM5z47eiz2o7Gz5",
"width": 960,
"height": 944,
"format": "png"
},
"explorers": [
{
"name": "Pepe Explorer",
"url": "https://explorer.pepenetwork.io",
"icon": {
"url": "ipfs://QmPX3uipdwd195z1MJff7uj8hpZdSuVvM5z47eiz2o7Gz5",
"width": 960,
"height": 944,
"format": "png"
},
"standard": "none"
}
],
"testnet": false,
"slug": "pepenetwork"
} as const satisfies Chain;
+14 -9
View File
@@ -1,21 +1,26 @@
import type { Chain } from "../src/types";
export default {
"name": "Wanchain Testnet",
"chain": "WAN",
"name": "Zora Testnet",
"chain": "ETH",
"rpc": [
"https://wanchain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gwan-ssl.wandevs.org:46891/"
"https://zora-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet.rpc.zora.co/"
],
"faucets": [],
"nativeCurrency": {
"name": "Wancoin",
"symbol": "WAN",
"name": "Ether",
"symbol": "GETH",
"decimals": 18
},
"infoURL": "https://testnet.wanscan.org",
"shortName": "twan",
"icon": {
"url": "ipfs://QmZ6qaRwTPFEZUspwMUjaxC6KhmzcELdRQcQzS3P72Dzts/Vector.svg",
"height": 512,
"width": 512,
"format": "svg"
},
"shortName": "Zora",
"chainId": 999,
"networkId": 999,
"testnet": true,
"slug": "wanchain-testnet"
"slug": "zora-testnet"
} as const satisfies Chain;
+33
View File
@@ -0,0 +1,33 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Omit<Chain, "slug">} */
export default {
name: "Taro Testnet",
chain: "gETH",
shortName: "Taro",
chainId: 1582,
testnet: true,
icon: {
format: "svg",
url: "ipfs://bafybeibfpls2ealp4e5fdeoxessfjjkldgjnrcx2erph7524pg7alskk6a/1f9cb.svg",
width: 512,
height: 512,
},
rpc: ["https://taro-testnet.calderachain.xyz/http"],
nativeCurrency: {
decimals: 18,
name: "Ether",
symbol: "gETH",
},
explorers: [
{
url: "https://explorer.tarotestnet.com",
name: "Taro Testnet Explorer",
standard: "EIP3091",
},
],
faucets: ["https://tarotestnet.com"],
infoURL: "https://tarotestnet.com",
networkId: 1582,
};
+25
View File
@@ -0,0 +1,25 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Omit<Chain, "slug">} */
export default {
name: "Zora Testnet",
chain: "ETH",
rpc: ["https://testnet.rpc.zora.co/"],
faucets: [],
nativeCurrency: {
name: "Ether",
symbol: "GETH",
decimals: 18,
},
icon: {
url: "ipfs://QmZ6qaRwTPFEZUspwMUjaxC6KhmzcELdRQcQzS3P72Dzts/Vector.svg",
height: 512,
width: 512,
format: "svg",
},
shortName: "Zora",
chainId: 999,
networkId: 999,
testnet: true,
};
+7
View File
@@ -0,0 +1,7 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Partial<Chain>} */
export default {
rpc: ["https://evm.astar.network"],
};
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/chains",
"version": "0.1.17",
"version": "0.1.20",
"main": "dist/thirdweb-dev-chains.cjs.js",
"module": "dist/thirdweb-dev-chains.esm.js",
"browser": {
+61 -17
View File
@@ -54,6 +54,8 @@ for (const file of additionalChainsFiles) {
const additionalChain = await import(
path.join("file://", additionalChainsDir, file)
);
chains = chains.filter((c) => c.chainId !== additionalChain.default.chainId);
chains.push(additionalChain.default);
}
@@ -81,6 +83,7 @@ chains = chains
const imports = [];
const exports = [];
const exportNames = [];
const exportNameToChain = {};
const takenSlugs = {};
@@ -216,9 +219,13 @@ export default ${JSON.stringify(chain, null, 2)} as const satisfies Chain;`,
imports.push(`import c${chain.chainId} from "../chains/${chain.chainId}";`);
exports.push(`export const ${exportName} = c${chain.chainId};`);
exports.push(
`export { default as ${exportName} } from "../chains/${chain.chainId}"`,
);
exportNames.push(exportName);
const key = `c${chain.chainId}`;
exportNames.push(key);
exportNameToChain[key] = chain;
}
fs.writeFileSync(
@@ -229,22 +236,58 @@ import type { Chain } from "./types";
${exports.join("\n")}
export * from "./types";
export * from "./utils";
export const defaultChains = [Ethereum, Goerli, Polygon, Mumbai, Arbitrum, ArbitrumGoerli, Optimism, OptimismGoerli, Binance, BinanceTestnet, Fantom, FantomTestnet, Avalanche, AvalancheFuji, Localhost];
export const allChains = [${exportNames.join(", ")}];
export const defaultChains = [c1, c5, c84531, c137, c80001, c42161, c421613, c10, c420, c56, c97, c250, c4002, c43114, c43113, c1337];
export const allChains: Chain[] = [${exportNames.join(", ")}];
const chainsById = {
${exportNames.map((n) => `[${n}.chainId]: ${n}`).join(",\n")}
} as const;
type ChainsById = {
${exportNames
.map((n) => `${exportNameToChain[n].chainId}: typeof ${n}`)
.join(",\n")}
};
const chainIdsBySlug = {
${exportNames.map((n) => `[${n}.slug]: ${n}.chainId`).join(",\n")}
} as const;
type ChainIdsBySlug = {
${exportNames
.map(
(n) => `"${exportNameToChain[n].slug}": ${exportNameToChain[n].chainId}`,
)
.join(",\n")}
};
let _chainsById: Record<number, Chain>;
let _chainIdsBySlug: Record<string, number>;
function getChainsById() {
if (_chainsById) {
return _chainsById;
}
_chainsById = {};
allChains.forEach((chain) => {
_chainsById[chain.chainId] = chain;
});
return _chainsById;
}
export function getChainIdsBySlug() {
if (_chainIdsBySlug) {
return _chainIdsBySlug;
}
_chainIdsBySlug = {};
allChains.forEach((chain) => {
_chainIdsBySlug[chain.slug] = chain.chainId;
});
return _chainIdsBySlug;
}
export type ChainSlug = keyof ChainIdsBySlug;
export type ChainId = keyof ChainsById;
function isValidChainId(chainId: number): chainId is ChainId {
const chainsById = getChainsById();
return chainId in chainsById;
}
function isValidChainSlug(slug: string): slug is ChainSlug {
const chainIdsBySlug = getChainIdsBySlug();
return slug in chainIdsBySlug;
}
@@ -252,7 +295,8 @@ export function getChainByChainId<TChainId extends ChainId>(
chainId: TChainId | (number & {}),
) {
if (isValidChainId(chainId)) {
return chainsById[chainId] as (typeof chainsById)[TChainId];
const chainsById = getChainsById();
return chainsById[chainId] as ChainsById[TChainId];
}
throw new Error(\`Chain with chainId "\${chainId}" not found\`);
}
@@ -261,13 +305,13 @@ export function getChainBySlug<TSlug extends ChainSlug>(
slug: TSlug | (string & {}),
) {
if (isValidChainSlug(slug)) {
return chainsById[chainIdsBySlug[slug]] as (typeof chainsById)[
(typeof chainIdsBySlug)[TSlug]
];
const chainIdsBySlug = getChainIdsBySlug();
const chainsById = getChainsById();
return chainsById[
chainIdsBySlug[slug]
] as ChainsById[ChainIdsBySlug[TSlug]];
}
throw new Error(\`Chain with slug "\${slug}" not found\`);
}
export type ChainSlug = keyof typeof chainIdsBySlug;
export type ChainId = keyof typeof chainsById;`,
`,
);
+2792 -2686
View File
File diff suppressed because one or more lines are too long
+43
View File
@@ -1,5 +1,48 @@
# thirdweb
## 0.10.22
### Patch Changes
- Updated dependencies [[`3bf7f375`](https://github.com/thirdweb-dev/js/commit/3bf7f375933cbd7dd8c682a66e8c67bbcb268bf7), [`16232de9`](https://github.com/thirdweb-dev/js/commit/16232de9eab9966e24e335929b2a3919346af265), [`8687d6ac`](https://github.com/thirdweb-dev/js/commit/8687d6ac3a363eae63eeb1959a953cbcd282d353), [`645b0303`](https://github.com/thirdweb-dev/js/commit/645b0303cc1a9cbb0a0e9cbd67d11c3b865e4584), [`522453fd`](https://github.com/thirdweb-dev/js/commit/522453fd568b8c350141a96f9f1c6d5a3ef74493), [`6803c3e9`](https://github.com/thirdweb-dev/js/commit/6803c3e97ca74eed19cd90095afde25b02150d51), [`56f85e57`](https://github.com/thirdweb-dev/js/commit/56f85e57df84bfa93e3230639c95d12466f8aec7), [`6a91b6a0`](https://github.com/thirdweb-dev/js/commit/6a91b6a0253bab5914d4ebdad951dd1c5d141fbc), [`a5f16b6d`](https://github.com/thirdweb-dev/js/commit/a5f16b6dc50b37920a6e5210b60aa6a1682ceb63), [`b6728603`](https://github.com/thirdweb-dev/js/commit/b6728603972ccd6c95108b25e8562807f0f95e19), [`ed47fd53`](https://github.com/thirdweb-dev/js/commit/ed47fd5310d11323080d984bca18a96fdef3a977)]:
- @thirdweb-dev/sdk@3.10.21
- @thirdweb-dev/chains@0.1.20
## 0.10.21
### Patch Changes
- Updated dependencies [[`ce36322b`](https://github.com/thirdweb-dev/js/commit/ce36322b383af73905894b73f9409a146359ffb0), [`c60658ed`](https://github.com/thirdweb-dev/js/commit/c60658ed8c94867cca831b0d5535006da5b40aa6), [`aa9e952c`](https://github.com/thirdweb-dev/js/commit/aa9e952cb519a47ed112d2905b1f3787863035b6), [`564eaccf`](https://github.com/thirdweb-dev/js/commit/564eaccf480a81f36db43c782392595a5021e5ac), [`6aee0413`](https://github.com/thirdweb-dev/js/commit/6aee0413439b9ca408879bbb3c38c538c89d01af), [`e93aa70e`](https://github.com/thirdweb-dev/js/commit/e93aa70ef0093a2526404e11b7ddae8fb98c213b), [`51bbd3d1`](https://github.com/thirdweb-dev/js/commit/51bbd3d1bccbb92a1405ea50f6c178c091a90f20)]:
- @thirdweb-dev/sdk@3.10.20
## 0.10.20
### Patch Changes
- Updated dependencies [[`23d90b3e`](https://github.com/thirdweb-dev/js/commit/23d90b3e779a5bfdb7058b8c51349d9c278fcbce), [`cc56037e`](https://github.com/thirdweb-dev/js/commit/cc56037e64560b9e0fc16eb0ac7cc2e47e2c9fdf), [`67450789`](https://github.com/thirdweb-dev/js/commit/67450789473b6008b86453ee4f4c7b99461223a6)]:
- @thirdweb-dev/sdk@3.10.19
- @thirdweb-dev/storage@1.1.4
## 0.10.19
### Patch Changes
- [#1003](https://github.com/thirdweb-dev/js/pull/1003) [`d24a6146`](https://github.com/thirdweb-dev/js/commit/d24a6146d8a1c623c39687baf6f579e721ef99c6) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Add support for ZKSync
- [#1066](https://github.com/thirdweb-dev/js/pull/1066) [`32cc5442`](https://github.com/thirdweb-dev/js/commit/32cc54423e51b22cb665bf6106c484dfb45206b3) Thanks [@adam-maj](https://github.com/adam-maj)! - Deduplicate addresses when running thirdweb generate
- Updated dependencies [[`2f1df0b5`](https://github.com/thirdweb-dev/js/commit/2f1df0b5354a8ee55089b2c1e61c058788d890f1), [`189daf02`](https://github.com/thirdweb-dev/js/commit/189daf0280a90ed730200088948526a594da3408), [`afae0873`](https://github.com/thirdweb-dev/js/commit/afae0873b0e3f9741f5a9c44c5d255f38c6a9111), [`c6e74ef0`](https://github.com/thirdweb-dev/js/commit/c6e74ef0b00210f52e6778c548061376d3ba7001), [`ee4c7de2`](https://github.com/thirdweb-dev/js/commit/ee4c7de25cb63f99f33b90da8e26293bbfbe6f3e), [`f7b352a5`](https://github.com/thirdweb-dev/js/commit/f7b352a585a23726eaa3be116f65db56b005f4d8), [`4a1d7581`](https://github.com/thirdweb-dev/js/commit/4a1d75811058d6974616bdc12a6040cea5444e40), [`bdabbef7`](https://github.com/thirdweb-dev/js/commit/bdabbef71a2421a2dceb384f93bb6a59a3ddf007), [`59206233`](https://github.com/thirdweb-dev/js/commit/59206233e15ccfe3dc32047060055219d35938f2), [`98efd090`](https://github.com/thirdweb-dev/js/commit/98efd090f63cfd9dfed7b89b20b6e43db88cf75c), [`8eecf4c2`](https://github.com/thirdweb-dev/js/commit/8eecf4c2d5b0d6447ad5b9cdbf0269818bbb3498), [`bd86661f`](https://github.com/thirdweb-dev/js/commit/bd86661f54ca2f1eb09cbae35c704dc79be1b63a), [`d5651006`](https://github.com/thirdweb-dev/js/commit/d565100614d7d4e256554f998b8ce978a566051c), [`da576108`](https://github.com/thirdweb-dev/js/commit/da5761080288c3b325f54fb56c80f96405a1cb5d), [`c85810ee`](https://github.com/thirdweb-dev/js/commit/c85810eee318b10eee4ada61828adaa51f94ea6c), [`6fd10f94`](https://github.com/thirdweb-dev/js/commit/6fd10f94b469dc5659e2ff4ce92a5aff86f3c89d), [`5f1e6abb`](https://github.com/thirdweb-dev/js/commit/5f1e6abb391f5c58dbdb207f569b3dd0b5d4729c), [`a034b032`](https://github.com/thirdweb-dev/js/commit/a034b0321fd0113ed51d95d538b5c3020615c227)]:
- @thirdweb-dev/sdk@3.10.18
- @thirdweb-dev/chains@0.1.19
## 0.10.18
### Patch Changes
- Updated dependencies [[`30e5593d`](https://github.com/thirdweb-dev/js/commit/30e5593dd1ce9abd809ad216a1cfce77b897093c)]:
- @thirdweb-dev/chains@0.1.18
- @thirdweb-dev/sdk@3.10.17
## 0.10.17
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "thirdweb",
"main": "dist/cli/index.js",
"version": "0.10.17",
"version": "0.10.22",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/cli",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+1
View File
@@ -294,6 +294,7 @@ const main = async () => {
"--dynamic",
"Deploy a dynamic smart contract made up of extensions to blockchains",
)
.option("--zksync", "Deploy on ZKSync")
.action(async (options) => {
const url = await deploy(options);
if (url) {
+6 -4
View File
@@ -52,7 +52,9 @@ export async function processProject(
logger.debug("Processing project at path " + projectPath);
const projectType = await detect(projectPath, options);
const projectType = options.zksync
? "hardhat"
: await detect(projectPath, options);
if (projectType === "none") {
if (command === "deploy") {
@@ -220,13 +222,13 @@ export async function processProject(
const soliditySDKPackage = "@thirdweb-dev/contracts";
let usesSoliditySDK = false;
if(options.dynamic) {
if (options.dynamic) {
if (selectedRouter.name === "thirdweb-router") {
const deployArgs: TWRouterParams = {
extensionRegistry: EXTENSION_REGISTRY_ADDRESS,
extensionNames: selectedContracts.map((c) => c.name),
};
const outputDeployArgs = JSON.stringify(deployArgs, undefined, 2);
writeFileSync("./deployArgs.json", outputDeployArgs, "utf-8");
info(
@@ -236,7 +238,7 @@ export async function processProject(
const deployArgs: RouterParams = await formatToExtensions(
selectedContracts,
);
const outputDeployArgs = JSON.stringify(deployArgs, undefined, 2);
writeFileSync("./deployArgs.json", outputDeployArgs, "utf-8");
info(
+2 -1
View File
@@ -9,7 +9,7 @@ import { TruffleBuilder } from "./truffle";
export default async function build(
path: string,
projectType: ProjectType,
options: { clean: boolean },
options: any,
): Promise<{
contracts: ContractPayload[];
}> {
@@ -40,5 +40,6 @@ export default async function build(
name: "",
projectPath: path,
clean: options.clean,
zksync: options.zksync,
});
}
+15 -12
View File
@@ -12,6 +12,7 @@ export abstract class BaseBuilder implements IBuilder {
abi: any[],
bytecode: string,
name: string,
ignoreIpfsHash?: boolean,
): boolean {
if (
!bytecode ||
@@ -31,19 +32,21 @@ export abstract class BaseBuilder implements IBuilder {
logger.debug(`Skipping '${name}'.`);
return false;
}
// ensure that we can extract IPFS hashes from the bytecode
let ipfsHash;
try {
ipfsHash = extractIPFSHashFromBytecode(bytecode);
} catch (e) {
logger.debug(`Error extracting IPFS hash from '${name}': ${e}`);
}
if (!ignoreIpfsHash) {
// ensure that we can extract IPFS hashes from the bytecode
let ipfsHash;
try {
ipfsHash = extractIPFSHashFromBytecode(bytecode);
} catch (e) {
logger.debug(`Error extracting IPFS hash from '${name}': ${e}`);
}
if (!ipfsHash) {
logger.debug(
`Cannot resolve build metadata IPFS hash for contract '${name}'. Skipping.`,
);
return false;
if (!ipfsHash) {
logger.debug(
`Cannot resolve build metadata IPFS hash for contract '${name}'. Skipping.`,
);
return false;
}
}
return true;
}
+33 -11
View File
@@ -1,7 +1,6 @@
import { findFiles } from "../../common/file-helper";
import { execute } from "../helpers/exec";
import { logger } from "../helpers/logger";
import { CompileOptions } from "../interfaces/Builder";
import { ContractPayload } from "../interfaces/ContractPayload";
import { BaseBuilder } from "./builder-base";
import { existsSync, readFileSync } from "fs";
@@ -9,13 +8,9 @@ import { HardhatConfig } from "hardhat/types";
import { join, resolve } from "path";
export class HardhatBuilder extends BaseBuilder {
public async compile(options: CompileOptions): Promise<{
public async compile(options: any): Promise<{
contracts: ContractPayload[];
}> {
if (options.clean) {
await execute("npx hardhat clean", options.projectPath);
}
await execute("npx hardhat compile", options.projectPath);
//we get our very own extractor script from the dir that we're in during execution
// this is `./dist/cli` (for all purposes of the CLI)
// then we look up the hardhat config extractor file path from there
@@ -39,6 +34,24 @@ export class HardhatBuilder extends BaseBuilder {
logger.debug("successfully extracted hardhat config", actualHardhatConfig);
await execute("npx hardhat clean", options.projectPath);
let ignoreIpfsHash = false;
if (options.zksync) {
const zkNetwork = Object.entries(actualHardhatConfig.networks).find(
(network) => {
return (network[1] as any).zksync;
},
);
ignoreIpfsHash = (zkNetwork?.[1] as any).zksync; // IPFS hash can't be recovered from ZKSync bytecode
await execute(
`npx hardhat compile --network ${zkNetwork?.[0]}`,
options.projectPath,
);
} else {
await execute(`npx hardhat compile`, options.projectPath);
}
const solcConfigs = actualHardhatConfig.solidity.compilers;
if (solcConfigs) {
for (const solcConfig of solcConfigs) {
@@ -80,7 +93,6 @@ export class HardhatBuilder extends BaseBuilder {
logger.debug("Skipping", contractPath, "(not a source target)");
continue;
}
for (const [contractName, contractInfo] of Object.entries(
contractInfos as any,
)) {
@@ -98,10 +110,13 @@ export class HardhatBuilder extends BaseBuilder {
}
const bytecode = info.evm.bytecode.object;
const deployedBytecode = info.evm.deployedBytecode.object;
const deployedBytecode =
info.evm.deployedBytecode?.object || bytecode;
const { metadata, abi } = info;
const meta = JSON.parse(metadata);
const meta = metadata.solc_metadata
? JSON.parse(metadata.solc_metadata)
: JSON.parse(metadata);
const sources = Object.keys(meta.sources)
.map((path) => {
const directPath = join(options.projectPath, path);
@@ -129,9 +144,16 @@ export class HardhatBuilder extends BaseBuilder {
);
const fileName = fileNames.length > 0 ? fileNames[0] : "";
if (this.shouldProcessContract(abi, deployedBytecode, contractName)) {
if (
this.shouldProcessContract(
abi,
deployedBytecode,
contractName,
ignoreIpfsHash,
)
) {
contracts.push({
metadata,
metadata: JSON.stringify(meta),
bytecode,
name: contractName,
fileName,
+1
View File
@@ -8,6 +8,7 @@ import { basename, join } from "path";
import solc from "solc";
export class SolcBuilder extends BaseBuilder {
/* eslint-disable @typescript-eslint/no-unused-vars */
public async compile(options: CompileOptions): Promise<{
contracts: ContractPayload[];
}> {
@@ -4,6 +4,7 @@ export type CompileOptions = {
clean: boolean;
projectPath: string;
name: string;
zksync?: boolean;
};
export interface IBuilder {
+1 -1
View File
@@ -33,7 +33,7 @@ export async function generate(options: GenerateOptions) {
const configAddresses = thirdwebConfig.contracts.map((contract) =>
contract.address.toLowerCase(),
);
const newAddresses = addresses.filter(
const newAddresses = Array.from(new Set(addresses)).filter(
(address) => !configAddresses.includes(address.toLowerCase()),
);
+6
View File
@@ -1,5 +1,11 @@
# @thirdweb-dev/contracts-js
## 1.3.5
### Patch Changes
- [#1095](https://github.com/thirdweb-dev/js/pull/1095) [`564eaccf`](https://github.com/thirdweb-dev/js/commit/564eaccf480a81f36db43c782392595a5021e5ac) Thanks [@nkrishang](https://github.com/nkrishang)! - Add SmartWalletFactory extension detection and logic
## 1.3.4
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/contracts-js",
"version": "1.3.4",
"version": "1.3.5",
"main": "dist/thirdweb-dev-contracts-js.cjs.js",
"module": "dist/thirdweb-dev-contracts-js.esm.js",
"browser": {
@@ -10,7 +10,7 @@
"license": "Apache-2.0",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/contracts-js",
"dependencies": {
"@thirdweb-dev/contracts": "3.4.7-0"
"@thirdweb-dev/contracts": "3.5.5"
},
"devDependencies": {
"@babel/preset-env": "^7.18.10",
+90
View File
@@ -1,5 +1,95 @@
# @thirdweb-dev/react-core
## 3.13.1
### Patch Changes
- [#1145](https://github.com/thirdweb-dev/js/pull/1145) [`6a194262`](https://github.com/thirdweb-dev/js/commit/6a19426200297b8da158c7d860d31efcc8c15822) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Add hook to check if a smart wallet has been deployed for the given admin
- [#1123](https://github.com/thirdweb-dev/js/pull/1123) [`54cfd6d8`](https://github.com/thirdweb-dev/js/commit/54cfd6d8916c42d87b6aa438e607ce525766b686) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Update useCreateSmartWallet
- [#1136](https://github.com/thirdweb-dev/js/pull/1136) [`9a015a23`](https://github.com/thirdweb-dev/js/commit/9a015a23cde09c8ba6c36593a84303ffe409a79a) Thanks [@MananTank](https://github.com/MananTank)! - Logout user on wallet account switch
- [#1119](https://github.com/thirdweb-dev/js/pull/1119) [`0cba69ca`](https://github.com/thirdweb-dev/js/commit/0cba69ca40a8cf6f106344247d0082212cd169da) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Export smart wallet factory hooks
- [#1146](https://github.com/thirdweb-dev/js/pull/1146) [`e32faeb5`](https://github.com/thirdweb-dev/js/commit/e32faeb57a5c2193c40cb6129fab92b84069b12d) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Fix return type for useIsSmartWalletDeployed
- [#1144](https://github.com/thirdweb-dev/js/pull/1144) [`9ce3eb6a`](https://github.com/thirdweb-dev/js/commit/9ce3eb6aad957aff38fb4a25383ed17ff58e988f) Thanks [@MananTank](https://github.com/MananTank)! - Remove WalletConfig.config object from wallets
- Updated dependencies [[`2a443365`](https://github.com/thirdweb-dev/js/commit/2a443365bdc3d47d0f41fc895f70256dcde423f5), [`3bf7f375`](https://github.com/thirdweb-dev/js/commit/3bf7f375933cbd7dd8c682a66e8c67bbcb268bf7), [`16232de9`](https://github.com/thirdweb-dev/js/commit/16232de9eab9966e24e335929b2a3919346af265), [`8687d6ac`](https://github.com/thirdweb-dev/js/commit/8687d6ac3a363eae63eeb1959a953cbcd282d353), [`645b0303`](https://github.com/thirdweb-dev/js/commit/645b0303cc1a9cbb0a0e9cbd67d11c3b865e4584), [`522453fd`](https://github.com/thirdweb-dev/js/commit/522453fd568b8c350141a96f9f1c6d5a3ef74493), [`6803c3e9`](https://github.com/thirdweb-dev/js/commit/6803c3e97ca74eed19cd90095afde25b02150d51), [`56f85e57`](https://github.com/thirdweb-dev/js/commit/56f85e57df84bfa93e3230639c95d12466f8aec7), [`197a6838`](https://github.com/thirdweb-dev/js/commit/197a6838f69ae8b9ad46524e7c469fc757d0a2cb), [`6a91b6a0`](https://github.com/thirdweb-dev/js/commit/6a91b6a0253bab5914d4ebdad951dd1c5d141fbc), [`a5f16b6d`](https://github.com/thirdweb-dev/js/commit/a5f16b6dc50b37920a6e5210b60aa6a1682ceb63), [`b6728603`](https://github.com/thirdweb-dev/js/commit/b6728603972ccd6c95108b25e8562807f0f95e19), [`ed47fd53`](https://github.com/thirdweb-dev/js/commit/ed47fd5310d11323080d984bca18a96fdef3a977)]:
- @thirdweb-dev/wallets@0.2.26
- @thirdweb-dev/sdk@3.10.21
- @thirdweb-dev/chains@0.1.20
## 3.13.0
### Minor Changes
- [#1114](https://github.com/thirdweb-dev/js/pull/1114) [`2283e71a`](https://github.com/thirdweb-dev/js/commit/2283e71acaaf3d15eb2d6121682f1d2a81eec4f3) Thanks [@adam-maj](https://github.com/adam-maj)! - Switch to server-side payload generation
### Patch Changes
- [#1111](https://github.com/thirdweb-dev/js/pull/1111) [`21627c03`](https://github.com/thirdweb-dev/js/commit/21627c03d1bb1658fee19b12d580faa6c7f048d9) Thanks [@adam-maj](https://github.com/adam-maj)! - Update expiration dates for auth
- Updated dependencies [[`ce36322b`](https://github.com/thirdweb-dev/js/commit/ce36322b383af73905894b73f9409a146359ffb0), [`c60658ed`](https://github.com/thirdweb-dev/js/commit/c60658ed8c94867cca831b0d5535006da5b40aa6), [`aa9e952c`](https://github.com/thirdweb-dev/js/commit/aa9e952cb519a47ed112d2905b1f3787863035b6), [`564eaccf`](https://github.com/thirdweb-dev/js/commit/564eaccf480a81f36db43c782392595a5021e5ac), [`6aee0413`](https://github.com/thirdweb-dev/js/commit/6aee0413439b9ca408879bbb3c38c538c89d01af), [`e93aa70e`](https://github.com/thirdweb-dev/js/commit/e93aa70ef0093a2526404e11b7ddae8fb98c213b), [`51bbd3d1`](https://github.com/thirdweb-dev/js/commit/51bbd3d1bccbb92a1405ea50f6c178c091a90f20), [`9b20fc9a`](https://github.com/thirdweb-dev/js/commit/9b20fc9ad2d303edc31f44fbd2ea3b4dcf35d11e)]:
- @thirdweb-dev/sdk@3.10.20
- @thirdweb-dev/wallets@0.2.25
## 3.12.4
### Patch Changes
- Updated dependencies [[`23d90b3e`](https://github.com/thirdweb-dev/js/commit/23d90b3e779a5bfdb7058b8c51349d9c278fcbce), [`cc56037e`](https://github.com/thirdweb-dev/js/commit/cc56037e64560b9e0fc16eb0ac7cc2e47e2c9fdf), [`67450789`](https://github.com/thirdweb-dev/js/commit/67450789473b6008b86453ee4f4c7b99461223a6)]:
- @thirdweb-dev/sdk@3.10.19
- @thirdweb-dev/storage@1.1.4
- @thirdweb-dev/wallets@0.2.24
## 3.12.3
### Patch Changes
- [#1068](https://github.com/thirdweb-dev/js/pull/1068) [`fd7111d5`](https://github.com/thirdweb-dev/js/commit/fd7111d5449b8315d326c308a021eed335446e19) Thanks [@MananTank](https://github.com/MananTank)! - add `theme` in `WalletConfig.selectUI` to allow creating selection UI that follows the theme of the wallet Modal
- [#1065](https://github.com/thirdweb-dev/js/pull/1065) [`bd86661f`](https://github.com/thirdweb-dev/js/commit/bd86661f54ca2f1eb09cbae35c704dc79be1b63a) Thanks [@iketw](https://github.com/iketw)! - [ReactNative] Add support for signing in with email/phone using magic sdk
Devs can now add a new supportedWallet:
```javascript
import { Goerli } from '@thirdweb-dev/chains';
import { ThirdwebProvider, magicWallet } from '@thirdweb-dev/react-native';
<ThirdwebProvider
activeChain={Goerli}
supportedWallets={[
magicWallet({
apiKey: 'magic_api_key',
}),
]}>
```
- [#1067](https://github.com/thirdweb-dev/js/pull/1067) [`e21bdd03`](https://github.com/thirdweb-dev/js/commit/e21bdd0328d9c52d58295aa4012fc11cde83b60a) Thanks [@MananTank](https://github.com/MananTank)! - Return wallet instance from `useConnect` hook instead of returning nothing
```diff
const connect = useConnect();
- await connect(walletConfig)
+ const walletInstance = await connect(walletConfig)
```
- Updated dependencies [[`2f1df0b5`](https://github.com/thirdweb-dev/js/commit/2f1df0b5354a8ee55089b2c1e61c058788d890f1), [`189daf02`](https://github.com/thirdweb-dev/js/commit/189daf0280a90ed730200088948526a594da3408), [`afae0873`](https://github.com/thirdweb-dev/js/commit/afae0873b0e3f9741f5a9c44c5d255f38c6a9111), [`bba9767a`](https://github.com/thirdweb-dev/js/commit/bba9767adfe20e41055450b86e4448fcb2119855), [`c6e74ef0`](https://github.com/thirdweb-dev/js/commit/c6e74ef0b00210f52e6778c548061376d3ba7001), [`ee4c7de2`](https://github.com/thirdweb-dev/js/commit/ee4c7de25cb63f99f33b90da8e26293bbfbe6f3e), [`bd86661f`](https://github.com/thirdweb-dev/js/commit/bd86661f54ca2f1eb09cbae35c704dc79be1b63a), [`68fa1896`](https://github.com/thirdweb-dev/js/commit/68fa1896f75d3514e00cc380924fd8bc623064f0), [`f7b352a5`](https://github.com/thirdweb-dev/js/commit/f7b352a585a23726eaa3be116f65db56b005f4d8), [`4a1d7581`](https://github.com/thirdweb-dev/js/commit/4a1d75811058d6974616bdc12a6040cea5444e40), [`bdabbef7`](https://github.com/thirdweb-dev/js/commit/bdabbef71a2421a2dceb384f93bb6a59a3ddf007), [`59206233`](https://github.com/thirdweb-dev/js/commit/59206233e15ccfe3dc32047060055219d35938f2), [`292a321a`](https://github.com/thirdweb-dev/js/commit/292a321a95ed2d847097eed205353dd69eeb8d54), [`98efd090`](https://github.com/thirdweb-dev/js/commit/98efd090f63cfd9dfed7b89b20b6e43db88cf75c), [`8eecf4c2`](https://github.com/thirdweb-dev/js/commit/8eecf4c2d5b0d6447ad5b9cdbf0269818bbb3498), [`bd86661f`](https://github.com/thirdweb-dev/js/commit/bd86661f54ca2f1eb09cbae35c704dc79be1b63a), [`f3b2ae3f`](https://github.com/thirdweb-dev/js/commit/f3b2ae3f6d9c66356c521d3b9c2a6c096dbb4b57), [`d5651006`](https://github.com/thirdweb-dev/js/commit/d565100614d7d4e256554f998b8ce978a566051c), [`4f99ccb4`](https://github.com/thirdweb-dev/js/commit/4f99ccb49c584946de709fbc01017611d2828b76), [`da576108`](https://github.com/thirdweb-dev/js/commit/da5761080288c3b325f54fb56c80f96405a1cb5d), [`c85810ee`](https://github.com/thirdweb-dev/js/commit/c85810eee318b10eee4ada61828adaa51f94ea6c), [`6fd10f94`](https://github.com/thirdweb-dev/js/commit/6fd10f94b469dc5659e2ff4ce92a5aff86f3c89d), [`5f1e6abb`](https://github.com/thirdweb-dev/js/commit/5f1e6abb391f5c58dbdb207f569b3dd0b5d4729c), [`a034b032`](https://github.com/thirdweb-dev/js/commit/a034b0321fd0113ed51d95d538b5c3020615c227), [`35984362`](https://github.com/thirdweb-dev/js/commit/35984362b0a60e5b9c3d3c9731450a8f47deb1c4)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.12.2
### Patch Changes
- Updated dependencies [[`30e5593d`](https://github.com/thirdweb-dev/js/commit/30e5593dd1ce9abd809ad216a1cfce77b897093c), [`30e5593d`](https://github.com/thirdweb-dev/js/commit/30e5593dd1ce9abd809ad216a1cfce77b897093c)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.12.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-core",
"version": "3.12.1",
"version": "3.13.1",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-core",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -1,4 +1,4 @@
import { ThirdwebAuthProvider } from "../../evm/contexts/thirdweb-auth";
import { ThirdwebAuthProvider } from "../../evm/contexts/ThirdwebAuthProvider";
import { useUpdateChainsWithApiKeys } from "../../evm/hooks/chain-hooks";
import { ThirdwebSDKProvider } from "../../evm/providers/thirdweb-sdk-provider";
import { ThirdwebSDKProviderProps } from "../../evm/providers/types";
@@ -7,6 +7,7 @@ import {
AsyncStorage,
ConnectParams,
CreateAsyncStorage,
walletIds,
} from "@thirdweb-dev/wallets";
import { Signer } from "ethers";
import {
@@ -41,26 +42,23 @@ type WalletConnectParams<I extends WalletInstance> = Parameters<
type ConnectionStatus = "unknown" | "connected" | "disconnected" | "connecting";
type ConnectFnArgs<
I extends WalletInstance,
Config extends Record<string, any> | undefined,
> =
type ConnectFnArgs<I extends WalletInstance> =
// if second argument is optional
undefined extends WalletConnectParams<I>
? [
wallet: WalletConfig<I, Config>,
wallet: WalletConfig<I>,
connectParams?: NonNullable<WalletConnectParams<I>>,
]
: // if second argument is required
[
wallet: WalletConfig<I, Config>,
wallet: WalletConfig<I>,
connectParams: NonNullable<WalletConnectParams<I>>,
];
// maps wallet instance to it's wallet config
const walletInstanceToConfig: Map<
WalletInstance,
WalletConfig<any, any>
WalletConfig<any>
> = new Map();
type ThirdwebWalletContextData = {
@@ -68,21 +66,14 @@ type ThirdwebWalletContextData = {
signer?: Signer;
activeWallet?: WalletInstance;
activeWalletConfig?: WalletConfig;
connect: <
I extends WalletInstance,
Config extends Record<string, any> | undefined = undefined,
>(
...args: ConnectFnArgs<I, Config>
) => Promise<void>;
connect: <I extends WalletInstance>(...args: ConnectFnArgs<I>) => Promise<I>;
disconnect: () => Promise<void>;
connectionStatus: ConnectionStatus;
setConnectionStatus: (status: ConnectionStatus) => void;
createWalletInstance: <
I extends WalletInstance,
Config extends Record<string, any> | undefined,
>(
Wallet: WalletConfig<I, Config>,
createWalletInstance: <I extends WalletInstance>(
Wallet: WalletConfig<I>,
) => I;
createdWalletInstance?: WalletInstance;
createWalletStorage: CreateAsyncStorage;
switchChain: (chain: number) => Promise<void>;
chainToConnect?: Chain;
@@ -120,6 +111,10 @@ export function ThirdwebWalletProvider(
WalletInstance | undefined
>();
const [createdWalletInstance, setCreatedWalletInstance] = useState<
WalletInstance | undefined
>();
const [activeWalletConfig, setActiveWalletConfig] = useState<
WalletConfig | undefined
>();
@@ -149,10 +144,16 @@ export function ThirdwebWalletProvider(
}, [props.chains, props.dAppMeta, props.activeChain, theme]);
const createWalletInstance = useCallback(
<I extends WalletInstance, Config extends Record<string, any> | undefined>(
walletConfig: WalletConfig<I, Config>,
): I => {
<I extends WalletInstance>(walletConfig: WalletConfig<I>): I => {
const walletInstance = walletConfig.create(walletParams);
if (walletInstance.walletId === walletIds.magicLink) {
// NOTE: removing this if statement causes the component to re-render
// Patch for magic link wallet in react native
// needed because we need to add a component to the view tree
// from the instance, right before calling connect.
// Check it out in RN's DappContextProvider.
setCreatedWalletInstance(walletInstance);
}
walletInstanceToConfig.set(walletInstance, walletConfig);
return walletInstance;
},
@@ -300,14 +301,7 @@ export function ThirdwebWalletProvider(
const personalWalletInfo = walletInfo.connectParams?.personalWallet;
if (personalWalletInfo) {
type Config = {
personalWallets: WalletConfig[];
};
const personalWallets =
"config" in walletObj
? (walletObj.config as Config).personalWallets
: [];
const personalWallets = walletObj.personalWallets || [];
const personalWalleObj = personalWallets.find(
(W) => W.id === personalWalletInfo.walletId,
@@ -346,11 +340,11 @@ export function ThirdwebWalletProvider(
await wallet.autoConnect(walletInfo.connectParams);
setConnectedWallet(wallet, walletInfo.connectParams, true);
} catch (e) {
console.error(e);
lastConnectedWalletStorage.removeItem(
LAST_CONNECTED_WALLET_STORAGE_KEY,
);
setConnectionStatus("disconnected");
throw e;
}
}
@@ -365,12 +359,7 @@ export function ThirdwebWalletProvider(
]);
const connectWallet = useCallback(
async <
I extends WalletInstance,
Config extends Record<string, any> | undefined = undefined,
>(
...args: ConnectFnArgs<I, Config>
) => {
async <I extends WalletInstance>(...args: ConnectFnArgs<I>): Promise<I> => {
const [WalletObj, connectParams] = args;
const _connectedParams = {
@@ -388,6 +377,8 @@ export function ThirdwebWalletProvider(
setConnectionStatus("disconnected");
throw e;
}
return wallet;
},
[createWalletInstance, setConnectedWallet, chainToConnect],
);
@@ -456,6 +447,7 @@ export function ThirdwebWalletProvider(
connectionStatus,
setConnectionStatus,
createWalletInstance: createWalletInstance,
createdWalletInstance: createdWalletInstance,
createWalletStorage: props.createWalletStorage,
switchChain,
setConnectedWallet: setConnectedWallet,
+23 -21
View File
@@ -23,32 +23,32 @@ export type WalletClass<I extends WalletInstance = WalletInstance> = {
meta: (typeof AbstractClientWallet)["meta"];
};
export type WalletConfig<
I extends WalletInstance = WalletInstance,
Config extends Record<string, any> | undefined = undefined,
> = {
export type WalletConfig<I extends WalletInstance = WalletInstance> = {
id: string;
meta: (typeof AbstractClientWallet)["meta"];
create: (options: WalletOptions) => I;
/**
* UI for connecting wallet
*/
connectUI?: React.FC<ConnectUIProps<I, Config>>;
connectUI?: React.FC<ConnectUIProps<I>>;
/**
* UI for selecting wallet - this UI is rendered in the wallet selection screen
*/
selectUI?: React.FC<SelectUIProps<I, Config>>;
selectUI?: React.FC<SelectUIProps<I>>;
isInstalled?: () => boolean;
} & (Config extends undefined
? {}
: {
config: Config;
});
/**
* An array of `WalletConfig` that users can use as a personal wallet to connect to your wallet
*
* This is only required if your wallet requires a personal wallet to be connected such as a Safe Wallet or Smart Wallet
*
* providing the `personalWallets` ensures that autoconnect and ConnectWallet modal works properly for your wallet.
* * autoconnect will connect the last connected personal wallet first and then connect your wallet
* * ConnectWallet modal will reopen once the personal wallet is connected so that you can render UI for connecting your wallet as the next step
*/
personalWallets?: WalletConfig[];
};
export type ConnectUIProps<
I extends WalletInstance = WalletInstance,
Config extends Record<string, any> | undefined = undefined,
> = {
export type ConnectUIProps<I extends WalletInstance = WalletInstance> = {
/**
* close the connect wallet modal
* @param reset reset Connect Wallet Modal to initial state, so that if it's opened again, it will start from the wallet-selection screen
@@ -117,7 +117,7 @@ export type ConnectUIProps<
* }
* ```
*/
walletConfig: WalletConfig<I, Config>;
walletConfig: WalletConfig<I>;
/**
* selectionData passed from `selectUI`'s `onSelect` function
@@ -136,10 +136,7 @@ export type ConnectUIProps<
supportedWallets: WalletConfig[];
};
export type SelectUIProps<
I extends WalletInstance = WalletInstance,
Config extends Record<string, any> | undefined = undefined,
> = {
export type SelectUIProps<I extends WalletInstance = WalletInstance> = {
/**
* Call this function to "select" your wallet and render the screen for connecting the wallet
* @param selectionData - selectionData to be passed to `connectUI`'s `selectionData` prop
@@ -152,7 +149,7 @@ export type SelectUIProps<
*
* you can use this get metadata of your wallet by doing `walletConfig.meta`
*/
walletConfig: WalletConfig<I, Config>;
walletConfig: WalletConfig<I>;
/**
* List of all supported wallets including your wallet.
@@ -161,4 +158,9 @@ export type SelectUIProps<
* For example: You can render a larger UI if only one wallet (your wallet) is supported.
*/
supportedWallets: WalletConfig[];
/**
* theme of the connect wallet modal
*/
theme: "dark" | "light";
};
@@ -0,0 +1,57 @@
import React, { PropsWithChildren, useEffect, useMemo } from "react";
import { useLogout, useUser } from "../hooks/auth";
import { useWallet } from "../../core/hooks/wallet-hooks";
import { ThirdwebAuthConfig, ThirdwebAuthContext } from "./thirdweb-auth";
export const ThirdwebAuthProvider: React.FC<
PropsWithChildren<{ value?: ThirdwebAuthConfig }>
> = ({ value, children }) => {
// Remove trailing slash from URL if present
const authContext = useMemo(() => {
if (!value) {
return undefined;
}
const context: ThirdwebAuthContext = {
...value,
authUrl: value.authUrl?.replace(/\/$/, ""),
};
return context;
}, [value]);
return (
<ThirdwebAuthContext.Provider value={authContext}>
{children}
<DisconnectOnAccountSwitch />
</ThirdwebAuthContext.Provider>
);
};
function DisconnectOnAccountSwitch() {
const { logout } = useLogout();
const wallet = useWallet();
const { isLoggedIn } = useUser();
useEffect(() => {
const handleChange = (data: { address?: string; chainId?: number }) => {
// if the user changes their account, logout
if (data.address) {
logout();
}
};
const shouldAddListener = wallet && isLoggedIn;
if (shouldAddListener) {
wallet.addListener("change", handleChange);
}
return () => {
if (shouldAddListener) {
wallet.removeListener("change", handleChange);
}
};
}, [wallet, logout, isLoggedIn]);
return null;
}
@@ -1,9 +1,4 @@
import React, {
PropsWithChildren,
createContext,
useContext,
useMemo,
} from "react";
import { createContext, useContext } from "react";
export interface ISecureStorage {
getItem(key: string): Promise<string | null>;
@@ -31,44 +26,21 @@ export interface ThirdwebAuthConfig {
/**
* Secure storage to use for storing the auth token when using JWT tokens.
*
* Do not use a storage option that stores values accessible outside
* your aplication (like localStorage on web environments) since you may
*
* Do not use a storage option that stores values accessible outside
* your aplication (like localStorage on web environments) since you may
* be exposing your auth token to malicious actors.
*
*
* ** By default auth uses cookies so no need to set this unless you want to specifically use JWT tokens **
*/
secureStorage?: ISecureStorage;
}
interface ThirdwebAuthContext extends ThirdwebAuthConfig {}
export interface ThirdwebAuthContext extends ThirdwebAuthConfig {}
const ThirdwebAuthContext = createContext<ThirdwebAuthContext | undefined>(
undefined,
);
export const ThirdwebAuthProvider: React.FC<
PropsWithChildren<{ value?: ThirdwebAuthConfig }>
> = ({ value, children }) => {
// Remove trailing slash from URL if present
const authContext = useMemo(() => {
if (!value) {
return undefined;
}
const context: ThirdwebAuthContext = {
...value,
authUrl: value.authUrl?.replace(/\/$/, ""),
};
return context;
}, [value]);
return (
<ThirdwebAuthContext.Provider value={authContext}>
{children}
</ThirdwebAuthContext.Provider>
);
};
export const ThirdwebAuthContext = createContext<
ThirdwebAuthContext | undefined
>(undefined);
export function useThirdwebAuthContext() {
return useContext(ThirdwebAuthContext);
@@ -64,6 +64,7 @@ export const ThirdwebConnectedWalletProvider: React.FC<
});
} catch (e) {
// failed to get a viable rpc url, nothing we can do
console.error(e);
}
}
@@ -0,0 +1,158 @@
import {
RequiredParam,
requiredParamInvariant,
} from "../../../core/query-utils/required-param";
import { useSDKChainId } from "../../providers/thirdweb-sdk-provider";
import { WalletAddress } from "../../types";
import {
cacheKeys,
invalidateContractAndBalances,
} from "../../utils/cache-keys";
import { useQueryWithNetwork } from "../query-utils/useQueryWithNetwork";
import {
useMutation,
useQueryClient,
UseQueryResult,
} from "@tanstack/react-query";
import type {
AccountEvent, SmartContract,
} from "@thirdweb-dev/sdk";
import type { BytesLike } from "ethers";
import invariant from "tiny-invariant";
/** **********************/
/** READ HOOKS **/
/** **********************/
/**
* Get all wallets
*
* @example
* ```javascript
* const { data: smartWallets, isLoading, error } = useSmartWallets(contract);
* ```
*
* @param contract - an instance of a smart wallet factory contract
* @returns a response object that includes an array of all smart wallets with their associated admin
* @twfeature SmartWalletFactory
* @see {@link https://portal.thirdweb.com/react/react.usesmartwallets?utm_source=sdk | Documentation}
* @beta
*/
export function useSmartWallets(
contract: RequiredParam<SmartContract>
): UseQueryResult<AccountEvent[]> {
const contractAddress = contract?.getAddress();
return useQueryWithNetwork(
cacheKeys.contract.smartWalletFactory.getAll(contractAddress),
() => {
requiredParamInvariant(contract, "No Contract instance provided");
invariant(
contract.smartWalletFactory.getAllWallets,
"Contract instance does not support contract.smartWalletFactory.getAllWallets",
);
return contract.smartWalletFactory.getAllWallets();
},
{ enabled: !!contract },
);
}
/**
* Check if a smart wallet has been deployed for the given admin
*
* @example
* ```javascript
* const { data: isSmartWalletDeployed, isLoading, error } = useIsSmartWalletDeployed(contract);
* ```
*
* @param contract - an instance of a smart wallet factory contract
* @returns a boolean indicating if a smart wallet has been deployed for the given admin
* @twfeature SmartWalletFactory
* @see {@link https://portal.thirdweb.com/react/react.useissmartwalletdeployed?utm_source=sdk | Documentation}
* @beta
*/
export function useIsSmartWalletDeployed(
contract: RequiredParam<SmartContract>,
admin: RequiredParam<WalletAddress>,
extraData?: BytesLike,
): UseQueryResult<boolean> {
const contractAddress = contract?.getAddress();
return useQueryWithNetwork(
cacheKeys.contract.smartWalletFactory.getAll(contractAddress),
() => {
requiredParamInvariant(contract, "No Contract instance provided");
invariant(
contract.smartWalletFactory.isWalletDeployed,
"Contract instance does not support contract.smartWalletFactory.getAllWallets",
);
invariant(admin, "No wallet address provided");
return contract.smartWalletFactory.isWalletDeployed(admin, extraData);
},
{ enabled: !!contract },
);
}
/** **********************/
/** WRITE HOOKS **/
/** **********************/
/**
* Create a smart wallet
*
* @example
* ```jsx
* const Component = () => {
* const { contract } = useContract("{{contract_address}}");
* const {
* mutate: createSmartWallet,
* isLoading,
* error,
* } = useCreateSmartWallet(contract);
*
* if (error) {
* console.error("failed to create smart wallet", error);
* }
*
* return (
* <button
* disabled={isLoading}
* onClick={() => createSmartWallet("0x...")}
* >
* Create Smart Wallet
* </button>
* );
* };
* ```
*
* @param contract - an instance of a smart wallet factory contract
* @returns a mutation object that can be used to create a smart wallet
* @twfeature SmartWalletFactory
* @see {@link https://portal.thirdweb.com/react/react.usecreatesmartwallet?utm_source=sdk | Documentation}
* @beta
*/
export function useCreateSmartWallet(
contract: RequiredParam<SmartContract>,
) {
const activeChainId = useSDKChainId();
const contractAddress = contract?.getAddress();
const queryClient = useQueryClient();
return useMutation(
async (admin: string, extraData?: BytesLike) => {
requiredParamInvariant(contract, "contract is undefined");
return contract.smartWalletFactory.createWallet(
admin,
extraData,
);
},
{
onSettled: () =>
invalidateContractAndBalances(
queryClient,
contractAddress,
activeChainId,
),
},
);
}
@@ -27,7 +27,7 @@ export function useLogin() {
const wallet = useWallet();
const login = useMutation({
mutationFn: async (options?: LoginOptions) => {
mutationFn: async () => {
invariant(
authConfig,
"Please specify an authConfig in the ThirdwebProvider",
@@ -38,14 +38,29 @@ export function useLogin() {
"Please specify an authUrl in the authConfig.",
);
// we need to generate this auth payload
const payload = await doLogin(wallet, {
...authConfig,
...(options || {}),
const address = await wallet.getAddress();
let res = await fetch(`${authConfig.authUrl}/payload`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ address }),
});
const res = await fetch(`${authConfig.authUrl}/login`, {
if (!res.ok) {
throw new Error(`Failed to get payload with status code ${res.status}`);
}
let payloadData: LoginPayloadData;
try {
({ payload: payloadData } = await res.json());
} catch {
throw new Error(`Failed to get payload`);
}
const payload = await doLoginWithPayload(wallet, payloadData);
res = await fetch(`${authConfig.authUrl}/login`, {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -73,11 +88,24 @@ export function useLogin() {
});
return {
login: (options?: LoginOptions) => login.mutateAsync(options),
login: () => login.mutateAsync(),
isLoading: login.isLoading,
};
}
export async function doLoginWithPayload(
wallet: GenericAuthWallet,
payload: LoginPayloadData,
): Promise<LoginPayload> {
const message = generateMessage(payload);
const signature = await wallet.signMessage(message);
return {
payload,
signature,
};
}
export async function doLogin(
wallet: GenericAuthWallet,
options?: LoginOptions,
@@ -109,20 +137,15 @@ export async function doLogin(
nonce: options?.nonce || nonce,
issued_at: new Date().toISOString(),
expiration_time: new Date(
options?.expirationTime || Date.now() + 1000 * 60 * 5,
options?.expirationTime || Date.now() + 1000 * 60 * 10,
).toISOString(),
invalid_before: new Date(
options?.invalidBefore || Date.now(),
options?.invalidBefore || Date.now() - 1000 * 60 * 10,
).toISOString(),
resources: options?.resources,
};
const signature = await wallet.signMessage(generateMessage(payloadData));
return {
payload: payloadData,
signature,
};
return doLoginWithPayload(wallet, payloadData);
}
// generate straight from auth
+9 -4
View File
@@ -47,10 +47,8 @@ export type {
} from "../core/types/wallet";
// auth
export {
ThirdwebAuthProvider,
useThirdwebAuthContext,
} from "./contexts/thirdweb-auth";
export { useThirdwebAuthContext } from "./contexts/thirdweb-auth";
export { ThirdwebAuthProvider } from "./contexts/ThirdwebAuthProvider";
export type {
ThirdwebAuthConfig,
ISecureStorage,
@@ -194,6 +192,13 @@ export {
useBurnToken,
} from "./hooks/async/token";
// smart wallet factory
export {
useIsSmartWalletDeployed,
useSmartWallets,
useCreateSmartWallet,
} from "./hooks/async/smart-wallet-factory";
// thirdweb hooks (work as long as at least `<ThirdwebSdkProvider>` is used)
// auth hooks
@@ -118,6 +118,11 @@ export const cacheKeys = {
overrides,
]),
smartWalletFactory: {
getAll: (contractAddress: RequiredParam<ContractAddress>) =>
createContractCacheKey(contractAddress, ["smartWalletFactory"]),
},
app: {
get: (contractAddress: RequiredParam<ContractAddress>) =>
createContractCacheKey(contractAddress, ["appURI"]),

Some files were not shown because too many files have changed in this diff Show More