Compare commits

...
Author SHA1 Message Date
Jonas DanielsGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>GitHub Action
449ae19f94 Version Packages (#3352)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <[email protected]>
2024-06-18 10:08:57 +12:00
joaquim-verges 7304c5b0c7 refactor: respect Coinbase wallet optons when preloading (#3364) 2024-06-17 21:46:10 +00:00
dependabot 49cfdb3fd9 build(deps): bump @eth-optimism/sdk from 3.3.0 to 3.3.2 (#3357)
Bumps [@eth-optimism/sdk](https://github.com/ethereum-optimism/ecosystem) from 3.3.0 to 3.3.2.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/ethereum-optimism/ecosystem/commits/@eth-optimism/[email protected]">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@eth-optimism/sdk&package-manager=npm_and_yarn&previous-version=3.3.0&new-version=3.3.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

</details>

<!-- start pr-codex -->

---

## PR-Codex overview
This PR updates the `@eth-optimism/sdk` package to version 3.3.2 and makes corresponding changes in the `pnpm-lock.yaml` file.

### Detailed summary
- Updated `@eth-optimism/sdk` to version 3.3.2 in `package.json`
- Updated version and specifier in `pnpm-lock.yaml` for `@eth-optimism/sdk` to 3.3.2

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-17 20:47:43 +00:00
joaquim-verges 2d7ebe2111 fix: ConnectButton custom theme + customized component in playground (#3356) 2024-06-17 20:36:44 +00:00
kien-ngo a9ce10f39a Add ERC721 extension: updateMetadata & updateBatchBaseURI (#3347)
<!-- start pr-codex -->

## PR-Codex overview
This PR adds an ERC721 extension `updateMetadata` for updating NFT metadata in batches.

### Detailed summary
- Added `updateMetadata` function to update NFT metadata
- Implemented `getUpdateMetadataParams` to prepare transaction
- Added tests for `updateMetadata` function
- Introduced `freezeBatchBaseURI` function and related utilities

> The following files were skipped due to too many changes: `packages/thirdweb/src/extensions/erc721/__generated__/DropERC721/write/freezeBatchBaseURI.ts`, `packages/thirdweb/src/extensions/erc721/__generated__/DropERC721/write/setMaxTotalSupply.ts`, `packages/thirdweb/src/extensions/erc721/__generated__/DropERC721/write/updateBatchBaseURI.ts`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-17 19:20:14 +00:00
github-actions[bot]GitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
321cf26342 chore(chains): update chains (#3348)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-17 11:31:07 -07:00
jnsdls d2ad36d76d [Fix] Ensure proper awaiting of the format function in generate script (#3349)
### TL;DR

This PR modifies the `generateFromAbi` function to ensure that the `format` function from Prettier is properly awaited. This solves issues with file writing inconsistencies.

### What changed?

- Added `await` to the `format` function calls within `generateFromAbi`.

### How to test?

1. Run the `generateFromAbi` script.
2. Ensure that generated files are consistently formatted.

### Why make this change?

This change ensures that the Prettier formatting is correctly applied before the files are written, resolving any inconsistencies and potential bugs caused by non-awaited formatting.

---
2024-06-17 18:26:12 +00:00
Jonas DanielsGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
507d0e5bf4 Version Packages (#3346)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-06-17 16:19:35 +12:00
Joaquim VergesandGitHub 79e6a047d6 fix: inApp native wallet creation (#3345) 2024-06-17 16:02:30 +12:00
Jonas DanielsGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>GitHub Action
4dce62de1c Version Packages (#3319)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <[email protected]>
2024-06-17 15:09:31 +12:00
joaquim-verges 1c533efcd5 fix: respect transaction button theme prop (#3341)
<!-- start pr-codex -->

## PR-Codex overview
This PR fixes the issue where the transaction button did not respect the theme prop in the `SponsoredTxPreview` component.

### Detailed summary
- Fixed transaction button theme prop issue in `SponsoredTxPreview`
- Added `isValidTheme` and `parseTheme` functions in `buttons.tsx`
- Updated `parseTheme` to validate theme and return default if invalid

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-17 02:39:52 +00:00
joaquim-verges eca6217f77 refactor: separate onConnectRequested impl between web and native (#3344) 2024-06-17 00:36:22 +00:00
joaquim-verges df84f9c4ce refactor: improve Coinbase connection handling (#3340)
### TL;DR

To prevent popups from Coinbase wallet being blocked in Safari, pre-connection actions have been added. Specifically, popups will be displayed immediately upon connection request and before transaction preprocessing.

### What changed?

1. Removed the `COINBASE` constant and its related connection flow.
2. Integrated `onConnectRequested` optional function for wallets.
3. Updated Coinbase wallet's `onConnectRequested` to show the popup immediately.
4. Added `onTransactionRequested` to show popup before transaction processing.

### How to test?

1. Initiate connection with Coinbase wallet and observe that the popup appears immediately.
2. Perform a transaction with Coinbase wallet and ensure the popup is not blocked.
3. Test across different browsers, focusing on Safari.

### Why make this change?

Safari has stricter rules regarding popups, and the previous delay in showing the popup led to it being blocked. This change ensures a smoother user experience for Coinbase wallet users on Safari by addressing the popup blocking issue.

---

<!-- start pr-codex -->

---

## PR-Codex overview
The focus of this PR is to enhance wallet connectivity and transaction handling in the application.

### Detailed summary
- Added `onConnectRequested` and `onTransactionRequested` functions to wallet interfaces
- Updated wallet connection and transaction handling logic
- Preloaded wallet providers for smoother user experience

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-16 23:02:22 +00:00
jnsdls 17c0e6f282 [ConnectWallet] Include wallet name in injectedWalletLocale query key (#3333)
### TL;DR
Updated the queryKey used in the useQuery hook to also include the walletInfo.data?.name parameter, ensuring that injectedWalletLocale queries are correctly keyed and updated when the wallet name changes.

### What changed?
The queryKey array in the useQuery hook was updated from `["injectedWalletLocale", localeId]` to `["injectedWalletLocale", localeId, walletInfo.data?.name]`.

### How to test?
1. Ensure the application runs without errors.
2. Verify that locale-specific wallet names are correctly handled when displayed in the UI.

### Why make this change?
The change ensures that the locale-based queries are properly identified and updated when the wallet name changes, preventing potential stale data from being used in the UI.

---
2024-06-16 22:56:42 +00:00
jnsdls d51c1883af [Refactor] Migrate usePreloadWalletProviders to useQueries for wallet preloading (#3331)
Refactor `usePreloadWalletProviders` to utilize `useQueries` from `@tanstack/react-query`. This change optimizes wallet provider preloading, ensuring a non-blocking, and parallel fetching of necessary providers. Removes the `useEffect` based logic.

---
2024-06-16 22:56:39 +00:00
joaquim-verges 9cf3a1d663 feat: preloading wallet providers for improved performance (#3330)
<!-- start pr-codex -->

## PR-Codex overview
This PR fixes an issue with the Coinbase wallet popup not opening on Safari and improves inAppWallet web performance.

### Detailed summary
- Fixed Coinbase wallet popup not opening on Safari
- Improved inAppWallet web performance
- Added `usePreloadWalletProviders` hook
- Preloaded wallet providers for Coinbase and inApp wallet
- Updated `ConnectButton`, `ConnectEmbed`, `usePreloadWalletProviders`, and `ConnectModalContent` components

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-16 22:56:36 +00:00
joaquim-verges c94bcd574a refactor: change Coinbase SDK import to dynamic in coinbaseSDKWallet.ts (#3329)
<!-- start pr-codex -->

## PR-Codex overview
The focus of this PR is to dynamically import the `CoinbaseWalletSDK` to resolve cloudflare bundler issues.

### Detailed summary
- Dynamically import `CoinbaseWalletSDK` to avoid bundler issues
- Updated import statement for `ProviderInterface`
- Removed unnecessary imports
- Refactored `getCoinbaseWebProvider` function to dynamically import `CoinbaseWalletSDK`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-15 04:55:17 +00:00
jnsdls 41c6d04c2f [dependencies] Bump turbo package to 2.0.4 (#3323)
<!-- start pr-codex -->

## PR-Codex overview
This PR updates Yarn installation and package versions, enhances test project scripts, and modifies Turbo tasks configuration.

### Detailed summary
- Updated Yarn installation to version 1.22.19
- Updated package versions in the test project
- Modified Turbo tasks configuration for various packages and builds

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-15 01:28:21 +00:00
jnsdls 3a78041de7 [Multi] Update dependencies and version packages (#3327)
## 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

## Contributor NFT

Paste in your wallet address below and we will airdrop you a special NFT when your pull request is merged.

```Address: ```

<!-- start pr-codex -->

---

## PR-Codex overview
This PR updates dependencies in `package.json` and `pnpm-lock.yaml`, focusing on versions of `axios`, `@grpc/grpc-js`, and `braces`.

### Detailed summary
- Updated `@grpc/grpc-js` to version `1.10.9`
- Updated `braces` to version `3.0.3`
- Adjusted versions of `axios` and `@ethereumjs/util`
- Updated `fill-range` to version `7.1.1`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-06-14 22:32:39 +00:00
github-actions[bot]GitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
8b74602e3b chore(chains): update chains (#3311)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-14 13:23:51 -07:00
Joaquim VergesandGitHub f9081d58d4 refactor: inject storage and session handler in wallet connect connector [part 5] (#3314) 2024-06-14 19:11:03 +00:00
Joaquim VergesandGitHub b051d844d0 refactor: Inject storage EVERYWHERE [part 4] (#3312) 2024-06-14 19:00:12 +00:00
Joaquim VergesandGitHub f8e0c5f84b reafactor: reorganize react native export files [part 3] (#3304) 2024-06-14 18:54:24 +00:00
Joaquim VergesandGitHub 476b6cc271 refactor: separate native exports for inapp wallet [part 2] (#3300) 2024-06-14 18:43:27 +00:00
Joaquim VergesandGitHub ffaff744f7 refactor: separate native exports for cb wallet [part 1] (#3298) 2024-06-14 18:37:23 +00:00
FirekeeperandGitHub 198f72c493 [Unity] fix tx builder type parsing (#3317) 2024-06-14 18:20:49 +00:00
Jonas DanielsGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>GitHub Action
5cb580e99e Version Packages (#3316)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <[email protected]>
2024-06-14 11:12:41 -07:00
Manan TankandGitHub eff710738c [v4 react] Allow configuring qrcode and qrModalOptions on various wallet configurators (#3315) 2024-06-14 17:28:41 +00:00
Jonas DanielsandGitHub fb6a07d4b8 [Multi] Optimize package.json types versions & update ERC4337 factory methods (#3318) 2024-06-14 17:19:35 +00:00
7768067bf4 Modular contracts (#2880)
Signed-off-by: Yash <[email protected]>
Co-authored-by: Jonas Daniels <[email protected]>
2024-06-14 16:32:34 +00:00
Jonas DanielsGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>GitHub Action
5ece04cdc0 Version Packages (#3287)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <[email protected]>
2024-06-14 20:10:01 +12:00
1b15e7b1f2 docs: add examples for defineChain usage (#3308)
Co-authored-by: Joaquim Verges <[email protected]>
2024-06-14 18:48:02 +12:00
gregandGitHub a4086c6a39 refactor(constants): rename ADDRESS_ZERO to ZERO_ADDRESS and deprecate older name (#3307) 2024-06-14 06:16:41 +00:00
1aaa63eec7 fix(wallets): don't serialize eip5792 calls (#3306)
Co-authored-by: Joaquim Verges <[email protected]>
2024-06-14 06:16:02 +00:00
gregandGitHub 502c53ac0b fix(tests): zk AA tests (#3313) 2024-06-14 05:42:36 +00:00
gregandGitHub e7ba698f3e fix: set default recipients in sigMint and update tests (#3305) 2024-06-13 23:49:35 +00:00
github-actions[bot]andGitHub 6746416db9 chore(chains): update chains (#3289)
This PR was automatically created by a GitHub Action. It updates the chains package with the latest changes from the database.
2024-06-13 16:09:10 -07:00
fivecutandGitHub 2fb81bd4b7 chore: remove repeat words (#3297)
Signed-off-by: fivecut <[email protected]>
2024-06-13 15:57:16 +00:00
gregandGitHub 841c86aa12 feat: add export private key functionality (#3296) 2024-06-13 05:57:18 +00:00
Alec AnanianandGitHub 132b3cb45a feat(react): add ability to pass ReactNode for ConnectButton label (#3292) 2024-06-12 23:20:38 +00:00
b248afc160 fix(react): use custom title and icon in compact Connect modal (#3290)
Co-authored-by: Joaquim Verges <[email protected]>
2024-06-12 22:53:34 +00:00
github-actions[bot]GitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
9f42e4d241 chore(chains): update chains (#3279)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-12 10:37:25 -07:00
Winston YeoandGitHub 901427c33c [service-utils]: update usage tracker schema (#3286) 2024-06-12 16:22:00 +00:00
342 changed files with 13883 additions and 2366 deletions
+1 -1
View File
@@ -106,7 +106,7 @@ jobs:
- name: Install Yarn (if needed)
if: matrix.package_manager == 'yarn'
run: npm install -g yarn
run: npm install -g yarn@1.22.19
- name: Create test project
run: |
@@ -4,6 +4,7 @@ import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import { CodeExample } from "../../../components/code/code-example";
import { CustomizedConnect } from "../../../components/sign-in/custom";
import { HooksPreview } from "../../../components/sign-in/hooks";
import { StyledConnectButton } from "../../../components/styled-connect-button";
import { StyledConnectEmbed } from "../../../components/styled-connect-embed";
@@ -70,6 +71,10 @@ export default function Page() {
<EmbedComponent />
</section>
<section className="container px-4 md:px-6 space-y-8">
<CustomizedComponent />
</section>
<section className="container px-4 md:px-6 space-y-8">
<Hooks />
</section>
@@ -146,6 +151,65 @@ return (
);
}
function CustomizedComponent() {
return (
<>
<div className="space-y-2">
<h2 className="text-2xl sm:text-3xl font-semibold tracking-tight">
Customized Component
</h2>
<p className="max-w-[600px]">
Change the look and feel of the connect button without rewriting your
own.
</p>
</div>
<CodeExample
preview={<CustomizedConnect />}
code={`import { createThirdwebClient } from "thirdweb";
import { ConnectEmbed } from "thirdweb/react";
const THIRDWEB_CLIENT = createThirdwebClient({
clientId: "<YOUR_CLIENT_ID>"
});
function App(){
return (
<ConnectButton
client={THIRDWEB_CLIENT}
connectButton={{
label: "Custom Connect Button",
}}
showAllWallets={false}
connectModal={{
title: "Custom Connect Modal",
size: "compact",
}}
theme={darkTheme({
colors: {
modalBg: "#281866",
accentButtonBg: "#281866",
connectedButtonBgHover: "#281866",
borderColor: "rgba(256, 256,256, 0.1)",
accentText: "rgba(256, 256,256, 0.1)",
connectedButtonBg: "#281866",
tertiaryBg: "rgba(256, 256,256, 0.1)",
primaryButtonBg: "#281866",
secondaryButtonBg: "rgba(256, 256,256, 0.1)",
primaryButtonText: "#E7E8E9",
primaryText: "#E7E8E9",
separatorLine: "rgba(256, 256,256, 0.1)",
},
})}
/>
);
};`}
lang="tsx"
/>
</>
);
}
function Hooks() {
return (
<>
@@ -1,9 +1,9 @@
import { getContract } from "thirdweb";
import { zkSyncSepolia } from "thirdweb/chains";
import { baseSepolia } from "thirdweb/chains";
import { THIRDWEB_CLIENT } from "../../lib/client";
export const chain = zkSyncSepolia;
export const editionDropAddress = "0xd563ACBeD80e63B257B2524562BdD7Ec666eEE77";
export const chain = baseSepolia;
export const editionDropAddress = "0x638263e3eAa3917a53630e61B1fBa685308024fa";
export const editionDropTokenId = 0n;
export const editionDropContract = getContract({
@@ -12,7 +12,6 @@ import {
useReadContract,
} from "thirdweb/react";
import { THIRDWEB_CLIENT } from "../../lib/client";
import { CodeExample } from "../code/code-example";
import { editionDropContract, editionDropTokenId } from "./constants";
export function SponsoredTxPreview() {
@@ -50,7 +49,7 @@ export function SponsoredTxPreview() {
/>
) : null}
{smartAccount ? (
<>
<div className="flex flex-col justify-center p-8">
<p className="font-semibold text-center mb-2">
You own {ownedNfts?.[0]?.quantityOwned.toString() || "0"}{" "}
Kittens
@@ -73,7 +72,7 @@ export function SponsoredTxPreview() {
>
Mint
</TransactionButton>
</>
</div>
) : (
<p
style={{
@@ -0,0 +1,36 @@
"use client";
import { ConnectButton } from "thirdweb/react";
import { darkTheme, lightTheme } from "thirdweb/react";
import { THIRDWEB_CLIENT } from "../../lib/client";
export const CustomizedConnect = () => {
return (
<ConnectButton
client={THIRDWEB_CLIENT}
connectButton={{
label: "Custom Connect Button",
}}
showAllWallets={false}
connectModal={{
title: "Custom Connect Modal",
size: "compact",
}}
theme={darkTheme({
colors: {
modalBg: "#281866",
accentButtonBg: "#281866",
connectedButtonBgHover: "#281866",
borderColor: "rgba(256, 256,256, 0.1)",
accentText: "rgba(256, 256,256, 0.1)",
connectedButtonBg: "#281866",
tertiaryBg: "rgba(256, 256,256, 0.1)",
primaryButtonBg: "#281866",
secondaryButtonBg: "rgba(256, 256,256, 0.1)",
primaryButtonText: "#E7E8E9",
primaryText: "#E7E8E9",
separatorLine: "rgba(256, 256,256, 0.1)",
},
})}
/>
);
};
+35
View File
@@ -1,5 +1,40 @@
# @thirdweb-dev/auth
## 4.1.96
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.5.38
## 4.1.95
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.5.37
## 4.1.94
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.5.36
## 4.1.93
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.5.35
## 4.1.92
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.5.34
## 4.1.91
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "4.1.91",
"version": "4.1.96",
"main": "dist/thirdweb-dev-auth.cjs.js",
"module": "dist/thirdweb-dev-auth.esm.js",
"browser": {
+18
View File
@@ -1,5 +1,23 @@
# @thirdweb-dev/chains
## 0.1.120
### Patch Changes
- [#3348](https://github.com/thirdweb-dev/js/pull/3348) [`321cf26`](https://github.com/thirdweb-dev/js/commit/321cf26342d0755204aa465bc2390e052d5ed071) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
## 0.1.119
### Patch Changes
- [#3311](https://github.com/thirdweb-dev/js/pull/3311) [`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
## 0.1.118
### Patch Changes
- [#3279](https://github.com/thirdweb-dev/js/pull/3279) [`9f42e4d`](https://github.com/thirdweb-dev/js/commit/9f42e4d2412df536d1b5f03a4e2a8b516911facb) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
## 0.1.117
### Patch Changes
@@ -4,12 +4,6 @@ export default {
"chainId": 107107114116,
"explorers": [],
"faucets": [],
"icon": {
"url": "ipfs://QmNTZ9nEomAXK6bLxUbMfTS1TvrsN22HU1zTtxHUpMkUhz",
"width": 1000,
"height": 1000,
"format": "png"
},
"infoURL": "https://kakarot.org",
"name": "Kakarot Sepolia Deprecated",
"nativeCurrency": {
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 111223,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "Chennai Testnet",
"nativeCurrency": {
"name": "Chennai Testnet Token",
"symbol": "ZOD",
"decimals": 18
},
"networkId": 111223,
"redFlags": [],
"rpc": [
"https://111223.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/chennai/testnet/rpc"
],
"shortName": "Chennai Testnet",
"slug": "chennai-testnet",
"testnet": true
} as const satisfies Chain;
+3 -1
View File
@@ -36,7 +36,9 @@ export default {
},
"rpc": [
"https://1123.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://b2-testnet.alt.technology"
"https://b2-testnet.alt.technology",
"https://rpc.ankr.com/b2_testnet",
"https://testnet-rpc.bsquared.network"
],
"shortName": "B2-testnet",
"slug": "b2-testnet",
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"chain": "Artela",
"chainId": 11822,
"explorers": [
{
"name": "ArtelaScan",
"url": "https://betanet-scan.artela.network",
"standard": "EIP3091"
}
],
"faucets": [],
"infoURL": "https://artela.network/",
"name": "Artela Testnet",
"nativeCurrency": {
"name": "ART",
"symbol": "ART",
"decimals": 18
},
"networkId": 11822,
"rpc": [
"https://11822.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://betanet-rpc1.artela.network"
],
"shortName": "Artela",
"slug": "artela-testnet",
"testnet": true
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"chain": "CuckooAI",
"chainId": 1200,
"explorers": [
{
"name": "Cuckoo Chain Explorer",
"url": "https://mainnet-scan.cuckoo.network",
"standard": "EIP3091"
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmZjVDfk56DjqkCPymaweJJaj9ASGjjgcwJ95XsFDzj9us",
"width": 512,
"height": 512,
"format": "png"
},
"infoURL": "https://cuckoo.network",
"name": "Cuckoo Chain",
"nativeCurrency": {
"name": "CuckooAI",
"symbol": "CAI",
"decimals": 18
},
"networkId": 1200,
"rpc": [
"https://1200.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet-rpc.cuckoo.network",
"wss://mainnet-rpc.cuckoo.network"
],
"shortName": "cai",
"slug": "cuckoo-chain",
"testnet": false,
"title": "Cuckoo Chain"
} as const satisfies Chain;
+4 -3
View File
@@ -17,7 +17,7 @@ export default {
"format": "png"
},
"infoURL": "https://buildonhybrid.com",
"name": "Hybrid Testnet",
"name": "Hybrid Testnet (Deprecated)",
"nativeCurrency": {
"name": "Hybrid",
"symbol": "HYB",
@@ -28,7 +28,8 @@ export default {
"https://1224.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.buildonhybrid.com"
],
"shortName": "hyb",
"slug": "hybrid-testnet",
"shortName": "hyb_deprecated",
"slug": "hybrid-testnet-deprecated",
"status": "deprecated",
"testnet": true
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"chain": "HYB",
"chainId": 1225,
"explorers": [
{
"name": "Hybrid Testnet",
"url": "https://explorer.buildonhybrid.com",
"standard": "EIP3091"
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmdGfvH9qfvbMXYKosS1nHbw3q5UtFJky4hdMDmmKDTx8Y",
"width": 250,
"height": 250,
"format": "png"
},
"infoURL": "https://buildonhybrid.com",
"name": "Hybrid Testnet",
"nativeCurrency": {
"name": "Hybrid",
"symbol": "HYB",
"decimals": 18
},
"networkId": 1225,
"rpc": [
"https://1225.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://hybrid-testnet.rpc.caldera.xyz/http",
"wss://hybrid-testnet.rpc.caldera.xyz/ws"
],
"shortName": "hyb",
"slug": "hybrid-testnet",
"status": "active",
"testnet": true
} as const satisfies Chain;
-6
View File
@@ -15,12 +15,6 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmRySLe3su59dE5x5JPm2b1GeZfz6DR9qUzcbp3rt4SD3A",
"width": 300,
"height": 300,
"format": "png"
},
"infoURL": "https://astar.network",
"name": "zKatana",
"nativeCurrency": {
+37
View File
@@ -0,0 +1,37 @@
import type { Chain } from "../src/types";
export default {
"chain": "Sei",
"chainId": 1328,
"explorers": [
{
"name": "Seitrace",
"url": "https://seitrace.com",
"standard": "EIP3091"
}
],
"faucets": [
"https://atlantic-2.app.sei.io/faucet"
],
"icon": {
"url": "ipfs://bafkreih3l3iisplmikofkbfyimqlox7nmixzlkzhjoewmpi4jbqitwryoa",
"width": 600,
"height": 600,
"format": "png"
},
"infoURL": "https://www.sei.io",
"name": "Sei Testnet",
"nativeCurrency": {
"name": "Sei",
"symbol": "SEI",
"decimals": 18
},
"networkId": 1328,
"rpc": [
"https://1328.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://evm-rpc-testnet.sei-apis.com",
"wss://evm-ws-testnet.sei-apis.com"
],
"shortName": "sei-testnet",
"slug": "sei-testnet",
"testnet": true
} as const satisfies Chain;
+1 -13
View File
@@ -6,13 +6,7 @@ export default {
{
"name": "etherscan",
"url": "http://testnet-api.magape.io:81",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmPsxWMvnxnZ9dZcRJJMaE24o34dQsnsAMCJh3kVDrE1aB",
"width": 1000,
"height": 1000,
"format": "png"
}
"standard": "EIP3091"
}
],
"faucets": [],
@@ -21,12 +15,6 @@ export default {
"name": "EIP155"
}
],
"icon": {
"url": "ipfs://QmPsxWMvnxnZ9dZcRJJMaE24o34dQsnsAMCJh3kVDrE1aB",
"width": 1000,
"height": 1000,
"format": "png"
},
"infoURL": "https://magape.io",
"name": "MagApe Testnet",
"nativeCurrency": {
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 14299,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "Diego's",
"nativeCurrency": {
"name": "Diego's Token",
"symbol": "VMF",
"decimals": 18
},
"networkId": 14299,
"redFlags": [],
"rpc": [
"https://14299.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/diegos/testnet/rpc"
],
"shortName": "Diego's",
"slug": "diego-s",
"testnet": true
} as const satisfies Chain;
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Satori",
"chainId": 14801,
"explorers": [
{
"name": "satoriscan",
"url": "https://satori.vanascan.io",
"standard": "EIP3091"
}
],
"faucets": [
"https://faucet.vana.org"
],
"infoURL": "https://satori.vana.org",
"name": "Vana Satori Testnet",
"nativeCurrency": {
"name": "DAT",
"symbol": "DAT",
"decimals": 18
},
"networkId": 14801,
"rpc": [
"https://14801.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://rpc.satori.vana.org"
],
"shortName": "satori",
"slug": "vana-satori-testnet",
"testnet": true
} as const satisfies Chain;
@@ -15,12 +15,6 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmNTZ9nEomAXK6bLxUbMfTS1TvrsN22HU1zTtxHUpMkUhz",
"width": 1000,
"height": 1000,
"format": "png"
},
"infoURL": "https://kakarot.org",
"name": "Kakarot Sepolia",
"nativeCurrency": {
+38
View File
@@ -0,0 +1,38 @@
import type { Chain } from "../src/types";
export default {
"chain": "TCC Network",
"chainId": 181155,
"explorers": [
{
"name": "Tcc Scan",
"url": "https://scan.tccworld.org/",
"standard": "181155",
"icon": {
"url": "ipfs://QmchZTtvuU7oRe3rSu1HNPELJQdnutV79NjcHxoybJ4SVo/tcc-coin.png",
"width": 100,
"height": 100,
"format": "png"
}
}
],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmchZTtvuU7oRe3rSu1HNPELJQdnutV79NjcHxoybJ4SVo/tcc-coin.png",
"width": 100,
"height": 100,
"format": "png"
},
"name": "TCC Network",
"nativeCurrency": {
"name": "The ChampCoin",
"symbol": "TCC",
"decimals": 18
},
"networkId": 181155,
"redFlags": [],
"rpc": [],
"shortName": "TCC",
"slug": "tcc-network",
"testnet": false
} as const satisfies Chain;
@@ -0,0 +1,41 @@
import type { Chain } from "../src/types";
export default {
"chain": "Gemuchain",
"chainId": 1903648807,
"explorers": [
{
"name": "Gemuchain Explorer",
"url": "https://gemutest-explorer.gemuchain.io",
"standard": "EIP3091",
"icon": {
"url": "https://explorer.gemuchain.io/assets/network_logo.svg",
"width": 345,
"height": 48,
"format": "svg"
}
}
],
"faucets": [],
"features": [],
"icon": {
"url": "https://raw.githubusercontent.com/UrfinDeuce/logos/05725373b48fb7e3de75737f621b21a4a6557c76/GemuChain%20logo.svg",
"width": 345,
"height": 48,
"format": "svg"
},
"name": "Gemuchain Lab",
"nativeCurrency": {
"name": "GEMU",
"symbol": "GEMU",
"decimals": 18
},
"networkId": 1903648807,
"redFlags": [],
"rpc": [
"https://1903648807.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gemutest-rpc.gemuchain.io"
],
"shortName": "GEMU",
"slug": "gemuchain-lab",
"testnet": true
} as const satisfies Chain;
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"chain": "KYOTO",
"chainId": 1997,
"explorers": [
{
"name": "Kyotoscan",
"url": "https://kyotoscan.io",
"standard": "EIP3091"
}
],
"faucets": [],
"features": [
{
"name": "EIP155"
}
],
"infoURL": "https://kyotoprotocol.io",
"name": "Kyoto",
"nativeCurrency": {
"name": "Kyoto",
"symbol": "KYOTO",
"decimals": 18
},
"networkId": 1997,
"rpc": [
"https://1997.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.kyotochain.io"
],
"shortName": "kyoto",
"slip44": 1,
"slug": "kyoto",
"testnet": false
} as const satisfies Chain;
+29
View File
@@ -0,0 +1,29 @@
import type { Chain } from "../src/types";
export default {
"chain": "Parodychain",
"chainId": 2078,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmR2ovc7zeM7gdzpL6FdvWBEhLyE8dL1w8GWnooHEk9uEZ/parodychain-logo.png",
"width": 512,
"height": 512,
"format": "png"
},
"name": "Parody Network",
"nativeCurrency": {
"name": "Parody",
"symbol": "PDY",
"decimals": 18
},
"networkId": 2078,
"redFlags": [],
"rpc": [
"https://2078.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://fraa-flashbox-4392-rpc.a.stagenet.tanssi.network"
],
"shortName": "Parody",
"slug": "parody-network",
"testnet": true
} as const satisfies Chain;
+2 -2
View File
@@ -20,8 +20,8 @@ export default {
"networkId": 2136,
"rpc": [
"https://2136.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://test-market.bigsb.io",
"wss://test-market.bigsb.io"
"https://test-market.bigsb.network",
"wss://test-market.bigsb.network"
],
"shortName": "bigsb_testnet",
"slug": "bigshortbets-testnet",
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 2144,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "Test Subnet Resources",
"nativeCurrency": {
"name": "Test Subnet Resources Token",
"symbol": "LNV",
"decimals": 18
},
"networkId": 2144,
"redFlags": [],
"rpc": [
"https://2144.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/testsubnet/testnet/rpc"
],
"shortName": "Test Subnet Resources",
"slug": "test-subnet-resources",
"testnet": true
} as const satisfies Chain;
+2 -20
View File
@@ -6,34 +6,16 @@ export default {
{
"name": "explorer",
"url": "https://testnet.meldscan.io",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmRhB4AbjDrhvwfSAQi2JvKirFiDWxzJvKEvG8S8AdDdED",
"width": 4000,
"height": 4000,
"format": "png"
}
"standard": "EIP3091"
},
{
"name": "explorer",
"url": "https://subnets-test.avax.network/meld",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmRhB4AbjDrhvwfSAQi2JvKirFiDWxzJvKEvG8S8AdDdED",
"width": 4000,
"height": 4000,
"format": "png"
}
"standard": "EIP3091"
}
],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmRhB4AbjDrhvwfSAQi2JvKirFiDWxzJvKEvG8S8AdDdED",
"width": 4000,
"height": 4000,
"format": "png"
},
"infoURL": "https://meld.com",
"name": "Kanazawa",
"nativeCurrency": {
+2 -1
View File
@@ -44,7 +44,8 @@ export default {
"https://mainnet.b2-rpc.com",
"https://rpc.bsquared.network",
"https://b2-mainnet.alt.technology",
"https://b2-mainnet-public.s.chainbase.com"
"https://b2-mainnet-public.s.chainbase.com",
"https://rpc.ankr.com/b2"
],
"shortName": "B2-mainnet",
"slug": "b2",
+41
View File
@@ -0,0 +1,41 @@
import type { Chain } from "../src/types";
export default {
"chain": "AILayer",
"chainId": 2648,
"explorers": [
{
"name": "blockscout",
"url": "https://testnet-explorer.ailayer.xyz",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmYoqc8rm8PrBg9jqfpsrxd6zdPEqDozbyNVMkBo3QMAFP",
"width": 500,
"height": 500,
"format": "png"
}
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmYoqc8rm8PrBg9jqfpsrxd6zdPEqDozbyNVMkBo3QMAFP",
"width": 500,
"height": 500,
"format": "png"
},
"infoURL": "https://ailayer.xyz/",
"name": "AILayer Testnet",
"nativeCurrency": {
"name": "BTC",
"symbol": "BTC",
"decimals": 18
},
"networkId": 2648,
"rpc": [
"https://2648.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.ailayer.xyz",
"wss://testnet-rpc.ailayer.xyz"
],
"shortName": "ailayer-testnet",
"slug": "ailayer-testnet",
"testnet": true
} as const satisfies Chain;
+41
View File
@@ -0,0 +1,41 @@
import type { Chain } from "../src/types";
export default {
"chain": "AILayer",
"chainId": 2649,
"explorers": [
{
"name": "blockscout",
"url": "https://mainnet-explorer.ailayer.xyz",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmYoqc8rm8PrBg9jqfpsrxd6zdPEqDozbyNVMkBo3QMAFP",
"width": 500,
"height": 500,
"format": "png"
}
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmYoqc8rm8PrBg9jqfpsrxd6zdPEqDozbyNVMkBo3QMAFP",
"width": 500,
"height": 500,
"format": "png"
},
"infoURL": "https://ailayer.xyz/",
"name": "AILayer Mainnet",
"nativeCurrency": {
"name": "BTC",
"symbol": "BTC",
"decimals": 18
},
"networkId": 2649,
"rpc": [
"https://2649.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://mainnet-rpc.ailayer.xyz",
"wss://mainnet-rpc.ailayer.xyz"
],
"shortName": "ailayer-mainnet",
"slug": "ailayer",
"testnet": false
} as const satisfies Chain;
+2 -20
View File
@@ -6,34 +6,16 @@ export default {
{
"name": "explorer",
"url": "https://meldscan.io",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmRhB4AbjDrhvwfSAQi2JvKirFiDWxzJvKEvG8S8AdDdED",
"width": 4000,
"height": 4000,
"format": "png"
}
"standard": "EIP3091"
},
{
"name": "explorer",
"url": "https://subnets.avax.network/meld",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmRhB4AbjDrhvwfSAQi2JvKirFiDWxzJvKEvG8S8AdDdED",
"width": 4000,
"height": 4000,
"format": "png"
}
"standard": "EIP3091"
}
],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmRhB4AbjDrhvwfSAQi2JvKirFiDWxzJvKEvG8S8AdDdED",
"width": 4000,
"height": 4000,
"format": "png"
},
"infoURL": "https://meld.com",
"name": "Meld",
"nativeCurrency": {
+41
View File
@@ -0,0 +1,41 @@
import type { Chain } from "../src/types";
export default {
"chain": "GTC",
"chainId": 3490,
"explorers": [
{
"name": "GTCScan Explorer",
"url": "https://gtcscan.io",
"standard": "none",
"icon": {
"url": "ipfs://bafybeiaaq7gogws6uqcvo6imxbxfgpdhewybh7bxgtfny2i2as5nidbdje",
"width": 312,
"height": 312,
"format": "png"
}
}
],
"faucets": [],
"icon": {
"url": "ipfs://bafybeiaaq7gogws6uqcvo6imxbxfgpdhewybh7bxgtfny2i2as5nidbdje",
"width": 312,
"height": 312,
"format": "png"
},
"infoURL": "https://gtcscan.io/",
"name": "GTCSCAN",
"nativeCurrency": {
"name": "GTC",
"symbol": "GTC",
"decimals": 18
},
"networkId": 3490,
"rpc": [
"https://3490.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gtc-dataseed.gtcscan.io/"
],
"shortName": "gtc",
"slip44": 1,
"slug": "gtcscan",
"testnet": false
} as const satisfies Chain;
+6
View File
@@ -10,6 +10,12 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmcumhDxUyoLTHkcMKgPqkpGnnjwSTqE2KGFnDXXFY8mMo",
"width": 40,
"height": 38,
"format": "png"
},
"infoURL": "https://islamicoin.finance",
"name": "iChain Network",
"nativeCurrency": {
+34
View File
@@ -0,0 +1,34 @@
import type { Chain } from "../src/types";
export default {
"chain": "iChain Testnet",
"chainId": 3645,
"explorers": [
{
"name": "iChainscan",
"url": "https://test.ichainscan.com",
"standard": "EIP3091"
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmcumhDxUyoLTHkcMKgPqkpGnnjwSTqE2KGFnDXXFY8mMo",
"width": 40,
"height": 38,
"format": "png"
},
"infoURL": "https://islamicoin.finance",
"name": "iChain Testnet",
"nativeCurrency": {
"name": "ISLAMICOIN",
"symbol": "ISLAMI",
"decimals": 18
},
"networkId": 3645,
"rpc": [
"https://3645.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://istanbul.ichainscan.com"
],
"shortName": "ISLAMIT",
"slug": "ichain-testnet",
"testnet": true
} as const satisfies Chain;
+4 -9
View File
@@ -7,20 +7,15 @@ export default {
"name": "Blockscout",
"url": "https://testnet-explorer-v2.xai-chain.net",
"standard": "EIP3091"
},
{
"name": "blockscout",
"url": "https://testnet-explorer-v2.xai-chain.net/",
"standard": "EIP3091"
}
],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmZKFekbHxDkB8gFmmmjWz89SLhwg38GkALmAKo3gn753N/2024-01-10%2012.50.15.jpg",
"width": 512,
"height": 512,
"format": "jpg"
"url": "ipfs://QmbWFbhjKw7zfsK5Rd9YxZgJgS43fpySPozjhYc98ibbEV/xai-icon.png",
"width": 1024,
"height": 1024,
"format": "png"
},
"infoURL": "https://xai.games",
"name": "Xai Sepolia",
-6
View File
@@ -16,12 +16,6 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmZt75xixnEtFzqHTrJa8kJkV4cTXmUZqeMeHM8BcvomQc",
"width": 512,
"height": 512,
"format": "png"
},
"infoURL": "https://oho.ai",
"name": "OHO Mainnet",
"nativeCurrency": {
+43
View File
@@ -0,0 +1,43 @@
import type { Chain } from "../src/types";
export default {
"chain": "Bahamut",
"chainId": 4058,
"explorers": [
{
"name": "blockscout",
"url": "https://ocean.ftnscan.com",
"standard": "none"
}
],
"faucets": [],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"icon": {
"url": "ipfs://QmSemioP83RXnDWwTZbet8VpwJxcFRboX4B3pcdhLZGodP",
"width": 200,
"height": 200,
"format": "png"
},
"infoURL": "https://bahamut.io",
"name": "Bahamut ocean",
"nativeCurrency": {
"name": "FTN",
"symbol": "FTN",
"decimals": 18
},
"networkId": 4058,
"rpc": [
"https://4058.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc1.ocean.bahamutchain.com"
],
"shortName": "ocean",
"slug": "bahamut-ocean",
"testnet": false,
"title": "Bahamut ocean"
} as const satisfies Chain;
-6
View File
@@ -10,12 +10,6 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmXARMjJGkXEVEdjUyxkeG4ffsWvEo9vSJpVon3JwRxckS",
"width": 512,
"height": 512,
"format": "png"
},
"infoURL": "https://tobechain.net",
"name": "Tobe Chain",
"nativeCurrency": {
+2 -2
View File
@@ -4,8 +4,8 @@ export default {
"chainId": 44,
"explorers": [
{
"name": "subscan",
"url": "https://crab.subscan.io",
"name": "blockscout",
"url": "https://crab-scan.darwinia.network",
"standard": "EIP3091"
}
],
+1 -13
View File
@@ -6,22 +6,10 @@ export default {
{
"name": "etmpscan",
"url": "https://etmscan.network",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmT7DTqT1V2y42pRpt3sj9ifijfmbtkHN7D2vTfAUAS622",
"width": 512,
"height": 512,
"format": "png"
}
"standard": "EIP3091"
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmT7DTqT1V2y42pRpt3sj9ifijfmbtkHN7D2vTfAUAS622",
"width": 512,
"height": 512,
"format": "png"
},
"infoURL": "https://etm.network",
"name": "Ennothem Mainnet Proterozoic",
"nativeCurrency": {
-6
View File
@@ -10,12 +10,6 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmT7DTqT1V2y42pRpt3sj9ifijfmbtkHN7D2vTfAUAS622",
"width": 512,
"height": 512,
"format": "png"
},
"infoURL": "https://etm.network",
"name": "Ennothem Testnet Pioneer",
"nativeCurrency": {
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 51290,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "Test Using Resources",
"nativeCurrency": {
"name": "Test Using Resources Token",
"symbol": "JMH",
"decimals": 18
},
"networkId": 51290,
"redFlags": [],
"rpc": [
"https://51290.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/testsize2/testnet/rpc"
],
"shortName": "Test Using Resources",
"slug": "test-using-resources",
"testnet": true
} as const satisfies Chain;
+38
View File
@@ -0,0 +1,38 @@
import type { Chain } from "../src/types";
export default {
"chain": "Pentagon",
"chainId": 555555,
"explorers": [
{
"name": "Pentagon Testnet Explorer",
"url": "https://explorer-testnet.pentagon.games",
"standard": "EIP3091"
}
],
"faucets": [
"https://bridge-testnet.pentagon.games"
],
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://pentagon.games",
"name": "Pentagon Testnet",
"nativeCurrency": {
"name": "Pentagon",
"symbol": "PEN",
"decimals": 18
},
"networkId": 555555,
"rpc": [
"https://555555.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-testnet.pentagon.games"
],
"shortName": "pentagon-testnet",
"slug": "pentagon-testnet",
"testnet": true
} as const satisfies Chain;
+7 -7
View File
@@ -4,20 +4,20 @@ export default {
"chainId": 57451,
"explorers": [
{
"name": "coinsec network",
"name": "coinsecnetwork",
"url": "https://explorer.coinsec.network",
"standard": "EIP3091"
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmWm9biSavZ4ixNNSe8KhxiYgYaejY6Y4xRaqmz9fXimo5",
"width": 1136,
"height": 1112,
"format": "png"
"url": "ipfs://QmeUyBe58BPndt6SpH9Tn1a8AYpNtHbMVhVyZt8Ppc4HTB",
"width": 200,
"height": 200,
"format": "svg"
},
"infoURL": "https://explorer.coinsec.network/",
"name": "COINSEC",
"name": "COINSEC Network",
"nativeCurrency": {
"name": "COINSEC",
"symbol": "SEC",
@@ -29,7 +29,7 @@ export default {
"https://mainnet-rpc.coinsec.network"
],
"shortName": "coinsecnetwork",
"slug": "coinsec",
"slug": "coinsec-network",
"testnet": false,
"title": "COINSEC Network"
} as const satisfies Chain;
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 57923,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "QI0614I1",
"nativeCurrency": {
"name": "QI0614I1 Token",
"symbol": "GZD",
"decimals": 18
},
"networkId": 57923,
"redFlags": [],
"rpc": [
"https://57923.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/defi-kingdoms/dfk-chain/rpc"
],
"shortName": "QI0614I1",
"slug": "qi0614i1",
"testnet": true
} as const satisfies Chain;
-6
View File
@@ -16,12 +16,6 @@ export default {
],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmRySLe3su59dE5x5JPm2b1GeZfz6DR9qUzcbp3rt4SD3A",
"width": 300,
"height": 300,
"format": "png"
},
"infoURL": "https://astar.network",
"name": "Astar zKyoto",
"nativeCurrency": {
+40
View File
@@ -0,0 +1,40 @@
import type { Chain } from "../src/types";
export default {
"chain": "Open Campus Codex",
"chainId": 656476,
"explorers": [
{
"name": "Open Campus Codex",
"url": "https://opencampus-codex.blockscout.com",
"standard": "none",
"icon": {
"url": "ipfs://QmXbz7VEYvf6NVHezuBy5HpJTCiagEThBxxdDdfVXNQ8Bt",
"width": 30,
"height": 30,
"format": "png"
}
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmXbz7VEYvf6NVHezuBy5HpJTCiagEThBxxdDdfVXNQ8Bt",
"width": 30,
"height": 30,
"format": "png"
},
"infoURL": "https://raas.gelato.network/rollups/details/public/open-campus-codex",
"name": "Open Campus Codex",
"nativeCurrency": {
"name": "EDU",
"symbol": "EDU",
"decimals": 18
},
"networkId": 656476,
"rpc": [
"https://656476.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.open-campus-codex.gelato.digital"
],
"shortName": "open-campus-codex",
"slug": "open-campus-codex",
"testnet": false
} as const satisfies Chain;
+4 -4
View File
@@ -12,10 +12,10 @@ export default {
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://QmZKFekbHxDkB8gFmmmjWz89SLhwg38GkALmAKo3gn753N/2024-01-10%2012.50.15.jpg",
"width": 512,
"height": 512,
"format": "jpg"
"url": "ipfs://QmbWFbhjKw7zfsK5Rd9YxZgJgS43fpySPozjhYc98ibbEV/xai-icon.png",
"width": 1024,
"height": 1024,
"format": "png"
},
"infoURL": "https://xai.games/",
"name": "Xai Mainnet",
+24
View File
@@ -0,0 +1,24 @@
import type { Chain } from "../src/types";
export default {
"chain": "OX",
"chainId": 6699,
"explorers": [],
"faucets": [],
"infoURL": "https://ox.fun/chain",
"name": "OX Chain",
"nativeCurrency": {
"name": "OX",
"symbol": "OX",
"decimals": 18
},
"networkId": 6699,
"rpc": [
"https://6699.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.oxscan.io"
],
"shortName": "ox-chain",
"slug": "ox-chain",
"status": "incubating",
"testnet": false,
"title": "OX Chain"
} as const satisfies Chain;
+29
View File
@@ -0,0 +1,29 @@
import type { Chain } from "../src/types";
export default {
"chain": "Darwinia Koi",
"chainId": 701,
"explorers": [
{
"name": "blockscout",
"url": "https://koi-scan.darwinia.network",
"standard": "EIP3091"
}
],
"faucets": [],
"infoURL": "https://darwinia.network/",
"name": "Darwinia Koi Testnet",
"nativeCurrency": {
"name": "Koi Network Native Token",
"symbol": "KRING",
"decimals": 18
},
"networkId": 701,
"rpc": [
"https://701.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://koi-rpc.darwinia.network"
],
"shortName": "darwinia-koi",
"slip44": 1,
"slug": "darwinia-koi-testnet",
"testnet": true
} as const satisfies Chain;
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 74444,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "QR0612T1TS",
"nativeCurrency": {
"name": "QR0612T1TS Token",
"symbol": "FYJ",
"decimals": 18
},
"networkId": 74444,
"redFlags": [],
"rpc": [
"https://74444.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/qr0612t1ts/testnet/rpc"
],
"shortName": "QR0612T1TS",
"slug": "qr0612t1ts",
"testnet": true
} as const satisfies Chain;
+4 -3
View File
@@ -19,14 +19,15 @@ export default {
"infoURL": "https://www.boraportal.com",
"name": "BORAchain mainnet",
"nativeCurrency": {
"name": "BGAS",
"symbol": "BGAS",
"name": "BORA",
"symbol": "BORA",
"decimals": 18
},
"networkId": 77001,
"rpc": [
"https://77001.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://public-node.api.boraportal.com/bora/mainnet"
"https://public-node.api.boraportal.com/bora/mainnet",
"https://public-node.api.boraportal.io/bora/mainnet"
],
"shortName": "BORAchain",
"slip44": 8217,
-6
View File
@@ -16,12 +16,6 @@ export default {
}
],
"faucets": [],
"icon": {
"url": "ipfs://QmVhezQHkqSZ5Tvtsw18giA1yBjV1URSsBQ7HenUh6p6oC",
"width": 512,
"height": 512,
"format": "png"
},
"infoURL": "https://octa.space",
"name": "OctaSpace",
"nativeCurrency": {
+4 -1
View File
@@ -10,6 +10,7 @@ export default {
}
],
"faucets": [
"https://bartio.faucet.berachain.com",
"https://bartio.faucet.berachain.com/"
],
"features": [],
@@ -19,6 +20,7 @@ export default {
"height": 360,
"format": "png"
},
"infoURL": "https://www.berachain.com",
"name": "Berachain bArtio",
"nativeCurrency": {
"name": "BERA",
@@ -31,7 +33,8 @@ export default {
"https://80084.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://quicknode-rpc.berachain.com",
"https://bartio.rpc.berachain.com",
"https://rpc.ankr.com/berachain_testnet"
"https://rpc.ankr.com/berachain_testnet",
"https://bera-testnet.nodeinfra.com"
],
"shortName": "Berachain",
"slug": "berachain-bartio",
+3
View File
@@ -16,6 +16,7 @@ export default {
}
],
"faucets": [],
"features": [],
"icon": {
"url": "ipfs://bafkreibqgh23s7yt7rikybybiwfivwtoh32n24scjykvgbgewo3ecbrcye",
"width": 512,
@@ -30,8 +31,10 @@ export default {
"decimals": 18
},
"networkId": 8047,
"redFlags": [],
"rpc": [
"https://8047.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc0.come.boats/",
"https://rpc0.come.boat/"
],
"shortName": "boat",
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 82529,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "Test Using Resources",
"nativeCurrency": {
"name": "Test Using Resources Token",
"symbol": "JMH",
"decimals": 18
},
"networkId": 82529,
"redFlags": [],
"rpc": [
"https://82529.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/testsize/testnet/rpc"
],
"shortName": "Test Using Resources",
"slug": "test-using-resources-test using resources",
"testnet": true
} as const satisfies Chain;
-6
View File
@@ -12,12 +12,6 @@ export default {
"faucets": [
"https://faucet.blocktonscan.com/"
],
"icon": {
"url": "ipfs://bafkreig3hoedafisrgc6iffdo2jcblm6kov35h72gcblc3zkmt7t4ucwhy",
"width": 800,
"height": 800,
"format": "png"
},
"infoURL": "https://blocktoncoin.com",
"name": "Blockton Blockchain",
"nativeCurrency": {
+30
View File
@@ -0,0 +1,30 @@
import type { Chain } from "../src/types";
export default {
"chain": "Avalanche",
"chainId": 85405,
"explorers": [],
"faucets": [],
"features": [],
"icon": {
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
"width": 256,
"height": 256,
"format": "svg"
},
"infoURL": "https://avacloud.io",
"name": "QR0614T1tS",
"nativeCurrency": {
"name": "QR0614T1tS Token",
"symbol": "FTW",
"decimals": 18
},
"networkId": 85405,
"redFlags": [],
"rpc": [
"https://85405.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/qr0614t1ts/testnet/rpc"
],
"shortName": "QR0614T1tS",
"slug": "qr0614t1ts",
"testnet": true
} as const satisfies Chain;
+1 -13
View File
@@ -6,24 +6,12 @@ export default {
{
"name": "mmtscan",
"url": "https://mmtscan.io",
"standard": "EIP3091",
"icon": {
"url": "ipfs://QmaF5gi2CbDKsJ2UchNkjBqmWjv8JEDP3vePBmxeUHiaK4",
"width": 250,
"height": 250,
"format": "png"
}
"standard": "EIP3091"
}
],
"faucets": [
"https://faucet.mmtscan.io/"
],
"icon": {
"url": "ipfs://QmaF5gi2CbDKsJ2UchNkjBqmWjv8JEDP3vePBmxeUHiaK4",
"width": 250,
"height": 250,
"format": "png"
},
"infoURL": "https://mmtchain.io/",
"name": "Mammoth Mainnet",
"nativeCurrency": {
+1 -13
View File
@@ -6,24 +6,12 @@ export default {
{
"name": "Shidoblock Testnet Explorer",
"url": "https://testnet.shidoscan.com",
"standard": "none",
"icon": {
"url": "ipfs://bafkreiatrf5pp7ywvrwvsv4otrex73u6v6bvhorqkxiop2hy2i572zjrba",
"width": 1080,
"height": 1080,
"format": "png"
}
"standard": "none"
}
],
"faucets": [
"https://testnet.shidoscan.com/faucet"
],
"icon": {
"url": "ipfs://bafkreiatrf5pp7ywvrwvsv4otrex73u6v6bvhorqkxiop2hy2i572zjrba",
"width": 1080,
"height": 1080,
"format": "png"
},
"infoURL": "https://www.nexablock.io",
"name": "Shido Testnet Block",
"nativeCurrency": {
+1 -13
View File
@@ -6,22 +6,10 @@ export default {
{
"name": "Shidoblock Mainnet Explorer",
"url": "https://shidoscan.com",
"standard": "none",
"icon": {
"url": "ipfs://bafkreiatrf5pp7ywvrwvsv4otrex73u6v6bvhorqkxiop2hy2i572zjrba",
"width": 1080,
"height": 1080,
"format": "png"
}
"standard": "none"
}
],
"faucets": [],
"icon": {
"url": "ipfs://bafkreiatrf5pp7ywvrwvsv4otrex73u6v6bvhorqkxiop2hy2i572zjrba",
"width": 1080,
"height": 1080,
"format": "png"
},
"infoURL": "https://shido.io",
"name": "Shido Mainnet Block",
"nativeCurrency": {
+31
View File
@@ -0,0 +1,31 @@
import type { Chain } from "../src/types";
export default {
"chain": "Supernet Testnet",
"chainId": 998899,
"explorers": [
{
"name": "supernet-testnet-explorer",
"url": "https://testnet-explorer.supernet.chaingames.io",
"standard": "EIP3091"
}
],
"faucets": [
"https://faucet.chaingames.io"
],
"name": "Supernet Testnet",
"nativeCurrency": {
"name": "CHAIN",
"symbol": "CHAIN",
"decimals": 18
},
"networkId": 998899,
"rpc": [
"https://998899.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://testnet-rpc.supernet.chaingames.io/"
],
"shortName": "supernetchain",
"slip44": 1,
"slug": "supernet-testnet",
"testnet": true,
"title": "Supernet Testnet"
} as const satisfies Chain;
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/chains",
"version": "0.1.117",
"version": "0.1.120",
"main": "dist/thirdweb-dev-chains.cjs.js",
"module": "dist/thirdweb-dev-chains.esm.js",
"exports": {
File diff suppressed because one or more lines are too long
+48
View File
@@ -1,5 +1,53 @@
# thirdweb
## 0.14.11
### Patch Changes
- Updated dependencies [[`321cf26`](https://github.com/thirdweb-dev/js/commit/321cf26342d0755204aa465bc2390e052d5ed071)]:
- @thirdweb-dev/chains@0.1.120
- @thirdweb-dev/sdk@4.0.98
- @thirdweb-dev/wallets@2.5.38
- @thirdweb-dev/auth@4.1.96
## 0.14.10
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.97
- @thirdweb-dev/wallets@2.5.37
- @thirdweb-dev/auth@4.1.95
## 0.14.9
### Patch Changes
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
- @thirdweb-dev/chains@0.1.119
- @thirdweb-dev/sdk@4.0.96
- @thirdweb-dev/wallets@2.5.36
- @thirdweb-dev/auth@4.1.94
## 0.14.8
### Patch Changes
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
- @thirdweb-dev/sdk@4.0.95
- @thirdweb-dev/wallets@2.5.35
- @thirdweb-dev/auth@4.1.93
## 0.14.7
### Patch Changes
- Updated dependencies [[`9f42e4d`](https://github.com/thirdweb-dev/js/commit/9f42e4d2412df536d1b5f03a4e2a8b516911facb)]:
- @thirdweb-dev/chains@0.1.118
- @thirdweb-dev/sdk@4.0.94
- @thirdweb-dev/wallets@2.5.34
- @thirdweb-dev/auth@4.1.92
## 0.14.6
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@thirdweb-dev/cli",
"main": "dist/cli/index.js",
"version": "0.14.6",
"version": "0.14.11",
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/cli",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -8,7 +8,7 @@
"@typescript-eslint/parser": "7.9.0",
"eslint-config-next": "14.2.1",
"eslint-config-prettier": "9.1.0",
"eslint-config-turbo": "1.13.2",
"eslint-config-turbo": "2.0.4",
"eslint-plugin-react": "7.34.1"
},
"publishConfig": {
+48
View File
@@ -1,5 +1,53 @@
# @thirdweb-dev/react-core
## 4.9.3
### Patch Changes
- Updated dependencies [[`321cf26`](https://github.com/thirdweb-dev/js/commit/321cf26342d0755204aa465bc2390e052d5ed071)]:
- @thirdweb-dev/chains@0.1.120
- @thirdweb-dev/sdk@4.0.98
- @thirdweb-dev/wallets@2.5.38
- @thirdweb-dev/auth@4.1.96
## 4.9.2
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.97
- @thirdweb-dev/wallets@2.5.37
- @thirdweb-dev/auth@4.1.95
## 4.9.1
### Patch Changes
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
- @thirdweb-dev/chains@0.1.119
- @thirdweb-dev/sdk@4.0.96
- @thirdweb-dev/wallets@2.5.36
- @thirdweb-dev/auth@4.1.94
## 4.9.0
### Patch Changes
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
- @thirdweb-dev/sdk@4.0.95
- @thirdweb-dev/wallets@2.5.35
- @thirdweb-dev/auth@4.1.93
## 4.8.0
### Patch Changes
- Updated dependencies [[`9f42e4d`](https://github.com/thirdweb-dev/js/commit/9f42e4d2412df536d1b5f03a4e2a8b516911facb)]:
- @thirdweb-dev/chains@0.1.118
- @thirdweb-dev/sdk@4.0.94
- @thirdweb-dev/wallets@2.5.34
- @thirdweb-dev/auth@4.1.92
## 4.7.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-core",
"version": "4.7.0",
"version": "4.9.3",
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/react-core",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+56
View File
@@ -1,5 +1,61 @@
# @thirdweb-dev/react
## 4.9.3
### Patch Changes
- Updated dependencies [[`321cf26`](https://github.com/thirdweb-dev/js/commit/321cf26342d0755204aa465bc2390e052d5ed071)]:
- @thirdweb-dev/chains@0.1.120
- @thirdweb-dev/sdk@4.0.98
- @thirdweb-dev/react-core@4.9.3
- @thirdweb-dev/wallets@2.5.38
## 4.9.2
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.97
- @thirdweb-dev/react-core@4.9.2
- @thirdweb-dev/wallets@2.5.37
## 4.9.1
### Patch Changes
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
- @thirdweb-dev/chains@0.1.119
- @thirdweb-dev/sdk@4.0.96
- @thirdweb-dev/react-core@4.9.1
- @thirdweb-dev/wallets@2.5.36
## 4.9.0
### Minor Changes
- [#3315](https://github.com/thirdweb-dev/js/pull/3315) [`eff7107`](https://github.com/thirdweb-dev/js/commit/eff710738ce3d4341257e5912311c95b28a34b5d) Thanks [@MananTank](https://github.com/MananTank)! - Allow configuring WalletConnect `qrcode` and `qrModalOptions` from wallet configurator functions like `metamaskWallet`, `coreWallet`, `zerionWallet` etc
### Patch Changes
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
- @thirdweb-dev/sdk@4.0.95
- @thirdweb-dev/react-core@4.9.0
- @thirdweb-dev/wallets@2.5.35
## 4.8.0
### Minor Changes
- [#3296](https://github.com/thirdweb-dev/js/pull/3296) [`841c86a`](https://github.com/thirdweb-dev/js/commit/841c86aa125c5965f43472e5e6f54267eda65726) Thanks [@gregfromstl](https://github.com/gregfromstl)! - Adds private key export
### Patch Changes
- Updated dependencies [[`9f42e4d`](https://github.com/thirdweb-dev/js/commit/9f42e4d2412df536d1b5f03a4e2a8b516911facb)]:
- @thirdweb-dev/chains@0.1.118
- @thirdweb-dev/sdk@4.0.94
- @thirdweb-dev/react-core@4.8.0
- @thirdweb-dev/wallets@2.5.34
## 4.7.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react",
"version": "4.7.0",
"version": "4.9.3",
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/react",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -79,6 +79,7 @@ import { useChainQuery } from "../hooks/useChainQuery";
import { SwapScreen } from "./screens/Buy/swap/SwapScreen";
import { SwapTransactionsScreen } from "./screens/SwapTransactionsScreen";
import { swapTransactionsStore } from "./screens/Buy/swap/pendingSwapTx";
import { ExportPrivateKey } from "../wallets/embeddedWallet/ExportPrivateKey";
const TW_CONNECTED_WALLET = "tw-connected-wallet";
@@ -89,7 +90,8 @@ type WalletDetailsModalScreen =
| "buy"
| "receive"
| "network-switcher"
| "pending-tx";
| "pending-tx"
| "private-key";
export const ConnectedWalletDetails: React.FC<{
onDisconnect: () => void;
@@ -573,6 +575,23 @@ export const ConnectedWalletDetails: React.FC<{
</div>
)}
{/* Export Embedded Wallet */}
{activeWallet?.walletId === walletIds.embeddedWallet && (
<div>
<MenuButton
onClick={() => {
setScreen("private-key");
}}
style={{
fontSize: fontSize.sm,
}}
>
<PinBottomIcon width={iconSize.md} height={iconSize.md} />
<Text color="primaryText">{"Export Private Key"}</Text>
</MenuButton>
</div>
)}
{props.detailsModalFooter && (
<props.detailsModalFooter close={() => setIsOpen(false)} />
)}
@@ -645,6 +664,16 @@ export const ConnectedWalletDetails: React.FC<{
}}
/>
);
} else if (screen === "private-key") {
content = (
<ExportPrivateKey
theme={props.theme}
walletInstance={activeWallet}
onBack={() => {
setScreen("main");
}}
/>
);
} else if (screen === "send" && walletChainId) {
content = (
<SendFunds
@@ -6,6 +6,7 @@ import type {
import { Coin98Wallet, getInjectedCoin98Provider } from "@thirdweb-dev/wallets";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import { useTWLocale } from "../../../evm/providers/locale-provider";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
const coin98WalletUris = {
ios: "coin98://",
@@ -29,6 +30,22 @@ export type Coin98WalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -78,7 +95,11 @@ export const coin98Wallet = (
const wallet = new Coin98Wallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
return wallet;
@@ -10,6 +10,7 @@ import {
import { handelWCSessionRequest } from "../handleWCSessionRequest";
import { useTWLocale } from "../../../evm/providers/locale-provider";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
const coreWalletUris = {
ios: "core://",
@@ -33,6 +34,22 @@ export type CoreWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -81,7 +98,11 @@ export const coreWallet = (
const wallet = new CoreWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
handelWCSessionRequest(wallet, coreWalletUris);
@@ -10,6 +10,7 @@ import {
import { useTWLocale } from "../../../evm/providers/locale-provider";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import { handelWCSessionRequest } from "../handleWCSessionRequest";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
const cryptoDefiWalletUris = {
ios: "dfw://",
@@ -33,6 +34,22 @@ export type CryptoDefiWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -82,7 +99,11 @@ export const cryptoDefiWallet = (
const wallet = new CryptoDefiWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
handelWCSessionRequest(wallet, cryptoDefiWalletUris);
@@ -0,0 +1,45 @@
import {
Container,
ModalHeader,
} from "../../../components/basic";
import {
WalletInstance,
} from "@thirdweb-dev/react-core";
import { Theme } from "../../../design-system";
export const ExportPrivateKey: React.FC<{
onBack?: () => void;
walletInstance?: WalletInstance;
walletAddress?: string;
theme: "light" | "dark" | Theme;
}> = (props) => {
return (
<Container fullHeight animate="fadein">
<Container p="lg">
<ModalHeader
onBack={props.onBack}
title="Export Private Key"
/>
</Container>
<Container p="md">
<iframe
title="Export In-App Wallet"
style={{
width: "100%",
height: "250px",
}}
allow="clipboard-read; clipboard-write"
src={`https://embedded-wallet.thirdweb.com//sdk/2022-08-12/embedded-wallet/export-private-key?clientId=${
props.walletInstance?.getOptions()?.clientId
}&theme=${
typeof props.theme === "string" ? props.theme : props.theme.type
}`}
/>
</Container>
</Container>
);
};
@@ -6,6 +6,7 @@ import type {
import { ImTokenWallet, assertWindowEthereum } from "@thirdweb-dev/wallets";
import { useTWLocale } from "../../../evm/providers/locale-provider";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
const imTokenWalletUris = {
ios: "imtokenv2://",
@@ -15,6 +16,22 @@ const imTokenWalletUris = {
export type ImTokenWalletConfigOptions = {
projectId?: string;
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
export const imTokenWallet = (
@@ -30,7 +47,11 @@ export const imTokenWallet = (
const wallet = new ImTokenWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
return wallet;
@@ -6,6 +6,7 @@ import {
import { MetamaskConnectUI } from "./MetamaskConnectUI";
import { metamaskUris } from "./metamaskUris";
import { handelWCSessionRequest } from "../handleWCSessionRequest";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
/**
* @wallet
@@ -35,6 +36,22 @@ export type MetamaskWalletConfigOptions = {
* Default is `"walletconnect"`
*/
connectionMethod?: "walletConnect" | "metamaskBrowser";
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -89,7 +106,11 @@ export const metamaskWallet = (
const wallet = new MetaMaskWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
if (connectionMethod === "walletConnect") {
@@ -1,6 +1,7 @@
import type { WalletOptions, WalletConfig } from "@thirdweb-dev/react-core";
import { OKXWallet, getInjectedOKXProvider } from "@thirdweb-dev/wallets";
import { OKXConnectUI } from "./OKXConnectUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
/**
* @wallet
@@ -18,6 +19,22 @@ export type OKXWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -67,7 +84,11 @@ export const okxWallet = (
const wallet = new OKXWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
return wallet;
@@ -6,6 +6,7 @@ import type {
import { OneKeyWallet, getInjectedOneKeyProvider } from "@thirdweb-dev/wallets";
import { useTWLocale } from "../../../evm/providers/locale-provider";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
export const oneKeyWalletUris = {
ios: "onekey-wallet://",
@@ -29,6 +30,22 @@ export type OneKeyWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -78,7 +95,11 @@ export const oneKeyWallet = (
const wallet = new OneKeyWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
return wallet;
@@ -1,6 +1,7 @@
import type { WalletOptions, WalletConfig } from "@thirdweb-dev/react-core";
import { RabbyWallet, getInjectedRabbyProvider } from "@thirdweb-dev/wallets";
import { RabbyConnectUI } from "./RabbyConnectUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
/**
* @wallet
@@ -18,6 +19,22 @@ export type RabbyWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -64,7 +81,11 @@ export const rabbyWallet = (
const wallet = new RabbyWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
return wallet;
@@ -7,6 +7,7 @@ import { TrustWallet, assertWindowEthereum } from "@thirdweb-dev/wallets";
import { handelWCSessionRequest } from "../handleWCSessionRequest";
import { useTWLocale } from "../../../evm/providers/locale-provider";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
const trustWalletUris = {
ios: "trust://",
@@ -30,6 +31,22 @@ export type TrustWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -72,7 +89,11 @@ export const trustWallet = (
const wallet = new TrustWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
handelWCSessionRequest(wallet, trustWalletUris);
@@ -7,6 +7,7 @@ import { ZerionWallet, assertWindowEthereum } from "@thirdweb-dev/wallets";
import { handelWCSessionRequest } from "../handleWCSessionRequest";
import { useTWLocale } from "../../../evm/providers/locale-provider";
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
const zerionWalletUris = {
ios: "zerion://",
@@ -30,6 +31,22 @@ export type ZerionkWalletConfigOptions = {
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
*/
recommended?: boolean;
/**
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
*
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
*
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
*/
wcModal?:
| {
/**
* Configure the style of Wallet Connect Modal.
*/
qrModalOptions?: QRModalOptions;
}
| boolean;
};
/**
@@ -72,7 +89,11 @@ export const zerionWallet = (
const wallet = new ZerionWallet({
...walletOptions,
projectId: options?.projectId,
qrcode: false,
qrcode: options?.wcModal ? true : false,
qrModalOptions:
typeof options?.wcModal === "object"
? options?.wcModal?.qrModalOptions
: undefined,
});
handelWCSessionRequest(wallet, zerionWalletUris);
Binary file not shown.
+40
View File
@@ -1,5 +1,45 @@
# @thirdweb-dev/sdk
## 4.0.98
### Patch Changes
- Updated dependencies [[`2d7ebe2`](https://github.com/thirdweb-dev/js/commit/2d7ebe2111d24448dd85ace25fc9fdbef987a57d), [`7304c5b`](https://github.com/thirdweb-dev/js/commit/7304c5b0c7060080f302160dc9b24b2becc17524), [`a9ce10f`](https://github.com/thirdweb-dev/js/commit/a9ce10f39ad47f386e8086e230679093aab08754), [`321cf26`](https://github.com/thirdweb-dev/js/commit/321cf26342d0755204aa465bc2390e052d5ed071)]:
- thirdweb@5.29.5
- @thirdweb-dev/chains@0.1.120
## 4.0.97
### Patch Changes
- Updated dependencies [[`79e6a04`](https://github.com/thirdweb-dev/js/commit/79e6a047d6ae6cb341fdad22137bd83ad6e611d4)]:
- thirdweb@5.29.4
## 4.0.96
### Patch Changes
- Updated dependencies [[`c94bcd5`](https://github.com/thirdweb-dev/js/commit/c94bcd574aa4eaf2bd76ab8b6379302de4731ed4), [`1c533ef`](https://github.com/thirdweb-dev/js/commit/1c533efcd5fbc8a72fd03c98510fa601ee5f34b5), [`ffaff74`](https://github.com/thirdweb-dev/js/commit/ffaff744f72d2cb22896e7501677b48f76ea857a), [`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447), [`9cf3a1d`](https://github.com/thirdweb-dev/js/commit/9cf3a1d6636fcd56559e889ab2bfe3249d51162a)]:
- thirdweb@5.29.3
- @thirdweb-dev/chains@0.1.119
## 4.0.95
### Patch Changes
- [#2880](https://github.com/thirdweb-dev/js/pull/2880) [`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Modular contract publish and deploy setup
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052), [`fb6a07d`](https://github.com/thirdweb-dev/js/commit/fb6a07d4b84ba8ea6389ca04c73625f670a0d9c4)]:
- thirdweb@5.29.2
## 4.0.94
### Patch Changes
- Updated dependencies [[`b248afc`](https://github.com/thirdweb-dev/js/commit/b248afc16062f8fe0967e42535ae119642897003), [`9f42e4d`](https://github.com/thirdweb-dev/js/commit/9f42e4d2412df536d1b5f03a4e2a8b516911facb), [`132b3cb`](https://github.com/thirdweb-dev/js/commit/132b3cb45ae1d56f8de240a361b31c76d5b9b4a7), [`e7ba698`](https://github.com/thirdweb-dev/js/commit/e7ba698f3e60e0749f8739ad1aec76a8ab2c2fb3)]:
- thirdweb@5.29.1
- @thirdweb-dev/chains@0.1.118
## 4.0.93
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/sdk",
"version": "4.0.93",
"version": "4.0.98",
"description": "The main thirdweb SDK.",
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/sdk",
"license": "Apache-2.0",
@@ -129,7 +129,7 @@
}
},
"dependencies": {
"@eth-optimism/sdk": "3.3.0",
"@eth-optimism/sdk": "3.3.2",
"@thirdweb-dev/chains": "workspace:*",
"@thirdweb-dev/contracts-js": "workspace:*",
"@thirdweb-dev/crypto": "workspace:*",
@@ -0,0 +1,158 @@
import { providers, utils } from "ethers";
import {
coreContractAbi,
extensionContractAbi,
} from "../../constants/thirdweb-features";
import { hasDuplicates } from "../utils";
import { getChainByChainIdAsync, getChainRPC } from "@thirdweb-dev/chains";
type CallbackFunction = {
selector: string;
};
type FallbackFunction = {
selector: string;
permissionBits: string;
};
type SupportedCallbackFunction = {
selector: string;
mode: number;
};
export async function compatibleExtensions(
coreBytecode: string,
extensionBytecodes: string[],
chainId: number,
): Promise<boolean> {
const chain = await getChainByChainIdAsync(chainId);
const rpcUrl = getChainRPC(chain);
const jsonRpcProvider = new providers.JsonRpcProvider(rpcUrl);
const addr = "0x0000000000000000000000000000000000000124"; // arbitrary address
/**
* Here we use state override with eth_call.
*
* This lets us call functions on a non-deployed contract, by using its deployed bytecode
* to override code of an arbitrary address in eth_call.
*
* Encode function calldata, and perform eth_call with bytecode override.
*/
const coreIface = new utils.Interface(coreContractAbi);
const coreCalldata = coreIface.encodeFunctionData(
"getSupportedCallbackFunctions",
[],
);
if (!coreBytecode.startsWith("0x6080604052")) {
const index = coreBytecode.indexOf("6080604052");
coreBytecode = `0x${coreBytecode.substring(index)}`;
} else if (coreBytecode.lastIndexOf("6080604052") > 0) {
const index = coreBytecode.lastIndexOf("6080604052");
coreBytecode = `0x${coreBytecode.substring(index)}`;
}
const core = await jsonRpcProvider.send("eth_call", [
{ to: addr, data: coreCalldata },
"latest",
{ [addr]: { code: coreBytecode } }, // eth_call with bytecode override
]);
const extensionIface = new utils.Interface(extensionContractAbi);
const extensionCalldata = extensionIface.encodeFunctionData(
"getExtensionConfig",
[],
);
const extensions = await Promise.all(
extensionBytecodes.map((b: string) => {
// TODO: Upload deployed bytecode on publish metadata
if (!b.startsWith("0x6080604052")) {
const index = b.indexOf("6080604052");
b = `0x${b.substring(index)}`;
} else if (b.lastIndexOf("6080604052") > 0) {
const index = b.lastIndexOf("6080604052");
b = `0x${b.substring(index)}`;
}
return jsonRpcProvider.send("eth_call", [
{ to: addr, data: extensionCalldata },
"latest",
{ [addr]: { code: b } }, // eth_call with bytecode override
]);
}),
);
const decodedCore = coreIface.decodeFunctionResult(
"getSupportedCallbackFunctions",
core,
);
const coreCallbackSelectors = decodedCore.flat().map(
(c: SupportedCallbackFunction) => c.selector,
);
// extract callback/fallback selectors and required interfaces from extension config
const requiredInterfaces: string[] = [];
const extensionFallbackSelectors: string[] = [];
const extensionCallbackSelectors: string[] = [];
const selectors: string[] = [];
extensions.forEach((e: string) => {
const decodedExtensionConfig = extensionIface.decodeFunctionResult(
"getExtensionConfig",
e,
);
requiredInterfaces.push(...decodedExtensionConfig[0].requiredInterfaces);
const fallbackSelectors =
decodedExtensionConfig[0].fallbackFunctions.map(
(a: FallbackFunction) => a.selector,
);
const callbackSelectors =
decodedExtensionConfig[0].callbackFunctions.map(
(a: CallbackFunction) => a.selector,
);
extensionFallbackSelectors.push(...fallbackSelectors);
extensionCallbackSelectors.push(...callbackSelectors);
});
// check if callback selectors are supported
for(const callback of extensionCallbackSelectors) {
if(!coreCallbackSelectors.includes(callback)) {
return false;
}
}
// check if the core contract supports required interfaces by extensions above
if(requiredInterfaces.length > 0) {
const supportsInterfaceResult = await Promise.all(
requiredInterfaces.map((r) => {
const supportsInterfaceCalldata = coreIface.encodeFunctionData(
"supportsInterface",
[r],
);
return jsonRpcProvider.send("eth_call", [
{ to: addr, data: supportsInterfaceCalldata },
"latest",
{ [addr]: { code: coreBytecode } },
]);
}),
);
const supportsInterfaceDecoded = supportsInterfaceResult.map(r => {
return coreIface.decodeFunctionResult(
"supportsInterface",
r,
);
})
if (supportsInterfaceDecoded.flat().some((element) => element === false)) {
return false;
}
}
// check duplicate callback/fallback signatures
selectors.push(...extensionFallbackSelectors, ...extensionCallbackSelectors);
return !hasDuplicates(
selectors.flat(),
(a: string, b: string): boolean => a === b,
);
}
@@ -1,4 +1,5 @@
import {
coreContractAbi,
getAllExtensionsAbi,
getAllPluginsAbi,
} from "../../constants/thirdweb-features";
@@ -38,6 +39,7 @@ export async function getCompositeABI(
"DynamicContract",
features,
);
const isModular: boolean = isExtensionEnabled(abi, "ModularCore", features);
// check if the contract has fallback function - we'll further check for diamond pattern if needed
const isFallback: boolean = isExtensionEnabled(abi, "Fallback", features);
@@ -59,6 +61,24 @@ export async function getCompositeABI(
// get ABIs of extension contracts --
pluginABIs = await getPluginABI(pluginAddresses, provider, storage);
} else if (isModular) {
const contract = new ContractWrapper(
provider,
address,
coreContractAbi,
options,
storage,
);
const extensions = await contract.call("getInstalledExtensions");
// get extension addresses
const extensionAddresses = extensions.map(
(item: any) => item.implementation,
);
// get ABIs of extension contracts --
pluginABIs = await getPluginABI(extensionAddresses, provider, storage);
} else if (isPluginRouter) {
const contract = new ContractWrapper(
provider,
@@ -30,6 +30,27 @@ export function unique<T>(a: T[], fn: (a: T, b: T) => boolean): T[] {
return a;
}
/**
* @internal
*/
export function hasDuplicates<T>(arr: T[], fn: (a: T, b: T) => boolean): boolean {
if (arr.length === 0 || arr.length === 1) {
return false;
}
if (!fn) {
throw new Error("Comparison function required");
}
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (fn(arr[i], arr[j])) {
return true;
}
}
}
return false;
}
/**
* @internal
*/
@@ -63,6 +63,8 @@ import {
FEATURE_GASLESS,
FEATURE_PACK_VRF,
FEATURE_PLUGIN_ROUTER,
FEATURE_MODULAR_CORE,
FEATURE_MODULAR_EXTENSION,
FEATURE_DIRECT_LISTINGS,
FEATURE_ENGLISH_AUCTIONS,
FEATURE_OFFERS,
@@ -139,6 +141,8 @@ export type Feature =
| typeof FEATURE_GASLESS
| typeof FEATURE_PACK_VRF
| typeof FEATURE_PLUGIN_ROUTER
| typeof FEATURE_MODULAR_CORE
| typeof FEATURE_MODULAR_EXTENSION
| typeof FEATURE_DYNAMIC_CONTRACT
| typeof FEATURE_DIRECT_LISTINGS
| typeof FEATURE_ENGLISH_AUCTIONS
@@ -189,6 +193,8 @@ export const SUPPORTED_FEATURES: Record<string, Feature> = /* @__PURE__ */ {
[FEATURE_PACK_VRF.name]: FEATURE_PACK_VRF,
[FEATURE_PLUGIN_ROUTER.name]: FEATURE_PLUGIN_ROUTER,
[FEATURE_DYNAMIC_CONTRACT.name]: FEATURE_DYNAMIC_CONTRACT,
[FEATURE_MODULAR_CORE.name]: FEATURE_MODULAR_CORE,
[FEATURE_MODULAR_EXTENSION.name]: FEATURE_MODULAR_EXTENSION,
[FEATURE_DIRECT_LISTINGS.name]: FEATURE_DIRECT_LISTINGS,
[FEATURE_ENGLISH_AUCTIONS.name]: FEATURE_ENGLISH_AUCTIONS,
[FEATURE_OFFERS.name]: FEATURE_OFFERS,
@@ -116,6 +116,450 @@ export const getAllExtensionsAbi = [
},
];
export const coreContractAbi = [
{ type: "fallback", stateMutability: "payable" },
{
type: "function",
name: "cancelOwnershipHandover",
inputs: [],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "completeOwnershipHandover",
inputs: [
{ name: "pendingOwner", type: "address", internalType: "address" },
],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "getInstalledExtensions",
inputs: [],
outputs: [
{
name: "_installedExtensions",
type: "tuple[]",
internalType: "struct IModularCore.InstalledExtension[]",
components: [
{
name: "implementation",
type: "address",
internalType: "address",
},
{
name: "config",
type: "tuple",
internalType: "struct IExtensionConfig.ExtensionConfig",
components: [
{
name: "registerInstallationCallback",
type: "bool",
internalType: "bool",
},
{
name: "requiredInterfaces",
type: "bytes4[]",
internalType: "bytes4[]",
},
{
name: "supportedInterfaces",
type: "bytes4[]",
internalType: "bytes4[]",
},
{
name: "callbackFunctions",
type: "tuple[]",
internalType: "struct IExtensionConfig.CallbackFunction[]",
components: [
{
name: "selector",
type: "bytes4",
internalType: "bytes4",
},
],
},
{
name: "fallbackFunctions",
type: "tuple[]",
internalType: "struct IExtensionConfig.FallbackFunction[]",
components: [
{
name: "selector",
type: "bytes4",
internalType: "bytes4",
},
{
name: "permissionBits",
type: "uint256",
internalType: "uint256",
},
],
},
],
},
],
},
],
stateMutability: "view",
},
{
type: "function",
name: "getSupportedCallbackFunctions",
inputs: [],
outputs: [
{
name: "",
type: "tuple[]",
internalType: "struct IModularCore.SupportedCallbackFunction[]",
components: [
{ name: "selector", type: "bytes4", internalType: "bytes4" },
{
name: "mode",
type: "uint8",
internalType: "enum IModularCore.CallbackMode",
},
],
},
],
stateMutability: "pure",
},
{
type: "function",
name: "grantRoles",
inputs: [
{ name: "user", type: "address", internalType: "address" },
{ name: "roles", type: "uint256", internalType: "uint256" },
],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "hasAllRoles",
inputs: [
{ name: "user", type: "address", internalType: "address" },
{ name: "roles", type: "uint256", internalType: "uint256" },
],
outputs: [{ name: "", type: "bool", internalType: "bool" }],
stateMutability: "view",
},
{
type: "function",
name: "hasAnyRole",
inputs: [
{ name: "user", type: "address", internalType: "address" },
{ name: "roles", type: "uint256", internalType: "uint256" },
],
outputs: [{ name: "", type: "bool", internalType: "bool" }],
stateMutability: "view",
},
{
type: "function",
name: "installExtension",
inputs: [
{ name: "_extension", type: "address", internalType: "address" },
{ name: "_data", type: "bytes", internalType: "bytes" },
],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "owner",
inputs: [],
outputs: [{ name: "result", type: "address", internalType: "address" }],
stateMutability: "view",
},
{
type: "function",
name: "ownershipHandoverExpiresAt",
inputs: [
{ name: "pendingOwner", type: "address", internalType: "address" },
],
outputs: [{ name: "result", type: "uint256", internalType: "uint256" }],
stateMutability: "view",
},
{
type: "function",
name: "renounceOwnership",
inputs: [],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "renounceRoles",
inputs: [{ name: "roles", type: "uint256", internalType: "uint256" }],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "requestOwnershipHandover",
inputs: [],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "revokeRoles",
inputs: [
{ name: "user", type: "address", internalType: "address" },
{ name: "roles", type: "uint256", internalType: "uint256" },
],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "rolesOf",
inputs: [{ name: "user", type: "address", internalType: "address" }],
outputs: [{ name: "roles", type: "uint256", internalType: "uint256" }],
stateMutability: "view",
},
{
type: "function",
name: "supportsInterface",
inputs: [{ name: "interfaceId", type: "bytes4", internalType: "bytes4" }],
outputs: [{ name: "", type: "bool", internalType: "bool" }],
stateMutability: "view",
},
{
type: "function",
name: "transferOwnership",
inputs: [{ name: "newOwner", type: "address", internalType: "address" }],
outputs: [],
stateMutability: "payable",
},
{
type: "function",
name: "uninstallExtension",
inputs: [
{ name: "_extension", type: "address", internalType: "address" },
{ name: "_data", type: "bytes", internalType: "bytes" },
],
outputs: [],
stateMutability: "payable",
},
{
type: "event",
name: "ExtensionInstalled",
inputs: [
{
name: "caller",
type: "address",
indexed: false,
internalType: "address",
},
{
name: "implementation",
type: "address",
indexed: false,
internalType: "address",
},
{
name: "installedExtension",
type: "address",
indexed: false,
internalType: "address",
},
],
anonymous: false,
},
{
type: "event",
name: "ExtensionUninstalled",
inputs: [
{
name: "caller",
type: "address",
indexed: false,
internalType: "address",
},
{
name: "implementation",
type: "address",
indexed: false,
internalType: "address",
},
{
name: "installedExtension",
type: "address",
indexed: false,
internalType: "address",
},
],
anonymous: false,
},
{
type: "event",
name: "OwnershipHandoverCanceled",
inputs: [
{
name: "pendingOwner",
type: "address",
indexed: true,
internalType: "address",
},
],
anonymous: false,
},
{
type: "event",
name: "OwnershipHandoverRequested",
inputs: [
{
name: "pendingOwner",
type: "address",
indexed: true,
internalType: "address",
},
],
anonymous: false,
},
{
type: "event",
name: "OwnershipTransferred",
inputs: [
{
name: "oldOwner",
type: "address",
indexed: true,
internalType: "address",
},
{
name: "newOwner",
type: "address",
indexed: true,
internalType: "address",
},
],
anonymous: false,
},
{
type: "event",
name: "RolesUpdated",
inputs: [
{
name: "user",
type: "address",
indexed: true,
internalType: "address",
},
{
name: "roles",
type: "uint256",
indexed: true,
internalType: "uint256",
},
],
anonymous: false,
},
{ type: "error", name: "AlreadyInitialized", inputs: [] },
{ type: "error", name: "CallbackExecutionReverted", inputs: [] },
{
type: "error",
name: "CallbackFunctionAlreadyInstalled",
inputs: [],
},
{ type: "error", name: "CallbackFunctionNotSupported", inputs: [] },
{ type: "error", name: "CallbackFunctionRequired", inputs: [] },
{
type: "error",
name: "CallbackFunctionUnauthorizedCall",
inputs: [],
},
{ type: "error", name: "ExtensionAlreadyInstalled", inputs: [] },
{
type: "error",
name: "ExtensionInterfaceNotCompatible",
inputs: [
{
name: "requiredInterfaceId",
type: "bytes4",
internalType: "bytes4",
},
],
},
{ type: "error", name: "ExtensionNotInstalled", inputs: [] },
{ type: "error", name: "ExtensionOutOfSync", inputs: [] },
{
type: "error",
name: "FallbackFunctionAlreadyInstalled",
inputs: [],
},
{ type: "error", name: "FallbackFunctionNotInstalled", inputs: [] },
{ type: "error", name: "IndexOutOfBounds", inputs: [] },
{ type: "error", name: "NewOwnerIsZeroAddress", inputs: [] },
{ type: "error", name: "NoHandoverRequest", inputs: [] },
{ type: "error", name: "Unauthorized", inputs: [] },
];
export const extensionContractAbi = [
{
type: "function",
name: "getExtensionConfig",
inputs: [],
outputs: [
{
name: "",
type: "tuple",
internalType: "struct IExtensionConfig.ExtensionConfig",
components: [
{
name: "registerInstallationCallback",
type: "bool",
internalType: "bool",
},
{
name: "requiredInterfaces",
type: "bytes4[]",
internalType: "bytes4[]",
},
{
name: "supportedInterfaces",
type: "bytes4[]",
internalType: "bytes4[]",
},
{
name: "callbackFunctions",
type: "tuple[]",
internalType: "struct IExtensionConfig.CallbackFunction[]",
components: [
{
name: "selector",
type: "bytes4",
internalType: "bytes4",
},
],
},
{
name: "fallbackFunctions",
type: "tuple[]",
internalType: "struct IExtensionConfig.FallbackFunction[]",
components: [
{
name: "selector",
type: "bytes4",
internalType: "bytes4",
},
{
name: "permissionBits",
type: "uint256",
internalType: "uint256",
},
],
},
],
},
],
stateMutability: "pure",
},
];
export const FEATURE_ROYALTY = {
name: "Royalty",
namespace: "royalty",
@@ -255,6 +699,30 @@ export const FEATURE_DYNAMIC_CONTRACT = {
features: {},
} as const;
export const FEATURE_MODULAR_CORE = {
name: "ModularCore",
namespace: "modular.core",
docLinks: {
sdk: "",
//TODO
contracts: "",
},
abis: [coreContractAbi],
features: {},
} as const;
export const FEATURE_MODULAR_EXTENSION = {
name: "ModularExtension",
namespace: "modular.extension",
docLinks: {
sdk: "",
//TODO
contracts: "",
},
abis: [extensionContractAbi],
features: {},
} as const;
export const FEATURE_DIRECT_LISTINGS = {
name: "DirectListings",
namespace: "direct.listings",
@@ -406,11 +406,18 @@ export class ContractPublisher extends RPCConnectionHandler {
"DynamicContract",
features,
);
const isModular = isFeatureEnabled(
compilerMetadata.abi,
"ModularCore",
features,
);
extraMetadataCleaned.routerType = isPlugin
? "plugin"
: isDynamic
? "dynamic"
: "none";
: isModular
? "modular"
: "none";
// For a dynamic contract Router, try to fetch plugin/extension metadata
if (isDynamic || isPlugin) {
@@ -78,7 +78,7 @@ export class ContractRoles<TContract extends IPermissions, TRole extends Role>
/**
* Get all members of a specific role
* @remarks See {@link ContractRoles.getAll} to get get a list of addresses for all supported roles on the contract.
* @param role - The Role to to get a memberlist for.
* @param role - The Role to get a memberlist for.
* @returns The list of addresses that are members of the specific role.
* @throws If you are requesting a role that does not exist on the contract this will throw an error.
*
+1 -1
View File
@@ -9,7 +9,7 @@ import type {
} from "ethers";
import { ChainInfo } from "../schema/shared/ChainInfo";
// --- utility types extracted from from ts-toolbelt --- //
// --- utility types extracted from ts-toolbelt --- //
// if
type TBoolean = 0 | 1;
+1
View File
@@ -102,6 +102,7 @@ export * from "./common/feature-detection/detectContractFeature";
export * from "./common/feature-detection/hasFunction";
export * from "./common/plugin/joinABIs";
export * from "./common/plugin/getCompositePluginABI";
export * from "./common/modular/compatibleExtensions";
export * from "./common/version-checker";
export * from "./common/fetchSourceFilesFromMetadata";
export { isNativeToken } from "./common/currency/isNativeToken";
@@ -166,6 +166,14 @@ export const CustomFactoryInput = /* @__PURE__ */ (() =>
customFactoryAddresses: ChainIdToAddressSchema,
}))();
/**
* @internal
*/
export const ModularFactoryInput = /* @__PURE__ */ (() =>
z.object({
hooksParamName: z.string(),
}))();
/**
* @internal
*/
@@ -174,6 +182,7 @@ export const FactoryDeploymentSchema = /* @__PURE__ */ (() =>
implementationAddresses: ChainIdToAddressSchema,
implementationInitializerFunction: z.string().default("initialize"),
customFactoryInput: CustomFactoryInput.optional(),
modularFactoryInput: ModularFactoryInput.optional(),
factoryAddresses: ChainIdToAddressSchema.optional(),
}))();
@@ -191,7 +200,12 @@ export const DeployTypeInput = /* @__PURE__ */ (() =>
* @internal
*/
export const RouterTypeInput = /* @__PURE__ */ (() =>
z.union([z.literal("none"), z.literal("plugin"), z.literal("dynamic")]))();
z.union([
z.literal("none"),
z.literal("plugin"),
z.literal("dynamic"),
z.literal("modular"),
]))();
/**
* @internal
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

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