Compare commits

...
Author SHA1 Message Date
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
af21d5be36 Version Packages (#1669)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-10-02 22:55:38 +02:00
Manan TankandGitHub 54f83a5013 [wallets, react] - add signer on ThirdwebProvider (#1637) 2023-10-02 18:49:50 +00:00
6a5bbfd2f5 [RN] Embedded fix textinput onfocus (#1691)
Co-authored-by: ElasticBottle <[email protected]>
2023-09-30 17:24:23 +00:00
Phillip HoandGitHub c5b3232e1a chore: Add usage check for EWS (#1690) 2023-09-30 02:57:22 +00:00
5dc372fc46 [ReactNative] Adds EmbeddedWallet (email) (#1561)
Co-authored-by: ElasticBottle <[email protected]>
2023-09-29 21:51:58 +00:00
Manan TankandGitHub fd378ec3e4 [react] ConnectWallet UI Fixes / Improvements (#1687) 2023-09-29 15:46:27 +00:00
iketwandGitHub 0e27f15eb9 [RN] Same color smart wallet active dot (#1685) 2023-09-28 21:49:42 +00:00
iketwandGitHub 211aab9c16 [RN] UI improvements + ENS support (#1684) 2023-09-28 21:07:18 +00:00
Manan TankandGitHub eb9e9f0ce8 [react] ConnectWallet UI improvements (#1682) 2023-09-28 17:38:29 +00:00
iketwandGitHub bd23cec7d1 [RN] Update guest wallet icon (#1683) 2023-09-28 17:32:57 +00:00
Joaquim VergesandGitHub c7e7ec9502 [SmartWallets] Fix gas estimation for first SW transaction (#1681) 2023-09-28 16:50:33 +00:00
Kien NgoandGitHub 6897ad6502 [SDK] Performance improvement to various function for ERC721 (#1678) 2023-09-28 16:41:09 +00:00
iketwandGitHub ed4172dddf [RN] Small UI improvements (#1680) 2023-09-28 16:20:09 +00:00
Kien NgoandGitHub de05c2da17 [SDK] Add unit test for ERC721 allOwners() (#1679) 2023-09-28 12:33:31 +00:00
Adam MajmudarandGitHub c085d69060 [Wallets] Add support for GCP KMS (#1665) 2023-09-27 23:32:10 +00:00
iketwandGitHub c2bfc77137 Downgrade sdk to patch update (#1677) 2023-09-27 23:17:00 +00:00
iketwandGitHub 81797ffde3 [RN] Minor version bump (#1676) 2023-09-27 21:08:58 +00:00
iketwandGitHub 69e8208538 [RN] Lots of small UI fixes (#1675) 2023-09-27 19:36:00 +00:00
Kien NgoandGitHub ee028e1209 [SDK] Improve data fetching for gas & transaction methods (#1672) 2023-09-27 18:51:24 +00:00
Joaquim VergesandGitHub b16c09df75 [SDK] Fix error waiting for transaction after gasless tx (#1674) 2023-09-27 18:10:00 +00:00
iketwandGitHub 879d4226f6 [CLI] Fix thirdweb create with options (#1673) 2023-09-27 17:00:24 +00:00
83905ef6c6 chore: minor code snippet fix (#1539)
Co-authored-by: Joaquim Verges <[email protected]>
Co-authored-by: Jonas Daniels <[email protected]>
2023-09-27 17:05:40 +02:00
Joaquim VergesandGitHub f8c8c12ebc [README] add chains to readme table (#1671) 2023-09-27 14:58:48 +00:00
Joaquim VergesandGitHub a9b4b0c5d8 [SDK] Expose proxy resolver helper function (#1670) 2023-09-27 14:44:22 +00:00
Kien NgoandGitHub d28b1c0f1e [SDK] Various improvement to data fetching in some erc721 modules (#1666) 2023-09-27 14:20:44 +00:00
Kien NgoandGitHub 96e832cc80 [SDK] Various improvement to data fetching in erc-20.ts (#1667) 2023-09-27 13:30:22 +00:00
Kien NgoandGitHub bdb2ccc7a6 [SDK] Slight improvement to getContract() (#1668) 2023-09-27 13:28:38 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
e1b05fcea3 Version Packages (#1625)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-09-27 13:49:09 +02:00
Phillip HoandGitHub 426c75a330 refactor: Update cf-worker to use sample rate + Redis (#1657) 2023-09-27 02:49:40 +00:00
Manan TankandGitHub a9854e69ce [react] Fix Img element crashing app on invalid URL (#1664) 2023-09-26 23:23:12 +00:00
FirekeeperandGitHub 2097e233cb [Unity] Add EmbeddedWallet option WebGL (#1663) 2023-09-26 22:12:15 +00:00
c29042b71e [SDK] Update Promise.all (#1660)
Co-authored-by: Jonas Daniels <[email protected]>
2023-09-26 15:08:19 -07:00
Adam MajmudarandGitHub b5b7e5243d [SDK] Add support for prepare to account extension (#1643) 2023-09-26 21:18:51 +00:00
Jonas DanielsandGitHub d5fafddea5 chore(chains): update (#1662) 2023-09-26 20:45:01 +00:00
Joaquim VergesandGitHub b6df6b8957 Fix not resolving custom chain currencies (#1661) 2023-09-26 20:01:25 +00:00
iketwandGitHub 45112a613e [RN] ConnectWalletV3 Details Modal (#1642) 2023-09-26 18:21:50 +00:00
Winston YeoandGitHub ea5b9c3ecd fix(react): show recovery password modal for USER_MANAGED in paperWallet (#1659) 2023-09-26 15:45:08 +00:00
Manan TankandGitHub bd18e4f5ef [react] NetworkSelector component UI tweaks (#1653) 2023-09-25 20:19:56 +00:00
Manan TankandGitHub 1018eb56a6 [react] ConnectWallet V3 updates/fixes (#1650) 2023-09-25 18:27:05 +00:00
Winston YeoandGitHub def6d400ab Winston/fix embedded wallet login type and paperWallet init with USER_MANAGED flow (#1647) 2023-09-25 16:14:51 +00:00
iketwandGitHub 2ce89cfea9 [RN] Update json upload to use new endpoint (#1644) 2023-09-22 13:03:33 +00:00
Adam MajmudarandGitHub 48906a9d8e [SDK] [Bug] Always update network if configured in fromSigner (#1624) 2023-09-22 04:51:47 +00:00
64528263f4 [react] ConnectWallet v3 ( v2 update ) (#1618)
Co-authored-by: ElasticBottle <[email protected]>
2023-09-21 22:52:04 +00:00
iketwandGitHub cbbb8ccbe3 [RN] Coinbase listener only handles Coinbase links (#1632) 2023-09-21 17:26:39 +00:00
Tair AsimandGitHub e2e6bdd4cd service-utils: add embedded wallets to service definitions (#1640) 2023-09-21 10:18:01 +00:00
Phillip HoandGitHub d66ff413de chore: Add platform metrics fields (#1641) 2023-09-21 03:20:07 +00:00
FirekeeperandGitHub 9d553746b0 [Unity] Pass wallets to wc modal from client + avoid throwing on paper init from bridge (#1638) 2023-09-20 17:29:06 +00:00
iketwandGitHub 57af96c288 [RN] Fix json upload (#1635) 2023-09-20 14:52:15 +00:00
Winston YeoandGitHub 94bdcc142a Winston/embeddedWallet polish (#1634) 2023-09-19 22:21:03 +00:00
Jonas DanielsandGitHub dd3d1a87c2 [tooling] faster chains generation (#1631) 2023-09-19 16:14:15 +00:00
4268775f9c Winston/add embedded wallet export for react (#1622)
Co-authored-by: Manan Tank <[email protected]>
2023-09-19 14:58:07 +00:00
Jonas DanielsandGitHub 710739c7d2 [cli] - unlock node 20 (#1628) 2023-09-19 06:38:57 +00:00
Phillip HoandGitHub c54db48c0d fix: try/catch logHttpRequest (#1627) 2023-09-19 01:17:35 +00:00
Tair AsimandGitHub 903145a4ae feat: rate limit worker (#1584) 2023-09-18 22:24:12 +00:00
Winston YeoandGitHub 43f188c8a7 Winston/add embedded wallet connector (#1598) 2023-09-18 20:56:18 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
8a3993d42b Version Packages (#1613)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-09-18 12:13:49 -07:00
Manan TankandGitHub bab39980e7 [react] ConnectWallet minor UI fixes (#1621) 2023-09-18 18:56:07 +00:00
48295c0604 feat(sdk): centralize all blockchain reads via a single entrypoint (#1534)
Co-authored-by: Joaquim Verges <[email protected]>
2023-09-18 17:21:37 +00:00
YashandGitHub 3fd39cea0d Update addresses (#1617) 2023-09-15 20:26:16 +00:00
1fe867e205 [ReactNative] Connect Wallet V3 (#1592)
Co-authored-by: Manan Tank <[email protected]>
2023-09-15 17:47:40 +00:00
Manan TankandGitHub f5991387ef [react] ConnectWallet UI improvements + code cleanup (#1615) 2023-09-15 14:29:55 +00:00
3f3c63c01e [react] ConnectWallet v3 UI (#1550)
Co-authored-by: Joaquim Verges <[email protected]>
2023-09-15 11:21:03 +00:00
YashandGitHub f80cf0e17e [SDK] Remove ipfs dependency in tests (#1612) 2023-09-15 02:43:17 +00:00
Phillip HoandGitHub 10b7648857 chore: add evmMethod to usage traacker body (#1611) 2023-09-14 12:14:00 -07:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
6829ee0ee9 Version Packages (#1581)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-09-13 19:58:29 -07:00
Phillip HoandGitHub 6df24a2eb9 fix: Typo on setting maxFeePerGas (#1609) 2023-09-14 00:58:09 +00:00
nkrishangandGitHub 8b73abfd83 [SDK][Contracts-js][React] Use IAccountFactoryCore for detecting AccountFactory extension (#1607) 2023-09-13 15:27:40 +00:00
FirekeeperandGitHub 66c4ade868 [Unity] Support tx builder functionality (#1595) 2023-09-12 18:28:25 +00:00
Manan TankandGitHub 2a873d2f80 Fix wallets build in windows with cross-env (#1606) 2023-09-12 10:45:38 +00:00
iketwandGitHub bb320c7e97 [RN] Pass download options to storage (#1605) 2023-09-11 21:31:40 +00:00
931ee7930f adding phantom wallet (#1596)
Co-authored-by: Manan Tank <[email protected]>
Co-authored-by: Jonas Daniels <[email protected]>
2023-09-11 11:57:20 -07:00
YashandGitHub f55fd291bf Update addresses (#1600) 2023-09-11 17:07:15 +00:00
Manan TankandGitHub 3056c34c64 update chains and fix test (#1599) 2023-09-11 14:03:38 +00:00
Winston YeoandGitHub f90427650c feat(wallets): enable clientId to be used with paper ews (#1597) 2023-09-09 08:55:55 +00:00
Winston YeoandGitHub defe5fced3 feat(wallets): Add EmbeddedWalletSdk (#1563) 2023-09-08 10:42:26 +00:00
Joaquim VergesandGitHub c0070c2cc0 Handle default gas values for raw transactions, expose from property for 1155 airdrops (#1594) 2023-09-08 00:18:51 +00:00
YashandGitHub d50863f455 Airdrop abi conflict resolution (#1591) 2023-09-06 22:46:53 +00:00
iketwandGitHub 87ed24e1b4 [RN] Sets correct UI types to some compoments (#1590) 2023-09-06 20:27:45 +00:00
YashandGitHub 7e564163ce [SDK] Custom gasprice BitTorrent mainnet (#1589) 2023-09-06 19:13:08 +00:00
Manan TankandGitHub 0307671c63 Fix SmartWallet and Safe connection issue (#1588) 2023-09-06 17:39:00 +00:00
iketwandGitHub 4a7f41b3ee [RN/React] Remove signer as a prop (#1587) 2023-09-06 15:14:30 +00:00
Adam MajmudarandGitHub 2f187d1375 [Local Wallet] Fix bug in loadOrCreate (#1585) 2023-09-05 21:55:04 +00:00
iketwandGitHub 4567faef47 Update contributing guide to explain release-pr flow (#1583) 2023-09-05 21:43:37 +00:00
Manan TankandGitHub d37c3a75e7 Fix Rainbow wallet connection in mobile (#1577) 2023-09-04 20:39:15 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
4895217142 Version Packages (#1560)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-09-01 12:45:44 -07:00
Joaquim VergesandGitHub 0b59cb2e59 update readme (#1574) 2023-09-01 18:41:16 +00:00
Joaquim VergesandGitHub 2088de1cac [SDK] Dynamic gas fee estimation (#1572) 2023-09-01 18:28:46 +00:00
Danny FridayandGitHub 066b9cfa09 [Storage] Improve storage SDK IPFS upload error logging (#1564) 2023-08-31 16:39:55 +00:00
Mariano FuentesandGitHub 1e6f9dcc04 CLI - Update globalThis variables (#1569) 2023-08-31 02:25:46 +00:00
Joaquim VergesandGitHub a023cb8cf1 [SDK] Adjust gas fee calculations for OP chains (#1568) 2023-08-30 23:37:08 +00:00
YashandGitHub a00cbaf78c [SDK] Fix param encoding for deterministic deploy (#1567) 2023-08-30 23:08:47 +00:00
Winston YeoandGitHub d378106a85 Winston/documentation for service utils (#1566) 2023-08-30 22:11:13 +00:00
Joaquim VergesandGitHub 3eb9592e10 [Storage] Up default download timeout to 60s, expose option to override it (#1565) 2023-08-30 17:40:06 +00:00
Mariano FuentesandGitHub 04b6ef73e4 [CLI] - Update logout logic (#1562) 2023-08-29 22:25:57 +00:00
Tair AsimandGitHub 13ef6a50cf [service-utils] expose account status in api key meta (#1559) 2023-08-29 17:24:59 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
04c607ccde Version Packages (#1556)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-29 10:23:47 -07:00
Mariano FuentesandGitHub 926dd7b03f [CLI] - Descriptions improvements, deprecate Release (#1558) 2023-08-29 17:01:20 +00:00
Manan TankandGitHub e00dd12357 [sdk] Use default import for EventEmitter (#1557) 2023-08-29 15:49:09 +00:00
iketwandGitHub cdc08c5528 [RN] Use regular import for coinbase connector (#1546) 2023-08-29 13:23:43 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
4df0c2ee10 Version Packages (#1542)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-28 17:36:13 -07:00
Mariano FuentesandGitHub 48a8f9385e [CLI] - Update cors restrictions on login (#1552) 2023-08-29 00:20:07 +00:00
Joaquim VergesandGitHub a91776e121 [all] fix changesets (#1553) 2023-08-28 17:12:24 -07:00
Joaquim VergesandGitHub f5aed34d3c update chains + fix opbnb-testnet (#1551) 2023-08-29 00:02:20 +00:00
0f02706906 Use auth token for CLI (#1422)
Co-authored-by: Adam Majmudar <[email protected]>
2023-08-28 16:42:07 +00:00
iketwandGitHub eb463735e2 [React/Wallets] Adds a new RainbowWallet that supports Rainbow browser extension (#1544) 2023-08-28 13:00:31 +00:00
Joaquim VergesandGitHub adec589ead [SDK] Expose joinAbis() utility function (#1545) 2023-08-28 03:30:51 +00:00
saminaandGitHub e5246f2667 Update README.md (#1531) 2023-08-26 00:53:32 +00:00
b29ec675f9 [react] export ConnectModalInline component for ConnectWallet playground (#1532)
Co-authored-by: Joaquim Verges <[email protected]>
2023-08-26 00:27:56 +00:00
Joaquim VergesandGitHub b30566c684 [Chains] updated chains (#1540) 2023-08-26 00:15:47 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
182a4e7e8f Version Packages (#1528)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-25 09:03:36 -07:00
iketwandGitHub 8b82f3c59c [CLI] Adds support for PWA Vite template (#1538) 2023-08-25 15:38:21 +00:00
YashandGitHub f59b729f8b [SDK] Fix auto-factory deployment: correct bytecode format (#1537) 2023-08-25 14:19:39 +00:00
iketwandGitHub 387dddbd87 [RN] Adds switchToActiveChain to the ConnectWallet button (#1536) 2023-08-25 13:10:17 +00:00
YashandGitHub 911e14fcac [Chains] Add Chiliz Spicy testnet (#1530) 2023-08-24 18:35:05 +00:00
cd6b07b591 feat(sdk): centralize contract reads (#1520)
Co-authored-by: Joaquim Verges <[email protected]>
2023-08-24 04:29:26 +00:00
YashandGitHub 154c55add5 Contracts version 3.9.3-0 (#1527) 2023-08-24 03:33:49 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
f202f597ca Version Packages (#1517)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-23 20:25:07 -07:00
YashandGitHub 91f0245be7 [SDK] Fix getChainProvider (#1526) 2023-08-24 00:00:03 +00:00
Joaquim VergesandGitHub ae74b8ef62 [SDK] separate ERC1155Supply extension from ERC1155 (#1523) 2023-08-23 22:23:17 +00:00
YashandGitHub 5a373a7509 [SDK] Correct polygon rpc for fetching published contract (#1525) 2023-08-23 19:22:16 +00:00
Manan TankandGitHub 088547f763 [react] various ConnectWallet improvements (#1522) 2023-08-23 17:48:04 +00:00
586e91dbe6 [SDK] Publish dynamic contract (#1488)
Co-authored-by: Nacho Iacovino <[email protected]>
2023-08-23 14:27:40 +00:00
Joaquim VergesandGitHub f65578d637 [SDK] Optimize contract resolution + Fallback to bytecode extension detection for un-imported contracts (#1498) 2023-08-23 00:03:52 +00:00
447d984653 [SDK] Airdrops (#1288)
Co-authored-by: Atharva Deosthale <[email protected]>
2023-08-22 13:26:31 +00:00
nkrishangandGitHub 34a3bb8ae3 [SDK][REACT] Update contracts release (#1518) 2023-08-22 04:31:36 +00:00
Joaquim VergesandGitHub bc003c2fef [SDK] Return early for claim checks when possible (#1516) 2023-08-22 00:01:06 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
c88fa57591 Version Packages (#1509)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-21 12:17:36 -07:00
Jonas DanielsandGitHub c12f0874b4 feat(chains): add new chains (#1513) 2023-08-21 18:20:53 +00:00
Jonas DanielsandGitHub 184c325ab2 fix(chains): Update icon URL for chains 37 and 47 (#1508) 2023-08-19 02:19:31 +00:00
046c9ad604 moved res.json() to avoid getting JSON error in console (#1501)
Co-authored-by: Jonas Daniels <[email protected]>
2023-08-19 02:09:58 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
2a7bbf8665 Version Packages (#1507)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18 18:18:39 -07:00
Jonas DanielsandGitHub f97ddf4c7f [chains] - add xpla chains & update chains (#1506) 2023-08-19 01:01:08 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
66c53360cd Version Packages (#1504)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-18 16:04:05 -07:00
Joaquim VergesandGitHub bd1fcbae32 [SDK] Expose Transaction.populateTransaction() (#1505) 2023-08-18 19:05:05 +00:00
Joaquim VergesandGitHub e196264172 [SDK] Pass custom storage to internal SDK instances (#1503) 2023-08-18 16:21:20 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
c9deda6f4b Version Packages (#1487)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-16 07:44:08 -07:00
b91d3e9901 Small fix for Promise.all() (#1490)
Co-authored-by: Joaquim Verges <[email protected]>
2023-08-15 22:06:07 -07:00
Joaquim VergesandGitHub d248aa2c5a [SDK] Let users pass their own IPFS download timeout and fix gateway fallback logic (#1500) 2023-08-15 19:20:36 -07:00
Mariano FuentesandGitHub 8f3b685ad2 [CLI] Deploy to show public gateway url after upload (#1499) 2023-08-15 22:28:56 +00:00
iketwandGitHub 26349f311d [RN] Improves loading states when disconnecting and loading balances (#1496) 2023-08-14 22:56:26 +00:00
YashandGitHub 2897576513 [SDK] Custom base fee for cronos testnet (#1495) 2023-08-14 22:39:23 +00:00
iketwandGitHub 07fb1b5ffa [RN] Adds support for raw WalletConnect (#1489) 2023-08-13 16:24:11 +00:00
iketwandGitHub 300a3c6f04 [ReactCore] Add better error messages when using hooks outside the <ThirdwebProvider /> (#1486) 2023-08-12 14:21:31 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
26367c04f3 Version Packages (#1483)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-11 16:07:25 -07:00
Joaquim VergesandGitHub 39e2af6f2f [Wallets] correct gas estimation for polygon/mumbai (#1484) 2023-08-11 22:16:29 +00:00
Joaquim VergesandGitHub a5ba9e4fbf [SDK] Separate Account and AccountPermissions extensions (#1480) 2023-08-11 20:31:54 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
c9b0131acd Version Packages (#1478)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-10 15:51:09 -07:00
Joaquim VergesandGitHub 34b315993c [Wallets] use RPCs with no client id when adding to external wallets (#1477) 2023-08-10 22:33:47 +00:00
iketwandGitHub 14d9a71c92 [RN] Deprecates magicWallet in favor of magicLink for consistency (#1479) 2023-08-10 21:22:49 +00:00
YashandGitHub 7f5311222b [SDK] Enable dynamic contract deployment with any evm (#1468) 2023-08-10 19:32:51 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
b4847dd134 Version Packages (#1464)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-09 16:00:33 -07:00
Danny FridayandGitHub cf82c3b58c Improve error logging when authentication fails (#1475) 2023-08-09 21:37:09 +00:00
Adam MajmudarandGitHub a17326634e [Chains] Add back scroll-alpha-testnet (#1474) 2023-08-09 19:24:04 +00:00
70c4a119d6 Add sdk information in headers for various services (#1472)
Co-authored-by: Manan Tank <[email protected]>
2023-08-09 19:22:46 +00:00
Joaquim VergesandGitHub f0443bd989 [SDK] Expose erc721.claimConditions.getSupplyClaimedByWallet() (#1471) 2023-08-09 19:05:11 +00:00
Jonas DanielsandGitHub 73462ef108 [multi] only evaluate auth token if it is a valid string (#1473) 2023-08-09 18:07:26 +00:00
Jonas DanielsandGitHub 27c225a512 feat(urls): add clientId parameter to getGatewayUrlForCid (#1470) 2023-08-09 03:20:53 +00:00
Jonas DanielsandGitHub cb1c9937fa refactor(urls): Simplify authentication strategy handling (#1469) 2023-08-08 21:07:27 +00:00
Kien NgoandGitHub 588b210601 [react, react-native]Add option to hide the "Request Testnet Funds" button (#1458) 2023-08-08 08:38:37 -07:00
Phillip HoandGitHub 7e483ec97f [service-utils] Silence publishUsageEvents() output (#1466) 2023-08-08 00:20:09 +00:00
Joaquim VergesandGitHub c902901cff [All] Added PR template (#1465) 2023-08-07 23:57:31 +00:00
Phillip HoandGitHub 205018f6e1 [service-utils] Add userOpHash field (#1463) 2023-08-07 23:41:43 +00:00
FirekeeperandGitHub 269e68c0a1 Firekeeper/xai and large chainids (#1461) 2023-08-07 23:14:23 +00:00
Jonas DanielsandGitHub 2888efc065 build: Add TW_SECRET_KEY to test and e2e environments (#1462) 2023-08-07 21:14:00 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
c753641570 Version Packages (#1457)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-07 13:21:25 -07:00
Manan TankandGitHub 4b0e63dcc0 [wallets] Save oAuthRedirectResult when auto connecting Magic Link with social login (#1460) 2023-08-07 16:48:02 +00:00
6979810de5 Fix typo in auth error message (#1454)
Co-authored-by: Jonas Daniels <[email protected]>
2023-08-06 04:10:05 +00:00
Jonas DanielsandGitHub 4c37af49aa feat: allow overriding the upload server url for IpfsUploader (#1455) 2023-08-05 21:12:33 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
7858632429 Version Packages (#1451)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-04 18:15:57 -07:00
Phillip HoandGitHub 0647f12498 [service-utils] Remove optional fields in logging (#1453) 2023-08-05 00:24:56 +00:00
3e1c4045e7 chore: Add logHttpRequest helper func (#1448)
Co-authored-by: Danny Friday <[email protected]>
2023-08-04 23:18:54 +00:00
iketwandGitHub 3ba8ba4288 [RN] Upgrade coinbase wallet sdk (#1452) 2023-08-04 22:28:37 +00:00
Adam MajmudarandGitHub dfd120a3a9 [Auth] Split into functions & expose all auth functions on client (#1392) 2023-08-04 22:09:11 +00:00
Joaquim VergesandGitHub 262edc6a46 [SDK] Sanitize shared metadata descriptions strings (#1450) 2023-08-04 19:35:03 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
4f79053ec3 Version Packages (#1446)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-04 10:41:06 -07:00
Joaquim VergesandGitHub 2a91113a76 [SDK] Revert sanitizing inputs (#1449) 2023-08-04 10:31:04 -07:00
Danny FridayandGitHub b103872daf Export extractAuthorizationData for CF Workers (#1447) 2023-08-03 23:54:08 +00:00
Mariano FuentesandGitHub 7f54012ec6 CLI warnings (#1442) 2023-08-03 22:48:25 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
df36e27f32 Version Packages (#1431)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-08-03 15:30:22 -07:00
Danny FridayandGitHub 8c0dc9c880 Switch to domain with good reputation (#1443) 2023-08-03 22:16:04 +00:00
Joaquim VergesandGitHub 074a3eb01c [SDK] add jsdoc for deployOpenEdition (#1445) 2023-08-03 21:58:23 +00:00
Joaquim VergesandGitHub a5d0be939a [SDK] Optimize claimConditions.getAll() (#1444) 2023-08-03 21:50:02 +00:00
Phillip HoandGitHub 5ec0f064d2 [service-utils] Use aws4fetch for AWS calls from CF workers (#1440) 2023-08-03 20:40:46 +00:00
Joaquim VergesandGitHub becbb63736 [SDK] Sanitize NFT description strings (#1441) 2023-08-03 20:33:39 +00:00
farhanW3andGitHub 5ee700e804 updated error messages for API Keys (#1437) 2023-08-03 00:49:15 +00:00
Joaquim VergesandGitHub 67b145b94d [SDK] Expose deployPublishedContract alias (#1439) 2023-08-03 00:35:07 +00:00
Joaquim VergesandGitHub c0a6d2f182 [SDK] Expose sdk.deployer.deployOpenEdition() convenience function (#1438) 2023-08-03 00:11:05 +00:00
Joaquim VergesandGitHub fd9816556f [Wallets] better gas estimation for bundler calls (#1436) 2023-08-02 23:13:47 +00:00
Phillip HoandGitHub 2a3cd62dc9 Fix: Use string type for gasPricePerUnit (#1435) 2023-08-02 21:59:39 +00:00
iketwandGitHub c9bf4f05c1 [SDK] pass empty string if clientId is undefined (#1433) 2023-08-02 20:16:05 +00:00
Jonas DanielsandGitHub 9f5adc5c5c feat: Upgrade contracts package (#1432) 2023-08-02 19:39:50 +00:00
Phillip HoandGitHub d01e6396d1 [service-utils] Add a usage tracking helper fn to publish events (#1424) 2023-08-02 19:05:03 +00:00
nkrishangandGitHub 2283d21027 [SDK][REACT] Create useAccountAdmins and useAccountAdminsAndSigners (#1423) 2023-08-02 16:39:03 +00:00
iketwandGitHub ab36d84f1c [React] Allow passing secretKey for server-side rendering (#1429) 2023-08-02 16:17:24 +00:00
Manan TankandGitHub a9f2ff73c9 [wallets, react-core, react] minor fixes (#1430) 2023-08-02 15:47:18 +00:00
769 changed files with 65065 additions and 20443 deletions
+21
View File
@@ -107,6 +107,27 @@ In your test project, you need to:
1. Delete the dependencies cache. If you're using Next.js, that is the `.next` directory, and if you're using CRA, that is the `node_modules/.cache` directory.
2. Restart the development server.
#### Testing from npm
You can also test your changes by publishing a dev package to npm and adding your package as you normally do in your projects.
Once you have your PR up you can add a comment with the text: `/release-pr`. This will trigger a GitHub action that will publish a dev version to npm.
You can see the action progress in GitHub's `Actions` tab, look for the workflow: `release-pr`.
Once the action finishes executing, select it, click on deploy and look for the `Deploy pre-release` item. Scroll all the way to the bottom and you should see something like:
```
success packages published successfully:
🦋 @***-dev/[email protected]
🦋 @***-dev/[email protected]
...
```
These are the versions the GH action published to npm for testing purposes. Let's assume you're working on the `@thirdweb-dev/react` package, you can then run:
`yarn add @thirdweb-dev/react@0.0.0-dev-06a7cb1-20230901190619` to install the dev package.
<br/>
### Publish Your Changes
+13
View File
@@ -0,0 +1,13 @@
## Problem solved
Short description of the bug fixed or feature added
## Changes made
- [ ] Public API changes: list the public API changes made if any
- [ ] Internal API changes: explain the internal logic changes
## How to test
- [ ] Automated tests: link to unit test file
- [ ] Manual tests: step by step instructions on how to test
+1
View File
@@ -17,6 +17,7 @@ concurrency:
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TW_SECRET_KEY: ${{ secrets.TW_SECRET_KEY }}
jobs:
build:
+10 -8
View File
@@ -20,14 +20,16 @@
## Packages
| Package | Description | Latest Version |
| ---------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [/sdk](./packages/sdk) | Best in class web3 SDK for Browser, Node and Mobile apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/sdk"><img src="https://img.shields.io/npm/v/@thirdweb-dev/sdk?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react](./packages/react) | Ultimate collection of React hooks for your web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react-native](./packages/react-native) | Ultimate collection of React hooks for your native mobile web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react-native"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react-native?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/auth](./packages/auth) | Best in class wallet authentication for Node backends | <a href="https://www.npmjs.com/package/@thirdweb-dev/auth"><img src="https://img.shields.io/npm/v/@thirdweb-dev/auth?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/storage](./packages/storage) | Best in class decentralized storage SDK for Browser and Node | <a href="https://www.npmjs.com/package/@thirdweb-dev/storage"><img src="https://img.shields.io/npm/v/@thirdweb-dev/storage?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/cli](./packages/cli) | Publish and deploy smart contracts without dealing with private keys | <a href="https://www.npmjs.com/package/thirdweb"><img src="https://img.shields.io/npm/v/thirdweb?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| Package | Description | Latest Version |
| ---------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [/sdk](./packages/sdk) | Best in class web3 SDK for Browser, Node and Mobile apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/sdk"><img src="https://img.shields.io/npm/v/@thirdweb-dev/sdk?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/wallets](./packages/wallets) | Unified web3 Wallet library to integrate any wallet into your applications. | <a href="https://www.npmjs.com/package/@thirdweb-dev/wallets"><img src="https://img.shields.io/npm/v/@thirdweb-dev/wallets?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react](./packages/react) | Ultimate collection of React hooks for your web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react-native](./packages/react-native) | Ultimate collection of React hooks for your native mobile web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react-native"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react-native?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/auth](./packages/auth) | Best in class wallet authentication for Node backends | <a href="https://www.npmjs.com/package/@thirdweb-dev/auth"><img src="https://img.shields.io/npm/v/@thirdweb-dev/auth?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/storage](./packages/storage) | Best in class decentralized storage SDK for Browser and Node | <a href="https://www.npmjs.com/package/@thirdweb-dev/storage"><img src="https://img.shields.io/npm/v/@thirdweb-dev/storage?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/cli](./packages/cli) | Publish and deploy smart contracts without dealing with private keys | <a href="https://www.npmjs.com/package/thirdweb"><img src="https://img.shields.io/npm/v/thirdweb?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/chains](./packages/chains) | All EVM chain information as JS objects for easy handling | <a href="https://www.npmjs.com/package/@thirdweb-dev/chains"><img src="https://img.shields.io/npm/v/@thirdweb-dev/chains?color=red&label=npm&logo=npm" alt="npm version"/></a> |
## Documentation
+1 -1
View File
@@ -31,7 +31,7 @@
"hotlink-revert": "node ./scripts/hotlink/hotlink-revert.mjs",
"explain:major": "node ./scripts/changeset-explain-major.mjs"
},
"packageManager": "pnpm@8.1.0",
"packageManager": "pnpm@8.6.12",
"dependencies": {
"@changesets/changelog-github": "^0.4.8",
"@changesets/cli": "^2.26.2",
+142
View File
@@ -1,5 +1,147 @@
# @thirdweb-dev/auth
## 3.2.44
### Patch Changes
- Updated dependencies [[`54f83a50`](https://github.com/thirdweb-dev/js/commit/54f83a5013ed65ddd5a787e13ba7e5d86625537d), [`c085d690`](https://github.com/thirdweb-dev/js/commit/c085d69060c68b3335761bdb2cc0c3e082548702), [`c7e7ec95`](https://github.com/thirdweb-dev/js/commit/c7e7ec9502b46312d36cad5177c4f4a50c34f1a3)]:
- @thirdweb-dev/wallets@1.3.1
## 3.2.43
### Patch Changes
- Updated dependencies [[`9d553746`](https://github.com/thirdweb-dev/js/commit/9d553746b025ac489f9b8ee357372c9d01c835e1), [`64528263`](https://github.com/thirdweb-dev/js/commit/64528263f42bd2c564aad5e777f9f6dbba30af54), [`94bdcc14`](https://github.com/thirdweb-dev/js/commit/94bdcc142a7fe1e9f53273560404fa6b5ac3a7c4), [`43f188c8`](https://github.com/thirdweb-dev/js/commit/43f188c8a7ec02f394604120b414a039a2650525), [`ea5b9c3e`](https://github.com/thirdweb-dev/js/commit/ea5b9c3ecdd588461fb00f0e9da463de4a30ed1d), [`def6d400`](https://github.com/thirdweb-dev/js/commit/def6d400ab463bda3118d4c9cb00e5cc25a415c2)]:
- @thirdweb-dev/wallets@1.3.0
## 3.2.42
### Patch Changes
- Updated dependencies [[`3f3c63c0`](https://github.com/thirdweb-dev/js/commit/3f3c63c01e34242ae1f074e62b51787b305c059e)]:
- @thirdweb-dev/wallets@1.2.1
## 3.2.41
### Patch Changes
- Updated dependencies [[`2a873d2f`](https://github.com/thirdweb-dev/js/commit/2a873d2f80271208819bac88b32cea0b48761c8d), [`f9042765`](https://github.com/thirdweb-dev/js/commit/f90427650c037b2c437685734ddc3398ad3e2612), [`defe5fce`](https://github.com/thirdweb-dev/js/commit/defe5fced3fd738157616a9f1644c5092dcaa5a8), [`2f187d13`](https://github.com/thirdweb-dev/js/commit/2f187d13754f571b7205fc1b743efde767b1b1c8), [`931ee793`](https://github.com/thirdweb-dev/js/commit/931ee7930f16c25e4d775d2d93538a5cfe770353)]:
- @thirdweb-dev/wallets@1.2.0
## 3.2.40
### Patch Changes
- Updated dependencies [[`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/wallets@1.1.23
## 3.2.39
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.22
## 3.2.38
### Patch Changes
- Updated dependencies [[`eb463735`](https://github.com/thirdweb-dev/js/commit/eb463735e2f784cd1d212a982835af95cf60766b), [`0f027069`](https://github.com/thirdweb-dev/js/commit/0f027069064bebe647f9235fa86ef7f165ffc7b3)]:
- @thirdweb-dev/wallets@1.1.21
## 3.2.37
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.20
## 3.2.36
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.19
## 3.2.35
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.18
## 3.2.34
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.17
## 3.2.33
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.16
## 3.2.32
### Patch Changes
- Updated dependencies [[`07fb1b5f`](https://github.com/thirdweb-dev/js/commit/07fb1b5ffa4c170e252df31070852ddb9a81dec9)]:
- @thirdweb-dev/wallets@1.1.15
## 3.2.31
### Patch Changes
- Updated dependencies [[`39e2af6f`](https://github.com/thirdweb-dev/js/commit/39e2af6f2f4d933dca1b3de4a37de76375bafd74)]:
- @thirdweb-dev/wallets@1.1.14
## 3.2.30
### Patch Changes
- Updated dependencies [[`34b31599`](https://github.com/thirdweb-dev/js/commit/34b315993c0abaccb9640a5d5804c2c93af569c2)]:
- @thirdweb-dev/wallets@1.1.13
## 3.2.29
### Patch Changes
- Updated dependencies [[`73462ef1`](https://github.com/thirdweb-dev/js/commit/73462ef10800aeeb5976634e2bc6fb5d3e8501e4), [`70c4a119`](https://github.com/thirdweb-dev/js/commit/70c4a119d691a37ec999d9f6087902d532cc82ed)]:
- @thirdweb-dev/wallets@1.1.12
## 3.2.28
### Patch Changes
- Updated dependencies [[`4b0e63dc`](https://github.com/thirdweb-dev/js/commit/4b0e63dcc0ca871ce9cef76f8a41ff290316741c)]:
- @thirdweb-dev/wallets@1.1.11
## 3.2.27
### Patch Changes
- [#1392](https://github.com/thirdweb-dev/js/pull/1392) [`dfd120a3`](https://github.com/thirdweb-dev/js/commit/dfd120a3a9d1582c8b174265c92bf43dbbaf5c86) Thanks [@adam-maj](https://github.com/adam-maj)! - Expose functions from auth and update useAuth
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.10
## 3.2.26
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@1.1.9
## 3.2.25
### Patch Changes
- Updated dependencies [[`a9f2ff73`](https://github.com/thirdweb-dev/js/commit/a9f2ff73c9f83f05c3e2d3c53b23b2843e8a2576), [`fd981655`](https://github.com/thirdweb-dev/js/commit/fd9816556fe595b0c764e34dbcf15b0ad1677edb)]:
- @thirdweb-dev/wallets@1.1.8
## 3.2.24
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "3.2.24",
"version": "3.2.44",
"main": "dist/thirdweb-dev-auth.cjs.js",
"module": "dist/thirdweb-dev-auth.esm.js",
"browser": {
+73 -423
View File
@@ -1,28 +1,28 @@
import {
THIRDWEB_AUTH_DEFAULT_LOGIN_PAYLOAD_DURATION_IN_SECONDS,
THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
} from "../constants";
authenticateJWT,
generateJWT,
parseJWT,
refreshJWT,
} from "./functions/jwt";
import {
LoginOptions,
LoginPayload,
GenerateOptions,
LoginPayloadData,
LoginPayloadDataSchema,
AuthenticationPayloadDataSchema,
AuthenticationPayloadData,
VerifyOptionsSchema,
VerifyOptions,
GenerateOptionsSchema,
AuthenticateOptionsSchema,
AuthenticateOptions,
User,
Json,
LoginOptionsSchema,
AuthenticationPayload,
AuthenticationPayloadDataInput,
} from "./schema";
import { isBrowser } from "./utils";
buildAndSignLoginPayload,
buildLoginPayload,
signLoginPayload,
verifyLoginPayload,
} from "./functions/login";
import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
import { Json, User } from "./schema/common";
import {
LoginOptionsWithOptionalDomain,
LoginPayload,
LoginPayloadData,
} from "./schema/login";
import { VerifyOptionsWithOptionalDomain } from "./schema/verify";
import { GenerateOptionsWithOptionalDomain } from "./schema/generate";
import {
AuthenticateOptionsWithOptionalDomain,
AuthenticationPayload,
} from "./schema/authenticate";
export class ThirdwebAuth {
private domain: string;
@@ -37,432 +37,82 @@ export class ThirdwebAuth {
this.wallet = wallet;
}
public async payload(options?: LoginOptions): Promise<LoginPayloadData> {
const parsedOptions = LoginOptionsSchema.parse(options);
let chainId: string | undefined = parsedOptions?.chainId;
if (!chainId && this.wallet.getChainId) {
try {
chainId = (await this.wallet.getChainId()).toString();
} catch {
// ignore error
}
}
return LoginPayloadDataSchema.parse({
type: this.wallet.type,
domain: parsedOptions?.domain || this.domain,
address: parsedOptions?.address || (await this.wallet.getAddress()),
statement: parsedOptions?.statement,
version: parsedOptions?.version,
uri: parsedOptions?.uri,
chain_id: chainId,
nonce: parsedOptions?.nonce,
expiration_time:
parsedOptions?.expirationTime ||
new Date(
Date.now() +
1000 * THIRDWEB_AUTH_DEFAULT_LOGIN_PAYLOAD_DURATION_IN_SECONDS,
),
invalid_before:
parsedOptions?.invalidBefore ||
new Date(
Date.now() -
1000 * THIRDWEB_AUTH_DEFAULT_LOGIN_PAYLOAD_DURATION_IN_SECONDS,
),
resources: parsedOptions?.resources,
public async payload(
options?: LoginOptionsWithOptionalDomain,
): Promise<LoginPayloadData> {
return buildLoginPayload({
wallet: this.wallet,
options: this.formatOptions(options),
});
}
public async loginWithPayload(
payload: LoginPayloadData,
): Promise<LoginPayload> {
const message = this.generateMessage(payload);
const signature = await this.wallet.signMessage(message);
return {
payload,
signature,
};
return signLoginPayload({ wallet: this.wallet, payload });
}
public async login(options?: LoginOptions): Promise<LoginPayload> {
const payloadData = await this.payload(options);
return await this.loginWithPayload(payloadData);
public async login(
options?: LoginOptionsWithOptionalDomain,
): Promise<LoginPayload> {
return buildAndSignLoginPayload({
wallet: this.wallet,
options: this.formatOptions(options),
});
}
public async verify(
payload: LoginPayload,
options?: VerifyOptions,
options?: VerifyOptionsWithOptionalDomain,
): Promise<string> {
const parsedOptions = VerifyOptionsSchema.parse(options);
if (payload.payload.type !== this.wallet.type) {
throw new Error(
`Expected chain type '${this.wallet.type}' does not match chain type on payload '${payload.payload.type}'`,
);
}
// Check that the intended domain matches the domain of the payload
const domain = parsedOptions?.domain || this.domain;
if (payload.payload.domain !== domain) {
throw new Error(
`Expected domain '${domain}' does not match domain on payload '${payload.payload.domain}'`,
);
}
// Check that the payload statement matches the expected statement
if (parsedOptions?.statement) {
if (payload.payload.statement !== parsedOptions.statement) {
throw new Error(
`Expected statement '${parsedOptions.statement}' does not match statement on payload '${payload.payload.statement}'`,
);
}
}
// Check that the intended URI matches the URI of the payload
if (parsedOptions?.uri) {
if (payload.payload.uri !== parsedOptions.uri) {
throw new Error(
`Expected URI '${parsedOptions.uri}' does not match URI on payload '${payload.payload.uri}'`,
);
}
}
// Check that the intended version matches the version of the payload
if (parsedOptions?.version) {
if (payload.payload.version !== parsedOptions.version) {
throw new Error(
`Expected version '${parsedOptions.version}' does not match version on payload '${payload.payload.version}'`,
);
}
}
// Check that the intended chain ID matches the chain ID of the payload
if (parsedOptions?.chainId) {
if (payload.payload.chain_id !== parsedOptions.chainId) {
throw new Error(
`Expected chain ID '${parsedOptions.chainId}' does not match chain ID on payload '${payload.payload.chain_id}'`,
);
}
}
// Check that the payload nonce is valid
if (parsedOptions?.validateNonce !== undefined) {
try {
await parsedOptions.validateNonce(payload.payload.nonce);
} catch (err) {
throw new Error(`Login request nonce is invalid`);
}
}
// Check that it isn't before the invalid before time
const currentTime = new Date();
if (currentTime < new Date(payload.payload.invalid_before)) {
throw new Error(`Login request is not yet valid`);
}
// Check that the payload hasn't expired
if (currentTime > new Date(payload.payload.expiration_time)) {
throw new Error(`Login request has expired`);
}
// Check that the specified resources are present on the payload
if (parsedOptions?.resources) {
const missingResources = parsedOptions.resources.filter(
(resource) => !payload.payload.resources?.includes(resource),
);
if (missingResources.length > 0) {
throw new Error(
`Login request is missing required resources: ${missingResources.join(
", ",
)}`,
);
}
}
// Check that the signing address is the claimed wallet address
const message = this.generateMessage(payload.payload);
const chainId =
this.wallet.type === "evm" && payload.payload.chain_id
? parseInt(payload.payload.chain_id)
: undefined;
const verified = await this.verifySignature(
message,
payload.signature,
payload.payload.address,
chainId,
);
if (!verified) {
throw new Error(
`Signer address does not match payload address '${payload.payload.address.toLowerCase()}'`,
);
}
return payload.payload.address;
return verifyLoginPayload({
wallet: this.wallet,
payload,
options: this.formatOptions(options),
});
}
public async generate(
payload: LoginPayload,
options?: GenerateOptions,
options?: GenerateOptionsWithOptionalDomain,
): Promise<string> {
if (isBrowser()) {
throw new Error(
"Authentication tokens should not be generated in the browser, as they must be signed by a server-side admin wallet.",
);
}
const parsedOptions = GenerateOptionsSchema.parse(options);
const domain = parsedOptions?.domain || this.domain;
const userAddress = await this.verify(payload, {
domain,
...parsedOptions?.verifyOptions,
});
let session: Json | undefined = undefined;
if (typeof parsedOptions?.session === "function") {
const sessionTrigger = (await parsedOptions.session(userAddress)) as Json;
if (sessionTrigger) {
session = sessionTrigger;
}
} else {
session = parsedOptions?.session;
}
const adminAddress = await this.wallet.getAddress();
return this.createToken({
iss: adminAddress,
sub: userAddress,
aud: domain,
nbf: parsedOptions?.invalidBefore || new Date(),
exp:
parsedOptions?.expirationTime ||
new Date(
Date.now() + 1000 * THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
),
iat: new Date(),
jti: parsedOptions?.tokenId,
ctx: session,
});
}
public async refresh(token: string, expirationTime?: Date): Promise<string> {
const { payload } = this.parseToken(token);
return this.createToken({
iss: payload.iss,
sub: payload.sub,
aud: payload.aud,
nbf: new Date(),
exp:
expirationTime ||
new Date(
Date.now() + 1000 * THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
),
iat: new Date(),
ctx: payload.ctx,
});
}
/**
* Authenticate With Token
* @remarks Server-side function that authenticates the provided JWT token. This function verifies that
* the provided authentication token is valid and returns the address of the authenticated wallet.
*
* @param domain - The domain of the server-side application doing authentication
* @param token - The authentication token being used
* @returns The address of the authenticated wallet
*
* @example
* ```javascript
* const domain = "example.com";
* const loginPayload = await sdk.auth.login(domain);
* const token = await sdk.auth.generateAuthToken(domain, loginPayload);
*
* // Authenticate the token and get the address of authenticating users wallet
* const address = sdk.auth.authenticate(domain, token);
* ```
*/
public async authenticate<TSession extends Json = Json>(
token: string,
options?: AuthenticateOptions,
): Promise<User<TSession>> {
if (isBrowser()) {
throw new Error(
"Should not authenticate tokens in the browser, as they must be verified by the server-side admin wallet.",
);
}
const parsedOptions = AuthenticateOptionsSchema.parse(options);
const domain = parsedOptions?.domain || this.domain;
const { payload, signature } = this.parseToken(token);
// Check that the payload unique ID is valid
if (parsedOptions?.validateTokenId !== undefined) {
try {
await parsedOptions.validateTokenId(payload.jti);
} catch (err) {
throw new Error(`Token ID is invalid`);
}
}
// Check that the token audience matches the domain
if (payload.aud !== domain) {
throw new Error(
`Expected token to be for the domain '${domain}', but found token with domain '${payload.aud}'`,
);
}
// Check that the token is past the invalid before time
const currentTime = Math.floor(new Date().getTime() / 1000);
if (currentTime < payload.nbf) {
throw new Error(
`This token is invalid before epoch time '${payload.nbf}', current epoch time is '${currentTime}'`,
);
}
// Check that the token hasn't expired
if (currentTime > payload.exp) {
throw new Error(
`This token expired at epoch time '${payload.exp}', current epoch time is '${currentTime}'`,
);
}
// Check that the connected wallet matches the token issuer
const connectedAddress = await this.wallet.getAddress();
if (connectedAddress.toLowerCase() !== payload.iss.toLowerCase()) {
throw new Error(
`Expected the connected wallet address '${connectedAddress}' to match the token issuer address '${payload.iss}'`,
);
}
let chainId: number | undefined = undefined;
if (this.wallet.getChainId) {
try {
chainId = await this.wallet.getChainId();
} catch {
// ignore error
}
}
const verified = await this.verifySignature(
JSON.stringify(payload),
signature,
connectedAddress,
chainId,
);
if (!verified) {
throw new Error(
`The connected wallet address '${connectedAddress}' did not sign the token`,
);
}
return {
address: payload.sub,
session: payload.ctx as TSession | undefined,
};
}
public parseToken(token: string): AuthenticationPayload {
const encodedPayload = token.split(".")[1];
const encodedSignature = token.split(".")[2];
const payload: AuthenticationPayloadData = JSON.parse(
Buffer.from(encodedPayload, "base64").toString(),
);
const signature = Buffer.from(encodedSignature, "base64").toString();
return {
return generateJWT({
wallet: this.wallet,
payload,
signature,
};
options: this.formatOptions(options),
});
}
private async createToken(
payload: AuthenticationPayloadDataInput,
): Promise<string> {
const payloadData = AuthenticationPayloadDataSchema.parse(payload);
const message = JSON.stringify(payloadData);
const signature = await this.wallet.signMessage(message);
// Header used for JWT token specifying hash algorithm
const header = {
// Specify ECDSA with SHA-256 for hashing algorithm
alg: "ES256",
typ: "JWT",
};
const encodedHeader = Buffer.from(JSON.stringify(header)).toString(
"base64",
);
const encodedData = Buffer.from(JSON.stringify(payloadData))
.toString("base64")
.replace(/=/g, "");
const encodedSignature = Buffer.from(signature).toString("base64");
// Generate a JWT token with base64 encoded header, payload, and signature
const token = `${encodedHeader}.${encodedData}.${encodedSignature}`;
return token;
public async refresh(jwt: string, expirationTime?: Date): Promise<string> {
return refreshJWT({
wallet: this.wallet,
jwt,
options: { expirationTime },
});
}
private async verifySignature(
message: string,
signature: string,
address: string,
chainId?: number,
) {
return this.wallet.verifySignature(message, signature, address, chainId);
public async authenticate<TSession extends Json = Json>(
jwt: string,
options?: AuthenticateOptionsWithOptionalDomain,
): Promise<User<TSession>> {
return authenticateJWT({
wallet: this.wallet,
jwt,
options: this.formatOptions(options),
});
}
/**
* Generates a EIP-4361 & CAIP-122 compliant message to sign based on the login payload
*/
private generateMessage(payload: LoginPayloadData): string {
const typeField = payload.type === "evm" ? "Ethereum" : "Solana";
const header = `${payload.domain} wants you to sign in with your ${typeField} account:`;
let prefix = [header, payload.address].join("\n");
prefix = [prefix, payload.statement].join("\n\n");
if (payload.statement) {
prefix += "\n";
}
public parseToken(jwt: string): AuthenticationPayload {
return parseJWT(jwt);
}
const suffixArray = [];
if (payload.uri) {
const uriField = `URI: ${payload.uri}`;
suffixArray.push(uriField);
}
const versionField = `Version: ${payload.version}`;
suffixArray.push(versionField);
if (payload.chain_id) {
const chainField = `Chain ID: ` + payload.chain_id || "1";
suffixArray.push(chainField);
}
const nonceField = `Nonce: ${payload.nonce}`;
suffixArray.push(nonceField);
const issuedAtField = `Issued At: ${payload.issued_at}`;
suffixArray.push(issuedAtField);
const expiryField = `Expiration Time: ${payload.expiration_time}`;
suffixArray.push(expiryField);
if (payload.invalid_before) {
const invalidBeforeField = `Not Before: ${payload.invalid_before}`;
suffixArray.push(invalidBeforeField);
}
if (payload.resources) {
suffixArray.push(
[`Resources:`, ...payload.resources.map((x) => `- ${x}`)].join("\n"),
);
}
const suffix = suffixArray.join("\n");
return [prefix, suffix].join("\n");
private formatOptions<TOptions extends { domain?: string }>(
options?: TOptions,
): Omit<TOptions, "domain"> & { domain: string } {
return options
? { ...options, domain: options?.domain || this.domain }
: ({ domain: this.domain } as Omit<TOptions, "domain"> & {
domain: string;
});
}
}
+226
View File
@@ -0,0 +1,226 @@
import {
AuthenticateOptionsSchema,
AuthenticationPayload,
AuthenticationPayloadData,
AuthenticationPayloadDataSchema,
} from "../schema/authenticate";
import { Json, User } from "../schema/common";
import {
BuildJwtParams,
RefreshJwtParams,
GenerateJwtParams,
AuthenticateJwtParams,
} from "../schema/functions";
import { GenerateOptionsSchema } from "../schema/generate";
import { RefreshOptionsSchema } from "../schema/refresh";
import { verifyLoginPayload } from "./login";
function isBrowser() {
return typeof window !== "undefined";
}
function base64encode(data: string): string {
if (isBrowser()) {
return window.btoa(data);
}
return Buffer.from(data).toString("base64").replace(/=/g, "");
}
function base64decode(data: string): string {
if (isBrowser()) {
return window.atob(data);
}
return Buffer.from(data, "base64").toString();
}
/**
* Build JWT token based on the authentication payload
*/
async function buildJWT({ wallet, payload }: BuildJwtParams): Promise<string> {
const payloadData = AuthenticationPayloadDataSchema.parse(payload);
const message = JSON.stringify(payloadData);
const signature = await wallet.signMessage(message);
// Header used for JWT token specifying hash algorithm
const header = {
// Specify ECDSA with SHA-256 for hashing algorithm
alg: "ES256",
typ: "JWT",
};
const encodedHeader = base64encode(JSON.stringify(header));
const encodedData = base64encode(JSON.stringify(payloadData));
const encodedSignature = base64encode(signature);
// Generate a JWT with base64 encoded header, payload, and signature
const jwt = `${encodedHeader}.${encodedData}.${encodedSignature}`;
return jwt;
}
/**
* Generate a new JWT using a login payload
*/
export async function generateJWT({
wallet,
payload,
options,
}: GenerateJwtParams): Promise<string> {
const parsedOptions = GenerateOptionsSchema.parse(options);
const userAddress = await verifyLoginPayload({
wallet,
payload,
options: {
domain: parsedOptions.domain,
...parsedOptions.verifyOptions,
},
});
let session: Json | undefined = undefined;
if (typeof parsedOptions?.session === "function") {
const sessionTrigger = (await parsedOptions.session(userAddress)) as Json;
if (sessionTrigger) {
session = sessionTrigger;
}
} else {
session = parsedOptions?.session;
}
const adminAddress = await wallet.getAddress();
return buildJWT({
wallet,
payload: {
iss: adminAddress,
sub: userAddress,
aud: parsedOptions.domain,
nbf: parsedOptions?.invalidBefore || new Date(),
exp: parsedOptions.expirationTime,
iat: new Date(),
jti: parsedOptions?.tokenId,
ctx: session,
},
});
}
/**
* Parse data from an encoded auth JWT
*/
export function parseJWT(jwt: string): AuthenticationPayload {
const encodedPayload = jwt.split(".")[1];
const encodedSignature = jwt.split(".")[2];
const payload: AuthenticationPayloadData = JSON.parse(
base64decode(encodedPayload),
);
const signature = base64decode(encodedSignature);
return {
payload,
signature,
};
}
/**
* Refresh an existing JWT
*/
export async function refreshJWT({
wallet,
jwt,
options,
}: RefreshJwtParams): Promise<string> {
const { payload } = parseJWT(jwt);
const parsedOptions = RefreshOptionsSchema.parse(options);
return buildJWT({
wallet,
payload: {
iss: payload.iss,
sub: payload.sub,
aud: payload.aud,
nbf: new Date(),
exp: parsedOptions.expirationTime,
iat: new Date(),
ctx: payload.ctx,
},
});
}
/**
* Validate a JWT and extract the user's info
*/
export async function authenticateJWT<TSession extends Json = Json>({
wallet,
jwt,
options,
}: AuthenticateJwtParams): Promise<User<TSession>> {
const parsedOptions = AuthenticateOptionsSchema.parse(options);
const { payload, signature } = parseJWT(jwt);
// Check that the payload unique ID is valid
if (parsedOptions?.validateTokenId !== undefined) {
try {
await parsedOptions.validateTokenId(payload.jti);
} catch (err) {
throw new Error(`Token ID is invalid`);
}
}
// Check that the token audience matches the domain
if (payload.aud !== parsedOptions.domain) {
throw new Error(
`Expected token to be for the domain '${parsedOptions.domain}', but found token with domain '${payload.aud}'`,
);
}
// Check that the token is past the invalid before time
const currentTime = Math.floor(new Date().getTime() / 1000);
if (currentTime < payload.nbf) {
throw new Error(
`This token is invalid before epoch time '${payload.nbf}', current epoch time is '${currentTime}'`,
);
}
// Check that the token hasn't expired
if (currentTime > payload.exp) {
throw new Error(
`This token expired at epoch time '${payload.exp}', current epoch time is '${currentTime}'`,
);
}
// Check that the connected wallet matches the token issuer
const issuerAddress = parsedOptions.issuerAddress
? parsedOptions.issuerAddress
: await wallet.getAddress();
if (issuerAddress.toLowerCase() !== payload.iss.toLowerCase()) {
throw new Error(
`The expected issuer address '${issuerAddress}' did not match the token issuer address '${payload.iss}'`,
);
}
let chainId: number | undefined = undefined;
if (wallet.getChainId) {
try {
chainId = await wallet.getChainId();
} catch {
// ignore error
}
}
const verified = await wallet.verifySignature(
JSON.stringify(payload),
signature,
issuerAddress,
chainId,
);
if (!verified) {
throw new Error(
`The expected signer address '${issuerAddress}' did not sign the token`,
);
}
return {
address: payload.sub,
session: payload.ctx as TSession | undefined,
};
}
+224
View File
@@ -0,0 +1,224 @@
import {
BuildLoginPayloadParams,
SignLoginPayloadParams,
VerifyLoginPayloadParams,
} from "../schema/functions";
import {
LoginOptionsSchema,
LoginPayload,
LoginPayloadData,
LoginPayloadDataSchema,
} from "../schema/login";
import { VerifyOptionsSchema } from "../schema/verify";
/**
* Create an EIP-4361 & CAIP-122 compliant message to sign based on the login payload
*/
function createLoginMessage(payload: LoginPayloadData): string {
const typeField = payload.type === "evm" ? "Ethereum" : "Solana";
const header = `${payload.domain} wants you to sign in with your ${typeField} account:`;
let prefix = [header, payload.address].join("\n");
prefix = [prefix, payload.statement].join("\n\n");
if (payload.statement) {
prefix += "\n";
}
const suffixArray = [];
if (payload.uri) {
const uriField = `URI: ${payload.uri}`;
suffixArray.push(uriField);
}
const versionField = `Version: ${payload.version}`;
suffixArray.push(versionField);
if (payload.chain_id) {
const chainField = `Chain ID: ` + payload.chain_id || "1";
suffixArray.push(chainField);
}
const nonceField = `Nonce: ${payload.nonce}`;
suffixArray.push(nonceField);
const issuedAtField = `Issued At: ${payload.issued_at}`;
suffixArray.push(issuedAtField);
const expiryField = `Expiration Time: ${payload.expiration_time}`;
suffixArray.push(expiryField);
if (payload.invalid_before) {
const invalidBeforeField = `Not Before: ${payload.invalid_before}`;
suffixArray.push(invalidBeforeField);
}
if (payload.resources) {
suffixArray.push(
[`Resources:`, ...payload.resources.map((x) => `- ${x}`)].join("\n"),
);
}
const suffix = suffixArray.join("\n");
return [prefix, suffix].join("\n");
}
export async function buildLoginPayload({
wallet,
options,
}: BuildLoginPayloadParams): Promise<LoginPayloadData> {
const parsedOptions = LoginOptionsSchema.parse(options);
let chainId: string | undefined = parsedOptions?.chainId;
if (!chainId && wallet.getChainId) {
try {
chainId = (await wallet.getChainId()).toString();
} catch {
// ignore error
}
}
return LoginPayloadDataSchema.parse({
type: wallet.type,
domain: parsedOptions.domain,
address: parsedOptions?.address || (await wallet.getAddress()),
statement: parsedOptions?.statement,
version: parsedOptions?.version,
uri: parsedOptions?.uri,
chain_id: chainId,
nonce: parsedOptions?.nonce,
expiration_time: parsedOptions.expirationTime,
invalid_before: parsedOptions.invalidBefore,
resources: parsedOptions?.resources,
});
}
export async function signLoginPayload({
wallet,
payload,
}: SignLoginPayloadParams): Promise<LoginPayload> {
const message = createLoginMessage(payload);
const signature = await wallet.signMessage(message);
return {
payload,
signature,
};
}
export async function buildAndSignLoginPayload({
wallet,
options,
}: BuildLoginPayloadParams): Promise<LoginPayload> {
const payload = await buildLoginPayload({ wallet, options });
return signLoginPayload({ wallet, payload });
}
export async function verifyLoginPayload({
wallet,
payload,
options,
}: VerifyLoginPayloadParams): Promise<string> {
const parsedOptions = VerifyOptionsSchema.parse(options);
if (payload.payload.type !== wallet.type) {
throw new Error(
`Expected chain type '${wallet.type}' does not match chain type on payload '${payload.payload.type}'`,
);
}
// Check that the intended domain matches the domain of the payload
if (payload.payload.domain !== parsedOptions.domain) {
throw new Error(
`Expected domain '${parsedOptions.domain}' does not match domain on payload '${payload.payload.domain}'`,
);
}
// Check that the payload statement matches the expected statement
if (parsedOptions?.statement) {
if (payload.payload.statement !== parsedOptions.statement) {
throw new Error(
`Expected statement '${parsedOptions.statement}' does not match statement on payload '${payload.payload.statement}'`,
);
}
}
// Check that the intended URI matches the URI of the payload
if (parsedOptions?.uri) {
if (payload.payload.uri !== parsedOptions.uri) {
throw new Error(
`Expected URI '${parsedOptions.uri}' does not match URI on payload '${payload.payload.uri}'`,
);
}
}
// Check that the intended version matches the version of the payload
if (parsedOptions?.version) {
if (payload.payload.version !== parsedOptions.version) {
throw new Error(
`Expected version '${parsedOptions.version}' does not match version on payload '${payload.payload.version}'`,
);
}
}
// Check that the intended chain ID matches the chain ID of the payload
if (parsedOptions?.chainId) {
if (payload.payload.chain_id !== parsedOptions.chainId) {
throw new Error(
`Expected chain ID '${parsedOptions.chainId}' does not match chain ID on payload '${payload.payload.chain_id}'`,
);
}
}
// Check that the payload nonce is valid
if (parsedOptions?.validateNonce !== undefined) {
try {
await parsedOptions.validateNonce(payload.payload.nonce);
} catch (err) {
throw new Error(`Login request nonce is invalid`);
}
}
// Check that it isn't before the invalid before time
const currentTime = new Date();
if (currentTime < new Date(payload.payload.invalid_before)) {
throw new Error(`Login request is not yet valid`);
}
// Check that the payload hasn't expired
if (currentTime > new Date(payload.payload.expiration_time)) {
throw new Error(`Login request has expired`);
}
// Check that the specified resources are present on the payload
if (parsedOptions?.resources) {
const missingResources = parsedOptions.resources.filter(
(resource) => !payload.payload.resources?.includes(resource),
);
if (missingResources.length > 0) {
throw new Error(
`Login request is missing required resources: ${missingResources.join(
", ",
)}`,
);
}
}
// Check that the signing address is the claimed wallet address
const message = createLoginMessage(payload.payload);
const chainId =
wallet.type === "evm" && payload.payload.chain_id
? parseInt(payload.payload.chain_id)
: undefined;
const verified = await wallet.verifySignature(
message,
payload.signature,
payload.payload.address,
chainId,
);
if (!verified) {
throw new Error(
`Signer address does not match payload address '${payload.payload.address.toLowerCase()}'`,
);
}
return payload.payload.address;
}
+24 -1
View File
@@ -1,2 +1,25 @@
// Export thirdweb auth class
export { ThirdwebAuth } from "./auth";
export * from "./schema";
// Export individual auth functions
export {
generateJWT,
parseJWT,
refreshJWT,
authenticateJWT,
} from "./functions/jwt";
export {
buildLoginPayload,
signLoginPayload,
buildAndSignLoginPayload,
verifyLoginPayload,
} from "./functions/login";
// Export schema files individually
export * from "./schema/authenticate";
export * from "./schema/common";
export * from "./schema/functions";
export * from "./schema/generate";
export * from "./schema/login";
export * from "./schema/refresh";
export * from "./schema/verify";
-216
View File
@@ -1,216 +0,0 @@
import { utils, BigNumber } from "ethers";
import { v4 as uuidv4 } from "uuid";
import { z } from "zod";
export const AddressSchema = z.string().refine(
(arg) => utils.isAddress(arg),
(out) => {
return {
message: `${out} is not a valid address`,
};
},
);
export const RawDateSchema = z.date().transform((i) => {
return BigNumber.from(Math.floor(i.getTime() / 1000));
});
export const AccountTypeSchema = z.union([
z.literal("evm"),
z.literal("solana"),
]);
const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);
type Literal = z.infer<typeof literalSchema>;
export type Json = Literal | { [key: string]: Json } | Json[];
const JsonSchema: z.ZodType<Json> = z.lazy(
() => z.union([literalSchema, z.array(JsonSchema), z.record(JsonSchema)]),
{ invalid_type_error: "Provided value was not valid JSON" },
);
/**
* @internal
*/
export const LoginOptionsSchema = z
.object({
domain: z.string().optional(),
address: z.string().optional(),
statement: z.string().optional(),
uri: z.string().optional(),
version: z.string().optional(),
chainId: z.string().optional(),
nonce: z.string().optional(),
expirationTime: z.date().optional(),
invalidBefore: z.date().optional(),
resources: z.array(z.string()).optional(),
})
.optional();
/**
* @internal
*/
export const LoginPayloadDataSchema = z.object({
type: AccountTypeSchema,
domain: z.string(),
address: z.string(),
statement: z
.string()
.default(
"Please ensure that the domain above matches the URL of the current website.",
),
uri: z.string().optional(),
version: z.string().default("1"),
chain_id: z.string().optional(),
nonce: z.string().default(uuidv4()),
issued_at: z
.date()
.default(new Date())
.transform((d) => d.toISOString()),
expiration_time: z.date().transform((d) => d.toISOString()),
invalid_before: z
.date()
.default(new Date())
.transform((d) => d.toISOString()),
resources: z.array(z.string()).optional(),
});
/**
* @internal
*/
export const LoginPayloadSchema = z.object({
payload: LoginPayloadDataSchema,
signature: z.string(),
});
/**
* @internal
*/
const VerifyOptionsSchemaRequired = z.object({
domain: z.string().optional(),
statement: z.string().optional(),
uri: z.string().optional(),
version: z.string().optional(),
chainId: z.string().optional(),
validateNonce: z.function().args(z.string()).optional(),
resources: z.array(z.string()).optional(),
});
/**
* @internal
*/
export const VerifyOptionsSchema = VerifyOptionsSchemaRequired.optional();
/**
* @internal
*/
export const GenerateOptionsSchema = z
.object({
domain: z.string().optional(),
tokenId: z.string().optional(),
expirationTime: z.date().optional(),
invalidBefore: z.date().optional(),
session: z.union([JsonSchema, z.function().args(z.string())]).optional(),
verifyOptions: VerifyOptionsSchemaRequired.omit({
domain: true,
}).optional(),
})
.optional();
/**
* @internal
*/
export const AuthenticationPayloadDataSchema = z.object({
iss: z.string(),
sub: z.string(),
aud: z.string(),
exp: RawDateSchema.transform((b) => b.toNumber()),
nbf: RawDateSchema.transform((b) => b.toNumber()),
iat: RawDateSchema.transform((b) => b.toNumber()),
jti: z.string().default(uuidv4()),
ctx: JsonSchema.optional(),
});
/**
* @internal
*/
export const AuthenticationPayloadSchema = z.object({
payload: AuthenticationPayloadDataSchema,
signature: z.string(),
});
/**
* @internal
*/
export const AuthenticateOptionsSchema = z
.object({
domain: z.string().optional(),
validateTokenId: z.function().args(z.string()).optional(),
})
.optional();
/**
* @public
*/
export type LoginOptions = z.input<typeof LoginOptionsSchema>;
/**
* @public
*/
export type LoginPayloadData = z.output<typeof LoginPayloadDataSchema>;
/**
* @public
*/
export type LoginPayload = z.output<typeof LoginPayloadSchema>;
/**
* @public
*/
export type VerifyOptions = z.input<typeof VerifyOptionsSchema>;
/**
* @public
*/
export type GenerateOptions = z.input<typeof GenerateOptionsSchema>;
/**
* @public
*/
export type AuthenticationPayloadData = z.output<
typeof AuthenticationPayloadDataSchema
>;
/**
* @internal
*/
export type AuthenticationPayloadDataInput = z.input<
typeof AuthenticationPayloadDataSchema
>;
/**
* @public
*/
export type AuthenticationPayload = z.output<
typeof AuthenticationPayloadSchema
>;
/**
* @public
*/
export type AuthenticateOptions = z.output<typeof AuthenticateOptionsSchema>;
/**
* @public
*/
export type User<TContext extends Json = Json> = {
address: string;
session?: TContext;
};
export const LoginPayloadOutputSchema = LoginPayloadSchema.extend({
payload: LoginPayloadDataSchema.extend({
issued_at: z.string(),
expiration_time: z.string(),
invalid_before: z.string(),
}),
});
@@ -0,0 +1,46 @@
import { z } from "zod";
import { v4 as uuidv4 } from "uuid";
import { AddressSchema, JsonSchema, RawDateSchema } from "./common";
export const AuthenticationPayloadDataSchema = z.object({
iss: z.string(),
sub: z.string(),
aud: z.string(),
exp: RawDateSchema,
nbf: RawDateSchema,
iat: RawDateSchema,
jti: z.string().default(uuidv4()),
ctx: JsonSchema.optional(),
});
export const AuthenticationPayloadSchema = z.object({
payload: AuthenticationPayloadDataSchema,
signature: z.string(),
});
export const AuthenticateOptionsSchema = z.object({
domain: z.string(),
issuerAddress: AddressSchema.optional(),
validateTokenId: z.function().args(z.string()).optional(),
});
export type AuthenticationPayloadDataInput = z.input<
typeof AuthenticationPayloadDataSchema
>;
export type AuthenticationPayloadData = z.output<
typeof AuthenticationPayloadDataSchema
>;
export type AuthenticationPayload = z.output<
typeof AuthenticationPayloadSchema
>;
export type AuthenticateOptions = z.output<typeof AuthenticateOptionsSchema>;
export type AuthenticateOptionsWithOptionalDomain = Omit<
AuthenticateOptions,
"domain"
> & {
domain?: string;
};
+34
View File
@@ -0,0 +1,34 @@
import { utils } from "ethers";
import { z } from "zod";
const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);
type Literal = z.infer<typeof literalSchema>;
export type Json = Literal | { [key: string]: Json } | Json[];
export const JsonSchema: z.ZodType<Json> = z.lazy(
() => z.union([literalSchema, z.array(JsonSchema), z.record(JsonSchema)]),
{ invalid_type_error: "Provided value was not valid JSON" },
);
export const AddressSchema = z.string().refine(
(arg) => utils.isAddress(arg),
(out) => {
return {
message: `${out} is not a valid address`,
};
},
);
export const RawDateSchema = z.date().transform((i) => {
return Math.floor(i.getTime() / 1000);
});
export const AccountTypeSchema = z.union([
z.literal("evm"),
z.literal("solana"),
]);
export type User<TContext extends Json = Json> = {
address: string;
session?: TContext;
};
@@ -0,0 +1,48 @@
import { GenericAuthWallet } from "@thirdweb-dev/wallets";
import { LoginOptions, LoginPayload, LoginPayloadData } from "./login";
import { VerifyOptions } from "./verify";
import {
AuthenticateOptions,
AuthenticationPayloadDataInput,
} from "./authenticate";
import { RefreshOptions } from "./refresh";
import { GenerateOptions } from "./generate";
export type BuildLoginPayloadParams = {
wallet: GenericAuthWallet;
options: LoginOptions;
};
export type SignLoginPayloadParams = {
wallet: GenericAuthWallet;
payload: LoginPayloadData;
};
export type VerifyLoginPayloadParams = {
wallet: GenericAuthWallet;
payload: LoginPayload;
options: VerifyOptions;
};
export type BuildJwtParams = {
wallet: GenericAuthWallet;
payload: AuthenticationPayloadDataInput;
};
export type GenerateJwtParams = {
wallet: GenericAuthWallet;
payload: LoginPayload;
options: GenerateOptions;
};
export type RefreshJwtParams = {
wallet: GenericAuthWallet;
jwt: string;
options?: RefreshOptions;
};
export type AuthenticateJwtParams = {
wallet: GenericAuthWallet;
jwt: string;
options: AuthenticateOptions;
};
+31
View File
@@ -0,0 +1,31 @@
import { z } from "zod";
import { VerifyOptionsSchema } from "./verify";
import { JsonSchema } from "./common";
import { THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS } from "../../constants";
export const GenerateOptionsSchema = z.object({
domain: z.string(),
tokenId: z.string().optional(),
expirationTime: z
.date()
.default(
() =>
new Date(
Date.now() + 1000 * THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
),
),
invalidBefore: z.date().optional(),
session: z.union([JsonSchema, z.function().args(z.string())]).optional(),
verifyOptions: VerifyOptionsSchema.omit({
domain: true,
}).optional(),
});
export type GenerateOptions = z.input<typeof GenerateOptionsSchema>;
export type GenerateOptionsWithOptionalDomain = Omit<
GenerateOptions,
"domain"
> & {
domain?: string;
};
+81
View File
@@ -0,0 +1,81 @@
import { z } from "zod";
import { v4 as uuidv4 } from "uuid";
import { AccountTypeSchema } from "./common";
import { THIRDWEB_AUTH_DEFAULT_LOGIN_PAYLOAD_DURATION_IN_SECONDS } from "../../constants";
export const LoginOptionsSchema = z.object({
domain: z.string(),
address: z.string().optional(),
statement: z.string().optional(),
uri: z.string().optional(),
version: z.string().optional(),
chainId: z.string().optional(),
nonce: z.string().optional(),
expirationTime: z
.date()
.default(
() =>
new Date(
Date.now() +
1000 * THIRDWEB_AUTH_DEFAULT_LOGIN_PAYLOAD_DURATION_IN_SECONDS,
),
),
invalidBefore: z
.date()
.default(
() =>
new Date(
Date.now() -
1000 * THIRDWEB_AUTH_DEFAULT_LOGIN_PAYLOAD_DURATION_IN_SECONDS,
),
),
resources: z.array(z.string()).optional(),
});
export const LoginPayloadDataSchema = z.object({
type: AccountTypeSchema,
domain: z.string(),
address: z.string(),
statement: z
.string()
.default(
"Please ensure that the domain above matches the URL of the current website.",
),
uri: z.string().optional(),
version: z.string().default("1"),
chain_id: z.string().optional(),
nonce: z.string().default(uuidv4()),
issued_at: z
.date()
.default(new Date())
.transform((d) => d.toISOString()),
expiration_time: z.date().transform((d) => d.toISOString()),
invalid_before: z
.date()
.default(new Date())
.transform((d) => d.toISOString()),
resources: z.array(z.string()).optional(),
});
export const LoginPayloadSchema = z.object({
payload: LoginPayloadDataSchema,
signature: z.string(),
});
export const LoginPayloadOutputSchema = LoginPayloadSchema.extend({
payload: LoginPayloadDataSchema.extend({
issued_at: z.string(),
expiration_time: z.string(),
invalid_before: z.string(),
}),
});
export type LoginOptions = z.input<typeof LoginOptionsSchema>;
export type LoginPayloadData = z.output<typeof LoginPayloadDataSchema>;
export type LoginPayload = z.output<typeof LoginPayloadSchema>;
export type LoginOptionsWithOptionalDomain = Omit<LoginOptions, "domain"> & {
domain?: string;
};
+15
View File
@@ -0,0 +1,15 @@
import { z } from "zod";
import { THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS } from "../../constants";
export const RefreshOptionsSchema = z.object({
expirationTime: z
.date()
.default(
() =>
new Date(
Date.now() + 1000 * THIRDWEB_AUTH_DEFAULT_TOKEN_DURATION_IN_SECONDS,
),
),
});
export type RefreshOptions = z.input<typeof RefreshOptionsSchema>;
+17
View File
@@ -0,0 +1,17 @@
import { z } from "zod";
export const VerifyOptionsSchema = z.object({
domain: z.string(),
statement: z.string().optional(),
uri: z.string().optional(),
version: z.string().optional(),
chainId: z.string().optional(),
validateNonce: z.function().args(z.string()).optional(),
resources: z.array(z.string()).optional(),
});
export type VerifyOptions = z.input<typeof VerifyOptionsSchema>;
export type VerifyOptionsWithOptionalDomain = Omit<VerifyOptions, "domain"> & {
domain?: string;
};
-9
View File
@@ -1,9 +0,0 @@
/**
* @internal
*/
export const isBrowser = () => typeof window !== "undefined";
/**
* @internal
*/
export const isNode = () => !isBrowser();
+1 -1
View File
@@ -1,5 +1,5 @@
import { ThirdwebAuth } from "../../core";
import { Json, LoginPayloadOutputSchema, User } from "../../core/schema";
import { Json, LoginPayloadOutputSchema, User } from "../../core";
import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
import { Request } from "express";
import { z } from "zod";
+1 -2
View File
@@ -1,5 +1,4 @@
import { ThirdwebAuth } from "../../core";
import { Json, LoginPayloadOutputSchema, User } from "../../core/schema";
import { Json, LoginPayloadOutputSchema, ThirdwebAuth, User } from "../../core";
import type { GenericAuthWallet } from "@thirdweb-dev/wallets";
import { GetServerSidePropsContext, NextApiRequest } from "next";
import { NextRequest } from "next/server";
+22 -2
View File
@@ -3,7 +3,7 @@ import { EthersWallet } from "@thirdweb-dev/wallets/evm/wallets/ethers";
import { expect } from "chai";
import { Wallet } from "ethers";
describe("Wallet Authentication", async () => {
describe("Wallet Authentication - EVM", async () => {
let adminWallet: any, signerWallet: any, attackerWallet: any;
let auth: ThirdwebAuth;
@@ -272,7 +272,7 @@ describe("Wallet Authentication", async () => {
expect.fail();
} catch (err: any) {
expect(err.message).to.contain(
`Expected the connected wallet address '${await signerWallet.getAddress()}' to match the token issuer address '${await adminWallet.getAddress()}'`,
`The expected issuer address '${await signerWallet.getAddress()}' did not match the token issuer address '${await adminWallet.getAddress()}'`,
);
}
});
@@ -350,4 +350,24 @@ describe("Wallet Authentication", async () => {
role: "admin",
});
});
it("Should authenticate with issuer address", async () => {
const payload = await auth.login();
auth.updateWallet(adminWallet);
const token = await auth.generate(payload);
auth.updateWallet(attackerWallet);
try {
await auth.authenticate(token);
expect.fail();
} catch (err: any) {
expect(err.message).to.contain("The expected issuer address");
}
const user = await auth.authenticate(token, {
issuerAddress: await adminWallet.getAddress(),
});
expect(user.address).to.equal(await signerWallet.getAddress());
});
});
+2 -2
View File
@@ -3,7 +3,7 @@ import { Keypair } from "@solana/web3.js";
import { KeypairWallet } from "@thirdweb-dev/wallets/solana/wallets/keypair";
import { expect } from "chai";
describe("Wallet Authentication", async () => {
describe("Wallet Authentication - Solana", async () => {
let adminWallet: any, signerWallet: any, attackerWallet: any;
let auth: ThirdwebAuth;
@@ -272,7 +272,7 @@ describe("Wallet Authentication", async () => {
expect.fail();
} catch (err: any) {
expect(err.message).to.contain(
`Expected the connected wallet address '${await signerWallet.getAddress()}' to match the token issuer address '${await adminWallet.getAddress()}'`,
`The expected issuer address '${await signerWallet.getAddress()}' did not match the token issuer address '${await adminWallet.getAddress()}'`,
);
}
});
+97
View File
@@ -1,5 +1,102 @@
# @thirdweb-dev/chains
## 0.1.53
### Patch Changes
- [#1631](https://github.com/thirdweb-dev/js/pull/1631) [`dd3d1a87`](https://github.com/thirdweb-dev/js/commit/dd3d1a87c2dadbadecc9ac3722941a8992bc8131) Thanks [@jnsdls](https://github.com/jnsdls)! - add & update chains
- [#1662](https://github.com/thirdweb-dev/js/pull/1662) [`d5fafdde`](https://github.com/thirdweb-dev/js/commit/d5fafddea58bc307c9b514a1c9578cafd18b5861) Thanks [@jnsdls](https://github.com/jnsdls)! - added & updated chains
## 0.1.52
### Patch Changes
- [#1534](https://github.com/thirdweb-dev/js/pull/1534) [`48295c06`](https://github.com/thirdweb-dev/js/commit/48295c060499371035980d08e362d9858d0fc18b) Thanks [@ElasticBottle](https://github.com/ElasticBottle)! - feat(chains): add new chain information
## 0.1.51
### Patch Changes
- [#1607](https://github.com/thirdweb-dev/js/pull/1607) [`8b73abfd`](https://github.com/thirdweb-dev/js/commit/8b73abfd83c7a8235f5d65f07dc3ad1296b40ae0) Thanks [@nkrishang](https://github.com/nkrishang)! - Use IAccountFactoryCore
- [#1599](https://github.com/thirdweb-dev/js/pull/1599) [`3056c34c`](https://github.com/thirdweb-dev/js/commit/3056c34c646e1a8c80f1323899c163e0fa867fd1) Thanks [@MananTank](https://github.com/MananTank)! - Update chains
## 0.1.50
### Patch Changes
- [#1558](https://github.com/thirdweb-dev/js/pull/1558) [`926dd7b0`](https://github.com/thirdweb-dev/js/commit/926dd7b03f38ed25ca303dc23d3323d5edd28005) Thanks [@Marfuen](https://github.com/Marfuen)! - Updating chains list
## 0.1.49
### Patch Changes
- [#1540](https://github.com/thirdweb-dev/js/pull/1540) [`b30566c6`](https://github.com/thirdweb-dev/js/commit/b30566c68436ad94ddc938a380eccc13a8a7147d) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - updated chains
- [#1422](https://github.com/thirdweb-dev/js/pull/1422) [`0f027069`](https://github.com/thirdweb-dev/js/commit/0f027069064bebe647f9235fa86ef7f165ffc7b3) Thanks [@Marfuen](https://github.com/Marfuen)! - CLI will now use an OAuth like login flow to authenticate the device with the wallet on the dashboard.
Any actions performed by the CLI will be linked to your account / wallet on the dashboard, including but not limited to tracking your usage, and billing as needed.
- [#1551](https://github.com/thirdweb-dev/js/pull/1551) [`f5aed34d`](https://github.com/thirdweb-dev/js/commit/f5aed34d3c71065c3f45df2c1eb84ba9c36162d5) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Update chains
## 0.1.48
### Patch Changes
- [#1530](https://github.com/thirdweb-dev/js/pull/1530) [`911e14fc`](https://github.com/thirdweb-dev/js/commit/911e14fcac743b07fa1a66440c72d662c08e971c) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Add Chiliz Spicy testnet
## 0.1.47
### Patch Changes
- [#1518](https://github.com/thirdweb-dev/js/pull/1518) [`34a3bb8a`](https://github.com/thirdweb-dev/js/commit/34a3bb8ae3c1d7a506e5568a9e79ab7e469557a8) Thanks [@nkrishang](https://github.com/nkrishang)! - Update contracts package
## 0.1.46
### Patch Changes
- [#1508](https://github.com/thirdweb-dev/js/pull/1508) [`184c325a`](https://github.com/thirdweb-dev/js/commit/184c325ab2ef028022a050c4274f2ab12b1a3a7f) Thanks [@jnsdls](https://github.com/jnsdls)! - update xpla chain icons
- [#1513](https://github.com/thirdweb-dev/js/pull/1513) [`c12f0874`](https://github.com/thirdweb-dev/js/commit/c12f0874b4dac43c263c7edb20d0343c16381c34) Thanks [@jnsdls](https://github.com/jnsdls)! - add additonal chains
## 0.1.45
### Patch Changes
- [#1506](https://github.com/thirdweb-dev/js/pull/1506) [`f97ddf4c`](https://github.com/thirdweb-dev/js/commit/f97ddf4c7f14854f3b204ad9741b52ddb8dac736) Thanks [@jnsdls](https://github.com/jnsdls)! - add xpla chains & update chains
## 0.1.44
### Patch Changes
- [#1499](https://github.com/thirdweb-dev/js/pull/1499) [`8f3b685a`](https://github.com/thirdweb-dev/js/commit/8f3b685ad2bd73cb4d5d8c8aa25c04ffc10fb7cf) Thanks [@Marfuen](https://github.com/Marfuen)! - Update deploy command from CLI to use show a public gateway url temporarily. Updated chains too.
## 0.1.43
### Patch Changes
- [#1469](https://github.com/thirdweb-dev/js/pull/1469) [`cb1c9937`](https://github.com/thirdweb-dev/js/commit/cb1c9937fadb2d06eb148cf9819f2b3601376308) Thanks [@jnsdls](https://github.com/jnsdls)! - update chains
- [#1474](https://github.com/thirdweb-dev/js/pull/1474) [`a1732663`](https://github.com/thirdweb-dev/js/commit/a17326634e758c3bf42f0cc3869b8792f1e18cc9) Thanks [@adam-maj](https://github.com/adam-maj)! - Add back scroll-alpha-testnet
- [#1458](https://github.com/thirdweb-dev/js/pull/1458) [`588b2106`](https://github.com/thirdweb-dev/js/commit/588b21060139a7c0bf5805e2c629a16792ed2c76) Thanks [@kien-ngo](https://github.com/kien-ngo)! - Update chains
- [#1461](https://github.com/thirdweb-dev/js/pull/1461) [`269e68c0`](https://github.com/thirdweb-dev/js/commit/269e68c0a15e8f78cb5b68c9456ca8094b9e1f30) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - add xai-goerli chain and support BigInteger from Unity
## 0.1.42
### Patch Changes
- [#1450](https://github.com/thirdweb-dev/js/pull/1450) [`262edc6a`](https://github.com/thirdweb-dev/js/commit/262edc6a46792da88f49ff6ef0a756a932a6a0cf) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - update chains
## 0.1.41
### Patch Changes
- [#1436](https://github.com/thirdweb-dev/js/pull/1436) [`fd981655`](https://github.com/thirdweb-dev/js/commit/fd9816556fe595b0c764e34dbcf15b0ad1677edb) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Updated chains
- [#1432](https://github.com/thirdweb-dev/js/pull/1432) [`9f5adc5c`](https://github.com/thirdweb-dev/js/commit/9f5adc5c5c2782ffb878759df481e5fb1e1740e5) Thanks [@jnsdls](https://github.com/jnsdls)! - update chains
## 0.1.40
### Patch Changes
+4 -1
View File
@@ -15,7 +15,10 @@ export default {
"https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
"https://api.mycryptoapi.com/eth",
"https://cloudflare-eth.com",
"https://ethereum.publicnode.com"
"https://ethereum.publicnode.com",
"wss://ethereum.publicnode.com",
"https://mainnet.gateway.tenderly.co",
"wss://mainnet.gateway.tenderly.co"
],
"features": [
{
+4 -1
View File
@@ -7,7 +7,10 @@ export default {
"https://optimism-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
"https://mainnet.optimism.io",
"https://optimism.publicnode.com"
"https://optimism.publicnode.com",
"wss://optimism.publicnode.com",
"https://optimism.gateway.tenderly.co",
"wss://optimism.gateway.tenderly.co"
],
"faucets": [],
"nativeCurrency": {
+1
View File
@@ -18,6 +18,7 @@ export default {
"https://gnosis.api.onfinality.io/public",
"https://gnosis.blockpi.network/v1/rpc/public",
"https://web3endpoints.com/gnosischain-mainnet",
"https://gnosis.oat.farm",
"wss://rpc.gnosischain.com/wss"
],
"faucets": [
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Tectum Emission Token",
"chain": "TET",
"rpc": [
"https://tectum-emission-token.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.softnote.com/"
],
"faucets": [],
"nativeCurrency": {
"name": "Tectum",
"symbol": "TET",
"decimals": 8
},
"infoURL": "https://softnote.com",
"shortName": "tet",
"chainId": 1003,
"networkId": 1003,
"explorers": [
{
"name": "Tectum explorer",
"url": "https://explorer.tectum.io",
"icon": {
"url": "ipfs://QmYvFVprVdAGJH4iHUCXGEmy7pq8MMfxEjM64SuXutz9qx",
"width": 256,
"height": 256,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "tectum-emission-token"
} as const satisfies Chain;
+29
View File
@@ -0,0 +1,29 @@
import type { Chain } from "../src/types";
export default {
"name": "Japan Open Chain Testnet",
"chain": "JOCT",
"rpc": [
"https://japan-open-chain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-1.testnet.japanopenchain.org:8545",
"https://rpc-2.testnet.japanopenchain.org:8545"
],
"faucets": [],
"nativeCurrency": {
"name": "Japan Open Chain Testnet Token",
"symbol": "JOCT",
"decimals": 18
},
"infoURL": "https://www.japanopenchain.org/",
"shortName": "joct",
"chainId": 10081,
"networkId": 10081,
"explorers": [
{
"name": "Testnet Block Explorer",
"url": "https://explorer.testnet.japanopenchain.org",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "japan-open-chain-testnet"
} as const satisfies Chain;
+38
View File
@@ -0,0 +1,38 @@
import type { Chain } from "../src/types";
export default {
"name": "MaxxChain Mainnet",
"chain": "MaxxChain",
"rpc": [
"https://maxxchain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.maxxchain.org",
"https://rpc1.maxxchain.org",
"https://rpc2.maxxchain.org"
],
"faucets": [
"https://faucet.maxxchain.org"
],
"nativeCurrency": {
"name": "Power",
"symbol": "PWR",
"decimals": 18
},
"icon": {
"url": "ipfs://QmRhQG9TZrXDdbQeTzBmjg3pqgwaD5TKVZj8k4kaz8AoZx",
"width": 1021,
"height": 1021,
"format": "png"
},
"infoURL": "https://www.maxxchain.org/",
"shortName": "PWR",
"chainId": 10201,
"networkId": 10201,
"explorers": [
{
"name": "MaxxChain Block Explorer",
"url": "https://explorer.maxxchain.org",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "maxxchain"
} as const satisfies Chain;
+42
View File
@@ -0,0 +1,42 @@
import type { Chain } from "../src/types";
export default {
"name": "Arthera Testnet",
"chain": "AA",
"icon": {
"url": "ipfs://QmYQp3e52KjkT4bYdAvB6ACEEpXs2D8DozsDitaADRY2Ak",
"width": 1024,
"height": 998,
"format": "png"
},
"rpc": [
"https://arthera-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-test.arthera.net"
],
"faucets": [
"https://faucet.arthera.net"
],
"nativeCurrency": {
"name": "Arthera",
"symbol": "AA",
"decimals": 18
},
"infoURL": "https://docs.arthera.net",
"shortName": "aa",
"chainId": 10243,
"networkId": 10243,
"explorers": [
{
"name": "blockscout",
"url": "https://explorer-test.arthera.net",
"icon": {
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
"width": 551,
"height": 540,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "arthera-testnet"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Worldland Mainnet",
"chain": "Worldland",
"icon": {
"url": "ipfs://QmYZNTfK3byhgLsTjXP8vPubVHRz2CWsBrTJxZrQmKq6JZ",
"width": 3509,
"height": 2482,
"format": "png"
},
"rpc": [
"https://worldland.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://seoul.worldland.foundation"
],
"faucets": [],
"nativeCurrency": {
"name": "Worldland",
"symbol": "WL",
"decimals": 18
},
"infoURL": "https://worldland.foundation",
"shortName": "WLC",
"chainId": 103,
"networkId": 103,
"explorers": [
{
"name": "Worldland Explorer",
"url": "https://scan.worldland.foundation",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "worldland"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Worldland Testnet",
"chain": "Worldland",
"icon": {
"url": "ipfs://QmYZNTfK3byhgLsTjXP8vPubVHRz2CWsBrTJxZrQmKq6JZ",
"width": 3509,
"height": 2482,
"format": "png"
},
"rpc": [
"https://worldland-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gwangju.worldland.foundation"
],
"faucets": [],
"nativeCurrency": {
"name": "Worldland",
"symbol": "WL",
"decimals": 18
},
"infoURL": "https://worldland.foundation",
"shortName": "TWLC",
"chainId": 10395,
"networkId": 10395,
"explorers": [
{
"name": "Worldland Explorer",
"url": "https://testscan.worldland.foundation",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "worldland-testnet"
} as const satisfies Chain;
+1 -3
View File
@@ -8,9 +8,7 @@ export default {
"https://mainnet-rpc.thundertoken.net",
"https://mainnet-rpc.thundercore.io"
],
"faucets": [
"https://faucet.thundercore.com"
],
"faucets": [],
"nativeCurrency": {
"name": "ThunderCore Token",
"symbol": "TT",
+53
View File
@@ -0,0 +1,53 @@
import type { Chain } from "../src/types";
export default {
"name": "Humans.ai Mainnet",
"chain": "Humans",
"rpc": [
"https://humans-ai.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://jsonrpc.humans.nodestake.top",
"https://humans-mainnet-evm.itrocket.net:443",
"https://humans-evm-rpc.staketab.org:443",
"https://evm.humans.stakepool.dev.br",
"https://mainnet-humans-evm.konsortech.xyz",
"https://evm-rpc.mainnet.humans.zone"
],
"faucets": [],
"nativeCurrency": {
"name": "HEART",
"symbol": "HEART",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://humans.ai",
"shortName": "humans",
"chainId": 1089,
"networkId": 1089,
"icon": {
"url": "ipfs://QmX6XuoQDTTjYqAmdNJiieLDZSwHHyUx44yQb4E3tmHmEA",
"width": 400,
"height": 400,
"format": "png"
},
"explorers": [
{
"name": "explorer.guru",
"url": "https://humans.explorers.guru",
"icon": {
"url": "ipfs://QmU83haX3TNifDDjBx6RP6ByqES1Kg9VqeJC87X9ipKyCS",
"width": 386,
"height": 397,
"format": "png"
},
"standard": "none"
}
],
"testnet": false,
"slug": "humans-ai"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Shibarium",
"chain": "Shibarium",
"icon": {
"url": "ipfs://QmYNVkoZgRjDBQzJz6kog9mA2yPzQFW2oSKvhnkwuBhLQE",
"width": 2000,
"height": 2000,
"format": "png"
},
"rpc": [
"https://shibarium.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://www.shibrpc.com"
],
"faucets": [],
"nativeCurrency": {
"name": "BONE Shibarium",
"symbol": "BONE",
"decimals": 18
},
"infoURL": "https://shibariumecosystem.com",
"shortName": "shibariumecosystem",
"chainId": 109,
"networkId": 109,
"explorers": [
{
"name": "shibariumscan",
"url": "https://www.shibariumscan.io",
"standard": "none"
}
],
"testnet": false,
"slug": "shibarium"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "BLXq Testnet",
"chain": "BLXQ",
"icon": {
"url": "ipfs://QmS9kDKr1rgcz5W55yCQVfFs1vRTCneaLHt1t9cBizpqpH",
"width": 1000,
"height": 1000,
"format": "png"
},
"rpc": [
"https://blxq-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnetq1.blx.org"
],
"faucets": [],
"nativeCurrency": {
"name": "BLXQ",
"symbol": "BLXQ",
"decimals": 18
},
"infoURL": "https://blx.org",
"shortName": "tblxq",
"chainId": 1107,
"networkId": 1107,
"explorers": [
{
"name": "BLXq Explorer",
"url": "https://explorer.blx.org",
"icon": {
"url": "ipfs://QmS9kDKr1rgcz5W55yCQVfFs1vRTCneaLHt1t9cBizpqpH",
"width": 1000,
"height": 1000,
"format": "png"
},
"standard": "none"
}
],
"testnet": true,
"slug": "blxq-testnet"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "BLXq Mainnet",
"chain": "BLXQ",
"icon": {
"url": "ipfs://QmS9kDKr1rgcz5W55yCQVfFs1vRTCneaLHt1t9cBizpqpH",
"width": 1000,
"height": 1000,
"format": "png"
},
"rpc": [
"https://blxq.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet.blxq.org"
],
"faucets": [],
"nativeCurrency": {
"name": "BLXQ",
"symbol": "BLXQ",
"decimals": 18
},
"infoURL": "https://blx.org",
"shortName": "blxq",
"chainId": 1108,
"networkId": 1108,
"explorers": [
{
"name": "BLXq Explorer",
"url": "https://explorer.blxq.org",
"icon": {
"url": "ipfs://QmS9kDKr1rgcz5W55yCQVfFs1vRTCneaLHt1t9cBizpqpH",
"width": 1000,
"height": 1000,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "blxq"
} as const satisfies Chain;
+1 -3
View File
@@ -7,9 +7,7 @@ export default {
"https://mainnet-rpc.hashbit.org",
"https://rpc.hashbit.org"
],
"faucets": [
"https://free-online-app.com/faucet-for-eth-evm-chains/"
],
"faucets": [],
"nativeCurrency": {
"name": "HashBit Native Token",
"symbol": "HBIT",
+3 -1
View File
@@ -10,7 +10,9 @@ export default {
"https://rpc.sepolia.org",
"https://rpc2.sepolia.org",
"https://rpc-sepolia.rockx.com",
"https://rpc.sepolia.ethpandaops.io"
"https://rpc.sepolia.ethpandaops.io",
"https://sepolia.gateway.tenderly.co",
"wss://sepolia.gateway.tenderly.co"
],
"faucets": [
"http://fauceth.komputing.org?chain=11155111&address=${ADDRESS}"
+2 -1
View File
@@ -5,7 +5,8 @@ export default {
"rpc": [
"https://haqq-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.eth.haqq.network",
"https://haqq-evm.publicnode.com"
"https://haqq-evm.publicnode.com",
"wss://haqq-evm.publicnode.com"
],
"faucets": [],
"nativeCurrency": {
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "DeFiMetaChain",
"icon": {
"url": "ipfs://QmTFyaJFmkDQf35rVRzEf78nGThKAyUCW4BoRaKDi4nnV5",
"width": 720,
"height": 720,
"format": "png"
},
"chain": "DFI",
"rpc": [
"https://defimetachain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-dmc.mydefichain.com:20551"
],
"faucets": [
"http://tc04.mydefichain.com/faucet"
],
"nativeCurrency": {
"name": "DeFiChain Token",
"symbol": "DFI",
"decimals": 18
},
"infoURL": "https://defichain.com",
"shortName": "changi",
"chainId": 1133,
"networkId": 1133,
"explorers": [
{
"name": "MetaScan",
"url": "https://meta.defiscan.live",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "defimetachain"
} as const satisfies Chain;
-25
View File
@@ -1,25 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "DeBank Testnet",
"chain": "DeBank",
"rpc": [],
"faucets": [],
"icon": {
"url": "ipfs://QmW9pBps8WHRRWmyXhjLZrjZJUe8F48hUu7z98bu2RVsjN",
"width": 400,
"height": 400,
"format": "png"
},
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://debank.com",
"shortName": "debank-testnet",
"chainId": 115,
"networkId": 115,
"explorers": [],
"testnet": true,
"slug": "debank-testnet"
} as const satisfies Chain;
-25
View File
@@ -1,25 +0,0 @@
import type { Chain } from "../src/types";
export default {
"name": "DeBank Mainnet",
"chain": "DeBank",
"rpc": [],
"faucets": [],
"icon": {
"url": "ipfs://QmW9pBps8WHRRWmyXhjLZrjZJUe8F48hUu7z98bu2RVsjN",
"width": 400,
"height": 400,
"format": "png"
},
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://debank.com",
"shortName": "debank-mainnet",
"chainId": 116,
"networkId": 116,
"explorers": [],
"testnet": false,
"slug": "debank"
} as const satisfies Chain;
+32
View File
@@ -0,0 +1,32 @@
import type { Chain } from "../src/types";
export default {
"name": "Polygon Supernet Arianee",
"chain": "Arianee",
"rpc": [
"https://polygon-supernet-arianee.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.polygonsupernet.public.arianee.net"
],
"faucets": [],
"nativeCurrency": {
"name": "Arianee",
"symbol": "ARIA20",
"decimals": 18
},
"infoURL": "https://arianee.org",
"shortName": "Arianee",
"chainId": 11891,
"networkId": 11891,
"explorers": [
{
"name": "Polygon Supernet Arianee Explorer",
"url": "https://polygonsupernet.explorer.arianee.net",
"standard": "EIP3091"
}
],
"parent": {
"chain": "eip155-1",
"type": "L2"
},
"testnet": false,
"slug": "polygon-supernet-arianee"
} as const satisfies Chain;
+1 -3
View File
@@ -13,9 +13,7 @@ export default {
"wss://rcl-dataseed3.rclsidechain.com/v1/",
"wss://rcl-dataseed4.rclsidechain.com/v1/"
],
"faucets": [
"https://faucet.rclsidechain.com"
],
"faucets": [],
"nativeCurrency": {
"name": "Realchain",
"symbol": "REAL",
+2 -2
View File
@@ -3,7 +3,7 @@ export default {
"name": "Ultron Testnet",
"chain": "Ultron",
"icon": {
"url": "ipfs://QmS4W4kY7XYBA4f52vuuytXh3YaTcNBXF14V9tEY6SNqhz",
"url": "ipfs://QmPC6odFVyAQrXJQaZJVFpEQfRNbzZ5BjDZ7KBKmXPaYDw",
"width": 512,
"height": 512,
"format": "png"
@@ -27,7 +27,7 @@ export default {
"name": "Ultron Testnet Explorer",
"url": "https://explorer.ultron-dev.io",
"icon": {
"url": "ipfs://QmS4W4kY7XYBA4f52vuuytXh3YaTcNBXF14V9tEY6SNqhz",
"url": "ipfs://QmPC6odFVyAQrXJQaZJVFpEQfRNbzZ5BjDZ7KBKmXPaYDw",
"width": 512,
"height": 512,
"format": "png"
+2 -2
View File
@@ -3,7 +3,7 @@ export default {
"name": "Ultron Mainnet",
"chain": "Ultron",
"icon": {
"url": "ipfs://QmS4W4kY7XYBA4f52vuuytXh3YaTcNBXF14V9tEY6SNqhz",
"url": "ipfs://QmPC6odFVyAQrXJQaZJVFpEQfRNbzZ5BjDZ7KBKmXPaYDw",
"width": 512,
"height": 512,
"format": "png"
@@ -27,7 +27,7 @@ export default {
"name": "Ultron Explorer",
"url": "https://ulxscan.com",
"icon": {
"url": "ipfs://QmS4W4kY7XYBA4f52vuuytXh3YaTcNBXF14V9tEY6SNqhz",
"url": "ipfs://QmPC6odFVyAQrXJQaZJVFpEQfRNbzZ5BjDZ7KBKmXPaYDw",
"width": 512,
"height": 512,
"format": "png"
+32
View File
@@ -0,0 +1,32 @@
import type { Chain } from "../src/types";
export default {
"name": "Astar zkEVM",
"shortName": "astrzk",
"title": "Astar zkEVM Mainnet",
"chain": "ETH",
"icon": {
"url": "ipfs://QmZm2RfbEfWjnqu7MLSG5ChhAsjnKqTvmHM5eJWvYGAwG8",
"width": 800,
"height": 264,
"format": "png"
},
"rpc": [],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://astar.network",
"chainId": 12611,
"networkId": 12611,
"explorers": [],
"parent": {
"type": "L2",
"chain": "eip155-1",
"bridges": []
},
"status": "incubating",
"testnet": false,
"slug": "astar-zkevm"
} as const satisfies Chain;
+32
View File
@@ -0,0 +1,32 @@
import type { Chain } from "../src/types";
export default {
"name": "zKatana",
"shortName": "azktn",
"title": "Astar zkEVM Testnet zKatana",
"chain": "ETH",
"icon": {
"url": "ipfs://QmZm2RfbEfWjnqu7MLSG5ChhAsjnKqTvmHM5eJWvYGAwG8",
"width": 800,
"height": 264,
"format": "png"
},
"rpc": [],
"faucets": [],
"nativeCurrency": {
"name": "Sepolia Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://astar.network",
"chainId": 1261120,
"networkId": 1261120,
"explorers": [],
"parent": {
"type": "L2",
"chain": "eip155-11155111",
"bridges": []
},
"status": "incubating",
"testnet": true,
"slug": "zkatana"
} as const satisfies Chain;
+1 -3
View File
@@ -7,9 +7,7 @@ export default {
"https://http-mainnet.hecochain.com",
"wss://ws-mainnet.hecochain.com"
],
"faucets": [
"https://free-online-app.com/faucet-for-eth-evm-chains/"
],
"faucets": [],
"nativeCurrency": {
"name": "Huobi ECO Chain Native Token",
"symbol": "HT",
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "Quantum Chain Testnet",
"chain": "tQNET",
"icon": {
"url": "ipfs://bafkreibwywok67uewqbtqdzgr7nlk3lvvg7hxmbgwtn7kdwxe34useucvm",
"width": 1024,
"height": 1024,
"format": "png"
},
"rpc": [
"https://quantum-chain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.quantumscan.org"
],
"faucets": [],
"nativeCurrency": {
"name": "Quantum Chain",
"symbol": "tQNET",
"decimals": 18
},
"infoURL": "https://quantumnetwork.gg",
"shortName": "tqnet",
"chainId": 12890,
"networkId": 12890,
"explorers": [
{
"name": "Quantum Scan Testnet",
"url": "https://testnet.quantumscan.org",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "quantum-chain-testnet"
} as const satisfies Chain;
+44
View File
@@ -0,0 +1,44 @@
import type { Chain } from "../src/types";
export default {
"name": "Swisstronik Testnet",
"chain": "SWTR",
"rpc": [
"https://swisstronik-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://json-rpc.testnet.swisstronik.com"
],
"faucets": [
"https://faucet.testnet.swisstronik.com"
],
"nativeCurrency": {
"name": "Swisstronik",
"symbol": "SWTR",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://www.swisstronik.com",
"shortName": "swtr",
"chainId": 1291,
"networkId": 1291,
"icon": {
"url": "ipfs://bafybeihuintkoipxalwans23vhxajbwjnozpy34ww7ia7ds7nay3rpylzi",
"width": 256,
"height": 256,
"format": "svg"
},
"explorers": [
{
"name": "Swisstronik Scout",
"url": "https://explorer-evm.testnet.swisstronik.com",
"standard": "none"
}
],
"testnet": true,
"slug": "swisstronik-testnet"
} as const satisfies Chain;
+14 -12
View File
@@ -1,7 +1,7 @@
import type { Chain } from "../src/types";
export default {
"name": "Aitd Mainnet",
"chain": "AITD",
"name": "AIA Mainnet",
"chain": "AIA",
"icon": {
"url": "ipfs://QmXbBMMhjTTGAGjmqMpJm3ufFrtdkfEXCFyXYgz7nnZzsy",
"width": 160,
@@ -9,27 +9,29 @@ export default {
"format": "png"
},
"rpc": [
"https://aitd.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://walletrpc.aitd.io",
"https://node.aitd.io"
"https://aia.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://aia-dataseed1.aiachain.org",
"https://aia-dataseed2.aiachain.org",
"https://aia-dataseed3.aiachain.org",
"https://aia-dataseed4.aiachain.org"
],
"faucets": [],
"nativeCurrency": {
"name": "AITD Mainnet",
"symbol": "AITD",
"name": "AIA Mainnet",
"symbol": "AIA",
"decimals": 18
},
"infoURL": "https://www.aitd.io/",
"shortName": "aitd",
"infoURL": "https://aiachain.org/",
"shortName": "aia",
"chainId": 1319,
"networkId": 1319,
"explorers": [
{
"name": "AITD Chain Explorer Mainnet",
"url": "https://aitd-explorer-new.aitd.io",
"name": "AIA Chain Explorer Mainnet",
"url": "https://aiascan.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "aitd"
"slug": "aia"
} as const satisfies Chain;
+20 -12
View File
@@ -1,7 +1,7 @@
import type { Chain } from "../src/types";
export default {
"name": "Aitd Testnet",
"chain": "AITD",
"name": "AIA Testnet",
"chain": "AIA",
"icon": {
"url": "ipfs://QmXbBMMhjTTGAGjmqMpJm3ufFrtdkfEXCFyXYgz7nnZzsy",
"width": 160,
@@ -9,28 +9,36 @@ export default {
"format": "png"
},
"rpc": [
"https://aitd-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://http-testnet.aitd.io"
"https://aia-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://aia-dataseed1-testnet.aiachain.org"
],
"faucets": [
"https://aitd-faucet-pre.aitdcoin.com/"
"https://aia-faucet-testnet.aiachain.org"
],
"nativeCurrency": {
"name": "AITD Testnet",
"symbol": "AITD",
"name": "AIA Testnet",
"symbol": "AIA",
"decimals": 18
},
"infoURL": "https://www.aitd.io/",
"shortName": "aitdtestnet",
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://aiachain.org",
"shortName": "aiatestnet",
"chainId": 1320,
"networkId": 1320,
"explorers": [
{
"name": "AITD Chain Explorer Testnet",
"url": "https://block-explorer-testnet.aitd.io",
"name": "AIA Chain Explorer Testnet",
"url": "https://testnet.aiascan.com",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "aitd-testnet"
"slug": "aia-testnet"
} as const satisfies Chain;
+7 -7
View File
@@ -1,10 +1,10 @@
import type { Chain } from "../src/types";
export default {
"name": "Credit Smartchain Mainnet",
"name": "Credit Smart Chain",
"chain": "CREDIT",
"rpc": [
"https://credit-smartchain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet-rpc.cscscan.io"
"https://credit-smart-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.creditsmartchain.com"
],
"faucets": [],
"nativeCurrency": {
@@ -23,7 +23,7 @@ export default {
"infoURL": "https://creditsmartchain.com",
"shortName": "Credit",
"chainId": 13308,
"networkId": 1,
"networkId": 13308,
"icon": {
"url": "ipfs://bafkreifbso3gd4wu5wxl27xyurxctmuae2jyuy37guqtzx23nga6ba4ag4",
"width": 1000,
@@ -32,8 +32,8 @@ export default {
},
"explorers": [
{
"name": "CSC Scan",
"url": "https://explorer.cscscan.io",
"name": "Creditscan",
"url": "https://scan.creditsmartchain.com",
"icon": {
"url": "ipfs://bafkreifbso3gd4wu5wxl27xyurxctmuae2jyuy37guqtzx23nga6ba4ag4",
"width": 1000,
@@ -44,5 +44,5 @@ export default {
}
],
"testnet": false,
"slug": "credit-smartchain"
"slug": "credit-smart-chain"
} as const satisfies Chain;
+39
View File
@@ -0,0 +1,39 @@
import type { Chain } from "../src/types";
export default {
"name": "Beam Testnet",
"chain": "BEAM",
"rpc": [
"https://beam-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/beam/testnet/rpc"
],
"features": [
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Merit Circle",
"symbol": "MC",
"decimals": 18
},
"infoURL": "https://www.onbeam.com",
"shortName": "beam-testnet",
"icon": {
"url": "ipfs://QmQJ21NWyGGDraicVEzS1Uqq1yXahM9NCuNZgnfYvtspdt",
"width": 512,
"height": 512,
"format": "png"
},
"chainId": 13337,
"networkId": 13337,
"explorers": [
{
"name": "Beam Explorer",
"url": "https://subnets-test.avax.network/beam",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "beam-testnet"
} as const satisfies Chain;
+4 -1
View File
@@ -18,7 +18,10 @@ export default {
"https://rpc-mainnet.maticvigil.com",
"https://rpc-mainnet.matic.quiknode.pro",
"https://matic-mainnet-full-rpc.bwarelabs.com",
"https://polygon-bor.publicnode.com"
"https://polygon-bor.publicnode.com",
"wss://polygon-bor.publicnode.com",
"https://polygon.gateway.tenderly.co",
"wss://polygon.gateway.tenderly.co"
],
"faucets": [],
"nativeCurrency": {
+2 -2
View File
@@ -1,6 +1,6 @@
import type { Chain } from "../src/types";
export default {
"name": "Kalar Chain Mainnet",
"name": "Kalar Chain",
"chain": "KLC",
"icon": {
"url": "ipfs://bafkreihfoy2kgf2rebaoicso7z5h7ju46z6gtr64mskkths3qbfkrtnkjm",
@@ -10,7 +10,7 @@ export default {
},
"rpc": [
"https://kalar-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://rpc-api.kalarchain.tech"
"https://rpc-api.kalarchain.tech"
],
"faucets": [],
"nativeCurrency": {
+2 -1
View File
@@ -10,7 +10,8 @@ export default {
},
"rpc": [
"https://flare.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://flare-api.flare.network/ext/C/rpc"
"https://flare-api.flare.network/ext/C/rpc",
"https://rpc.ftso.au/flare"
],
"faucets": [],
"nativeCurrency": {
+41
View File
@@ -0,0 +1,41 @@
import type { Chain } from "../src/types";
export default {
"name": "ShimmerEVM Mainnet",
"title": "ShimmerEVM Mainnet",
"chain": "ShimmerEVM",
"rpc": [
"https://shimmerevm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://json-rpc.evm.shimmer.network"
],
"faucets": [],
"nativeCurrency": {
"name": "SMR",
"symbol": "SMR",
"decimals": 18
},
"infoURL": "https://shimmer.network",
"shortName": "shimmerevm-mainnet",
"chainId": 148,
"networkId": 148,
"icon": {
"url": "ipfs://bafkreibky2sy6qhi6arktayvologkrgu5kudpgdxfkx4uosbvmstz7v4di",
"width": 720,
"height": 720,
"format": "png"
},
"explorers": [
{
"name": "explorer",
"url": "https://explorer.evm.shimmer.network",
"icon": {
"url": "ipfs://bafkreibky2sy6qhi6arktayvologkrgu5kudpgdxfkx4uosbvmstz7v4di",
"width": 720,
"height": 720,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "shimmerevm"
} as const satisfies Chain;
+24
View File
@@ -0,0 +1,24 @@
import type { Chain } from "../src/types";
export default {
"name": "Humanode Testnet 5 Israfel",
"chain": "Humanode Testnet 5",
"rpc": [
"https://humanode-testnet-5-israfel.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://explorer-rpc-http.testnet5.stages.humanode.io"
],
"faucets": [
"https://t.me/HumanodeTestnet5FaucetBot"
],
"nativeCurrency": {
"name": "eHMND",
"symbol": "eHMND",
"decimals": 18
},
"infoURL": "https://humanode.io",
"shortName": "hmnd-t5",
"chainId": 14853,
"networkId": 14853,
"explorers": [],
"testnet": true,
"slug": "humanode-testnet-5-israfel"
} as const satisfies Chain;
+19
View File
@@ -0,0 +1,19 @@
import type { Chain } from "../src/types";
export default {
"name": "Redbelly Network Mainnet",
"shortName": "rbn",
"chain": "RBN",
"chainId": 151,
"networkId": 151,
"rpc": [],
"faucets": [],
"infoURL": "https://redbelly.network",
"nativeCurrency": {
"name": "Redbelly Network Coin",
"symbol": "RBNT",
"decimals": 18
},
"status": "incubating",
"testnet": false,
"slug": "redbelly-network"
} as const satisfies Chain;
+19
View File
@@ -0,0 +1,19 @@
import type { Chain } from "../src/types";
export default {
"name": "Redbelly Network Devnet",
"shortName": "rbn-devnet",
"chain": "RBN",
"chainId": 152,
"networkId": 152,
"rpc": [],
"faucets": [],
"infoURL": "https://redbelly.network",
"nativeCurrency": {
"name": "Redbelly Network Coin",
"symbol": "RBNT",
"decimals": 18
},
"status": "incubating",
"testnet": false,
"slug": "redbelly-network-devnet"
} as const satisfies Chain;
+19
View File
@@ -0,0 +1,19 @@
import type { Chain } from "../src/types";
export default {
"name": "Redbelly Network Testnet",
"shortName": "rbn-testnet",
"chain": "RBN",
"chainId": 153,
"networkId": 153,
"rpc": [],
"faucets": [],
"infoURL": "https://redbelly.network",
"nativeCurrency": {
"name": "Redbelly Network Coin",
"symbol": "RBNT",
"decimals": 18
},
"status": "incubating",
"testnet": true,
"slug": "redbelly-network-testnet"
} as const satisfies Chain;
+18
View File
@@ -0,0 +1,18 @@
import type { Chain } from "../src/types";
export default {
"name": "Redbelly Network TGE",
"shortName": "rbn-tge",
"chain": "RBN",
"chainId": 154,
"networkId": 154,
"rpc": [],
"faucets": [],
"infoURL": "https://redbelly.network",
"nativeCurrency": {
"name": "Redbelly Network Coin",
"symbol": "RBNT",
"decimals": 18
},
"testnet": false,
"slug": "redbelly-network-tge"
} as const satisfies Chain;
+2 -1
View File
@@ -12,7 +12,8 @@ export default {
"rpc": [
"https://tenet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.tenet.org",
"https://tenet-evm.publicnode.com"
"https://tenet-evm.publicnode.com",
"wss://tenet-evm.publicnode.com"
],
"faucets": [],
"nativeCurrency": {
+5 -5
View File
@@ -1,10 +1,10 @@
import type { Chain } from "../src/types";
export default {
"name": "Omni Testnet 1",
"name": "Omni Testnet",
"chain": "Omni",
"rpc": [
"https://omni-testnet-1.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-1.omni.network"
"https://omni-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet.omni.network"
],
"features": [
{
@@ -24,10 +24,10 @@ export default {
"explorers": [
{
"name": "Omni Explorer",
"url": "https://testnet-1.explorer.omni.network",
"url": "https://testnet.explorer.omni.network",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "omni-testnet-1"
"slug": "omni-testnet"
} as const satisfies Chain;
+2 -2
View File
@@ -11,8 +11,8 @@ export default {
},
"rpc": [
"https://horizen-gobi-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gobi-testnet.horizenlabs.io/ethv1",
"https://rpc.ankr.com/horizen_testnet_evm"
"https://gobi-rpc.horizenlabs.io/ethv1",
"https://rpc.ankr.com/horizen_gobi_testnet"
],
"features": [
{
+35
View File
@@ -0,0 +1,35 @@
import type { Chain } from "../src/types";
export default {
"name": "Taiko Jolnir L2",
"chain": "ETH",
"status": "incubating",
"icon": {
"url": "ipfs://QmcHdmVr5VRUJq13jnM6tgah5Ge7hn3Dm14eY6vwivJ5ui",
"width": 288,
"height": 258,
"format": "png"
},
"rpc": [
"https://taiko-jolnir-l2.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.jolnir.taiko.xyz"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://taiko.xyz",
"shortName": "tko-jolnir",
"chainId": 167007,
"networkId": 167007,
"explorers": [
{
"name": "blockscout",
"url": "https://explorer.jolnir.taiko.xyz",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "taiko-jolnir-l2"
} as const satisfies Chain;
+42
View File
@@ -0,0 +1,42 @@
import type { Chain } from "../src/types";
export default {
"name": "Manta Pacific Mainnet",
"chain": "Manta Pacific",
"rpc": [
"https://manta-pacific.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://pacific-rpc.manta.network/http"
],
"faucets": [],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://pacific-info.manta.network",
"shortName": "manta",
"chainId": 169,
"networkId": 169,
"icon": {
"url": "ipfs://QmTckcVTViRZ3NqT36MTt8AvgBSmudrbgU3pi8AaNtthoV",
"width": 834,
"height": 834,
"format": "png"
},
"explorers": [
{
"name": "manta-pacific Explorer",
"url": "https://pacific-explorer.manta.network",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "manta-pacific"
} as const satisfies Chain;
+44
View File
@@ -0,0 +1,44 @@
import type { Chain } from "../src/types";
export default {
"name": "Holesky",
"chain": "ETH",
"rpc": [
"https://holesky.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.holesky.ethpandaops.io"
],
"faucets": [
"https://faucet.holesky.ethpandaops.io",
"https://holesky-faucet.pk910.de"
],
"nativeCurrency": {
"name": "Testnet ETH",
"symbol": "ETH",
"decimals": 18
},
"infoURL": "https://holesky.ethpandaops.io",
"shortName": "holesky",
"chainId": 17000,
"networkId": 17000,
"icon": {
"url": "ipfs://QmdwQDr6vmBtXmK2TmknkEuZNoaDqTasFdZdu3DRw8b2wt",
"width": 1000,
"height": 1628,
"format": "png"
},
"status": "incubating",
"explorers": [
{
"name": "Holesky Explorer",
"url": "https://holesky.beaconcha.in",
"icon": {
"url": "ipfs://QmdwQDr6vmBtXmK2TmknkEuZNoaDqTasFdZdu3DRw8b2wt",
"width": 1000,
"height": 1628,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "holesky"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "WhiteBIT Network",
"chain": "WBT",
"rpc": [
"https://whitebit-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.whitebit.network"
],
"faucets": [],
"nativeCurrency": {
"name": "WhiteBIT Coin",
"symbol": "WBT",
"decimals": 18
},
"infoURL": "https://whitebit.network",
"shortName": "wbt",
"chainId": 1875,
"networkId": 1875,
"icon": {
"url": "ipfs://Qmbi6cqsQyDjkQSoxbNTTUy8WGyVEFqCtATX2aF4KLmCcZ",
"width": 512,
"height": 512,
"format": "png"
},
"explorers": [
{
"name": "wb-explorer",
"url": "https://explorer.whitebit.network",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "whitebit-network"
} as const satisfies Chain;
+6 -6
View File
@@ -3,9 +3,9 @@ export default {
"name": "Lightlink Phoenix Mainnet",
"chain": "Lightlink Phoenix Mainnet",
"icon": {
"url": "ipfs://QmNRUoMgx16hurD3au3ou5A9rmTLYmre8WiGmQEPFmP2Vo",
"width": 600,
"height": 600,
"url": "ipfs://QmXMDj6iAFn2ducQcUU1M87PMMdT2jfyL3Tp3Lz5uUD5Lv",
"width": 200,
"height": 200,
"format": "png"
},
"rpc": [
@@ -33,9 +33,9 @@ export default {
"name": "phoenix",
"url": "https://phoenix.lightlink.io",
"icon": {
"url": "ipfs://QmNRUoMgx16hurD3au3ou5A9rmTLYmre8WiGmQEPFmP2Vo",
"width": 600,
"height": 600,
"url": "ipfs://QmXMDj6iAFn2ducQcUU1M87PMMdT2jfyL3Tp3Lz5uUD5Lv",
"width": 200,
"height": 200,
"format": "png"
},
"standard": "EIP3091"
+6 -6
View File
@@ -3,9 +3,9 @@ export default {
"name": "Lightlink Pegasus Testnet",
"chain": "Lightlink Pegasus Testnet",
"icon": {
"url": "ipfs://QmNRUoMgx16hurD3au3ou5A9rmTLYmre8WiGmQEPFmP2Vo",
"width": 600,
"height": 600,
"url": "ipfs://QmXMDj6iAFn2ducQcUU1M87PMMdT2jfyL3Tp3Lz5uUD5Lv",
"width": 200,
"height": 200,
"format": "png"
},
"rpc": [
@@ -35,9 +35,9 @@ export default {
"name": "pegasus",
"url": "https://pegasus.lightlink.io",
"icon": {
"url": "ipfs://QmNRUoMgx16hurD3au3ou5A9rmTLYmre8WiGmQEPFmP2Vo",
"width": 600,
"height": 600,
"url": "ipfs://QmXMDj6iAFn2ducQcUU1M87PMMdT2jfyL3Tp3Lz5uUD5Lv",
"width": 200,
"height": 200,
"format": "png"
},
"standard": "EIP3091"
+2 -1
View File
@@ -13,7 +13,8 @@ export default {
"https://songbird-api.flare.network/ext/C/rpc",
"https://sgb.ftso.com.au/ext/bc/C/rpc",
"https://sgb.lightft.so/rpc",
"https://sgb-rpc.ftso.eu"
"https://sgb-rpc.ftso.eu",
"https://rpc.ftso.au/songbird"
],
"faucets": [],
"nativeCurrency": {
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Bitchain Mainnet",
"chain": "Bit",
"rpc": [
"https://bitchain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.bitchain.biz/"
],
"faucets": [],
"nativeCurrency": {
"name": "Bitcoin",
"symbol": "BTC",
"decimals": 18
},
"infoURL": "https://www.bitchain.biz/",
"shortName": "bit",
"chainId": 198,
"networkId": 198,
"explorers": [
{
"name": "Bitchain Scan",
"url": "https://explorer.bitchain.biz",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "bitchain"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "SatoshIE",
"chain": "TUSHY",
"rpc": [
"https://satoshie.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://rpc.satosh.ie"
],
"faucets": [],
"nativeCurrency": {
"name": "Tushy Token",
"symbol": "TUSHY",
"decimals": 18
},
"infoURL": "https://satosh.ie",
"shortName": "satoshie",
"chainId": 1985,
"networkId": 1985,
"icon": {
"url": "ipfs://QmRHT4o9ihiY6nVkkRdwZjdugbEAQiXrrov3GS9a3GTuL7",
"width": 1024,
"height": 1024,
"format": "jpg"
},
"explorers": [
{
"name": "mainnetexplorer",
"url": "http://explore.satosh.ie",
"icon": {
"url": "ipfs://QmRHT4o9ihiY6nVkkRdwZjdugbEAQiXrrov3GS9a3GTuL7",
"width": 1024,
"height": 1024,
"format": "jpg"
},
"standard": "none"
}
],
"testnet": false,
"slug": "satoshie"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "SatoshIE Testnet",
"chain": "TUSHY",
"rpc": [
"https://satoshie-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://testnet.satosh.ie"
],
"faucets": [],
"nativeCurrency": {
"name": "Tushy Token",
"symbol": "TUSHY",
"decimals": 18
},
"infoURL": "https://satosh.ie",
"shortName": "satoshie_testnet",
"chainId": 1986,
"networkId": 1986,
"icon": {
"url": "ipfs://QmRHT4o9ihiY6nVkkRdwZjdugbEAQiXrrov3GS9a3GTuL7",
"width": 1024,
"height": 1024,
"format": "jpg"
},
"explorers": [
{
"name": "testnetexplorer",
"url": "http://explore-testnet.satosh.ie",
"icon": {
"url": "ipfs://QmRHT4o9ihiY6nVkkRdwZjdugbEAQiXrrov3GS9a3GTuL7",
"width": 1024,
"height": 1024,
"format": "jpg"
},
"standard": "none"
}
],
"testnet": true,
"slug": "satoshie-testnet"
} as const satisfies Chain;
+1 -3
View File
@@ -6,9 +6,7 @@ export default {
"https://elastos-smart-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://api.elastos.io/eth"
],
"faucets": [
"https://faucet.elastos.org/"
],
"faucets": [],
"nativeCurrency": {
"name": "Elastos",
"symbol": "ELA",
+11 -1
View File
@@ -5,7 +5,10 @@ export default {
"rpc": [
"https://quarkblockchain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://hz.rpc.qkiscan.cn",
"https://jp.rpc.qkiscan.io"
"https://jp.rpc.qkiscan.io",
"https://rpc1.qkiscan.io",
"https://rpc2.qkiscan.io",
"https://rpc3.qkiscan.io"
],
"faucets": [],
"nativeCurrency": {
@@ -17,6 +20,13 @@ export default {
"shortName": "qki",
"chainId": 20181205,
"networkId": 20181205,
"explorers": [
{
"name": "qkiscan",
"url": "https://qkiscan.io",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "quarkblockchain"
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"name": "DeBank Testnet",
"chain": "DeBank",
"rpc": [
"https://debank-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://rpc.testnet.debank.com"
],
"faucets": [],
"icon": {
"url": "ipfs://QmW9pBps8WHRRWmyXhjLZrjZJUe8F48hUu7z98bu2RVsjN",
"width": 400,
"height": 400,
"format": "png"
},
"nativeCurrency": {
"name": "DeBank USD",
"symbol": "USD",
"decimals": 18
},
"infoURL": "https://debank.com",
"shortName": "dbk",
"chainId": 2021398,
"networkId": 2021398,
"explorers": [
{
"name": "DeBank Chain Explorer",
"url": "https://explorer.testnet.debank.com",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "debank-testnet"
} as const satisfies Chain;
+35
View File
@@ -0,0 +1,35 @@
import type { Chain } from "../src/types";
export default {
"name": "Centrifuge",
"chain": "CFG",
"rpc": [
"wss://fullnode.parachain.centrifuge.io"
],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Centrifuge",
"symbol": "CFG",
"decimals": 18
},
"infoURL": "https://centrifuge.io",
"shortName": "cfg",
"chainId": 2031,
"networkId": 2031,
"explorers": [
{
"name": "subscan",
"url": "https://centrifuge.subscan.io",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "centrifuge"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Catalyst",
"chain": "CFG",
"rpc": [
"wss://fullnode.catalyst.cntrfg.com"
],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Catalyst CFG",
"symbol": "NCFG",
"decimals": 18
},
"infoURL": "https://centrifuge.io",
"shortName": "ncfg",
"chainId": 2032,
"networkId": 2032,
"testnet": false,
"slug": "catalyst"
} as const satisfies Chain;
+33
View File
@@ -0,0 +1,33 @@
import type { Chain } from "../src/types";
export default {
"name": "Kiwi Subnet",
"chain": "KIWI",
"rpc": [
"https://kiwi-subnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/kiwi/testnet/rpc"
],
"features": [
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Shrapgas",
"symbol": "SHRAP",
"decimals": 18
},
"infoURL": "",
"shortName": "kiwi",
"chainId": 2037,
"networkId": 2037,
"explorers": [
{
"name": "KIWI Explorer",
"url": "https://subnets-test.avax.network/kiwi",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "kiwi-subnet"
} as const satisfies Chain;
+33
View File
@@ -0,0 +1,33 @@
import type { Chain } from "../src/types";
export default {
"name": "Shrapnel Testnet",
"chain": "SHRAPNEL",
"rpc": [
"https://shrapnel-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/shrapnel/testnet/rpc"
],
"features": [
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "SHRAPG",
"symbol": "SHRAPG",
"decimals": 18
},
"infoURL": "https://www.shrapnel.com/",
"shortName": "shraptest",
"chainId": 2038,
"networkId": 2038,
"explorers": [
{
"name": "SHRAPNEL Explorer",
"url": "https://subnets-test.avax.network/shrapnel",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "shrapnel-testnet"
} as const satisfies Chain;
+29
View File
@@ -0,0 +1,29 @@
import type { Chain } from "../src/types";
export default {
"name": "opBNB Mainnet",
"chain": "opBNB",
"rpc": [
"https://opbnb.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://opbnb-mainnet-rpc.bnbchain.org"
],
"faucets": [],
"nativeCurrency": {
"name": "BNB Chain Native Token",
"symbol": "BNB",
"decimals": 18
},
"infoURL": "https://opbnb.bnbchain.org/en",
"shortName": "obnb",
"chainId": 204,
"networkId": 204,
"slip44": 714,
"explorers": [
{
"name": "opbnbscan",
"url": "http://mainnet.opbnbscan.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "opbnb"
} as const satisfies Chain;
+17 -3
View File
@@ -1,8 +1,11 @@
import type { Chain } from "../src/types";
export default {
"name": "Stratos Mainnet",
"name": "Stratos",
"chain": "STOS",
"rpc": [],
"rpc": [
"https://stratos.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://web3-rpc.thestratos.org"
],
"faucets": [],
"nativeCurrency": {
"name": "STOS",
@@ -13,7 +16,18 @@ export default {
"shortName": "stos-mainnet",
"chainId": 2048,
"networkId": 2048,
"status": "incubating",
"explorers": [
{
"name": "Stratos EVM Explorer (Blockscout)",
"url": "https://web3-explorer.thestratos.org",
"standard": "none"
},
{
"name": "Stratos Cosmos Explorer (BigDipper)",
"url": "https://explorer.thestratos.org",
"standard": "none"
}
],
"testnet": false,
"slug": "stratos"
} as const satisfies Chain;
+43
View File
@@ -0,0 +1,43 @@
import type { Chain } from "../src/types";
export default {
"name": "Movo Smart Chain Mainnet",
"chain": "MOVO",
"rpc": [
"https://movo-smart-chain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://msc-rpc.movoscan.com",
"https://msc-rpc.movochain.org",
"https://msc-rpc.movoswap.com"
],
"faucets": [],
"nativeCurrency": {
"name": "Movo Smart Chain",
"symbol": "MOVO",
"decimals": 18
},
"infoURL": "https://movo.uk",
"shortName": "movo",
"chainId": 2049,
"networkId": 2049,
"slip44": 2050,
"icon": {
"url": "ipfs://QmbYjhXYych49hP6WY7C27pLGmSigSN35XYyocd5ftBew7",
"width": 800,
"height": 800,
"format": "png"
},
"explorers": [
{
"name": "movoscan",
"url": "https://movoscan.com",
"icon": {
"url": "ipfs://QmPqa6cJ92t4eQMgYxmVs6yr8t53ZgzchRDwz2zd2VFUwF",
"width": 256,
"height": 256,
"format": "png"
},
"standard": "none"
}
],
"testnet": false,
"slug": "movo-smart-chain"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Altair",
"chain": "AIR",
"rpc": [
"wss://fullnode.altair.centrifuge.io"
],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Altair",
"symbol": "AIR",
"decimals": 18
},
"infoURL": "https://centrifuge.io",
"shortName": "air",
"chainId": 2088,
"networkId": 2088,
"testnet": false,
"slug": "altair"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Algol",
"chain": "algol",
"rpc": [
"wss://fullnode.algol.cntrfg.com"
],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "Algol",
"symbol": "ALGL",
"decimals": 18
},
"infoURL": "https://centrifuge.io",
"shortName": "algl",
"chainId": 2089,
"networkId": 2089,
"testnet": false,
"slug": "algol"
} as const satisfies Chain;
+23
View File
@@ -0,0 +1,23 @@
import type { Chain } from "../src/types";
export default {
"name": "BigShortBets",
"chain": "BIGSB",
"rpc": [
"https://bigshortbets.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://market.bigsb.io",
"wss://market.bigsb.io"
],
"faucets": [],
"nativeCurrency": {
"name": "USD Coin",
"symbol": "USDC",
"decimals": 18
},
"infoURL": "https://bigshortbets.com/",
"shortName": "bigsb",
"chainId": 2137,
"networkId": 2137,
"explorers": [],
"testnet": false,
"slug": "bigshortbets"
} as const satisfies Chain;
+1 -1
View File
@@ -4,7 +4,7 @@ export default {
"chain": "REAP",
"rpc": [
"https://reapchain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.reapchain.org"
"https://eth.reapchain.org"
],
"faucets": [],
"nativeCurrency": {
+1 -1
View File
@@ -4,7 +4,7 @@ export default {
"chain": "REAP",
"rpc": [
"https://reapchain-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://test-rpc.reapchain.org"
"https://test-eth.reapchain.org"
],
"faucets": [
"http://faucet.reapchain.com"
+5 -4
View File
@@ -1,10 +1,11 @@
import type { Chain } from "../src/types";
export default {
"name": "Kava EVM Testnet",
"name": "Kava Testnet",
"chain": "KAVA",
"rpc": [
"https://kava-evm-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://kava-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://evm.testnet.kava.io",
"https://kava-evm-testnet.rpc.thirdweb.com",
"wss://wevm.testnet.kava.io"
],
"faucets": [
@@ -28,7 +29,7 @@ export default {
"explorers": [
{
"name": "Kava Testnet Explorer",
"url": "https://explorer.testnet.kava.io",
"url": "http://testnet.kavascan.com",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmdpRTk6oL1HRW9xC6cAc4Rnf9gs6zgdAcr4Z3HcLztusm",
@@ -39,5 +40,5 @@ export default {
}
],
"testnet": true,
"slug": "kava-evm-testnet"
"slug": "kava-testnet"
} as const satisfies Chain;
+8 -5
View File
@@ -1,14 +1,17 @@
import type { Chain } from "../src/types";
export default {
"name": "Kava EVM",
"name": "Kava",
"chain": "KAVA",
"rpc": [
"https://kava-evm.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://kava.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://evm.kava.io",
"https://evm2.kava.io",
"https://kava-rpc.gateway.pokt.network",
"https://kava-evm.rpc.thirdweb.com",
"wss://wevm.kava.io",
"wss://wevm2.kava.io",
"https://kava-evm.publicnode.com"
"https://kava-evm.publicnode.com",
"wss://kava-evm.publicnode.com"
],
"faucets": [],
"nativeCurrency": {
@@ -29,7 +32,7 @@ export default {
"explorers": [
{
"name": "Kava EVM Explorer",
"url": "https://explorer.kava.io",
"url": "https://kavascan.com",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmdpRTk6oL1HRW9xC6cAc4Rnf9gs6zgdAcr4Z3HcLztusm",
@@ -40,5 +43,5 @@ export default {
}
],
"testnet": false,
"slug": "kava-evm"
"slug": "kava"
} as const satisfies Chain;
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"name": "Nautilus Mainnet",
"chain": "ETH",
"icon": {
"url": "ipfs://QmNutSgM7n6aJPPDiofe9Dm1epy1RcYTMvugukLUK2vmPM",
"width": 500,
"height": 500,
"format": "png"
},
"rpc": [
"https://nautilus.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://api.nautilus.nautchain.xyz"
],
"faucets": [],
"nativeCurrency": {
"name": "Zebec",
"symbol": "ZBC",
"decimals": 18
},
"infoURL": "https://docs.nautchain.xyz",
"shortName": "NAUTCHAIN",
"chainId": 22222,
"networkId": 22222,
"explorers": [
{
"name": "Nautscan",
"url": "https://nautscan.com",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmNutSgM7n6aJPPDiofe9Dm1epy1RcYTMvugukLUK2vmPM",
"width": 500,
"height": 500,
"format": "png"
}
}
],
"testnet": false,
"slug": "nautilus"
} as const satisfies Chain;
+39
View File
@@ -0,0 +1,39 @@
import type { Chain } from "../src/types";
export default {
"name": "Krest Network",
"chain": "Krest",
"icon": {
"url": "ipfs://bafkreid732273ib5at7krjdl2t7lteljlepwd3tvifqge7mu7g6naxavhe",
"width": 256,
"height": 256,
"format": "png"
},
"rpc": [
"https://krest-network.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://erpc-krest.peaq.network"
],
"faucets": [],
"nativeCurrency": {
"name": "Krest",
"symbol": "KRST",
"decimals": 18
},
"infoURL": "https://www.peaq.network",
"shortName": "KRST",
"chainId": 2241,
"networkId": 2241,
"explorers": [
{
"name": "Polkadot.js",
"url": "https://polkadot.js.org/apps/?rpc=wss://wss-krest.peaq.network#/explorer",
"standard": "none"
},
{
"name": "Subscan",
"url": "https://krest.subscan.io",
"standard": "none"
}
],
"testnet": false,
"slug": "krest-network"
} as const satisfies Chain;
+2 -2
View File
@@ -14,8 +14,8 @@ export default {
],
"faucets": [],
"nativeCurrency": {
"name": "MAP",
"symbol": "MAP",
"name": "MAPO",
"symbol": "MAPO",
"decimals": 18
},
"infoURL": "https://maplabs.io",

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