Compare commits

...
Author SHA1 Message Date
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
046cd0bb5d Version Packages (#1375)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-20 14:27:05 -07:00
Jonas DanielsandGitHub 7cb55e7051 add empty changeset to bump version (#1374) 2023-07-20 14:22:45 -07:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
4939a3d0ba Version Packages (#1373)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-20 14:13:25 -07:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
550c80fdfa Version Packages (#1372)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-20 13:57:59 -07:00
Mariano FuentesandGitHub 79ebbbcad9 CLI --ci bug fix (#1370) 2023-07-20 19:01:19 +00:00
Jonas DanielsandGitHub d665954fee refactor: Update chain configuration for 742, 7332, 167005, 167006, and 9223 (#1371) 2023-07-20 18:22:43 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
a8258b5c15 Version Packages (#1367)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-18 21:58:35 -07:00
Jonas DanielsandGitHub b8086435a4 refactor: Update icon properties in IoTeX Network chains (#1368) 2023-07-19 04:39:34 +00:00
6cc4b8d28b feat(chain): add iotex chain icon (#1358)
Co-authored-by: Jonas Daniels <[email protected]>
2023-07-18 21:26:06 -07:00
Jonas DanielsandGitHub 02ab92cc5c feat(chains): add additional chains (#1366) 2023-07-19 04:01:24 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
b6b52ea56b Version Packages (#1360)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-18 18:36:39 -07:00
Tair AsimandGitHub da95dce580 [service-utils] handle port in the origin check (#1365) 2023-07-18 21:43:35 +00:00
iketwandGitHub 44dbf283c9 [RN/Storage] Use storage.downloader in RN and pass the clientId (#1362) 2023-07-18 21:04:00 +00:00
+1 d844714609 [All Packages] Pass keys in all packages (#1316)
Co-authored-by: Jonas Daniels <[email protected]>
Co-authored-by: Manan Tank <[email protected]>
Co-authored-by: Joaquim Verges <[email protected]>
Co-authored-by: Mariano Fuentes <[email protected]>
Co-authored-by: Mariano Fuentes <[email protected]>
Co-authored-by: Adam Majmudar <[email protected]>
Co-authored-by: Farhan Khwaja <[email protected]>
Co-authored-by: Nacho Iacovino <[email protected]>
Co-authored-by: 0xFirekeeper <[email protected]>
2023-07-17 23:54:41 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
5cea8436c1 Version Packages (#1341)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-17 15:10:05 +02:00
Joaquim VergesandGitHub dac8fa7d98 [SDK] Fix getOwned missing last owner for OpenEdition contracts (#1357) 2023-07-15 22:13:58 +00:00
Joaquim VergesandGitHub 7a6534d1a9 [React] Fix wrong enabled logic in useOwnedNFTs (#1356) 2023-07-15 05:02:06 +00:00
Tair AsimandGitHub d5aee62bf4 [service-utils] remove unused type (#1355) 2023-07-14 23:33:28 +00:00
Tair AsimandGitHub 0bfdedd4ba [service-utils] fix enforce auth param (#1354) 2023-07-14 23:18:10 +00:00
Joaquim VergesandGitHub c5761b99e9 [Wallets] Switch local wallet to seed based wallets (#1352) 2023-07-14 23:07:59 +00:00
Tair AsimandGitHub 42d9ab68d9 [service-utils] allow to skip auth for backwards compat (#1353) 2023-07-14 22:27:14 +00:00
farhanW3andGitHub fd0650dcac Farhan/service utils fix (#1351) 2023-07-14 20:52:30 +00:00
Tair AsimandGitHub ddb3dabe69 [service-utils] allow target addresses and api url stringy (#1349) 2023-07-14 19:17:28 +00:00
Manan TankandGitHub b96a228273 [wallets, react] Various improvements (#1350) 2023-07-14 18:26:26 +00:00
Tair AsimandGitHub 781e26d896 [service-utils] authorize bundle (#1347) 2023-07-14 16:47:22 +00:00
Tair AsimandGitHub f7392138ee [service-utils] api url fix (#1346) 2023-07-14 09:52:23 +00:00
Jonas DanielsandGitHub 5eb6fc1bf3 [service-utils] - rewrite (#1345) 2023-07-14 08:21:03 +00:00
Danny FridayandGitHub 7dc685bbec Add creatorWalletAddress to ApiKey type (#1343) 2023-07-14 04:11:26 +00:00
Jonas DanielsandGitHub 4915ac50f8 [service-utils] add relayer service definition (#1342) 2023-07-14 04:02:47 +00:00
Jonas DanielsandGitHub d724ad85c5 [service-utils] - fix use endpoint (#1340) 2023-07-14 00:27:25 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
1d32b299a0 Version Packages (#1337)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-13 16:02:54 -07:00
Tair AsimandGitHub cfa7ecbc9a service-utils: remove crypt + unfetch (#1339) 2023-07-13 22:20:42 +00:00
Jonas DanielsandGitHub 8dd7540c45 [storage] - remove HEAD request pre upload (#1338) 2023-07-13 21:57:30 +00:00
07c7d97c28 [service-utils] - initially add package (#1333)
Co-authored-by: Tair Asim <[email protected]>
2023-07-13 20:51:55 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
47e931e0dd Version Packages (#1336)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-13 09:25:13 -07:00
Jonas DanielsandGitHub 0407b2c2f3 [chains] update chains (#1335) 2023-07-13 16:01:04 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
55ffb176f2 Version Packages (#1331)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-12 19:28:04 -07:00
Adam MajmudarandGitHub a9093bcf28 Override binance chain slug (#1330) 2023-07-12 19:17:58 -07:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
db964131b4 Version Packages (#1329)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-12 18:56:29 -07:00
Adam MajmudarandGitHub 4393b22805 Make base default chain (#1328) 2023-07-12 18:42:27 -07:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
b28c3a5a67 Version Packages (#1327)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-12 18:29:43 -07:00
Adam MajmudarandGitHub 4068219145 [Chains] Add support for base (#1326) 2023-07-13 00:25:33 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
03d1a6d73b Version Packages (#1311)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-11 14:34:02 -07:00
YashandGitHub fd74d79180 [Chains] Update chains: Linea Mainnet (#1320) 2023-07-11 17:42:19 +00:00
Jonas DanielsandGitHub 35f20ceb4f [all] add package resolutions (#1315) 2023-07-11 01:27:22 +00:00
iketwandGitHub db68bd04cd Passes API key to all packages (#1314) 2023-07-10 23:06:05 +00:00
Manan TankandGitHub 3df86ad16f [react] ConnectWallet UI fixes (#1310) 2023-07-10 15:42:50 +00:00
308 changed files with 9432 additions and 2317 deletions
+1
View File
@@ -131,3 +131,4 @@ jobs:
run: pnpm e2e
env:
NODE_OPTIONS: "--max_old_space_size=4096"
CLI_E2E_API_KEY: ${{ secrets.CLI_E2E_API_KEY }}
+23 -4
View File
@@ -38,18 +38,37 @@
"@changesets/get-dependents-graph": "^1.3.6",
"@changesets/get-release-plan": "^3.0.17",
"@changesets/parse": "^0.3.16",
"@manypkg/cli": "^0.20.0",
"@manypkg/cli": "^0.21.0",
"@manypkg/get-packages": "^1.1.3",
"@playwright/test": "1.31.2",
"@trivago/prettier-plugin-sort-imports": "^4.1.1",
"@types/node": "^18.16.18",
"eslint": "^8.43.0",
"eslint": "^8.45.0",
"mocha": "^10.2.0",
"prettier": "^2.8.8",
"turbo": "^1.10.6",
"prettier": "^3.0.0",
"turbo": "^1.10.7",
"yalc": "1.0.0-pre.53"
},
"manypkg": {
"defaultBranch": "main"
},
"pnpm": {
"overrides": {
"cross-fetch@>=3.0.0 <3.1.5": ">=3.1.5",
"got@<11.8.5": ">=11.8.5",
"glob-parent@<5.1.2": ">=5.1.2",
"node-fetch@<2.6.7": ">=2.6.7",
"nth-check@<2.0.1": ">=2.0.1",
"socket.io-parser@>=4.0.4 <4.2.3": ">=4.2.3",
"fast-xml-parser@<4.2.4": ">=4.2.4",
"@openzeppelin/contracts@>=4.3.0 <4.9.1": ">=4.9.1",
"@openzeppelin/contracts@>=4.7.0 <4.9.2": ">=4.9.2",
"xml2js@<0.5.0": ">=0.5.0",
"engine.io@>=5.1.0 <6.4.2": ">=6.4.2",
"semver@<7.5.2": ">=7.5.2",
"json5@<1.0.2": ">=1.0.2",
"protobufjs@>=6.10.0 <7.2.4": ">=7.2.4",
"tough-cookie@<4.1.3": ">=4.1.3"
}
}
}
+77
View File
@@ -1,5 +1,82 @@
# @thirdweb-dev/auth
## 3.2.20
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.3
## 3.2.19
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.2
## 3.2.18
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.1
## 3.2.17
### Patch Changes
- Updated dependencies [[`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b)]:
- @thirdweb-dev/wallets@1.1.0
## 3.2.16
### Patch Changes
- Updated dependencies [[`c5761b99`](https://github.com/thirdweb-dev/js/commit/c5761b99e9797772481506e90cbfa5c35a05bd1d), [`b96a2282`](https://github.com/thirdweb-dev/js/commit/b96a2282730582b684cc96802649a96851af5220)]:
- @thirdweb-dev/wallets@1.0.12
## 3.2.15
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.0.11
## 3.2.14
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.0.10
## 3.2.13
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.0.9
## 3.2.12
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.0.8
## 3.2.11
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.0.7
## 3.2.10
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.0.6
## 3.2.9
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "3.2.9",
"version": "3.2.20",
"main": "dist/thirdweb-dev-auth.cjs.js",
"module": "dist/thirdweb-dev-auth.esm.js",
"browser": {
@@ -101,7 +101,7 @@
"@typescript-eslint/parser": "^5.60.1",
"chai": "^4.3.6",
"cookie-parser": "^1.4.6",
"eslint": "^8.43.0",
"eslint": "^8.45.0",
"eslint-config-prettier": "^8.8.0",
"eslint-config-thirdweb": "workspace:*",
"eslint-plugin-import": "^2.26.0",
@@ -113,7 +113,7 @@
"mocha": "^10.2.0",
"next": "^12.3.4",
"next-auth": "^4.22.1",
"prettier": "^2.8.8",
"prettier": "^3.0.0",
"typescript": "^5.1.6"
},
"peerDependencies": {
+64
View File
@@ -1,5 +1,69 @@
# @thirdweb-dev/chains
## 0.1.38
### Patch Changes
- [#1374](https://github.com/thirdweb-dev/js/pull/1374) [`7cb55e70`](https://github.com/thirdweb-dev/js/commit/7cb55e7051617268bba1b80146865c606ff6e66d) Thanks [@jnsdls](https://github.com/jnsdls)! -
## 0.1.37
### Patch Changes
- [#1371](https://github.com/thirdweb-dev/js/pull/1371) [`d665954f`](https://github.com/thirdweb-dev/js/commit/d665954fee0554985055bf06abbed8d7b8d5bc38) Thanks [@jnsdls](https://github.com/jnsdls)! - add more chains
## 0.1.36
### Patch Changes
- [#1366](https://github.com/thirdweb-dev/js/pull/1366) [`02ab92cc`](https://github.com/thirdweb-dev/js/commit/02ab92cc5c97f475e3b5642e5a7bdbe63ca136ee) Thanks [@jnsdls](https://github.com/jnsdls)! - new supported chains
- [#1358](https://github.com/thirdweb-dev/js/pull/1358) [`6cc4b8d2`](https://github.com/thirdweb-dev/js/commit/6cc4b8d28b982c5be3e1cd17d2a9a947001d1608) Thanks [@DLHTX](https://github.com/DLHTX)! - feat(chain): add iotex chain icon
## 0.1.35
### Patch Changes
- [#1316](https://github.com/thirdweb-dev/js/pull/1316) [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b) Thanks [@iketw](https://github.com/iketw)! - Adds support for clientId / secretKey
## 0.1.34
### Patch Changes
- [#1338](https://github.com/thirdweb-dev/js/pull/1338) [`8dd7540c`](https://github.com/thirdweb-dev/js/commit/8dd7540c455aa70534f6d29986537592fd12169b) Thanks [@jnsdls](https://github.com/jnsdls)! - update chains
## 0.1.33
### Patch Changes
- [#1335](https://github.com/thirdweb-dev/js/pull/1335) [`0407b2c2`](https://github.com/thirdweb-dev/js/commit/0407b2c2f39b5f3fa06e613e671623b5644b3a28) Thanks [@jnsdls](https://github.com/jnsdls)! - update chains again
## 0.1.32
### Patch Changes
- [#1330](https://github.com/thirdweb-dev/js/pull/1330) [`a9093bcf`](https://github.com/thirdweb-dev/js/commit/a9093bcf287c01e3335fd780e2ccbfdb3380bf95) Thanks [@adam-maj](https://github.com/adam-maj)! - Override binance slug
## 0.1.31
### Patch Changes
- [#1328](https://github.com/thirdweb-dev/js/pull/1328) [`4393b228`](https://github.com/thirdweb-dev/js/commit/4393b2280505fd0b2284555d64eae6567e8401a5) Thanks [@adam-maj](https://github.com/adam-maj)! - Make base default chain
## 0.1.30
### Patch Changes
- [#1326](https://github.com/thirdweb-dev/js/pull/1326) [`40682191`](https://github.com/thirdweb-dev/js/commit/40682191450de08ad40b9d2957afced248657af2) Thanks [@adam-maj](https://github.com/adam-maj)! - Add base chain support
## 0.1.29
### Patch Changes
- [#1320](https://github.com/thirdweb-dev/js/pull/1320) [`fd74d791`](https://github.com/thirdweb-dev/js/commit/fd74d7918072cda03b52f852ebb3f8dccb84074d) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Linea mainnet support
- [#1315](https://github.com/thirdweb-dev/js/pull/1315) [`35f20ceb`](https://github.com/thirdweb-dev/js/commit/35f20ceb4f943e95d9566105096f06412978da7a) Thanks [@jnsdls](https://github.com/jnsdls)! - add more chains
## 0.1.28
### Patch Changes
+4 -1
View File
@@ -11,7 +11,10 @@ export default {
"rpc": [
"https://gon-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://node1.testnet.gaiaopen.network",
"http://database1.gaiaopen.network"
"https://node1.mainnet.gon.network",
"https://node2.mainnet.gon.network",
"https://node3.mainnet.gon.network",
"https://node4.mainnet.gon.network"
],
"faucets": [],
"nativeCurrency": {
@@ -20,12 +20,12 @@ export default {
"nativeCurrency": {
"name": "SMR",
"symbol": "SMR",
"decimals": 18
"decimals": 6
},
"infoURL": "https://shimmer.network",
"shortName": "shimmerevm-testnet",
"chainId": 1071,
"networkId": 1071,
"chainId": 1072,
"networkId": 1072,
"explorers": [
{
"name": "explorer",
+7 -7
View File
@@ -1,11 +1,11 @@
import type { Chain } from "../src/types";
export default {
"name": "ChainX-EVM",
"name": "BEVM",
"chain": "ChainX",
"rpc": [
"https://chainx-evm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet.chainx.org/rpc",
"https://mainnet2.chainx.org/rpc"
"https://bevm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-1.bevm.io/",
"https://rpc-2.bevm.io/"
],
"faucets": [],
"nativeCurrency": {
@@ -19,11 +19,11 @@ export default {
"networkId": 1501,
"explorers": [
{
"name": "chainx-evm scan",
"url": "https://evm.chainx.org",
"name": "bevm scan",
"url": "https://scan.bevm.io",
"standard": "none"
}
],
"testnet": false,
"slug": "chainx-evm"
"slug": "bevm"
} as const satisfies Chain;
+4 -4
View File
@@ -1,6 +1,6 @@
import type { Chain } from "../src/types";
export default {
"name": "Taiko (Alpha-3 Testnet)",
"name": "Taiko Grimsvotn L2",
"chain": "ETH",
"status": "active",
"icon": {
@@ -10,7 +10,7 @@ export default {
"format": "png"
},
"rpc": [
"https://taiko-alpha-3-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://taiko-grimsvotn-l2.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.test.taiko.xyz"
],
"faucets": [],
@@ -20,7 +20,7 @@ export default {
"decimals": 18
},
"infoURL": "https://taiko.xyz",
"shortName": "taiko-a3",
"shortName": "taiko-l2",
"chainId": 167005,
"networkId": 167005,
"explorers": [
@@ -31,5 +31,5 @@ export default {
}
],
"testnet": true,
"slug": "taiko-alpha-3-testnet"
"slug": "taiko-grimsvotn-l2"
} as const satisfies Chain;
+35
View File
@@ -0,0 +1,35 @@
import type { Chain } from "../src/types";
export default {
"name": "Taiko Eldfell L3",
"chain": "ETH",
"status": "active",
"icon": {
"url": "ipfs://QmcHdmVr5VRUJq13jnM6tgah5Ge7hn3Dm14eY6vwivJ5ui",
"width": 288,
"height": 258,
"format": "png"
},
"rpc": [
"https://taiko-eldfell-l3.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.l3test.taiko.xyz"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://taiko.xyz",
"shortName": "taiko-l3",
"chainId": 167006,
"networkId": 167006,
"explorers": [
{
"name": "blockscout",
"url": "https://explorer.l3test.taiko.xyz",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "taiko-eldfell-l3"
} as const satisfies Chain;
+7
View File
@@ -17,6 +17,13 @@ export default {
"shortName": "TBSI",
"chainId": 1707,
"networkId": 1707,
"explorers": [
{
"name": "blockscout",
"url": "https://exp.blockchain.or.th",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "tbsi"
} as const satisfies Chain;
+7
View File
@@ -19,6 +19,13 @@ export default {
"shortName": "tTBSI",
"chainId": 1708,
"networkId": 1708,
"explorers": [
{
"name": "blockscout",
"url": "https://exp.testnet.blockchain.or.th",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "tbsi-testnet"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "MXC zkEVM Mainnet",
"chain": "MXC zkEVM",
"icon": {
"url": "ipfs://QmdGCthKA11K9kCZJdbTP5WPAyq1wiRZ3REn6KG58MrWaE",
"width": 159,
"height": 159,
"format": "png"
},
"rpc": [
"https://mxc-zkevm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.mxc.com"
],
"faucets": [],
"nativeCurrency": {
"name": "MXC zkEVM Mainnet",
"symbol": "MXC",
"decimals": 18
},
"infoURL": "https://doc.mxc.com/docs/intro",
"shortName": "MXCzkEVM",
"chainId": 18686,
"networkId": 18686,
"explorers": [
{
"name": "MXC zkEVM Mainnet",
"url": "https://explorer.mxc.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "mxc-zkevm"
} as const satisfies Chain;
+3 -3
View File
@@ -4,7 +4,7 @@ export default {
"chain": "STOS",
"rpc": [
"https://stratos-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://web3-testnet-rpc.thestratos.org"
"https://web3-rpc-mesos.thestratos.org"
],
"faucets": [],
"nativeCurrency": {
@@ -19,12 +19,12 @@ export default {
"explorers": [
{
"name": "Stratos EVM Explorer (Blockscout)",
"url": "https://web3-testnet-explorer.thestratos.org",
"url": "https://web3-explorer-mesos.thestratos.org",
"standard": "none"
},
{
"name": "Stratos Cosmos Explorer (BigDipper)",
"url": "https://big-dipper-dev.thestratos.org",
"url": "https://big-dipper-mesos.thestratos.org",
"standard": "none"
}
],
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "Antofy Mainnet",
"chain": "ABN",
"icon": {
"url": "ipfs://QmdTfku81ohnG9ECU1Xswmeumt678cBhwHWuFYZ7i1Qsto",
"width": 400,
"height": 400,
"format": "png"
},
"rpc": [
"https://antofy.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.antofy.io"
],
"faucets": [
"https://faucet.antofy.io"
],
"nativeCurrency": {
"name": "Antofy",
"symbol": "ABN",
"decimals": 18
},
"infoURL": "https://antofy.io",
"shortName": "ABNm",
"chainId": 2202,
"networkId": 2202,
"explorers": [
{
"name": "Antofy Mainnet",
"url": "https://antofyscan.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "antofy"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "Antofy Testnet",
"chain": "ABN",
"icon": {
"url": "ipfs://QmdTfku81ohnG9ECU1Xswmeumt678cBhwHWuFYZ7i1Qsto",
"width": 400,
"height": 400,
"format": "png"
},
"rpc": [
"https://antofy-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.antofy.io"
],
"faucets": [
"https://faucet.antofy.io"
],
"nativeCurrency": {
"name": "Antofy",
"symbol": "ABN",
"decimals": 18
},
"infoURL": "https://antofy.io",
"shortName": "ABNt",
"chainId": 23006,
"networkId": 23006,
"explorers": [
{
"name": "Antofy Testnet",
"url": "https://test.antofyscan.com",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "antofy-testnet"
} as const satisfies Chain;
@@ -2,10 +2,10 @@ import type { Chain } from "../src/types";
export default {
"name": "Kroma Sepolia",
"title": "Kroma Testnet Sepolia",
"chainId": 2357,
"chainId": 2358,
"shortName": "kroma-sepolia",
"chain": "ETH",
"networkId": 2357,
"networkId": 2358,
"nativeCurrency": {
"name": "Sepolia Ether",
"symbol": "ETH",
+6 -9
View File
@@ -2,10 +2,7 @@ import type { Chain } from "../src/types";
export default {
"name": "Neon EVM MainNet",
"chain": "Solana",
"rpc": [
"https://neon-evm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet.neonevm.org"
],
"rpc": [],
"faucets": [],
"icon": {
"url": "ipfs://Qmcxevb3v8PEvnvfYgcG3bCBuPhe5YAdsHeaufDChSSR3Q",
@@ -18,19 +15,19 @@ export default {
"symbol": "NEON",
"decimals": 18
},
"infoURL": "https://neon-labs.org",
"infoURL": "https://neonevm.org",
"shortName": "neonevm-mainnet",
"chainId": 245022934,
"networkId": 245022934,
"explorers": [
{
"name": "native",
"url": "https://mainnet.explorer.neon-labs.org",
"name": "neonscan",
"url": "https://neonscan.org",
"standard": "EIP3091"
},
{
"name": "neonscan",
"url": "https://mainnet.neonscan.org",
"name": "native",
"url": "https://neon.blockscout.com",
"standard": "EIP3091"
}
],
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "EgonCoin Mainnet",
"chain": "EGON",
"icon": {
"url": "ipfs://QmNZiMmzMQYjyGtNSghtzLg4UooYhDgMQsa677DAP5KsBg",
"width": 512,
"height": 512,
"format": "png"
},
"rpc": [
"https://egoncoin.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.egcscan.com"
],
"faucets": [
"https://faucet.egcscan.com"
],
"nativeCurrency": {
"name": "EgonCoin",
"symbol": "EGON",
"decimals": 18
},
"infoURL": "https://egcscan.com",
"shortName": "EGONm",
"chainId": 271,
"networkId": 271,
"explorers": [
{
"name": "EgonCoin Mainnet",
"url": "https://egcscan.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "egoncoin"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "EgonCoin Testnet",
"chain": "EGON",
"icon": {
"url": "ipfs://QmNZiMmzMQYjyGtNSghtzLg4UooYhDgMQsa677DAP5KsBg",
"width": 512,
"height": 512,
"format": "png"
},
"rpc": [
"https://egoncoin-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpctest.egcscan.com"
],
"faucets": [
"https://faucet.egcscan.com"
],
"nativeCurrency": {
"name": "EgonCoin",
"symbol": "EGON",
"decimals": 18
},
"infoURL": "https://egcscan.com",
"shortName": "EGONt",
"chainId": 271271,
"networkId": 271271,
"explorers": [
{
"name": "EgonCoin Testnet",
"url": "https://testnet.egcscan.com",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "egoncoin-testnet"
} as const satisfies Chain;
+6 -1
View File
@@ -4,7 +4,12 @@ export default {
"chain": "ETH",
"rpc": [
"https://boba-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet.boba.network/"
"https://mainnet.boba.network",
"https://replica.boba.network",
"http://boba-ethereum.gateway.tenderly.co",
"http://gateway.tenderly.co/public/boba-ethereum",
"wss://boba-ethereum.gateway.tenderly.co/",
"wss://gateway.tenderly.co/public/boba-ethereum"
],
"faucets": [],
"nativeCurrency": {
+4 -3
View File
@@ -4,7 +4,8 @@ export default {
"chain": "ETH",
"rpc": [
"https://boba-network-goerli-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://goerli.boba.network/"
"https://goerli.boba.network/",
"wss://wss.goerli.boba.network/"
],
"faucets": [],
"nativeCurrency": {
@@ -13,7 +14,7 @@ export default {
"decimals": 18
},
"infoURL": "https://boba.network",
"shortName": "Bobagoerli",
"shortName": "BobaGoerli",
"chainId": 2888,
"networkId": 2888,
"explorers": [
@@ -28,7 +29,7 @@ export default {
"chain": "eip155-5",
"bridges": [
{
"url": "https://gateway.goerli.boba.network"
"url": "https://gateway.boba.network"
}
]
},
+25
View File
@@ -0,0 +1,25 @@
import type { Chain } from "../src/types";
export default {
"name": "ProofOfPepe Testnet",
"chain": "POPTestnet",
"shortName": "POPTestnet",
"chainId": 331769,
"testnet": true,
"rpc": [
"https://proofofpepe-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet01.proofofpepe.tech"
],
"nativeCurrency": {
"name": "POP",
"symbol": "POP",
"decimals": 18
},
"explorers": [
{
"name": "ProofOfPepe Explorer",
"url": "https://pepescan.app/",
"standard": "EIP3091"
}
],
"slug": "proofofpepe-testnet"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "SenjePowers Testnet",
"chain": "SPC",
"icon": {
"url": "ipfs://QmcpyTj4hUyHJZ2VmSdkXFpPpRcNKRP1VxMs7Cp1anymNy",
"width": 504,
"height": 495,
"format": "png"
},
"rpc": [
"https://senjepowers-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.senjepowersscan.com"
],
"faucets": [
"https://faucet.senjepowersscan.com"
],
"nativeCurrency": {
"name": "SenjePowers",
"symbol": "SPC",
"decimals": 18
},
"infoURL": "https://senjepowersscan.com",
"shortName": "SPCt",
"chainId": 3698,
"networkId": 3698,
"explorers": [
{
"name": "SenjePowers",
"url": "https://testnet.senjepowersscan.com",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "senjepowers-testnet"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "SenjePowers Mainnet",
"chain": "SPC",
"icon": {
"url": "ipfs://QmcpyTj4hUyHJZ2VmSdkXFpPpRcNKRP1VxMs7Cp1anymNy",
"width": 504,
"height": 495,
"format": "png"
},
"rpc": [
"https://senjepowers.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.senjepowersscan.com"
],
"faucets": [
"https://faucet.senjepowersscan.com"
],
"nativeCurrency": {
"name": "SenjePowers",
"symbol": "SPC",
"decimals": 18
},
"infoURL": "https://senjepowersscan.com",
"shortName": "SPCm",
"chainId": 3699,
"networkId": 3699,
"explorers": [
{
"name": "SenjePowers",
"url": "https://senjepowersscan.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "senjepowers"
} as const satisfies Chain;
+57
View File
@@ -0,0 +1,57 @@
import type { Chain } from "../src/types";
export default {
"name": "PGN (Public Goods Network)",
"chain": "ETH",
"rpc": [
"https://pgn-public-goods-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.publicgoods.network"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://publicgoods.network/",
"shortName": "PGN",
"chainId": 424,
"networkId": 424,
"icon": {
"url": "ipfs://QmUVJ7MLCEAfq3pHVPFLscqRMiyAY5biVgTkeDQCmAhHNS",
"width": 574,
"height": 574,
"format": "svg"
},
"explorers": [
{
"name": "blockscout",
"url": "https://explorer.publicgoods.network",
"icon": {
"url": "ipfs://bafybeifu5tpui7dk5cjoo54kde7pmuthvnl7sdykobuarsxgu7t2izurnq",
"width": 512,
"height": 512,
"format": "png"
},
"standard": "EIP3091"
}
],
"parent": {
"type": "L2",
"chain": "eip155-1",
"bridges": [
{
"url": "https://bridge.publicgoods.network"
}
]
},
"testnet": false,
"slug": "pgn-public-goods-network"
} as const satisfies Chain;
+10 -2
View File
@@ -6,8 +6,7 @@ export default {
"https://bobafuji-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet.avax.boba.network",
"wss://wss.testnet.avax.boba.network",
"https://replica.testnet.avax.boba.network",
"wss://replica-wss.testnet.avax.boba.network"
"https://replica.testnet.avax.boba.network"
],
"faucets": [],
"nativeCurrency": {
@@ -26,6 +25,15 @@ export default {
"standard": "none"
}
],
"parent": {
"type": "L2",
"chain": "eip155-5",
"bridges": [
{
"url": "https://gateway.boba.network"
}
]
},
"testnet": true,
"slug": "bobafuji-testnet"
} as const satisfies Chain;
+6
View File
@@ -23,6 +23,12 @@ export default {
"standard": "EIP3091"
}
],
"icon": {
"url": "ipfs://QmQKHQrvtyUC5b5B76ke5GPTGXoGTVCubXS6gHgzCAswKo",
"width": 250,
"height": 250,
"format": "png"
},
"testnet": false,
"slug": "iotex-network"
} as const satisfies Chain;
+6
View File
@@ -25,6 +25,12 @@ export default {
"standard": "EIP3091"
}
],
"icon": {
"url": "ipfs://QmQKHQrvtyUC5b5B76ke5GPTGXoGTVCubXS6gHgzCAswKo",
"width": 250,
"height": 250,
"format": "png"
},
"testnet": true,
"slug": "iotex-network-testnet"
} as const satisfies Chain;
+15
View File
@@ -2,6 +2,12 @@ import type { Chain } from "../src/types";
export default {
"name": "Mantle",
"chain": "ETH",
"icon": {
"url": "ipfs://QmYddHh5zdceSsBU7uGfQvEHg6UUtAFbzQBBaePS4whx7o",
"width": 225,
"height": 225,
"format": "png"
},
"rpc": [
"https://mantle.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.mantle.xyz"
@@ -23,6 +29,15 @@ export default {
"standard": "EIP3091"
}
],
"parent": {
"type": "L2",
"chain": "eip155-1",
"bridges": [
{
"url": "https://bridge.mantle.xyz"
}
]
},
"testnet": false,
"slug": "mantle"
} as const satisfies Chain;
+37
View File
@@ -0,0 +1,37 @@
import type { Chain } from "../src/types";
export default {
"name": "Toronet Testnet",
"chain": "Toronet",
"icon": {
"url": "ipfs://QmciSvgLatP6jhgdazuiyD3fSrhipfAN7wC943v1qxcrpv",
"width": 846,
"height": 733,
"format": "png"
},
"rpc": [
"https://toronet-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://testnet.toronet.org/rpc"
],
"faucets": [],
"nativeCurrency": {
"name": "Toro",
"symbol": "TORO",
"decimals": 18
},
"infoURL": "https://toronet.org",
"shortName": "ToronetTestnet",
"chainId": 54321,
"networkId": 54321,
"ens": {
"registry": "0x059C474f26D65B0458F9da10A649a7322aB02C09"
},
"explorers": [
{
"name": "toronet_explorer",
"url": "https://testnet.toronet.org",
"standard": "none"
}
],
"testnet": true,
"slug": "toronet-testnet"
} as const satisfies Chain;
+7 -7
View File
@@ -1,6 +1,6 @@
import type { Chain } from "../src/types";
export default {
"name": "Binance Smart Chain Mainnet",
"name": "BNB Smart Chain Mainnet",
"chain": "BSC",
"rpc": [
"https://binance.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
@@ -14,20 +14,20 @@ export default {
"https://bsc-dataseed3.defibit.io",
"https://bsc-dataseed2.defibit.io",
"https://bsc-dataseed1.defibit.io",
"https://bsc-dataseed4.binance.org",
"https://bsc-dataseed3.binance.org",
"https://bsc-dataseed2.binance.org",
"https://bsc-dataseed1.binance.org"
"https://bsc-dataseed4.bnbchain.org",
"https://bsc-dataseed3.bnbchain.org",
"https://bsc-dataseed2.bnbchain.org",
"https://bsc-dataseed1.bnbchain.org"
],
"faucets": [
"https://free-online-app.com/faucet-for-eth-evm-chains/"
],
"nativeCurrency": {
"name": "Binance Chain Native Token",
"name": "BNB Chain Native Token",
"symbol": "BNB",
"decimals": 18
},
"infoURL": "https://www.binance.org",
"infoURL": "https://www.bnbchain.org/en",
"shortName": "bnb",
"chainId": 56,
"networkId": 56,
+13 -2
View File
@@ -5,9 +5,11 @@ export default {
"rpc": [
"https://boba-bnb.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://bnb.boba.network",
"wss://wss.bnb.boba.network",
"http://boba-bnb.gateway.tenderly.co/",
"http://gateway.tenderly.co/public/boba-bnb",
"https://replica.bnb.boba.network",
"wss://replica-wss.bnb.boba.network"
"wss://boba-bnb.gateway.tenderly.co/",
"wss://gateway.tenderly.co/public/boba-bnb"
],
"faucets": [],
"nativeCurrency": {
@@ -26,6 +28,15 @@ export default {
"standard": "none"
}
],
"parent": {
"type": "L2",
"chain": "eip155-5",
"bridges": [
{
"url": "https://gateway.boba.network"
}
]
},
"testnet": false,
"slug": "boba-bnb"
} as const satisfies Chain;
+57
View File
@@ -0,0 +1,57 @@
import type { Chain } from "../src/types";
export default {
"name": "Sepolia PGN (Public Goods Network)",
"chain": "ETH",
"rpc": [
"https://sepolia-pgn-public-goods-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://sepolia.publicgoods.network"
],
"faucets": [],
"nativeCurrency": {
"name": "Sepolia Ether",
"symbol": "ETH",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://publicgoods.network/",
"shortName": "sepPGN",
"chainId": 58008,
"networkId": 58008,
"icon": {
"url": "ipfs://QmUVJ7MLCEAfq3pHVPFLscqRMiyAY5biVgTkeDQCmAhHNS",
"width": 574,
"height": 574,
"format": "svg"
},
"explorers": [
{
"name": "blockscout",
"url": "https://explorer.sepolia.publicgoods.network",
"icon": {
"url": "ipfs://bafybeifu5tpui7dk5cjoo54kde7pmuthvnl7sdykobuarsxgu7t2izurnq",
"width": 512,
"height": 512,
"format": "png"
},
"standard": "EIP3091"
}
],
"parent": {
"type": "L2",
"chain": "eip155-11155111",
"bridges": [
{
"url": "https://pgn-bridge.vercel.app/bridge"
}
]
},
"testnet": false,
"slug": "sepolia-pgn-public-goods-network"
} as const satisfies Chain;
+41
View File
@@ -0,0 +1,41 @@
import type { Chain } from "../src/types";
export default {
"name": "Linea Mainnet",
"chain": "Linea Mainnet",
"shortName": "linea-mainnet",
"chainId": 59144,
"testnet": false,
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"rpc": [
"https://linea.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://rpc.linea.build"
],
"explorers": [
{
"name": "lineascan",
"url": "https://lineascan.build",
"standard": "EIP3091"
},
{
"name": "Linea Scan",
"url": "https://lineascan.build",
"standard": ""
}
],
"faucets": [
"https://www.infura.io/faucet/linea"
],
"infoURL": "https://docs.linea.build/overview",
"icon": {
"url": "ipfs://QmURjritnHL7a8TwZgsFwp3f272DJmG5paaPtWDZ98QZwH",
"height": 512,
"width": 512,
"format": "svg"
},
"slug": "linea"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Bitrock Mainnet",
"chain": "Bitrock",
"icon": {
"url": "ipfs://QmfXZCAh3HWS2bJroUStN9TieL4QA9QArMotie3X4pwBfj",
"width": 72,
"height": 72,
"format": "svg"
},
"rpc": [
"https://bitrock.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://connect.bit-rock.io"
],
"faucets": [],
"nativeCurrency": {
"name": "BITROCK",
"symbol": "BROCK",
"decimals": 18
},
"infoURL": "https://bit-rock.io",
"shortName": "bitrock",
"chainId": 7171,
"networkId": 7171,
"explorers": [
{
"name": "Bitrock Explorer",
"url": "https://scan.bit-rock.io",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "bitrock"
} as const satisfies Chain;
+49
View File
@@ -0,0 +1,49 @@
import type { Chain } from "../src/types";
export default {
"name": "Horizen EON",
"shortName": "EON",
"chain": "EON",
"icon": {
"url": "ipfs://QmSFMBk3rMyu45Sy9KQHjgArFj4HdywANNYrSosLMUdcti",
"width": 1213,
"height": 1213,
"format": "png"
},
"rpc": [
"https://horizen-eon.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://eon-rpc.horizenlabs.io/ethv1"
],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Zencash",
"symbol": "ZEN",
"decimals": 18
},
"infoURL": "https://horizen.io/",
"chainId": 7332,
"networkId": 7332,
"slip44": 121,
"explorers": [
{
"name": "Horizen EON Block Explorer",
"url": "https://eon-explorer.horizenlabs.io",
"icon": {
"url": "ipfs://QmSFMBk3rMyu45Sy9KQHjgArFj4HdywANNYrSosLMUdcti",
"width": 1213,
"height": 1213,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "horizen-eon"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Script Testnet",
"chain": "SPAY",
"rpc": [
"https://script-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testeth-rpc-api.script.tv/rpc"
],
"faucets": [],
"nativeCurrency": {
"name": "Script",
"symbol": "SPAY",
"decimals": 18
},
"infoURL": "https://token.script.tv",
"shortName": "SPAY",
"chainId": 742,
"networkId": 742,
"explorers": [
{
"name": "Script Explorer",
"url": "https://explorer.script.tv",
"standard": "none"
}
],
"testnet": true,
"slug": "script-testnet"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "Bitrock Testnet",
"chain": "Bitrock",
"icon": {
"url": "ipfs://QmfXZCAh3HWS2bJroUStN9TieL4QA9QArMotie3X4pwBfj",
"width": 72,
"height": 72,
"format": "svg"
},
"rpc": [
"https://bitrock-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet.bit-rock.io"
],
"faucets": [
"https://faucet.bit-rock.io"
],
"nativeCurrency": {
"name": "BITROCK",
"symbol": "BROCK",
"decimals": 18
},
"infoURL": "https://bit-rock.io",
"shortName": "tbitrock",
"chainId": 7771,
"networkId": 7771,
"explorers": [
{
"name": "Bitrock Testnet Explorer",
"url": "https://testnetscan.bit-rock.io",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "bitrock-testnet"
} as const satisfies Chain;
+37
View File
@@ -0,0 +1,37 @@
import type { Chain } from "../src/types";
export default {
"name": "Toronet Mainnet",
"chain": "Toronet",
"icon": {
"url": "ipfs://QmciSvgLatP6jhgdazuiyD3fSrhipfAN7wC943v1qxcrpv",
"width": 846,
"height": 733,
"format": "png"
},
"rpc": [
"https://toronet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://toronet.org/rpc"
],
"faucets": [],
"nativeCurrency": {
"name": "Toro",
"symbol": "TORO",
"decimals": 18
},
"infoURL": "https://toronet.org",
"shortName": "Toronet",
"chainId": 77777,
"networkId": 77777,
"ens": {
"registry": "0x1f45a71f4aAD769E27c969c4359E0e250C67165c"
},
"explorers": [
{
"name": "toronet_explorer",
"url": "https://toronet.org/explorer",
"standard": "none"
}
],
"testnet": false,
"slug": "toronet"
} as const satisfies Chain;
+42
View File
@@ -0,0 +1,42 @@
import type { Chain } from "../src/types";
export default {
"name": "ARDENIUM Athena",
"chain": "ATHENA",
"rpc": [
"https://ardenium-athena.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-athena.ardescan.com/"
],
"faucets": [
"https://faucet-athena.ardescan.com/"
],
"nativeCurrency": {
"name": "ARD",
"symbol": "tARD",
"decimals": 18
},
"infoURL": "https://ardenium.org",
"shortName": "ard",
"chainId": 7895,
"networkId": 7895,
"icon": {
"url": "ipfs://QmdwifhejRfF8QfyzYrNdFVhfhCR6iuzWMmppK4eL7kttG",
"width": 120,
"height": 120,
"format": "png"
},
"explorers": [
{
"name": "ARDENIUM Athena Explorer",
"icon": {
"url": "ipfs://QmdwifhejRfF8QfyzYrNdFVhfhCR6iuzWMmppK4eL7kttG",
"width": 120,
"height": 120,
"format": "png"
},
"url": "https://testnet.ardscan.com",
"standard": "none"
}
],
"testnet": true,
"slug": "ardenium-athena"
} as const satisfies Chain;
+17 -2
View File
@@ -2,7 +2,10 @@ import type { Chain } from "../src/types";
export default {
"name": "Base",
"chain": "ETH",
"rpc": [],
"rpc": [
"https://base.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://developer-access-mainnet.base.org/"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
@@ -13,13 +16,25 @@ export default {
"shortName": "base",
"chainId": 8453,
"networkId": 8453,
"status": "incubating",
"icon": {
"url": "ipfs://QmW5Vn15HeRkScMfPcW12ZdZcC2yUASpu6eCsECRdEmjjj/base-512.png",
"height": 512,
"width": 512,
"format": "png"
},
"explorers": [
{
"name": "basescout",
"url": "https://base.blockscout.com",
"standard": "none"
},
{
"name": "basescan",
"url": "https://basescan.org",
"standard": "none"
}
],
"status": "active",
"testnet": false,
"slug": "base"
} as const satisfies Chain;
+6 -6
View File
@@ -18,6 +18,12 @@ export default {
"shortName": "basegor",
"chainId": 84531,
"networkId": 84531,
"icon": {
"url": "ipfs://QmW5Vn15HeRkScMfPcW12ZdZcC2yUASpu6eCsECRdEmjjj/base-512.png",
"height": 512,
"width": 512,
"format": "png"
},
"explorers": [
{
"name": "basescout",
@@ -31,11 +37,5 @@ export default {
}
],
"testnet": true,
"icon": {
"url": "ipfs://QmW5Vn15HeRkScMfPcW12ZdZcC2yUASpu6eCsECRdEmjjj/base-512.png",
"height": 512,
"width": 512,
"format": "png"
},
"slug": "base-goerli"
} as const satisfies Chain;
+31
View File
@@ -0,0 +1,31 @@
import type { Chain } from "../src/types";
export default {
"name": "Mode Testnet ",
"chain": "ModeTest",
"shortName": "ModeTest",
"chainId": 919,
"testnet": true,
"rpc": [
"https://mode-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://sepolia.mode.network/"
],
"explorers": [
{
"name": "mode-sepolia-vtnhnpim72",
"url": "https://sepolia.explorer.mode.network/",
"standard": "EIP3091"
}
],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"icon": {
"height": 2160,
"width": 2160,
"format": "png",
"url": "ipfs://bafkreidi5y7afj5z4xrz7uz5rkg2mcsv2p2n4ui4g7q4k4ecdz65i2agou"
},
"slug": "mode-testnet"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Codefin Mainnet",
"chain": "COF",
"icon": {
"url": "ipfs://QmVyAuAnKKNnGEpqeYMLPRfMdysLgPBTZeEXihXbRytGhp",
"width": 1024,
"height": 1024,
"format": "png"
},
"rpc": [
"https://codefin.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://chain-rpc.codefin.pro"
],
"faucets": [],
"nativeCurrency": {
"name": "Codefin",
"symbol": "COF",
"decimals": 18
},
"infoURL": "https://network.codefin.pro",
"shortName": "COF",
"chainId": 9223,
"networkId": 9223,
"explorers": [
{
"name": "Codefin Net Explorer",
"url": "https://explorer.codefin.pro",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "codefin"
} as const satisfies Chain;
+10 -10
View File
@@ -1,26 +1,26 @@
import type { Chain } from "../src/types";
export default {
"name": "Binance Smart Chain Testnet",
"name": "BNB Smart Chain Testnet",
"chain": "BSC",
"rpc": [
"https://binance-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://bsc-testnet.publicnode.com",
"https://data-seed-prebsc-2-s3.binance.org:8545",
"https://data-seed-prebsc-1-s3.binance.org:8545",
"https://data-seed-prebsc-2-s2.binance.org:8545",
"https://data-seed-prebsc-1-s2.binance.org:8545",
"https://data-seed-prebsc-2-s1.binance.org:8545",
"https://data-seed-prebsc-1-s1.binance.org:8545"
"https://data-seed-prebsc-2-s3.bnbchain.org:8545",
"https://data-seed-prebsc-1-s3.bnbchain.org:8545",
"https://data-seed-prebsc-2-s2.bnbchain.org:8545",
"https://data-seed-prebsc-1-s2.bnbchain.org:8545",
"https://data-seed-prebsc-2-s1.bnbchain.org:8545",
"https://data-seed-prebsc-1-s1.bnbchain.org:8545"
],
"faucets": [
"https://testnet.binance.org/faucet-smart"
"https://testnet.bnbchain.org/faucet-smart"
],
"nativeCurrency": {
"name": "Binance Chain Native Token",
"name": "BNB Chain Native Token",
"symbol": "tBNB",
"decimals": 18
},
"infoURL": "https://testnet.binance.org/",
"infoURL": "https://www.bnbchain.org/en",
"shortName": "bnbt",
"chainId": 97,
"networkId": 97,
+9
View File
@@ -26,6 +26,15 @@ export default {
"standard": "none"
}
],
"parent": {
"type": "L2",
"chain": "eip155-5",
"bridges": [
{
"url": "https://gateway.boba.network"
}
]
},
"testnet": true,
"slug": "boba-bnb-testnet"
} as const satisfies Chain;
@@ -0,0 +1,24 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Omit<Chain, "slug">} */
export default {
name: "ProofOfPepe Testnet",
chain: "POPTestnet",
shortName: "POPTestnet",
chainId: 331769,
testnet: true,
rpc: ["https://testnet01.proofofpepe.tech"],
nativeCurrency: {
name: "POP",
symbol: "POP",
decimals: 18,
},
explorers: [
{
name: "ProofOfPepe Explorer",
url: "https://pepescan.app/",
standard: "EIP3091",
},
],
};
+32
View File
@@ -0,0 +1,32 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Omit<Chain, "slug">} */
export default {
name: "Linea Mainnet",
chain: "Linea Mainnet",
shortName: "linea-mainnet",
chainId: 59144,
testnet: false,
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18,
},
rpc: [],
explorers: [
{
name: "Linea Scan",
url: "https://lineascan.build",
standard: "",
},
],
faucets: ["https://www.infura.io/faucet/linea"],
infoURL: "https://docs.linea.build/overview",
icon: {
url: "ipfs://QmURjritnHL7a8TwZgsFwp3f272DJmG5paaPtWDZ98QZwH",
height: 512,
width: 512,
format: "svg",
},
};
+30
View File
@@ -0,0 +1,30 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Omit<Chain, "slug">} */
export default {
name: "Mode Testnet ",
chain: "ModeTest",
shortName: "ModeTest",
chainId: 919,
testnet: true,
rpc: ["https://sepolia.mode.network/"],
explorers: [
{
name: "mode-sepolia-vtnhnpim72",
url: "https://sepolia.explorer.mode.network/",
standard: "EIP3091",
},
],
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18,
},
icon: {
height: 2160,
width: 2160,
format: "png",
url: "ipfs://bafkreidi5y7afj5z4xrz7uz5rkg2mcsv2p2n4ui4g7q4k4ecdz65i2agou",
},
};
+12
View File
@@ -0,0 +1,12 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Partial<Chain>} */
export default {
icon: {
url: "ipfs://QmQKHQrvtyUC5b5B76ke5GPTGXoGTVCubXS6gHgzCAswKo",
width: 250,
height: 250,
format: "png"
}
};
+12
View File
@@ -0,0 +1,12 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Partial<Chain>} */
export default {
icon: {
url: "ipfs://QmQKHQrvtyUC5b5B76ke5GPTGXoGTVCubXS6gHgzCAswKo",
width: 250,
height: 250,
format: "png"
}
};
+14
View File
@@ -0,0 +1,14 @@
// @ts-check
/** @typedef { import("../../src/types").Chain } Chain */
/** @type {Partial<Chain>} */
export default {
chainId: 59144,
rpc: [
"https://rpc.linea.build",
"https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
],
explorers: [
{ name: "lineascan", url: "https://lineascan.build", standard: "EIP3091" },
],
};
+2
View File
@@ -10,4 +10,6 @@ export default {
width: 512,
format: "png",
},
rpc: ["https://base.rpc.thirdweb.com/${THIRDWEB_API_KEY}"],
status: "active",
};
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/chains",
"version": "0.1.28",
"version": "0.1.38",
"main": "dist/thirdweb-dev-chains.cjs.js",
"module": "dist/thirdweb-dev-chains.esm.js",
"browser": {
+3 -3
View File
@@ -164,10 +164,10 @@ function findSlug(chain) {
if (slug === "arbitrum-one") {
slug = "arbitrum";
}
if (slug === "binance-smart-chain") {
if (slug === "bnb-smart-chain") {
slug = "binance";
}
if (slug === "binance-smart-chain-testnet") {
if (slug === "bnb-smart-chain-testnet") {
slug = "binance-testnet";
}
if (slug === "base-goerli-testnet") {
@@ -267,7 +267,7 @@ import type { Chain } from "./types";
${exports.join("\n")}
export * from "./types";
export * from "./utils";
export const defaultChains = [c1, c5, c84531, c137, c80001, c42161, c421613, c10, c420, c56, c97, c250, c4002, c43114, c43113, c1337];
export const defaultChains = [c1, c5, c8453, c84531, c137, c80001, c42161, c421613, c10, c420, c56, c97, c250, c4002, c43114, c43113, c1337];
export const allChains: Chain[] = [${exportNames.join(", ")}];
type ChainsById = {
File diff suppressed because one or more lines are too long
+73
View File
@@ -69,6 +69,64 @@ export function getChainRPCs(
return processedRPCs;
}
/**
* Construct the list of RPC URLs given a specific chain config. Format any RPC URLs
* with necessary clientId/secretKey and returns the first valid one.
*
* @param chain - The chain config to assemble RPC URLs from
* @param clientId - The client id to use for the RPC URL
* @param secretKey - The secret key to use for the RPC URL
* @returns The first valid RPC URL for the chain
*/
export function getValidChainRPCs(
chain: Pick<Chain, "rpc" | "chainId">,
clientId?: string,
mode: "http" | "ws" = "http",
): string[] {
const processedRPCs: string[] = [];
chain.rpc.forEach((rpc) => {
// exclude RPC if mode mismatch
if (mode === "http" && !rpc.startsWith("http")) {
return;
}
if (mode === "ws" && !rpc.startsWith("ws")) {
return;
}
// Replace API_KEY placeholder with value
if (rpc.includes("${THIRDWEB_API_KEY}")) {
if (clientId) {
processedRPCs.push(rpc.replace("${THIRDWEB_API_KEY}", clientId));
} else {
// if no client id, let it through with empty string
// if secretKey is present, it will be used in header
// if none are passed, will have reduced access
processedRPCs.push(rpc.replace("${THIRDWEB_API_KEY}", ""));
}
}
// exclude RPCs with unknown placeholder
else if (rpc.includes("${")) {
return;
}
// add as is
else {
processedRPCs.push(rpc);
}
});
if (processedRPCs.length === 0) {
throw new Error(
`No RPC available for chainId "${chain.chainId}" with mode ${mode}`,
);
}
return processedRPCs;
}
/**
* Get the highest priority RPC URL for a specific chain
*
@@ -118,3 +176,18 @@ export function configureChain(
// prepend additional RPCs to the chain's RPCs
return { ...chain, rpc: [...additionalRPCs, ...chain.rpc] };
}
/**
*
* use the clientId and return a new chain object with updated RPCs
*/
export function updateChainRPCs(chain: Chain, clientId?: string) {
try {
return {
...chain,
rpc: getValidChainRPCs(chain, clientId),
};
} catch (error) {
return chain;
}
}
+116
View File
@@ -1,5 +1,121 @@
# thirdweb
## 0.11.4
### Patch Changes
- Updated dependencies [[`7cb55e70`](https://github.com/thirdweb-dev/js/commit/7cb55e7051617268bba1b80146865c606ff6e66d)]:
- @thirdweb-dev/chains@0.1.38
- @thirdweb-dev/sdk@3.10.40
## 0.11.3
### Patch Changes
- [#1370](https://github.com/thirdweb-dev/js/pull/1370) [`79ebbbca`](https://github.com/thirdweb-dev/js/commit/79ebbbcad92b71b3123f5cc08d7d837b3716cb3f) Thanks [@Marfuen](https://github.com/Marfuen)! - Fixed a bug where passing in --ci in publish, release or deploy would still open the url and crash during runtime. Now it won't open the url if --ci is passed in.
## 0.11.2
### Patch Changes
- Updated dependencies [[`d665954f`](https://github.com/thirdweb-dev/js/commit/d665954fee0554985055bf06abbed8d7b8d5bc38)]:
- @thirdweb-dev/chains@0.1.37
- @thirdweb-dev/sdk@3.10.39
## 0.11.1
### Patch Changes
- Updated dependencies [[`02ab92cc`](https://github.com/thirdweb-dev/js/commit/02ab92cc5c97f475e3b5642e5a7bdbe63ca136ee), [`6cc4b8d2`](https://github.com/thirdweb-dev/js/commit/6cc4b8d28b982c5be3e1cd17d2a9a947001d1608)]:
- @thirdweb-dev/chains@0.1.36
- @thirdweb-dev/sdk@3.10.38
## 0.11.0
### Minor Changes
- [#1316](https://github.com/thirdweb-dev/js/pull/1316) [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b) Thanks [@iketw](https://github.com/iketw)! - Introducing API secret key restrictions for certain commands. Get your API secret key from [here](https://thirdweb.com/dashboard/settings/api-keys).
The following commands will require you to have logged in with your API secret key:
- `thirdweb deploy`
- `thirdweb release`
- `thirdweb publish`
- `thirdweb upload`
Implemented 2 new commands for managing your session with the CLI:
- thirdweb login
- thirdweb logout
Note: If you try to call a command that requires you to be logged in, you will be prompted to login.
Updated chains.
### Patch Changes
- Updated dependencies [[`44dbf283`](https://github.com/thirdweb-dev/js/commit/44dbf283c985f3e2ecbeb1cfdf09fe1d84e26298), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b)]:
- @thirdweb-dev/storage@1.2.0
- @thirdweb-dev/sdk@3.10.37
- @thirdweb-dev/chains@0.1.35
## 0.10.37
### Patch Changes
- Updated dependencies [[`dac8fa7d`](https://github.com/thirdweb-dev/js/commit/dac8fa7d98b6952acf8d13e173099889c1d47da8)]:
- @thirdweb-dev/sdk@3.10.36
## 0.10.36
### Patch Changes
- Updated dependencies [[`8dd7540c`](https://github.com/thirdweb-dev/js/commit/8dd7540c455aa70534f6d29986537592fd12169b), [`8dd7540c`](https://github.com/thirdweb-dev/js/commit/8dd7540c455aa70534f6d29986537592fd12169b)]:
- @thirdweb-dev/storage@1.1.9
- @thirdweb-dev/chains@0.1.34
- @thirdweb-dev/sdk@3.10.35
## 0.10.35
### Patch Changes
- Updated dependencies [[`0407b2c2`](https://github.com/thirdweb-dev/js/commit/0407b2c2f39b5f3fa06e613e671623b5644b3a28)]:
- @thirdweb-dev/chains@0.1.33
- @thirdweb-dev/sdk@3.10.34
## 0.10.34
### Patch Changes
- Updated dependencies [[`a9093bcf`](https://github.com/thirdweb-dev/js/commit/a9093bcf287c01e3335fd780e2ccbfdb3380bf95)]:
- @thirdweb-dev/chains@0.1.32
- @thirdweb-dev/sdk@3.10.33
## 0.10.33
### Patch Changes
- Updated dependencies [[`4393b228`](https://github.com/thirdweb-dev/js/commit/4393b2280505fd0b2284555d64eae6567e8401a5)]:
- @thirdweb-dev/chains@0.1.31
- @thirdweb-dev/sdk@3.10.32
## 0.10.32
### Patch Changes
- Updated dependencies [[`40682191`](https://github.com/thirdweb-dev/js/commit/40682191450de08ad40b9d2957afced248657af2)]:
- @thirdweb-dev/chains@0.1.30
- @thirdweb-dev/sdk@3.10.31
## 0.10.31
### Patch Changes
- Updated dependencies [[`db68bd04`](https://github.com/thirdweb-dev/js/commit/db68bd04cd8bb3ee6bff051d1d5b5a872353fde0), [`fd74d791`](https://github.com/thirdweb-dev/js/commit/fd74d7918072cda03b52f852ebb3f8dccb84074d), [`35f20ceb`](https://github.com/thirdweb-dev/js/commit/35f20ceb4f943e95d9566105096f06412978da7a)]:
- @thirdweb-dev/storage@1.1.8
- @thirdweb-dev/sdk@3.10.30
- @thirdweb-dev/chains@0.1.29
## 0.10.30
### Patch Changes
+13 -2
View File
@@ -1,7 +1,7 @@
import { ERROR_MESSAGES } from "../constants/constants";
import { prepareEnvironment } from "@gmrchk/cli-testing-library";
import { copyFile } from "fs/promises";
import { resolve } from "path";
import { ERROR_MESSAGES } from "../constants/constants";
// this creates an app, can take some time that's fine
jest.setTimeout(120_000);
@@ -9,6 +9,14 @@ jest.setTimeout(120_000);
describe("npx thirdweb deploy", () => {
it("should return deploy page url", async () => {
const { spawn, cleanup, exists, path } = await prepareEnvironment();
// eslint-disable-next-line turbo/no-undeclared-env-vars
const apiSecretKey = process.env.CLI_E2E_API_KEY as string;
if (!apiSecretKey) {
throw new Error(
"CLI_E2E_API_KEY is not set in the environment variables",
);
}
await copyFile(
resolve("./e2e/files/BasicContract.sol"),
@@ -16,7 +24,10 @@ describe("npx thirdweb deploy", () => {
);
const { waitForText, waitForFinish, getExitCode, writeText, getStderr } =
await spawn("node", "./dist/cli/index.js deploy --contract");
await spawn(
"node",
`./dist/cli/index.js deploy --contract -k ${apiSecretKey}`,
);
expect(await exists("BasicContract.sol")).toEqual(true);
+12 -3
View File
@@ -1,14 +1,23 @@
import { ERROR_MESSAGES } from "../constants/constants";
import { prepareEnvironment } from "@gmrchk/cli-testing-library";
import { copyFile } from "fs/promises";
import { resolve } from "path";
import { ERROR_MESSAGES } from "../constants/constants";
// this creates an app, can take some time that's fine
jest.setTimeout(120_000);
describe("npx thirdweb publish", () => {
it("should return publish page url", async () => {
// TOOD: turn this test back on when we figure out why it's failing
it.skip("should return publish page url", async () => {
const { spawn, cleanup, exists, path } = await prepareEnvironment();
// eslint-disable-next-line turbo/no-undeclared-env-vars
const apiSecretKey = process.env.CLI_E2E_API_KEY as string;
if (!apiSecretKey) {
throw new Error(
"CLI_E2E_API_KEY is not set in the environment variables",
);
}
await copyFile(
resolve("./e2e/files/BasicContract.sol"),
@@ -16,7 +25,7 @@ describe("npx thirdweb publish", () => {
);
const { waitForText, waitForFinish, getExitCode, writeText, getStderr } =
await spawn("node", "./dist/cli/index.js publish");
await spawn("node", `./dist/cli/index.js publish -k ${apiSecretKey}}`);
expect(await exists("BasicContract.sol")).toEqual(true);
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "thirdweb",
"main": "dist/cli/index.js",
"version": "0.10.30",
"version": "0.11.4",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/cli",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -28,7 +28,7 @@
"hardhat": "^2.16.1",
"jest": "^29.4.3",
"ora": "^6.3.1",
"prettier": "^2.8.8",
"prettier": "^3.0.0",
"ts-jest": "^29.1.0",
"ts-node": "^10.7.0",
"tsup": "^6.7.0",
+86
View File
@@ -0,0 +1,86 @@
import chalk from "chalk";
import prompts from "prompts";
import Cache, { CacheEntry } from "sync-disk-cache";
import { ApiResponse } from "../lib/types";
export async function loginUser(
cache: Cache,
options?: { new: boolean },
showLogs?: boolean,
) {
const keyFound = getSession(cache);
if (keyFound && !options?.new) {
if (showLogs) {
console.log(chalk.green("You are already logged in"));
}
return keyFound;
} else {
const apiKey = await createSession(cache);
return apiKey;
}
}
export async function logoutUser(cache: Cache) {
try {
cache.remove("api-secret-key");
console.log(chalk.green("You have been logged out"));
} catch (error) {
console.log(chalk.red("Something went wrong", error));
}
}
export function getSession(cache: Cache) {
try {
const apiKey: CacheEntry = cache.get("api-secret-key");
return apiKey.value;
} catch (error) {
console.log(error);
}
}
export async function createSession(cache: Cache) {
try {
const response = await prompts({
type: "text",
name: "apiSecretKey",
message: `Please enter your API secret key, you can find or create it on ${chalk.blue(
"https://thirdweb.com/create-api-key",
)}`,
});
try {
await validateKey(response.apiSecretKey);
} catch (error) {
console.log(error);
process.exit(1);
}
cache.set("api-secret-key", response.apiSecretKey);
return response.apiSecretKey;
} catch (error) {
console.log(error);
}
}
export async function validateKey(apiSecretKey: string) {
const fetch = (await import("node-fetch")).default;
// TODO: CHANGE THIS TO PROD BEFORE MERGING!!!
const response = await fetch(
`https://api.thirdweb.com/v1/keys/use?scope=storage`,
{
method: "GET",
headers: {
"Content-Type": "application/json",
"x-secret-key": apiSecretKey,
},
},
);
const apiResponse = (await response.json()) as ApiResponse;
if (!response.ok) {
const { error } = apiResponse;
throw new Error(chalk.red(error.message));
} else {
return apiSecretKey;
}
}
+101 -27
View File
@@ -1,30 +1,34 @@
#!/usr/bin/env node
import { detectExtensions } from "../common/feature-detector";
import { detectProject } from "../common/project-detector";
import { processProject } from "../common/processor";
import { cliVersion, pkg } from "../constants/urls";
import { info, logger, spinner } from "../core/helpers/logger";
import { CacheEntry } from "../core/types/cache";
import { twCreate } from "../create/command";
import { deploy } from "../deploy";
import { generate } from "../generate/command";
import { findPackageInstallation } from "../helpers/detect-local-packages";
import { upload } from "../storage/command";
import { ThirdwebStorage } from "@thirdweb-dev/storage";
import chalk from "chalk";
import { exec, spawn } from "child_process";
import { Command } from "commander";
import open from "open";
import os from "os";
import path from "path";
import prompts from "prompts";
import Cache from "sync-disk-cache";
import Cache, { CacheEntry } from "sync-disk-cache";
import { loginUser, logoutUser, validateKey } from "../auth";
import { detectExtensions } from "../common/feature-detector";
import { processProject } from "../common/processor";
import { detectProject } from "../common/project-detector";
import { cliVersion, pkg } from "../constants/urls";
import { info, logger, spinner } from "../core/helpers/logger";
import { twCreate } from "../create/command";
import { deploy } from "../deploy";
import { generate } from "../generate/command";
import { findPackageInstallation } from "../helpers/detect-local-packages";
import { install } from "../install";
import { upload } from "../storage/command";
const main = async () => {
// eslint-disable-next-line turbo/no-undeclared-env-vars
const skipIntro = process.env.THIRDWEB_CLI_SKIP_INTRO === "true";
const program = new Command();
const cache = new Cache("thirdweb:cli");
const cache = new Cache("thirdweb:cli", {
location: path.join(os.homedir(), ".thirdweb", "creds"),
});
// yes this has to look like this, eliminates whitespace
if (!skipIntro) {
@@ -205,8 +209,8 @@ const main = async () => {
.option("--nightly", "Install the nightly version of packages.")
.option("--dev", "Install the dev version of packages")
.option("-d, --debug", "show debug logs")
.action(async (path, options) => {
await install(path, options);
.action(async (_path, options) => {
await install(_path, options);
});
program
@@ -246,8 +250,8 @@ const main = async () => {
"-c, --contract-name [name]",
"Name of the new smart contract to create",
)
.action(async (type, path, options) => {
await twCreate(type, path, options);
.action(async (type, _path, options) => {
await twCreate(type, _path, options);
});
program
@@ -296,9 +300,18 @@ const main = async () => {
"Deploy a dynamic smart contract made up of extensions to blockchains",
)
.option("--zksync", "Deploy on ZKSync")
.option("-k, --key <key>", "API key to authorize usage")
.action(async (options) => {
const url = await deploy(options);
if (url) {
let apiSecretKey = "";
// If no key is passed in, prompt the user to login. If it is passed in, use it.
if (!options.key) {
apiSecretKey = await loginUser(cache);
} else {
await validateKey(options.key);
apiSecretKey = options.key;
}
const url = await deploy(options, apiSecretKey);
if (url && !options.ci) {
await open(url);
}
});
@@ -319,17 +332,28 @@ const main = async () => {
.option("--dry-run", "dry run (skip actually publishing)")
.option("-d, --debug", "show debug logs")
.option("--ci", "Continuous Integration mode")
.option("-k, --key <key>", "API key to authorize usage")
.action(async (options) => {
let apiSecretKey = "";
// If no key is passed in, prompt the user to login. If it is passed in, use it.
if (!options.key) {
apiSecretKey = await loginUser(cache);
} else {
await validateKey(options.key);
apiSecretKey = options.key;
}
logger.warn(
"'release' is deprecated and will be removed in a future update. Please use 'publish' instead.",
);
const url = await processProject(options, "publish");
const url = await processProject(options, "publish", apiSecretKey);
info(
`Open this link to publish your contracts: ${chalk.blueBright(
url.toString(),
)}`,
);
await open(url.toString());
if (url && !options.ci) {
await open(url.toString());
}
});
program
@@ -350,24 +374,46 @@ const main = async () => {
.option("--dry-run", "dry run (skip actually publishing)")
.option("-d, --debug", "show debug logs")
.option("--ci", "Continuous Integration mode")
.option("-k, --key <key>", "API key to authorize usage")
.action(async (options) => {
const url = await processProject(options, "publish");
let apiSecretKey = "";
// If no key is passed in, prompt the user to login. If it is passed in, use it.
if (!options.key) {
apiSecretKey = await loginUser(cache);
} else {
await validateKey(options.key);
apiSecretKey = options.key;
}
const url = await processProject(options, "publish", apiSecretKey);
info(
`Open this link to publish your contracts: ${chalk.blueBright(
url.toString(),
)}`,
);
await open(url.toString());
if (url && !options.ci) {
await open(url.toString());
}
});
program
.command("upload")
.description("Upload any file or directory to decentralized storage (IPFS)")
.argument("[upload]", "path to file or directory to upload")
.action(async (path) => {
const storage = new ThirdwebStorage();
.option("-k, --key <key>", "API key to authorize usage")
.action(async (_path, options) => {
let apiSecretKey = "";
// If no key is passed in, prompt the user to login. If it is passed in, use it.
if (!options.key) {
apiSecretKey = await loginUser(cache);
} else {
await validateKey(options.key);
apiSecretKey = options.key;
}
const storage = new ThirdwebStorage({
secretKey: apiSecretKey,
});
try {
const uri = await upload(storage, path);
const uri = await upload(storage, _path);
info(
`Files stored at the following IPFS URI: ${chalk.blueBright(
uri.toString(),
@@ -414,8 +460,36 @@ const main = async () => {
"Preload ABIs and generate types for your smart contract to strongly type the thirdweb SDK",
)
.option("-p, --path <project-path>", "path to project", ".")
.option("-k, --key <key>", "API key to authorize usage")
.action(async (options) => {
await generate(options);
let apiSecretKey = "";
// If no key is passed in, prompt the user to login. If it is passed in, use it.
if (!options.key) {
apiSecretKey = await loginUser(cache);
} else {
await validateKey(options.key);
apiSecretKey = options.key;
}
await generate(options, apiSecretKey);
});
program
.command("login")
.description(
"Authenticate with the thirdweb CLI using your API secret key or replace an existing API secret key",
)
.option("-n, --new", "Login with a new API secret key", false)
.action(async (options) => {
await loginUser(cache, options, true);
});
program
.command("logout")
.description(
"Logout of the thirdweb CLI, effectively removing your API secret key from your machine",
)
.action(async () => {
await logoutUser(cache);
});
await program.parseAsync();
+23 -14
View File
@@ -1,11 +1,18 @@
import { detectFeatures } from "@thirdweb-dev/sdk";
import { ThirdwebStorage } from "@thirdweb-dev/storage";
import chalk from "chalk";
import { ethers } from "ethers";
import { readFileSync, writeFileSync } from "fs";
import ora from "ora";
import path from "path";
import {
EXTENSION_REGISTRY_ADDRESS,
ROUTER_CONTRACTS,
PreDeployedRouter,
TWRouterParams,
ROUTER_CONTRACTS,
RouterParams,
TWRouterParams,
} from "../constants/router-contracts";
import { cliVersion, THIRDWEB_URL } from "../constants/urls";
import { THIRDWEB_URL, cliVersion } from "../constants/urls";
import build from "../core/builder/build";
import detect from "../core/detection/detect";
import { execute } from "../core/helpers/exec";
@@ -17,24 +24,20 @@ import {
import { ContractPayload } from "../core/interfaces/ContractPayload";
import {
Extension,
ExtensionDeployArgs,
ExtensionFunction,
ExtensionMetadata,
ExtensionDeployArgs,
} from "../core/interfaces/Extension";
import { detectFeatures } from "@thirdweb-dev/sdk";
import { ThirdwebStorage } from "@thirdweb-dev/storage";
import chalk from "chalk";
import { ethers } from "ethers";
import { readFileSync, writeFileSync } from "fs";
import ora from "ora";
import path from "path";
export async function processProject(
options: any,
command: "deploy" | "publish",
apiSecretKey: string,
) {
// TODO: allow overriding the default storage
const storage = new ThirdwebStorage();
const storage = new ThirdwebStorage({
secretKey: apiSecretKey,
});
logger.setSettings({
minLevel: options.debug ? "debug" : "info",
@@ -237,6 +240,7 @@ export async function processProject(
} else {
const deployArgs: RouterParams = await formatToExtensions(
selectedContracts,
apiSecretKey,
);
const outputDeployArgs = JSON.stringify(deployArgs, undefined, 2);
@@ -364,11 +368,16 @@ export function getUrl(hashes: string[], command: string) {
return url;
}
async function formatToExtensions(contracts: ContractPayload[]): Promise<{
async function formatToExtensions(
contracts: ContractPayload[],
apiSecretKey: string,
): Promise<{
extensions: Extension[];
extensionDeployArgs: ExtensionDeployArgs[];
}> {
const storage = new ThirdwebStorage();
const storage = new ThirdwebStorage({
secretKey: apiSecretKey,
});
const extensions: Extension[] = [];
const extensionDeployArgs: ExtensionDeployArgs[] = [];
+22 -5
View File
@@ -4,7 +4,10 @@ import detectLibrary from "../core/detection/detectLibrary";
import detectLanguage from "../core/detection/detectLanguage";
import { logger, spinner } from "../core/helpers/logger";
import path from "path";
import { ContractLibrariesType, contractLibraries } from "../core/types/ProjectType";
import {
ContractLibrariesType,
contractLibraries,
} from "../core/types/ProjectType";
import { FeatureWithEnabled, detectFeatures } from "@thirdweb-dev/sdk";
import chalk from "chalk";
import ora from "ora";
@@ -48,8 +51,16 @@ export async function detectProject(options: any) {
options,
detectedPackageManager,
);
const detectedAppType = detectedFramework !== "none" ? contractLibraries.includes(detectedFramework as ContractLibrariesType) ? "contract" : "app" : "app";
const detectedContractLibrary = detectedAppType === "contract" ? detectedFramework as ContractLibrariesType : "none";
const detectedAppType =
detectedFramework !== "none"
? contractLibraries.includes(detectedFramework as ContractLibrariesType)
? "contract"
: "app"
: "app";
const detectedContractLibrary =
detectedAppType === "contract"
? (detectedFramework as ContractLibrariesType)
: "none";
logger.info("Detected package manager: " + detectedPackageManager);
logger.info("Detected library: " + detectedLibrary);
@@ -61,7 +72,11 @@ export async function detectProject(options: any) {
let compiledResult;
const compileLoader = spinner("Compiling project...");
try {
compiledResult = await build(projectPath, detectedContractLibrary, options);
compiledResult = await build(
projectPath,
detectedContractLibrary,
options,
);
} catch (e) {
compileLoader.fail("Compilation failed");
logger.error(e);
@@ -127,7 +142,9 @@ export async function detectProject(options: any) {
).stopAndPersist({ symbol: "🔎" });
} else {
ora(
`Detected extension on ${chalk.blueBright(contractWithFeatures.name)}`,
`Detected extension on ${chalk.blueBright(
contractWithFeatures.name,
)}`,
).stopAndPersist({ symbol: "🔎" });
contractWithFeatures.enabledFeatures.map((feature) => {
logger.info(`✔️ ${chalk.green(feature.name)}`);
+8 -5
View File
@@ -16,11 +16,14 @@ export class SolcBuilder extends BaseBuilder {
const inputPaths: string[] = [];
findFiles(options.projectPath, /^.*\.sol$/, inputPaths);
const sources = inputPaths.reduce((acc, curr) => {
const source = readFileSync(curr, "utf-8");
acc[basename(curr)] = { content: source };
return acc;
}, {} as Record<string, { content: string }>);
const sources = inputPaths.reduce(
(acc, curr) => {
const source = readFileSync(curr, "utf-8");
acc[basename(curr)] = { content: source };
return acc;
},
{} as Record<string, { content: string }>,
);
const input = {
language: "Solidity",
@@ -67,7 +67,10 @@ export default async function detect(
return possibleFrameworks[0];
}
if (possibleFrameworks.includes("expo") && possibleFrameworks.includes("react-native-cli")) {
if (
possibleFrameworks.includes("expo") &&
possibleFrameworks.includes("react-native-cli")
) {
return "expo";
}
@@ -30,7 +30,10 @@ export default async function detect(
return possibleLanguages[0];
}
if (possibleLanguages.includes("typescript") && possibleLanguages.includes("javascript")) {
if (
possibleLanguages.includes("typescript") &&
possibleLanguages.includes("javascript")
) {
return "typescript";
}
@@ -34,7 +34,10 @@ export default async function detect(
return possibleLibraries[0];
}
if (possibleLibraries.includes("react-native") && possibleLibraries.includes("react")) {
if (
possibleLibraries.includes("react-native") &&
possibleLibraries.includes("react")
) {
return "react-native";
}
@@ -42,7 +42,10 @@ export default async function detect(
return possiblePackageManagers[0];
}
if (possiblePackageManagers.includes("brownie") && possiblePackageManagers.includes("pip")) {
if (
possiblePackageManagers.includes("brownie") &&
possiblePackageManagers.includes("pip")
) {
return "brownie";
}
@@ -21,13 +21,15 @@ export default class BrownieDetector implements FrameworkDetector {
);
const additionalDirectoriesToCheck = ["/build", "/contracts", "/reports"];
const additionalDirectoriesExist = additionalDirectoriesToCheck.every((dir) => {
return existsSync(path + dir);
});
const additionalDirectoriesExist = additionalDirectoriesToCheck.every(
(dir) => {
return existsSync(path + dir);
},
);
return (
!!dependencies.find(dep => dep.includes("brownie")) ||
!!devDependencies.find(dep => dep.includes("brownie")) ||
!!dependencies.find((dep) => dep.includes("brownie")) ||
!!devDependencies.find((dep) => dep.includes("brownie")) ||
additionalFilesExist ||
additionalDirectoriesExist ||
false
@@ -18,8 +18,8 @@ export default class DjangoDetector implements FrameworkDetector {
);
return (
!!dependencies.find(dep => dep.includes("Django")) ||
!!devDependencies.find(dep => dep.includes("Django")) ||
!!dependencies.find((dep) => dep.includes("Django")) ||
!!devDependencies.find((dep) => dep.includes("Django")) ||
additionalFilesExist ||
false
);
@@ -18,8 +18,8 @@ export default class FastAPIDetector implements FrameworkDetector {
);
return (
!!dependencies.find(dep => dep.includes("fastapi")) ||
!!devDependencies.find(dep => dep.includes("fastapi")) ||
!!dependencies.find((dep) => dep.includes("fastapi")) ||
!!devDependencies.find((dep) => dep.includes("fastapi")) ||
additionalFilesExist ||
false
);
@@ -18,8 +18,8 @@ export default class FlaskDetector implements FrameworkDetector {
);
return (
!!dependencies.find(dep => dep.includes("Flask")) ||
!!devDependencies.find(dep => dep.includes("Flask")) ||
!!dependencies.find((dep) => dep.includes("Flask")) ||
!!devDependencies.find((dep) => dep.includes("Flask")) ||
additionalFilesExist ||
false
);
@@ -18,8 +18,8 @@ export default class PopulusDetector implements FrameworkDetector {
);
return (
!!dependencies.find(dep => dep === "populus") ||
!!devDependencies.find(dep => dep === "populus") ||
!!dependencies.find((dep) => dep === "populus") ||
!!devDependencies.find((dep) => dep === "populus") ||
additionalFilesExist ||
false
);
@@ -16,10 +16,7 @@ export default class TruffleDetector implements FrameworkDetector {
const packageJson = readFileSync(packageJsonPath);
const { dependencies, devDependencies } = parsePackageJson(packageJson);
const additionalFilesToCheck = [
"/truffle.config.js",
"/truffle.js",
];
const additionalFilesToCheck = ["/truffle.config.js", "/truffle.js"];
const additionalFilesExist = additionalFilesToCheck.some((file) =>
existsSync(path + file),
);
@@ -12,7 +12,9 @@ export default class Web3PyDetector implements LibraryDetector {
);
return (
!!dependencies.find(dep => dep.includes("web3")) || !!devDependencies.find(dep => dep.includes("web3")) || false
!!dependencies.find((dep) => dep.includes("web3")) ||
!!devDependencies.find((dep) => dep.includes("web3")) ||
false
);
}
}
@@ -6,7 +6,6 @@ export default class BrownieDetector implements PackageManagerDetector {
public packageManagerType: PackageManagerType = "brownie";
public matches(path: string): boolean {
const additionalFilesToCheck = [
"/brownie-config.yaml",
"/brownie-config.json",
@@ -17,14 +16,12 @@ export default class BrownieDetector implements PackageManagerDetector {
// Check that all of these exist.
const additionalDirectoriesToCheck = ["/build", "/contracts", "/reports"];
const additionalDirectoriesExist = additionalDirectoriesToCheck.every((dir) => {
return existsSync(path + dir);
});
return (
additionalFilesExist ||
additionalDirectoriesExist ||
false
const additionalDirectoriesExist = additionalDirectoriesToCheck.every(
(dir) => {
return existsSync(path + dir);
},
);
return additionalFilesExist || additionalDirectoriesExist || false;
}
}
+1 -2
View File
@@ -76,7 +76,6 @@ export type ContractLibrariesType =
| "solc"
| "none";
export const contractLibraries: readonly ContractLibrariesType[] = [
"brownie",
"foundry",
@@ -84,4 +83,4 @@ export const contractLibraries: readonly ContractLibrariesType[] = [
"truffle",
"solc",
"none",
] as const;
] as const;
-5
View File
@@ -1,5 +0,0 @@
export type CacheEntry = {
isCached: boolean;
key: string;
value: string;
};
-2
View File
@@ -1,2 +0,0 @@
declare module "sync-disk-cache";
declare module "solc";
+21
View File
@@ -0,0 +1,21 @@
declare module 'sync-disk-cache' {
export type CacheEntry = {
isCached: boolean;
key: string;
value: string;
};
export default class Cache {
constructor(key: string, options?: { location?: string; compression?: "gzip" | "deflate" | "deflateRaw"; });
clear(): void;
has(key: string): boolean;
get(key: string): CacheEntry;
set(key: string, value: string): string;
remove(key: string): boolean;
pathFor(key: string): string;
decompress(value: string): string;
compress(value: string): string;
}
}
declare module "solc"
+4 -1
View File
@@ -321,7 +321,10 @@ export async function twCreate(
const res = await prompts({
type: "text",
name: "path",
message: projectType === "extension" ? CREATE_MESSAGES.extensionName : CREATE_MESSAGES.contractName,
message:
projectType === "extension"
? CREATE_MESSAGES.extensionName
: CREATE_MESSAGES.contractName,
initial: defaultName,
validate: (name: string) => {
const isValid = /(^[a-z0-9A-Z]+$)|(^[a-z0-9A-Z]+\.sol$)/.test(name);
@@ -9,7 +9,7 @@ export async function runCommand(
return new Promise<void>((resolve, reject) => {
/**
* Spawn the installation process.
*/
*/
const child = spawn(command, args);
child.stdout?.on("data", (data) => {
@@ -28,7 +28,7 @@ export async function runCommand(
});
child.on("error", (err) => {
console.log("Spawn error", err)
console.log("Spawn error", err);
});
child.on("close", (code) => {
@@ -39,4 +39,4 @@ export async function runCommand(
resolve();
});
});
}
}
+17 -4
View File
@@ -5,10 +5,20 @@ import { logger } from "../core/helpers/logger";
import { runCommand } from "../create/helpers/run-command";
import { upload } from "../storage/command";
export async function deployApp(distPath = "dist", projectPath = ".") {
const storage = new ThirdwebStorage();
export async function deployApp(
distPath = "dist",
projectPath = ".",
apiSecretKey: string,
) {
const storage = new ThirdwebStorage({
secretKey: apiSecretKey,
});
const detectedPackageManager = await detectPackageManager(projectPath, {});
const detectedFramework = await detectFramework(projectPath, {}, detectedPackageManager);
const detectedFramework = await detectFramework(
projectPath,
{},
detectedPackageManager,
);
if (detectedFramework === "none") {
throw new Error("No supported project detected");
@@ -60,7 +70,10 @@ export async function deployApp(distPath = "dist", projectPath = ".") {
try {
const uri = await upload(storage, distPath);
return `${uri.replace("ipfs://", "https://ipfs-public.thirdwebcdn.com/ipfs/")}`;
return `${uri.replace(
"ipfs://",
"https://ipfs-public.thirdwebcdn.com/ipfs/",
)}`;
} catch (err) {
console.error("Can't upload project", err);
return Promise.reject("Can't upload project");
+4 -4
View File
@@ -1,8 +1,8 @@
import chalk from "chalk";
import { processProject } from "../common/processor";
import { info, logger } from "../core/helpers/logger";
import generateDashboardUrl from "../helpers/generate-dashboard-url";
import { deployApp } from "./app";
import chalk from "chalk";
type DeployOptions = {
name: string;
@@ -12,7 +12,7 @@ type DeployOptions = {
distPath?: string;
};
export async function deploy(options: DeployOptions) {
export async function deploy(options: DeployOptions, apiSecretKey: string) {
if (options.name) {
const url = generateDashboardUrl(options.name, options.contractVersion);
@@ -33,7 +33,7 @@ export async function deploy(options: DeployOptions) {
if (options.app) {
try {
let url = await deployApp(options.distPath, options.path);
let url = await deployApp(options.distPath, options.path, apiSecretKey);
info(`Here is the link to your app: ${chalk.blueBright(url.toString())}`);
return url.toString();
} catch (err) {
@@ -44,7 +44,7 @@ export async function deploy(options: DeployOptions) {
}
}
const url = await processProject(options, "deploy");
const url = await processProject(options, "deploy", apiSecretKey);
info(
`Open this link to deploy your contracts: ${chalk.blueBright(
url.toString(),
+23 -15
View File
@@ -1,20 +1,20 @@
import { GENERATE_MESSAGES } from "../../constants/constants";
import { allChains } from "@thirdweb-dev/chains";
import {
DeployedContract,
fetchContractMetadataFromAddress,
getChainProvider,
} from "@thirdweb-dev/sdk";
import { ThirdwebStorage } from "@thirdweb-dev/storage";
import { info } from "../core/helpers/logger";
import { allChains } from "@thirdweb-dev/chains";
import fs from "fs";
import prompts from "prompts";
import { findMatches } from "../common/file-helper";
import ora from "ora";
import prompts from "prompts";
import { GENERATE_MESSAGES } from "../../constants/constants";
import { findMatches } from "../common/file-helper";
import { info } from "../core/helpers/logger";
import { GenerateOptions, ThirdwebConfig } from "./types";
import { CHAIN_OPTIONS, getContractsForAddresses } from "./utils";
export async function generate(options: GenerateOptions) {
export async function generate(options: GenerateOptions, apiSecretKey: string) {
let projectPath: string = options.path?.replace(/\/$/, "") || ".";
let contracts: DeployedContract[] = [];
@@ -96,7 +96,9 @@ export async function generate(options: GenerateOptions) {
// Attempt to download the ABI for each contract
ora(`Downloading ABIs for contracts configured in 'thirdweb.json'`).info();
const storage = new ThirdwebStorage();
const storage = new ThirdwebStorage({
secretKey: apiSecretKey,
});
const metadata: {
address: string;
metadata: Awaited<ReturnType<typeof fetchContractMetadataFromAddress>>;
@@ -147,10 +149,13 @@ export async function generate(options: GenerateOptions) {
const file = fs.readFileSync(filePath, "utf-8");
const abiRegex = /GENERATED_ABI = \{.*\};\n\n/s;
const contractAbis = metadata.reduce((acc, contract) => {
acc[contract.address] = contract.metadata.abi;
return acc;
}, {} as Record<string, any>);
const contractAbis = metadata.reduce(
(acc, contract) => {
acc[contract.address] = contract.metadata.abi;
return acc;
},
{} as Record<string, any>,
);
const updatedAbis = JSON.stringify(contractAbis, null, 2);
const updatedFile = file.replace(
abiRegex,
@@ -169,10 +174,13 @@ export async function generate(options: GenerateOptions) {
const file = fs.readFileSync(typeFilePath, "utf-8");
const abiRegex = /GENERATED_ABI: \{.*\}/s;
const contractAbis = metadata.reduce((acc, contract) => {
acc[contract.address] = contract.metadata.abi;
return acc;
}, {} as Record<string, any>);
const contractAbis = metadata.reduce(
(acc, contract) => {
acc[contract.address] = contract.metadata.abi;
return acc;
},
{} as Record<string, any>,
);
const updatedAbis = JSON.stringify(contractAbis, null, 2);
const updatedFile = file.replace(abiRegex, `GENERATED_ABI: ${updatedAbis}`);
fs.writeFileSync(typeFilePath, updatedFile);
+295 -235
View File
@@ -1,235 +1,295 @@
// Import required dependencies
import { existsSync, readFileSync } from "fs";
import ora from "ora";
import inquirer from "inquirer";
// Import project dependencies
import detectFramework from "../core/detection/detectFramework";
import detectPackageManager from "../core/detection/detectPackageManager";
import detectLibrary from "../core/detection/detectLibrary";
import { ContractLibrariesType, contractLibraries } from "../core/types/ProjectType";
import { checkIfBrowniePackageIsInstalled, getDependenciesForFoundry, getDependenciesForGo, getDependenciesForPython, installOrUpdate, parsePackageJson, processAppType, processContractAppType } from "../lib/utils";
import { logger } from "../core/helpers/logger";
// Define excluded dependencies
const EXCLUDED_DEPENDENCIES = ["@thirdweb-dev/chain-icons"];
export async function install(projectPath = ".", options: any) {
const debug = options.debug || false;
let installer;
let updater;
// Initialize all dependencies.
let jsDependencies: { [key: string]: string } | string[] = {};
let jsDevDependencies: { [key: string]: string } | string[] = {};
let pythonDependencies: string[] = [];
let pythonDevDependencies: string[] = [];
let peerDependencies: { [key: string]: string } = {};
let goDependencies: { name: string; version: string }[] = [];
const thirdwebDepsToInstall = new Set<string>();
const otherDeps = new Set<string>();
// Initialize brownie and foundry checks
let thirdwebExistsInBrownie = { package: "", exists: false };
let thirdwebExistsInFoundry = false;
// Detect the package manager, and framework used in the project
const detectedPackageManager = await detectPackageManager(projectPath, options);
const detectedFramework = await detectFramework(projectPath, options, detectedPackageManager);
const detectedLibrary = await detectLibrary(projectPath, options, detectedPackageManager);
// Determine project type
const detectedAppType = detectedFramework !== "none" ? contractLibraries.includes(detectedFramework as ContractLibrariesType) ? "contract" : "app" : "app";
// Identify which specific package manager is used
const isBrowniePackageManager = detectedPackageManager === "brownie";
const isFoundryPackageManager = detectedPackageManager === "foundry";
const isGoPackageManager = detectedPackageManager === "go-modules";
const isPythonPackageManager = ["pip", "pipenv", "poetry"].includes(detectedPackageManager);
const isJSPackageManager = ["yarn", "pnpm", "npm"].includes(detectedPackageManager);
// Processing JS/TS dependencies
if (isJSPackageManager) {
let packageJson;
const packageJsonPath = projectPath + "/package.json";
// Check if package.json exists
if (!existsSync(packageJsonPath)) {
console.error(
"No package.json file found. Please run this command in the root of your project."
);
return;
}
// Parse package.json
packageJson = readFileSync(packageJsonPath);
const parsedJSDeps = parsePackageJson(packageJson);
jsDependencies = parsedJSDeps.dependencies;
jsDevDependencies = parsedJSDeps.devDependencies;
peerDependencies = parsedJSDeps.peerDependencies;
}
// Processing Python dependencies
if (isPythonPackageManager) {
const pythonDeps = getDependenciesForPython(projectPath, detectedPackageManager);
pythonDependencies = pythonDeps.dependencies;
pythonDevDependencies = pythonDeps.devDependencies;
}
// Processing Brownie dependencies
if (isBrowniePackageManager) {
const regex = /\s*thirdweb-dev\/contracts@\d+\.\d+\.\d+/g;
const res = await checkIfBrowniePackageIsInstalled(regex);
thirdwebExistsInBrownie = res;
}
// Processing Foundry dependencies
if (isFoundryPackageManager) {
const exists = await getDependenciesForFoundry(projectPath, "thirdweb-contracts");
thirdwebExistsInFoundry = exists;
}
// Processing Go dependencies
if (isGoPackageManager) {
const deps = getDependenciesForGo(projectPath);
goDependencies = deps;
}
const hasEthers =
!!jsDependencies?.ethers ||
!!jsDevDependencies?.ethers;
const version = !isJSPackageManager ? "" :
options.dev
? "@dev"
: options.nightly
? "@nightly" : "";
const thirdwebDepsToUpdate = new Set<string>(
[
...Object.keys(jsDependencies).filter((dep) =>
dep.startsWith("@thirdweb-dev/"),
),
...Object.keys(jsDevDependencies).filter((dep) =>
dep.startsWith("@thirdweb-dev/"),
),
...Object.keys(peerDependencies).filter((dep) =>
dep.startsWith("@thirdweb-dev/"),
),
...pythonDependencies
.filter((dep) => dep.startsWith("thirdweb-sdk"))
.map((dep) => dep.split('==')[0]),
...pythonDevDependencies
.filter((dep) => dep.startsWith("thirdweb-sdk"))
.map((dep) => dep.split('==')[0]),
...goDependencies
.filter((dep) => {
console.log('dep', dep)
return dep.name === "github.com/thirdweb-dev/go-sdk/v2"
})
.map((dep) => dep.name),
].concat(thirdwebExistsInBrownie.exists ? [thirdwebExistsInBrownie.package] : [])
.concat(thirdwebExistsInFoundry ? ["lib/thirdweb-contracts"] : [])
);
// Figure out which dependencies to install and which to update.
if (detectedAppType === "contract") {
processContractAppType({ detectedPackageManager, thirdwebDepsToUpdate, thirdwebDepsToInstall, isJSPackageManager })
} else if (detectedAppType === "app") {
processAppType({
detectedLibrary,
detectedFramework,
hasEthers,
isGoPackageManager,
isJSPackageManager,
isPythonPackageManager,
otherDeps,
thirdwebDepsToInstall,
thirdwebDepsToUpdate,
})
}
// remove exluded dependencies
EXCLUDED_DEPENDENCIES.forEach((excludedDep) => {
thirdwebDepsToUpdate.delete(excludedDep);
thirdwebDepsToInstall.delete(excludedDep);
});
// Ask which dependencies to install
if (thirdwebDepsToInstall.size !== 0) {
const answer = await inquirer.prompt({
type: "checkbox",
choices: [...thirdwebDepsToInstall],
message: "Which thirdweb dependencies would you like to install?",
name: "dependencies",
default: [...thirdwebDepsToInstall],
});
if (answer.dependencies.length !== thirdwebDepsToInstall.size) {
thirdwebDepsToInstall.clear();
answer.dependencies.forEach((dep: string) => thirdwebDepsToInstall.add(dep));
}
}
// Ask which dependencies to update
if (thirdwebDepsToUpdate.size !== 0) {
const answer = await inquirer.prompt({
type: "checkbox",
choices: [...thirdwebDepsToUpdate],
message: "Which thirdweb dependencies would you like to update?",
name: "dependencies",
default: [...thirdwebDepsToUpdate],
});
if (answer.dependencies.length !== thirdwebDepsToUpdate.size) {
thirdwebDepsToUpdate.clear();
answer.dependencies.forEach((dep: string) => thirdwebDepsToUpdate.add(dep));
}
}
if (thirdwebDepsToInstall.size === 0 && thirdwebDepsToUpdate.size === 0) {
console.log("No thirdweb dependencies to install or update.");
return;
}
if (debug) {
logger.info("Detected package manager: " + detectedPackageManager);
logger.info("Detected library: " + detectedLibrary);
logger.info("Detected framework: " + detectedFramework);
logger.info("Detected app type: " + detectedAppType);
}
try {
const dependenciesToAdd = [
...[...thirdwebDepsToInstall].map((dep) => `${dep}${version}`),
...otherDeps,
];
const dependenciesToUpdate = [...thirdwebDepsToUpdate].map(
(dep) => `${dep}${version}`,
)
if (thirdwebDepsToInstall.size !== 0) {
installer = ora(
`Installing: "${[...thirdwebDepsToInstall].join('", "')}"`,
).start();
await installOrUpdate(detectedPackageManager, dependenciesToAdd, [], "install", { oldVersion: thirdwebExistsInBrownie.package, debug });
installer?.succeed(`Installed: "${dependenciesToAdd.join('", "')}"`);
}
if (thirdwebDepsToUpdate.size !== 0) {
updater = ora(
`Updating: "${[...thirdwebDepsToUpdate].join('", "')}"`,
).start();
await installOrUpdate(detectedPackageManager, [], dependenciesToUpdate, "update", {
debug,
});
updater?.succeed(`Updated: "${dependenciesToUpdate.join('", "')}"`);
}
} catch (err) {
console.error("Can't install within project: ", err);
return Promise.reject("Can't install within project");
}
}
// Import required dependencies
import { existsSync, readFileSync } from "fs";
import ora from "ora";
import inquirer from "inquirer";
// Import project dependencies
import detectFramework from "../core/detection/detectFramework";
import detectPackageManager from "../core/detection/detectPackageManager";
import detectLibrary from "../core/detection/detectLibrary";
import {
ContractLibrariesType,
contractLibraries,
} from "../core/types/ProjectType";
import {
checkIfBrowniePackageIsInstalled,
getDependenciesForFoundry,
getDependenciesForGo,
getDependenciesForPython,
installOrUpdate,
parsePackageJson,
processAppType,
processContractAppType,
} from "../lib/utils";
import { logger } from "../core/helpers/logger";
// Define excluded dependencies
const EXCLUDED_DEPENDENCIES = ["@thirdweb-dev/chain-icons"];
export async function install(projectPath = ".", options: any) {
const debug = options.debug || false;
let installer;
let updater;
// Initialize all dependencies.
let jsDependencies: { [key: string]: string } | string[] = {};
let jsDevDependencies: { [key: string]: string } | string[] = {};
let pythonDependencies: string[] = [];
let pythonDevDependencies: string[] = [];
let peerDependencies: { [key: string]: string } = {};
let goDependencies: { name: string; version: string }[] = [];
const thirdwebDepsToInstall = new Set<string>();
const otherDeps = new Set<string>();
// Initialize brownie and foundry checks
let thirdwebExistsInBrownie = { package: "", exists: false };
let thirdwebExistsInFoundry = false;
// Detect the package manager, and framework used in the project
const detectedPackageManager = await detectPackageManager(
projectPath,
options,
);
const detectedFramework = await detectFramework(
projectPath,
options,
detectedPackageManager,
);
const detectedLibrary = await detectLibrary(
projectPath,
options,
detectedPackageManager,
);
// Determine project type
const detectedAppType =
detectedFramework !== "none"
? contractLibraries.includes(detectedFramework as ContractLibrariesType)
? "contract"
: "app"
: "app";
// Identify which specific package manager is used
const isBrowniePackageManager = detectedPackageManager === "brownie";
const isFoundryPackageManager = detectedPackageManager === "foundry";
const isGoPackageManager = detectedPackageManager === "go-modules";
const isPythonPackageManager = ["pip", "pipenv", "poetry"].includes(
detectedPackageManager,
);
const isJSPackageManager = ["yarn", "pnpm", "npm"].includes(
detectedPackageManager,
);
// Processing JS/TS dependencies
if (isJSPackageManager) {
let packageJson;
const packageJsonPath = projectPath + "/package.json";
// Check if package.json exists
if (!existsSync(packageJsonPath)) {
console.error(
"No package.json file found. Please run this command in the root of your project.",
);
return;
}
// Parse package.json
packageJson = readFileSync(packageJsonPath);
const parsedJSDeps = parsePackageJson(packageJson);
jsDependencies = parsedJSDeps.dependencies;
jsDevDependencies = parsedJSDeps.devDependencies;
peerDependencies = parsedJSDeps.peerDependencies;
}
// Processing Python dependencies
if (isPythonPackageManager) {
const pythonDeps = getDependenciesForPython(
projectPath,
detectedPackageManager,
);
pythonDependencies = pythonDeps.dependencies;
pythonDevDependencies = pythonDeps.devDependencies;
}
// Processing Brownie dependencies
if (isBrowniePackageManager) {
const regex = /\s*thirdweb-dev\/contracts@\d+\.\d+\.\d+/g;
const res = await checkIfBrowniePackageIsInstalled(regex);
thirdwebExistsInBrownie = res;
}
// Processing Foundry dependencies
if (isFoundryPackageManager) {
const exists = await getDependenciesForFoundry(
projectPath,
"thirdweb-contracts",
);
thirdwebExistsInFoundry = exists;
}
// Processing Go dependencies
if (isGoPackageManager) {
const deps = getDependenciesForGo(projectPath);
goDependencies = deps;
}
const hasEthers = !!jsDependencies?.ethers || !!jsDevDependencies?.ethers;
const version = !isJSPackageManager
? ""
: options.dev
? "@dev"
: options.nightly
? "@nightly"
: "";
const thirdwebDepsToUpdate = new Set<string>(
[
...Object.keys(jsDependencies).filter((dep) =>
dep.startsWith("@thirdweb-dev/"),
),
...Object.keys(jsDevDependencies).filter((dep) =>
dep.startsWith("@thirdweb-dev/"),
),
...Object.keys(peerDependencies).filter((dep) =>
dep.startsWith("@thirdweb-dev/"),
),
...pythonDependencies
.filter((dep) => dep.startsWith("thirdweb-sdk"))
.map((dep) => dep.split("==")[0]),
...pythonDevDependencies
.filter((dep) => dep.startsWith("thirdweb-sdk"))
.map((dep) => dep.split("==")[0]),
...goDependencies
.filter((dep) => {
console.log("dep", dep);
return dep.name === "github.com/thirdweb-dev/go-sdk/v2";
})
.map((dep) => dep.name),
]
.concat(
thirdwebExistsInBrownie.exists ? [thirdwebExistsInBrownie.package] : [],
)
.concat(thirdwebExistsInFoundry ? ["lib/thirdweb-contracts"] : []),
);
// Figure out which dependencies to install and which to update.
if (detectedAppType === "contract") {
processContractAppType({
detectedPackageManager,
thirdwebDepsToUpdate,
thirdwebDepsToInstall,
isJSPackageManager,
});
} else if (detectedAppType === "app") {
processAppType({
detectedLibrary,
detectedFramework,
hasEthers,
isGoPackageManager,
isJSPackageManager,
isPythonPackageManager,
otherDeps,
thirdwebDepsToInstall,
thirdwebDepsToUpdate,
});
}
// remove exluded dependencies
EXCLUDED_DEPENDENCIES.forEach((excludedDep) => {
thirdwebDepsToUpdate.delete(excludedDep);
thirdwebDepsToInstall.delete(excludedDep);
});
// Ask which dependencies to install
if (thirdwebDepsToInstall.size !== 0) {
const answer = await inquirer.prompt({
type: "checkbox",
choices: [...thirdwebDepsToInstall],
message: "Which thirdweb dependencies would you like to install?",
name: "dependencies",
default: [...thirdwebDepsToInstall],
});
if (answer.dependencies.length !== thirdwebDepsToInstall.size) {
thirdwebDepsToInstall.clear();
answer.dependencies.forEach((dep: string) =>
thirdwebDepsToInstall.add(dep),
);
}
}
// Ask which dependencies to update
if (thirdwebDepsToUpdate.size !== 0) {
const answer = await inquirer.prompt({
type: "checkbox",
choices: [...thirdwebDepsToUpdate],
message: "Which thirdweb dependencies would you like to update?",
name: "dependencies",
default: [...thirdwebDepsToUpdate],
});
if (answer.dependencies.length !== thirdwebDepsToUpdate.size) {
thirdwebDepsToUpdate.clear();
answer.dependencies.forEach((dep: string) =>
thirdwebDepsToUpdate.add(dep),
);
}
}
if (thirdwebDepsToInstall.size === 0 && thirdwebDepsToUpdate.size === 0) {
console.log("No thirdweb dependencies to install or update.");
return;
}
if (debug) {
logger.info("Detected package manager: " + detectedPackageManager);
logger.info("Detected library: " + detectedLibrary);
logger.info("Detected framework: " + detectedFramework);
logger.info("Detected app type: " + detectedAppType);
}
try {
const dependenciesToAdd = [
...[...thirdwebDepsToInstall].map((dep) => `${dep}${version}`),
...otherDeps,
];
const dependenciesToUpdate = [...thirdwebDepsToUpdate].map(
(dep) => `${dep}${version}`,
);
if (thirdwebDepsToInstall.size !== 0) {
installer = ora(
`Installing: "${[...thirdwebDepsToInstall].join('", "')}"`,
).start();
await installOrUpdate(
detectedPackageManager,
dependenciesToAdd,
[],
"install",
{ oldVersion: thirdwebExistsInBrownie.package, debug },
);
installer?.succeed(`Installed: "${dependenciesToAdd.join('", "')}"`);
}
if (thirdwebDepsToUpdate.size !== 0) {
updater = ora(
`Updating: "${[...thirdwebDepsToUpdate].join('", "')}"`,
).start();
await installOrUpdate(
detectedPackageManager,
[],
dependenciesToUpdate,
"update",
{
debug,
},
);
updater?.succeed(`Updated: "${dependenciesToUpdate.join('", "')}"`);
}
} catch (err) {
console.error("Can't install within project: ", err);
return Promise.reject("Can't install within project");
}
}
+29 -3
View File
@@ -1,11 +1,15 @@
import { FrameworkType, LibraryType, PackageManagerType } from "../core/types/ProjectType";
import {
FrameworkType,
LibraryType,
PackageManagerType,
} from "../core/types/ProjectType";
export type IProcessContractAppTypeArgs = {
detectedPackageManager: PackageManagerType;
thirdwebDepsToUpdate: Set<string>;
thirdwebDepsToInstall: Set<string>;
isJSPackageManager: boolean;
}
};
export type IProcessAppTypeArgs = {
detectedLibrary: LibraryType;
@@ -17,4 +21,26 @@ export type IProcessAppTypeArgs = {
isGoPackageManager: boolean;
hasEthers: boolean;
otherDeps: Set<string>;
}
};
export type ApiKey = {
id: string;
key: string;
walletAddresses: string[];
domains: string[];
services?: [
{
name: string;
targetAddresses: string[];
},
];
};
export type ApiResponse = {
data: ApiKey | null;
error: {
code: string;
statusCode: number;
message: string;
};
};
+107 -43
View File
@@ -7,19 +7,21 @@ import { IProcessAppTypeArgs, IProcessContractAppTypeArgs } from "./types";
export function convertDependenciesToStringFormat(dependenciesObject: object) {
return Object.entries(dependenciesObject).map(([pkg, versionDetails]) => {
let version = '';
if (typeof versionDetails === 'string') {
let version = "";
if (typeof versionDetails === "string") {
version = versionDetails;
} else if (typeof versionDetails === 'object') {
} else if (typeof versionDetails === "object") {
version = versionDetails.version;
}
// Replace '^' with nothing as '^' is not a valid version specifier in Python
version = version.replace('^', '');
version = version.replace("^", "");
return `${pkg}==${version}`;
});
}
export const parsePackageJson = (packageJson: Buffer): {
export const parsePackageJson = (
packageJson: Buffer,
): {
dependencies: {
[key: string]: string;
};
@@ -55,10 +57,9 @@ export const parsePipFile = (PipFile: string) => {
export const parsePyProjectToml = (pyProjectToml: string) => {
const pyProjectFile = toml.parse(pyProjectToml) as any;
const dependencies =
(pyProjectFile["tool"]["poetry"]["dependencies"]) || [];
const dependencies = pyProjectFile["tool"]["poetry"]["dependencies"] || [];
const devDependencies =
(pyProjectFile["tool"]["poetry"]["dev-dependencies"]) || [];
pyProjectFile["tool"]["poetry"]["dev-dependencies"] || [];
return {
dependencies: convertDependenciesToStringFormat(dependencies),
@@ -150,20 +151,26 @@ export const getDependenciesForPython = (
export const getLatestVersion = async (packageName: string): Promise<any> => {
try {
const fetch = (await import('node-fetch')).default;
const url = `https://registry.npmjs.org/${packageName}`
const fetch = (await import("node-fetch")).default;
const url = `https://registry.npmjs.org/${packageName}`;
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data: any = await response.json();
return data['dist-tags']['latest'];
return data["dist-tags"]["latest"];
} catch (error) {
console.error(`Failed to get latest version of ${packageName}:`, error);
}
}
};
export const installOrUpdate = async (packageManager: PackageManagerType, dependenciesToAdd: string[], dependenciesToUpdate: string[], typeOfAction: "install" | "update", options?: { oldVersion?: string, debug?: boolean }) => {
export const installOrUpdate = async (
packageManager: PackageManagerType,
dependenciesToAdd: string[],
dependenciesToUpdate: string[],
typeOfAction: "install" | "update",
options?: { oldVersion?: string; debug?: boolean },
) => {
let runner: string = "";
let installCommand: string[] = [];
let updateCommand: string[] = [];
@@ -174,7 +181,7 @@ export const installOrUpdate = async (packageManager: PackageManagerType, depend
case "npm":
runner = "npm";
installCommand = ["install"];
updateCommand = ["install", "--legacy-peer-deps"]
updateCommand = ["install", "--legacy-peer-deps"];
break;
case "yarn":
runner = "yarn";
@@ -208,9 +215,9 @@ export const installOrUpdate = async (packageManager: PackageManagerType, depend
break;
case "brownie":
runner = "brownie";
installCommand = ["pm", "install"]
updateCommand = ["pm", "update"]
deleteCommand = ["pm", "delete"]
installCommand = ["pm", "install"];
updateCommand = ["pm", "update"];
deleteCommand = ["pm", "delete"];
break;
case "foundry":
runner = "forge";
@@ -223,17 +230,25 @@ export const installOrUpdate = async (packageManager: PackageManagerType, depend
}
if (typeOfAction === "install") {
if (!dependenciesToAdd.length) { return; }
if (!dependenciesToAdd.length) {
return;
}
const commands = [...installCommand, ...dependenciesToAdd];
await runCommand(runner, commands, printLogs);
if (options?.oldVersion) {
await runCommand(runner, [...deleteCommand, options.oldVersion], printLogs);
await runCommand(
runner,
[...deleteCommand, options.oldVersion],
printLogs,
);
}
}
if (typeOfAction === "update") {
if (!dependenciesToUpdate.length) { return; }
if (!dependenciesToUpdate.length) {
return;
}
const commands = [...updateCommand, ...dependenciesToUpdate];
await runCommand(runner, commands, printLogs);
}
@@ -259,13 +274,16 @@ export const getDependenciesForBrownie = async () => {
let deps = "";
await runCommand("brownie", ["pm", "list"], true, (data) => {
deps += data.toString();
})
});
// strip out colors from output
deps = deps.replace(/\u001b\[\d+(;\d+)*m/g, '');
deps = deps.replace(/\u001b\[\d+(;\d+)*m/g, "");
return deps;
};
export const getDependenciesForFoundry = async (filePath: string, libName: string) => {
export const getDependenciesForFoundry = async (
filePath: string,
libName: string,
) => {
const fullPath = path.join(filePath, "lib", libName);
return existsSync(fullPath);
};
@@ -275,15 +293,14 @@ type GoModule = {
version: string;
};
export const getDependenciesForGo = (filePath: string): GoModule[] => {
const content = readFileSync(filePath + "/go.mod", "utf-8");
const lines = content.split("\n");
const modules: GoModule[] = [];
for (const line of lines) {
if (line.includes('github.com/thirdweb-dev')) {
const words = line.split(/\s+/); // split on any amount of whitespace
if (line.includes("github.com/thirdweb-dev")) {
const words = line.split(/\s+/); // split on any amount of whitespace
const name = words[1].trim();
const version = words[2];
modules.push({ name, version });
@@ -291,10 +308,17 @@ export const getDependenciesForGo = (filePath: string): GoModule[] => {
}
return modules;
}
};
export const processContractAppType = async (args: IProcessContractAppTypeArgs): Promise<void> => {
const { detectedPackageManager, thirdwebDepsToUpdate, thirdwebDepsToInstall, isJSPackageManager } = args;
export const processContractAppType = async (
args: IProcessContractAppTypeArgs,
): Promise<void> => {
const {
detectedPackageManager,
thirdwebDepsToUpdate,
thirdwebDepsToInstall,
isJSPackageManager,
} = args;
if (isJSPackageManager) {
if (!thirdwebDepsToUpdate.has(`@thirdweb-dev/contracts`)) {
@@ -303,15 +327,29 @@ export const processContractAppType = async (args: IProcessContractAppTypeArgs):
}
if (detectedPackageManager === "brownie") {
const latestThirdwebContractVersion = await getLatestVersion("@thirdweb-dev/contracts");
const latestThirdwebContractVersion = await getLatestVersion(
"@thirdweb-dev/contracts",
);
// Exit out early if the user already has the latest version of thirdweb installed.
if (thirdwebDepsToUpdate.has(`thirdweb-dev/contracts@${latestThirdwebContractVersion}`)) {
return Promise.reject("You already have the latest version of thirdweb-dev/contracts installed.");
if (
thirdwebDepsToUpdate.has(
`thirdweb-dev/contracts@${latestThirdwebContractVersion}`,
)
) {
return Promise.reject(
"You already have the latest version of thirdweb-dev/contracts installed.",
);
}
if (!thirdwebDepsToUpdate.has(`thirdweb-dev/contracts@${latestThirdwebContractVersion}`)) {
thirdwebDepsToInstall.add(`thirdweb-dev/contracts@${latestThirdwebContractVersion}`);
if (
!thirdwebDepsToUpdate.has(
`thirdweb-dev/contracts@${latestThirdwebContractVersion}`,
)
) {
thirdwebDepsToInstall.add(
`thirdweb-dev/contracts@${latestThirdwebContractVersion}`,
);
}
}
@@ -322,8 +360,20 @@ export const processContractAppType = async (args: IProcessContractAppTypeArgs):
}
};
export const processAppType = async (args: IProcessAppTypeArgs): Promise<void> => {
const { detectedFramework, thirdwebDepsToUpdate, thirdwebDepsToInstall, hasEthers, isJSPackageManager, otherDeps, isPythonPackageManager, isGoPackageManager, detectedLibrary } = args;
export const processAppType = async (
args: IProcessAppTypeArgs,
): Promise<void> => {
const {
detectedFramework,
thirdwebDepsToUpdate,
thirdwebDepsToInstall,
hasEthers,
isJSPackageManager,
otherDeps,
isPythonPackageManager,
isGoPackageManager,
detectedLibrary,
} = args;
const reactlibs = [
"react",
@@ -335,21 +385,35 @@ export const processAppType = async (args: IProcessAppTypeArgs): Promise<void> =
"vue",
"vite",
"svelte",
]
const shouldInstallThirdwebReact = reactlibs.includes(detectedFramework as string);
];
const shouldInstallThirdwebReact = reactlibs.includes(
detectedFramework as string,
);
const shouldInstallThirdwebReactNative = detectedLibrary === "react-native";
if (isJSPackageManager) {
if (!thirdwebDepsToUpdate.has(`@thirdweb-dev/react`) && shouldInstallThirdwebReact) {
if (
!thirdwebDepsToUpdate.has(`@thirdweb-dev/react`) &&
shouldInstallThirdwebReact
) {
thirdwebDepsToInstall.add(`@thirdweb-dev/react`);
}
if (!thirdwebDepsToUpdate.has(`@thirdweb-dev/sdk`) && !shouldInstallThirdwebReactNative) {
if (
!thirdwebDepsToUpdate.has(`@thirdweb-dev/sdk`) &&
!shouldInstallThirdwebReactNative
) {
thirdwebDepsToInstall.add(`@thirdweb-dev/sdk`);
}
if (!thirdwebDepsToUpdate.has(`@thirdweb-dev/react-native`) && shouldInstallThirdwebReactNative) {
if (
!thirdwebDepsToUpdate.has(`@thirdweb-dev/react-native`) &&
shouldInstallThirdwebReactNative
) {
thirdwebDepsToInstall.add(`@thirdweb-dev/react-native`);
}
if (!thirdwebDepsToUpdate.has(`@thirdweb-dev/react-native-compat`) && shouldInstallThirdwebReactNative) {
if (
!thirdwebDepsToUpdate.has(`@thirdweb-dev/react-native-compat`) &&
shouldInstallThirdwebReactNative
) {
thirdwebDepsToInstall.add(`@thirdweb-dev/react-native-compat`);
}
if (!hasEthers) {
@@ -368,4 +432,4 @@ export const processAppType = async (args: IProcessAppTypeArgs): Promise<void> =
thirdwebDepsToInstall.add("github.com/thirdweb-dev/go-sdk/v2");
}
}
};
};
+14 -4
View File
@@ -51,9 +51,14 @@ export async function upload(
const spin = spinner(
"Uploading directory to IPFS. This may take a while depending on file sizes.",
);
const uris = await storage.uploadBatch(files);
spin.succeed("Successfully uploaded directory to IPFS");
uri = uris[0].substring(0, uris[0].lastIndexOf("/"));
try {
const uris = await storage.uploadBatch(files);
spin.succeed("Successfully uploaded directory to IPFS");
uri = uris[0].substring(0, uris[0].lastIndexOf("/"));
} catch (err) {
spin.fail("Failed to upload directory to IPFS.");
return Promise.reject(err);
}
} else if (fileType.isFile()) {
const fileName = path.parse(uploadPath).base;
const fileData = fs.readFileSync(uploadPath);
@@ -62,7 +67,12 @@ export async function upload(
const spin = spinner(
"Uploading file to IPFS. This may take a while depending on file sizes.",
);
uri = await storage.upload(file, { uploadWithoutDirectory: true });
try {
uri = await storage.upload(file, { uploadWithoutDirectory: true });
} catch (err) {
spin.fail("Failed to upload file to IPFS.");
return Promise.reject(err);
}
spin.succeed("Successfully uploaded file to IPFS.");
} else {
return Promise.reject("Invalid path provided");
+111
View File
@@ -1,5 +1,116 @@
# @thirdweb-dev/react-core
## 3.14.20
### Patch Changes
- Updated dependencies [[`7cb55e70`](https://github.com/thirdweb-dev/js/commit/7cb55e7051617268bba1b80146865c606ff6e66d)]:
- @thirdweb-dev/chains@0.1.38
- @thirdweb-dev/sdk@3.10.40
- @thirdweb-dev/wallets@1.1.3
## 3.14.19
### Patch Changes
- Updated dependencies [[`d665954f`](https://github.com/thirdweb-dev/js/commit/d665954fee0554985055bf06abbed8d7b8d5bc38)]:
- @thirdweb-dev/chains@0.1.37
- @thirdweb-dev/sdk@3.10.39
- @thirdweb-dev/wallets@1.1.2
## 3.14.18
### Patch Changes
- Updated dependencies [[`02ab92cc`](https://github.com/thirdweb-dev/js/commit/02ab92cc5c97f475e3b5642e5a7bdbe63ca136ee), [`6cc4b8d2`](https://github.com/thirdweb-dev/js/commit/6cc4b8d28b982c5be3e1cd17d2a9a947001d1608)]:
- @thirdweb-dev/chains@0.1.36
- @thirdweb-dev/sdk@3.10.38
- @thirdweb-dev/wallets@1.1.1
## 3.14.17
### Patch Changes
- [#1316](https://github.com/thirdweb-dev/js/pull/1316) [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b) Thanks [@iketw](https://github.com/iketw)! - Adds new `clientId` prop to access thirdweb's services.
You can create a _free_ `clientId` [on the thirdweb Dashboard](https://thirdweb.com/dashboard)
```javascript
<ThirdwebProvider clientId="your-client-id" />
```
- Updated dependencies [[`44dbf283`](https://github.com/thirdweb-dev/js/commit/44dbf283c985f3e2ecbeb1cfdf09fe1d84e26298), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b), [`d8447146`](https://github.com/thirdweb-dev/js/commit/d8447146092c1962f410155ab2047225453aaa2b)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.16
### Patch Changes
- [#1356](https://github.com/thirdweb-dev/js/pull/1356) [`7a6534d1`](https://github.com/thirdweb-dev/js/commit/7a6534d1a98cab1eb47cf88d13e2b7ec04037e42) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Fix useOwnedNFT enabled state
- Updated dependencies [[`dac8fa7d`](https://github.com/thirdweb-dev/js/commit/dac8fa7d98b6952acf8d13e173099889c1d47da8), [`c5761b99`](https://github.com/thirdweb-dev/js/commit/c5761b99e9797772481506e90cbfa5c35a05bd1d), [`b96a2282`](https://github.com/thirdweb-dev/js/commit/b96a2282730582b684cc96802649a96851af5220)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.15
### Patch Changes
- Updated dependencies [[`8dd7540c`](https://github.com/thirdweb-dev/js/commit/8dd7540c455aa70534f6d29986537592fd12169b), [`8dd7540c`](https://github.com/thirdweb-dev/js/commit/8dd7540c455aa70534f6d29986537592fd12169b)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.14
### Patch Changes
- Updated dependencies [[`0407b2c2`](https://github.com/thirdweb-dev/js/commit/0407b2c2f39b5f3fa06e613e671623b5644b3a28)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.13
### Patch Changes
- Updated dependencies [[`a9093bcf`](https://github.com/thirdweb-dev/js/commit/a9093bcf287c01e3335fd780e2ccbfdb3380bf95)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.12
### Patch Changes
- Updated dependencies [[`4393b228`](https://github.com/thirdweb-dev/js/commit/4393b2280505fd0b2284555d64eae6567e8401a5)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.11
### Patch Changes
- Updated dependencies [[`40682191`](https://github.com/thirdweb-dev/js/commit/40682191450de08ad40b9d2957afced248657af2)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.10
### Patch Changes
- Updated dependencies [[`db68bd04`](https://github.com/thirdweb-dev/js/commit/db68bd04cd8bb3ee6bff051d1d5b5a872353fde0), [`fd74d791`](https://github.com/thirdweb-dev/js/commit/fd74d7918072cda03b52f852ebb3f8dccb84074d), [`35f20ceb`](https://github.com/thirdweb-dev/js/commit/35f20ceb4f943e95d9566105096f06412978da7a)]:
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
- @thirdweb-dev/[email protected]
## 3.14.9
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-core",
"version": "3.14.9",
"version": "3.14.20",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-core",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -84,7 +84,7 @@
"@types/react": "^18.2.14",
"@typescript-eslint/eslint-plugin": "^5.60.1",
"@typescript-eslint/parser": "^5.60.1",
"eslint": "^8.43.0",
"eslint": "^8.45.0",
"eslint-config-prettier": "^8.8.0",
"eslint-config-thirdweb": "workspace:*",
"eslint-plugin-better-tree-shaking": "0.0.3",
@@ -93,7 +93,7 @@
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-tsdoc": "^0.2.16",
"ethers": "^5.7.2",
"prettier": "^2.8.8",
"prettier": "^3.0.0",
"react": "^18.2.0",
"typescript": "^5.1.6"
},
@@ -1 +1 @@
export const AUTH_TOKEN_STORAGE_KEY = "auth_token_storage_key";
export const AUTH_TOKEN_STORAGE_KEY = "auth_token_storage_key";
@@ -1,2 +0,0 @@
export const DEFAULT_API_KEY =
"fb52f0ca630bdd02f0d5210d9e8e3568272ac765dd0709272918eefb29d3ac9e";
@@ -1,5 +1,5 @@
import { ThirdwebAuthProvider } from "../../evm/contexts/ThirdwebAuthProvider";
import { useUpdateChainsWithApiKeys } from "../../evm/hooks/chain-hooks";
import { useUpdateChainsWithClientId } from "../../evm/hooks/chain-hooks";
import { ThirdwebSDKProvider } from "../../evm/providers/thirdweb-sdk-provider";
import { ThirdwebSDKProviderProps } from "../../evm/providers/types";
import { WalletConfig } from "../types/wallet";
@@ -106,12 +106,10 @@ export const ThirdwebProviderCore = <TChains extends Chain[]>({
}, [props.supportedChains, activeChain]);
const [supportedChainsWithKey, activeChainIdOrObjWithKey] =
useUpdateChainsWithApiKeys(
useUpdateChainsWithClientId(
supportedChainsNonNull,
props.activeChain || supportedChainsNonNull[0],
props.thirdwebApiKey,
props.alchemyApiKey,
props.infuraApiKey,
props.clientId,
);
const activeChainWithKey = useMemo(() => {
@@ -155,6 +153,7 @@ export const ThirdwebProviderCore = <TChains extends Chain[]>({
activeChain={activeChainWithKey}
autoSwitch={props.autoSwitch}
autoConnectTimeout={props.autoConnectTimeout}
clientId={props.clientId}
>
<ThirdwebSDKProviderWrapper
queryClient={props.queryClient}
@@ -163,9 +162,7 @@ export const ThirdwebProviderCore = <TChains extends Chain[]>({
activeChain={activeChainWithKey}
storageInterface={props.storageInterface}
authConfig={props.authConfig}
thirdwebApiKey={props.thirdwebApiKey}
alchemyApiKey={props.alchemyApiKey}
infuraApiKey={props.infuraApiKey}
clientId={props.clientId}
>
<ThirdwebAuthProvider value={props.authConfig}>
{props.children}
@@ -1,6 +1,9 @@
import { DAppMetaData } from "../types/dAppMeta";
import type { WalletConfig, WalletInstance } from "../types/wallet";
import { ThirdwebThemeContext } from "./theme-context";
import type {
WalletConfig,
WalletInstance,
WalletOptions,
} from "../types/wallet";
import { Chain } from "@thirdweb-dev/chains";
import {
AbstractClientWallet,
@@ -102,6 +105,7 @@ export function ThirdwebWalletProvider(
chains: Chain[];
autoSwitch?: boolean;
autoConnectTimeout?: number;
clientId?: string;
}>,
) {
const [signer, setSigner] = useState<Signer | undefined>(undefined);
@@ -130,21 +134,14 @@ export function ThirdwebWalletProvider(
// if autoSwitch is enabled - enforce connection to activeChain
const chainToConnect = props.autoSwitch ? props.activeChain : undefined;
const theme = useContext(ThirdwebThemeContext);
const walletParams = useMemo(() => {
const walletChains = props.chains;
const walletOptions = {
chains: walletChains,
dappMetadata: props.dAppMeta,
};
const walletParams: WalletOptions = useMemo(() => {
return {
...walletOptions,
chains: props.chains,
dappMetadata: props.dAppMeta,
chain: props.activeChain || props.chains[0],
theme: theme || "dark",
clientId: props.clientId,
};
}, [props.chains, props.dAppMeta, props.activeChain, theme]);
}, [props.chains, props.dAppMeta, props.activeChain, props.clientId]);
const createWalletInstance = useCallback(
<I extends WalletInstance>(walletConfig: WalletConfig<I>): I => {
@@ -494,7 +491,14 @@ async function getLastConnectedWalletInfo() {
return null;
}
return JSON.parse(str) as LastConnectedWalletInfo;
try {
return JSON.parse(str) as LastConnectedWalletInfo;
} catch {
await lastConnectedWalletStorage.removeItem(
LAST_CONNECTED_WALLET_STORAGE_KEY,
);
return null;
}
}
async function saveLastConnectedWalletInfo(
+3 -10
View File
@@ -1,19 +1,12 @@
import type {
AbstractClientWallet,
Chain,
DAppMetaData,
} from "@thirdweb-dev/wallets";
import type { AbstractClientWallet, Chain } from "@thirdweb-dev/wallets";
import { WalletOptions as WalletOptions_ } from "@thirdweb-dev/wallets";
// these are extra options provided by the react-core package
export type ExtraCoreWalletOptions = {
chain: Chain;
};
export type WalletOptions = {
chains: Chain[];
walletId?: string;
dappMetadata?: DAppMetaData;
} & ExtraCoreWalletOptions;
export type WalletOptions = WalletOptions_<ExtraCoreWalletOptions>;
export type WalletInstance = AbstractClientWallet;
@@ -1,16 +0,0 @@
import { getChainRPCs, ChainRPCOptions, Chain } from "@thirdweb-dev/chains";
/**
*
* use the keys and return a new chain object with updated RPCs
*/
export const updateChainRPCs = (chain: Chain, options: ChainRPCOptions) => {
try {
return {
...chain,
rpc: getChainRPCs(chain, options),
};
} catch (error) {
return chain;
}
};

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