Compare commits

...
Author SHA1 Message Date
8c521aa06a [SDK] fix: ignore EIP-1193 code 1013 transient disconnect in injected… (#8807)
Co-authored-by: Cursor <[email protected]>
Co-authored-by: 0xFirekeeper <[email protected]>
2026-06-15 22:24:42 +07:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
8ab8e07fb1 Version Packages (#8802)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-10 18:28:54 +07:00
FirekeeperandGitHub 49194e3a2a Fix Arc Testnet native currency decimals (#8801) 2026-06-10 18:22:49 +07:00
FirekeeperandGitHub 50420fc119 Add CSV export progress for user wallets (#8791) 2026-06-05 19:28:47 +07:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
a82e63319a Version Packages (#8765)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-12 05:21:51 +07:00
FirekeeperandGitHub 23d74a0a54 Add Rampnow as a fiat onramp provider (#8764) 2026-05-12 04:54:07 +07:00
FirekeeperandGitHub eb07340118 Dedicated channel for Pro plan (#8751) 2026-04-22 00:39:29 +07:00
FirekeeperandGitHub dc07145543 Handle managed vault rotation and redirect (#8747) 2026-04-21 02:28:20 +07:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
901789983f Version Packages (#8734)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-06 23:21:42 +07:00
FirekeeperandGitHub ad49560331 ENS: add coinType param to reverse resolver (#8735) 2026-04-06 23:10:59 +07:00
83198b2ea4 [SDK] Update ENS Universal Resolver address for ENSv2 (#8733)
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Co-authored-by: 0xFirekeeper <[email protected]>
2026-04-06 22:07:53 +07:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
a138681b6c Version Packages (#8727)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-26 19:00:03 +07:00
FirekeeperandGitHub 3a18c6e6a8 [CLI] fix stylus abi exports (#8726) 2026-03-26 18:58:18 +07:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
fdd8c17813 Version Packages (#8725)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-26 15:04:30 +07:00
FirekeeperandGitHub 32c2ff62f8 [CLI] create-stylus fixes (#8724) 2026-03-26 14:59:53 +07:00
dependabot[bot]andJonas Daniels bef65c8b69 build(deps): Bump github/codeql-action from 3.29.0 to 4.34.1
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.0 to 4.34.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/ce28f5bb42b7a9f2c824e633a3f6ee835bab6858...38697555549f1db7851b81482ff19f1fa5c4fedc)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.34.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-23 14:06:34 -07:00
dependabot[bot]andJonas Daniels 7afc2055b9 build(deps): Bump codecov/codecov-action from 5.4.3 to 5.5.3
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.4.3 to 5.5.3.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/18283e04ce6e62d37312384ff67231eb8fd56d24...1af58845a975a7985b0beb0cbe6fbbb71a41dbad)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 5.5.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-23 14:06:17 -07:00
nischitpra 8e9c51ee7b send server wallet txn for native transfer fix (#8701)
<!-- start pr-codex -->

## PR-Codex overview
This PR focuses on normalizing the token address in the `SendProjectWalletModalContent` function to ensure consistency when interacting with the contract. It simplifies the handling of the native token address and adjusts how data is passed to the mutation.

### Detailed summary
- Added `normalizedTokenAddress` to handle token address normalization.
- Adjusted the condition to check `normalizedTokenAddress` instead of `values.tokenAddress`.
- Updated the contract call to use `normalizedTokenAddress`.
- Modified the mutation to include `normalizedTokenAddress` only if it exists.
- Changed the mutation call from `void sendMutation.mutateAsync(values)` to `sendMutation.mutate(values)`.

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

<!-- end pr-codex -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **Bug Fixes**
  * Improved native token handling in the project wallet so native tokens are correctly recognized for balance display and transfers.
  * More reliable token decimal detection to ensure accurate balance reads.
  * Fixed send flow to reduce submission issues and make fund transfers more dependable.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-06 23:16:05 +00:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
01a20cb7d5 Version Packages (#8699)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-06 02:31:37 +07:00
FirekeeperandGitHub e13b9a784a [CLI] Deprecate create (#8700) 2026-03-06 02:27:51 +07:00
da4a4a540a Wallet details export screen (#8698)
Co-authored-by: Cursor Agent <[email protected]>
Co-authored-by: Yash <[email protected]>
2026-03-06 01:40:34 +07:00
5e5c82fb2e Sei chain description (#8651)
Co-authored-by: Cursor Agent <[email protected]>
Co-authored-by: yashjoisar <[email protected]>
2026-03-05 21:40:45 +07:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1d28988253 Version Packages (#8687)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-24 22:39:15 +13:00
5352152835 Connect modal approval changeset (#8686)
Co-authored-by: Cursor Agent <[email protected]>
Co-authored-by: Yash <[email protected]>
2026-02-24 22:36:53 +13:00
decbbb8f7a Connect modal require approval (#8683)
Co-authored-by: Cursor Agent <[email protected]>
Co-authored-by: Yash <[email protected]>
2026-02-24 22:01:29 +13:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
ecd5ae1feb Version Packages (#8672)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-13 23:39:01 +07:00
FirekeeperandGitHub 1caf6dd460 changeset / fmt (#8671) 2026-02-13 23:34:21 +07:00
19204e4654 [SDK] Fix Safe wallet WalletConnect connection on Berachain (#8670)
Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-02-13 23:24:37 +07:00
Manan TankandGitHub 674c8d5e6c portal: Fix sidebar spacing on top (#8666) 2026-02-11 17:09:29 +13:00
1eb0cd9314 Feat/partner logo branding (#8668)
Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-02-10 14:52:06 -08:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
b7dfde2d68 Version Packages (#8665)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-04 19:54:15 -08:00
Joaquim VergesandGitHub b50e304e0c changeset (#8664) 2026-02-04 17:56:41 -08:00
9baa251bb1 [SDK] Fix SiteLink and SiteEmbed stripping URL hash fragments (#8663)
Co-authored-by: Claude Opus 4.5 <[email protected]>
2026-02-04 17:55:11 -08:00
Manan TankandGitHub 7f36303b0b portal: OpenApiEndpoint card UI tweaks (#8661) 2026-02-04 17:50:30 -08:00
Manan TankandGitHub 13a46b7ff6 portal: Update SDK Reference breadcrumbs UI (#8662) 2026-02-04 17:50:07 -08:00
Manan TankandGitHub b9d93e44ca portal: landing page ui improvements (#8647) 2026-01-30 12:09:55 -08:00
Joaquim VergesGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
fc9e81f99a Version Packages (#8644)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-01-20 16:27:12 -08:00
281759f06a Add base account sdk (#8634)
Co-authored-by: Joaquim Verges <[email protected]>
2026-01-20 16:04:13 -08:00
Joaquim VergesandGitHub 2d98fe2799 Support linking accounts with redirect mode (#8643) 2026-01-20 14:40:33 -08:00
247 changed files with 8617 additions and 4380 deletions
@@ -0,0 +1,7 @@
---
"thirdweb": patch
---
Fix: injected wallets (e.g. MetaMask) no longer fire a spurious `"disconnect"` event for transient EIP-1193 error code 1013 ("disconnected, will reconnect"). Previously, MetaMask's temporary disconnect during chain changes or RPC hiccups would trigger the thirdweb `disconnect` subscriber and tear down wallet state, causing unexpected logouts. The `onDisconnect` handler now ignores code-1013 errors and lets MetaMask reconnect automatically.
Additionally, the `WalletEmitterEvents["disconnect"]` type is updated from `never` to `WalletDisconnectError | undefined`, so `disconnect` subscribers can inspect the underlying EIP-1193 error code and message when they need to distinguish disconnect causes.
+1 -1
View File
@@ -89,7 +89,7 @@ jobs:
- run: pnpm test
- name: Code Coverage
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
uses: codecov/codecov-action@1af58845a975a7985b0beb0cbe6fbbb71a41dbad # v5.5.3
with:
directory: packages/
flags: packages
+3 -3
View File
@@ -46,7 +46,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
uses: github/codeql-action/init@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -59,7 +59,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
uses: github/codeql-action/autobuild@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -72,4 +72,4 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
uses: github/codeql-action/analyze@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
@@ -105,6 +105,7 @@ type PartnerPermission = "PROMPT_USER_V1" | "FULL_CONTROL_V1";
export type Partner = {
id: string;
name: string;
imageUrl?: string;
allowlistedDomains: string[];
allowlistedBundleIds: string[];
permissions: [PartnerPermission];
@@ -104,6 +104,10 @@ export function UserWalletsTable(
completed: 0,
total: 0,
});
const [csvExportProgress, setCsvExportProgress] = useState<{
fetchedWallets: number;
totalWallets?: number;
}>();
const walletsQuery = useEmbeddedWallets({
authToken: props.authToken,
@@ -113,10 +117,18 @@ export function UserWalletsTable(
page: activePage,
});
const wallets = walletsQuery?.data?.users || [];
const { mutateAsync: getAllEmbeddedWallets, isPending: isLoadingAllWallets } =
useAllEmbeddedWallets({
authToken: props.authToken,
});
const {
mutateAsync: getAllEmbeddedWalletsForBalances,
isPending: isLoadingWalletsForBalances,
} = useAllEmbeddedWallets({
authToken: props.authToken,
});
const {
mutateAsync: getAllEmbeddedWalletsForCsv,
isPending: isLoadingWalletsForCsv,
} = useAllEmbeddedWallets({
authToken: props.authToken,
});
const fetchPortfoliosMutation = useFetchAllPortfolios();
@@ -125,7 +137,7 @@ export function UserWalletsTable(
try {
// First get all wallets
const allWallets = await getAllEmbeddedWallets({
const allWallets = await getAllEmbeddedWalletsForBalances({
clientId: props.projectClientId,
ecosystemSlug: props.ecosystemSlug,
teamId: props.teamId,
@@ -161,7 +173,7 @@ export function UserWalletsTable(
}
}, [
selectedChains,
getAllEmbeddedWallets,
getAllEmbeddedWalletsForBalances,
props.projectClientId,
props.ecosystemSlug,
props.teamId,
@@ -170,7 +182,32 @@ export function UserWalletsTable(
]);
const isFetchingBalances =
isLoadingAllWallets || fetchPortfoliosMutation.isPending;
isLoadingWalletsForBalances || fetchPortfoliosMutation.isPending;
const csvExportLabel = useMemo(() => {
if (!isLoadingWalletsForCsv) {
return "Download as .csv";
}
const fetchedWallets = csvExportProgress?.fetchedWallets ?? 0;
const totalWallets = csvExportProgress?.totalWallets;
if (fetchedWallets === 0) {
return "Preparing export...";
}
if (totalWallets && totalWallets > 0) {
const cappedFetchedWallets = Math.min(fetchedWallets, totalWallets);
const percentage = Math.min(
100,
Math.round((cappedFetchedWallets / totalWallets) * 100),
);
return `Exporting ${percentage}% (${cappedFetchedWallets.toLocaleString()}/${totalWallets.toLocaleString()})`;
}
return `Exporting ${fetchedWallets.toLocaleString()} users...`;
}, [csvExportProgress, isLoadingWalletsForCsv]);
const aggregatedStats = useMemo(() => {
let fundedWallets = 0;
@@ -414,41 +451,48 @@ export function UserWalletsTable(
};
const downloadCSV = useCallback(async () => {
if (wallets.length === 0 || !getAllEmbeddedWallets) {
if (wallets.length === 0) {
return;
}
const usersWallets = await getAllEmbeddedWallets({
clientId: props.projectClientId,
ecosystemSlug: props.ecosystemSlug,
teamId: props.teamId,
});
const csv = Papa.unparse(
usersWallets.map((row) => {
const email = getPrimaryEmail(row.linkedAccounts);
setCsvExportProgress({ fetchedWallets: 0 });
return {
address: row.wallets[0]?.address || "Uninitialized",
created: row.wallets[0]?.createdAt
? new Date(row.wallets[0].createdAt).toISOString()
: "Wallet not created yet",
email: email || "N/A",
login_methods: row.linkedAccounts.map((acc) => acc.type).join(", "),
auth_identifier: getAuthIdentifier(row.linkedAccounts) || "N/A",
user_identifier: row.id || "N/A",
};
}),
);
const csvUrl = URL.createObjectURL(
new Blob([csv], { type: "text/csv;charset=utf-8;" }),
);
const tempLink = document.createElement("a");
tempLink.href = csvUrl;
tempLink.setAttribute("download", "download.csv");
tempLink.click();
try {
const usersWallets = await getAllEmbeddedWalletsForCsv({
clientId: props.projectClientId,
ecosystemSlug: props.ecosystemSlug,
teamId: props.teamId,
onProgress: setCsvExportProgress,
});
const csv = Papa.unparse(
usersWallets.map((row) => {
const email = getPrimaryEmail(row.linkedAccounts);
return {
address: row.wallets[0]?.address || "Uninitialized",
created: row.wallets[0]?.createdAt
? new Date(row.wallets[0].createdAt).toISOString()
: "Wallet not created yet",
email: email || "N/A",
login_methods: row.linkedAccounts.map((acc) => acc.type).join(", "),
auth_identifier: getAuthIdentifier(row.linkedAccounts) || "N/A",
user_identifier: row.id || "N/A",
};
}),
);
const csvUrl = URL.createObjectURL(
new Blob([csv], { type: "text/csv;charset=utf-8;" }),
);
const tempLink = document.createElement("a");
tempLink.href = csvUrl;
tempLink.setAttribute("download", "download.csv");
tempLink.click();
} finally {
setCsvExportProgress(undefined);
}
}, [
wallets,
props.projectClientId,
getAllEmbeddedWallets,
getAllEmbeddedWalletsForCsv,
props.teamId,
props.ecosystemSlug,
]);
@@ -481,12 +525,12 @@ export function UserWalletsTable(
</div>
<Button
className="gap-2 bg-background rounded-full"
disabled={wallets.length === 0 || isLoadingAllWallets}
disabled={wallets.length === 0 || isLoadingWalletsForCsv}
onClick={downloadCSV}
variant="outline"
>
{isLoadingAllWallets && <Spinner className="size-4" />}
Download as .csv
{isLoadingWalletsForCsv && <Spinner className="size-4" />}
{csvExportLabel}
</Button>
</div>
</div>
+32 -14
View File
@@ -2,7 +2,6 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useActiveAccount } from "thirdweb/react";
import { apiServerProxy } from "@/actions/proxies";
import type { Project } from "@/api/project/projects";
import { rotateVaultAccountAndAccessToken } from "../../app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/vault.client";
import { accountKeys, authorizedWallets } from "../query-keys/cache-keys";
// FIXME: We keep repeating types, API server should provide them
@@ -316,6 +315,20 @@ export type RotateSecretKeyAPIReturnType = {
};
};
export const MANAGED_VAULT_BLOCKS_ROTATION_CODE =
"MANAGED_VAULT_BLOCKS_ROTATION";
export class RotateSecretKeyError extends Error {
code: string | undefined;
status: number;
constructor(message: string, status: number, code?: string) {
super(message);
this.name = "RotateSecretKeyError";
this.status = status;
this.code = code;
}
}
export async function rotateSecretKeyClient(params: { project: Project }) {
const res = await apiServerProxy<RotateSecretKeyAPIReturnType>({
body: JSON.stringify({}),
@@ -327,19 +340,24 @@ export async function rotateSecretKeyClient(params: { project: Project }) {
});
if (!res.ok) {
throw new Error(res.error);
}
// if the project has an encrypted vault admin key, rotate it as well
const service = params.project.services.find(
(service) => service.name === "engineCloud",
);
if (service?.encryptedAdminKey) {
await rotateVaultAccountAndAccessToken({
project: params.project,
projectSecretKey: res.data.data.secret,
projectSecretHash: res.data.data.secretHash,
});
// The error body is a JSON-serialized `{ error: { code, message, ... } }`
// payload from the api-server. Try to extract the structured code so the
// UI can react (e.g. redirect users with a managed vault to the vault
// configuration page so they can eject first).
let code: string | undefined;
let message = res.error;
try {
const parsed = JSON.parse(res.error) as {
error?: { code?: string; message?: string };
};
code = parsed.error?.code;
if (parsed.error?.message) {
message = parsed.error.message;
}
} catch {
// not JSON, fall through with raw text
}
throw new RotateSecretKeyError(message, res.status, code);
}
return res.data;
@@ -68,6 +68,7 @@ const fetchAccountList = ({
return {
users: response.data.result.wallets.map(transformToWalletUser),
hasMore: response.data.result.pagination.hasMore ?? false,
totalCount: response.data.result.pagination.totalCount,
};
} catch (error) {
console.error("Failed to fetch wallets:", error);
@@ -170,10 +171,15 @@ export function useAllEmbeddedWallets(params: { authToken: string }) {
clientId,
ecosystemSlug,
teamId,
onProgress,
}: {
clientId?: string;
ecosystemSlug?: string;
teamId: string;
onProgress?: (progress: {
fetchedWallets: number;
totalWallets?: number;
}) => void;
}) => {
const responses: WalletUser[] = [];
let page = 1;
@@ -185,6 +191,7 @@ export function useAllEmbeddedWallets(params: { authToken: string }) {
const res = await queryClient.fetchQuery<{
users: WalletUser[];
hasMore: boolean;
totalCount?: number;
}>({
queryFn: fetchAccountList({
clientId,
@@ -204,6 +211,10 @@ export function useAllEmbeddedWallets(params: { authToken: string }) {
});
responses.push(...res.users);
onProgress?.({
fetchedWallets: responses.length,
totalWallets: res.totalCount,
});
consecutiveFailures = 0; // Reset on success
if (!res.hasMore) {
+17 -18
View File
@@ -19,25 +19,30 @@ export const TEAM_PLANS: Record<
}
> = {
growth: {
description: "Ideal for teams building production-grade apps.",
description: "Ideal for small scale teams and startups.",
features: [
"Email Support",
"48hr Guaranteed Response",
"Custom User Wallet Auth",
"Custom In-App Wallet Auth",
"Web, Mobile & Gaming SDKs",
"Server Wallets",
"Contract & Wallet APIs",
"Account Abstraction",
"Managed Infrastructure (RPC, IPFS, etc.)",
"Audited smart contracts",
],
price: 99,
subTitle: "Everything in Starter, plus:",
subTitle: null,
title: "Growth",
trialPeriodDays: 0,
},
pro: {
description: "For large organizations with custom needs.",
description: "For large orgs with custom needs.",
features: [
"Dedicated Account Executive",
"Slack & Telegram Support",
"12hr Guaranteed Response",
"No Rate Limits",
["Custom Infrastructure Add-Ons", "Infrastructure for custom chains."],
["Volume Discounts", "Negotiated volume discounts that fit your scale."],
"Custom Infrastructure Add-Ons",
"Negotiated Volume Discounts",
],
isStartingPriceOnly: true,
price: 1499,
@@ -46,20 +51,14 @@ export const TEAM_PLANS: Record<
trialPeriodDays: 0,
},
scale: {
description: "For funded startups and mid-size businesses.",
description: "Ideal for mid-size businesses.",
features: [
"Slack & Telegram Support",
"Email Support",
"24hr Guaranteed Response",
"Remove thirdweb branding",
"Audit Logs",
[
"Ecosystem Wallet Add-On",
"Unlocks the ability to deploy your own ecosystem wallets.",
],
[
"Dedicated Infrastructure Add-Ons",
"Dedicated RPC nodes, indexers, etc.",
],
"Ecosystem Wallet Add-On",
"Dedicated Infrastructure Add-Ons (RPC, Insight)",
],
price: 499,
subTitle: "Everything in Growth, plus:",
@@ -285,6 +285,11 @@ const chainMetaRecord = {
"Lisk is focused on serving builders in high-growth markets like Africa and Southeast Asia. When you build on Lisk, you become part of the strongest Ethereum collective, alongside Coinbase, Sony, World, Kraken and Uniswap -- the OP Superchain.",
headerImgUrl: liskBanner.src,
},
//Sei Mainnet
1329: {
about:
"Sei is a blockchain designed for fast, cheap financial transactions, combining the network effects of Ethereum with the performance of Solana. Sei has processed more than four billion transactions across more than 80 million wallets and has become the #1 EVM chain by number of active users. The team is backed by top investors such as Multicoin, Jump, Coinbase Ventures, and Circle Ventures – and includes talent from companies like Robinhood, Google, Coinbase, Databricks, Uber, and Goldman Sachs.",
},
//Reactive Mainnet
1597: {
about:
@@ -177,10 +177,7 @@ export function PlanInfoCardUI(props: {
<div className="flex flex-col items-center py-8 text-center max-sm:gap-4">
<CircleAlertIcon className="mb-3 text-muted-foreground lg:size-6" />
<p>Your plan includes a fixed amount of free usage.</p>
<p>
To unlock additional usage, upgrade your plan to Starter or
Growth.
</p>
<p>To unlock additional usage, upgrade your plan to Growth.</p>
<div className="mt-4">
<ToolTipLabel
@@ -69,7 +69,6 @@ export const BillingPricing: React.FC<BillingPricingProps> = ({
validTeamPlan === "starter" ||
validTeamPlan === "growth_legacy"));
const highlightStarterPlan = highlightPlan === "starter";
const highlightScalePlan =
highlightPlan === "scale" ||
(!highlightPlan &&
@@ -94,23 +93,7 @@ export const BillingPricing: React.FC<BillingPricingProps> = ({
<div className="h-5" />
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
{/* Starter */}
<PricingCard
billingPlan="starter"
billingStatus={team.billingStatus}
cta={getPlanCta(
validTeamPlan,
"starter",
isCurrentPlanScheduledToCancel,
)}
current={validTeamPlan === "starter"}
getTeam={getTeam}
highlighted={highlightStarterPlan}
teamId={team.id}
teamSlug={team.slug}
/>
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3">
{/* Growth */}
<PricingCard
activeTrialEndsAt={
@@ -3,6 +3,7 @@ import { useParams } from "next/navigation";
import { toast } from "sonner";
import type { ThirdwebClient } from "thirdweb";
import type { Ecosystem, Partner } from "@/api/team/ecosystems";
import { useDashboardStorageUpload } from "@/hooks/useDashboardStorageUpload";
import { useDashboardRouter } from "@/lib/DashboardRouter";
import { useAddPartner } from "../../hooks/use-add-partner";
import { PartnerForm, type PartnerFormValues } from "./partner-form.client";
@@ -23,6 +24,8 @@ export function AddPartnerForm({
const teamSlug = params.team_slug as string;
const ecosystemSlug = params.slug as string;
const storageUpload = useDashboardStorageUpload({ client });
const { mutateAsync: addPartner, isPending } = useAddPartner(
{
authToken,
@@ -48,10 +51,23 @@ export function AddPartnerForm({
},
);
const handleSubmit = (
const isUploading = storageUpload.isPending;
const handleSubmit = async (
values: PartnerFormValues,
finalAccessControl: Partner["accessControl"] | null,
) => {
let imageUrl: string | undefined;
if (values.logo) {
try {
const [uri] = await storageUpload.mutateAsync([values.logo]);
imageUrl = uri;
} catch {
toast.error("Failed to upload logo");
return;
}
}
addPartner({
accessControl: finalAccessControl,
allowlistedBundleIds: values.bundleIds
@@ -61,6 +77,7 @@ export function AddPartnerForm({
.split(/,| /)
.filter((d) => d.length > 0),
ecosystem,
imageUrl,
name: values.name,
});
};
@@ -68,7 +85,7 @@ export function AddPartnerForm({
return (
<PartnerForm
client={client}
isSubmitting={isPending}
isSubmitting={isPending || isUploading}
onSubmit={handleSubmit}
submitLabel="Add"
/>
@@ -1,12 +1,13 @@
"use client";
import { zodResolver } from "@hookform/resolvers/zod";
import { PlusIcon, Trash2Icon } from "lucide-react";
import { useId } from "react";
import { PencilIcon, PlusIcon, Trash2Icon, XIcon } from "lucide-react";
import { useId, useRef } from "react";
import { useFieldArray, useForm } from "react-hook-form";
import type { ThirdwebClient } from "thirdweb";
import type { z } from "zod";
import type { Partner } from "@/api/team/ecosystems";
import { Img } from "@/components/blocks/Img";
import { Button } from "@/components/ui/button";
import {
Form,
@@ -17,11 +18,13 @@ import {
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { ImageUpload } from "@/components/ui/image-upload";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Spinner } from "@/components/ui/Spinner";
import { Switch } from "@/components/ui/switch";
import { cn } from "@/lib/utils";
import { resolveSchemeWithErrorHandler } from "@/utils/resolveSchemeWithErrorHandler";
import { partnerFormSchema } from "../../constants";
import { AllowedOperationsSection } from "./allowed-operations-section";
@@ -118,6 +121,7 @@ export function PartnerForm({
const accessControlId = useId();
const serverVerifierId = useId();
const fileInputRef = useRef<HTMLInputElement>(null);
return (
<Form {...form}>
@@ -150,6 +154,101 @@ export function PartnerForm({
</FormItem>
)}
/>
<FormField
control={form.control}
name="logo"
render={() => {
const removeLogo = form.watch("removeLogo");
const logoFile = form.watch("logo");
const newFilePreview = logoFile
? URL.createObjectURL(logoFile)
: undefined;
const existingImageUrl =
partner?.imageUrl && !removeLogo
? resolveSchemeWithErrorHandler({
client,
uri: partner.imageUrl,
})
: undefined;
const displayUrl = newFilePreview || existingImageUrl;
return (
<FormItem>
<FormLabel>Partner Logo</FormLabel>
<FormControl>
<div>
<input
ref={fileInputRef}
accept="image/png,image/jpeg,image/webp"
className="hidden"
onChange={(e) => {
const file = e.target.files?.[0];
if (file) {
form.setValue("logo", file, {
shouldValidate: true,
});
form.setValue("removeLogo", false);
}
e.target.value = "";
}}
type="file"
/>
{displayUrl ? (
<div className="relative inline-block">
<Img
alt={partner?.name ?? "Partner logo"}
className="size-20 rounded-md border object-contain object-center"
src={displayUrl}
/>
<Button
aria-label="Remove logo"
className="absolute -top-2 -right-2 size-6 rounded-full bg-background p-0 hover:bg-accent"
onClick={() => {
form.setValue("logo", undefined);
form.setValue("removeLogo", true);
}}
size="icon"
type="button"
variant="ghost"
>
<XIcon className="size-3" />
</Button>
<Button
aria-label="Change logo"
className="absolute -bottom-2 -right-2 size-6 rounded-full bg-background p-0 hover:bg-accent"
onClick={() => fileInputRef.current?.click()}
size="icon"
type="button"
variant="ghost"
>
<PencilIcon className="size-3" />
</Button>
</div>
) : (
<ImageUpload
accept="image/png, image/jpeg, image/webp"
className="bg-background"
onUpload={(files) => {
if (files[0]) {
form.setValue("logo", files[0], {
shouldValidate: true,
});
form.setValue("removeLogo", false);
}
}}
/>
)}
</div>
</FormControl>
<FormDescription>
Optional logo for this partner. Used in OTP emails sent to
users authenticating through this partner.
</FormDescription>
<FormMessage />
</FormItem>
);
}}
/>
<FormField
control={form.control}
defaultValue=""
@@ -3,6 +3,7 @@ import { useParams } from "next/navigation";
import { toast } from "sonner";
import type { ThirdwebClient } from "thirdweb";
import type { Ecosystem, Partner } from "@/api/team/ecosystems";
import { useDashboardStorageUpload } from "@/hooks/useDashboardStorageUpload";
import { useDashboardRouter } from "@/lib/DashboardRouter";
import { useUpdatePartner } from "../../hooks/use-update-partner";
import { PartnerForm, type PartnerFormValues } from "./partner-form.client";
@@ -25,6 +26,8 @@ export function UpdatePartnerForm({
const teamSlug = params.team_slug as string;
const ecosystemSlug = params.slug as string;
const storageUpload = useDashboardStorageUpload({ client });
const { mutateAsync: updatePartner, isPending } = useUpdatePartner(
{
authToken,
@@ -50,10 +53,31 @@ export function UpdatePartnerForm({
},
);
const handleSubmit = (
const isUploading = storageUpload.isPending;
const handleSubmit = async (
values: PartnerFormValues,
finalAccessControl: Partner["accessControl"] | null,
) => {
// Determine imageUrl based on three states:
// 1. New file uploaded → upload and use new URI
// 2. Explicit removal → send null to clear
// 3. No change → preserve existing partner imageUrl
let imageUrl: string | null | undefined;
if (values.logo) {
try {
const [uri] = await storageUpload.mutateAsync([values.logo]);
imageUrl = uri;
} catch {
toast.error("Failed to upload logo");
return;
}
} else if (values.removeLogo) {
imageUrl = null;
} else {
imageUrl = partner.imageUrl;
}
updatePartner({
accessControl: finalAccessControl,
allowlistedBundleIds: values.bundleIds
@@ -63,6 +87,7 @@ export function UpdatePartnerForm({
.split(/,| /)
.filter((d) => d.length > 0),
ecosystem,
imageUrl,
name: values.name,
partnerId: partner.id,
});
@@ -71,7 +96,7 @@ export function UpdatePartnerForm({
return (
<PartnerForm
client={client}
isSubmitting={isPending}
isSubmitting={isPending || isUploading}
onSubmit={handleSubmit}
partner={partner}
submitLabel="Update"
@@ -154,6 +154,21 @@ const allowedOperationsSchema = z.discriminatedUnion("signMethod", [
export const partnerFormSchema = z
.object({
logo: z
.instanceof(File, {
message: "Please select an image file",
})
.refine(
(file) => ["image/png", "image/jpeg", "image/webp"].includes(file.type),
{
message: "Only PNG, JPG or WEBP images are allowed",
},
)
.refine((file) => file.size <= 500 * 1024, {
message: "Logo size must be less than 500KB",
})
.optional(),
removeLogo: z.boolean().default(false),
accessControl: z
.object({
allowedOperations: z
@@ -8,6 +8,7 @@ import type { Ecosystem, Partner } from "@/api/team/ecosystems";
type AddPartnerParams = {
ecosystem: Ecosystem;
name: string;
imageUrl?: string;
allowlistedDomains: string[];
allowlistedBundleIds: string[];
accessControl?: Partner["accessControl"] | null;
@@ -37,6 +38,7 @@ export function useAddPartner(
accessControl: params.accessControl ?? undefined,
allowlistedBundleIds: params.allowlistedBundleIds,
allowlistedDomains: params.allowlistedDomains,
imageUrl: params.imageUrl,
name: params.name,
// TODO - remove the requirement for permissions in API endpoint
permissions: ["FULL_CONTROL_V1"],
@@ -9,6 +9,7 @@ type UpdatePartnerParams = {
partnerId: string;
ecosystem: Ecosystem;
name: string;
imageUrl?: string | null;
allowlistedDomains: string[];
allowlistedBundleIds: string[];
accessControl?: {
@@ -43,6 +44,7 @@ export function useUpdatePartner(
accessControl: params.accessControl,
allowlistedBundleIds: params.allowlistedBundleIds,
allowlistedDomains: params.allowlistedDomains,
imageUrl: params.imageUrl,
name: params.name,
}),
@@ -31,8 +31,7 @@ export function TeamDedicatedSupportCard(props: {
const [selectedChannelType, setSelectedChannelType] =
useState<ChannelType>("slack");
const isFeatureEnabled =
props.team.billingPlan === "scale" || props.team.billingPlan === "pro";
const isFeatureEnabled = props.team.billingPlan === "pro";
const createMutation = useMutation({
mutationFn: async (params: {
@@ -107,8 +106,7 @@ export function TeamDedicatedSupportCard(props: {
bottomText={
!isFeatureEnabled ? (
<>
Upgrade to the <b>Scale</b> or <b>Pro</b> plan to unlock this
feature.
Upgrade to the <b>Pro</b> plan to unlock this feature.
</>
) : hasDefaultTeamName ? (
"Please update your team name before requesting a dedicated support channel."
@@ -126,17 +124,7 @@ export function TeamDedicatedSupportCard(props: {
}
saveButton={
isFeatureEnabled
? {
disabled: createMutation.isPending,
isPending: createMutation.isPending,
label: "Create Support Channel",
onClick: () =>
createMutation.mutate({
channelType: selectedChannelType,
teamId: props.team.id,
}),
}
: hasDefaultTeamName
? hasDefaultTeamName
? {
disabled: false,
isPending: false,
@@ -145,14 +133,24 @@ export function TeamDedicatedSupportCard(props: {
router.push(`/team/${props.team.slug}/~/settings`),
}
: {
disabled: false,
isPending: false,
label: "Upgrade Plan",
disabled: createMutation.isPending,
isPending: createMutation.isPending,
label: "Create Support Channel",
onClick: () =>
router.push(
`/team/${props.team.slug}/~/billing?showPlans=true&highlight=scale`,
),
createMutation.mutate({
channelType: selectedChannelType,
teamId: props.team.id,
}),
}
: {
disabled: false,
isPending: false,
label: "Upgrade Plan",
onClick: () =>
router.push(
`/team/${props.team.slug}/~/billing?showPlans=true&highlight=pro`,
),
}
}
>
<div className="md:w-[450px]">
@@ -32,7 +32,10 @@ export function ProjectFTUX(props: {
}) {
return (
<div className="flex flex-col gap-14">
<IntegrateAPIKeySection project={props.project} />
<IntegrateAPIKeySection
project={props.project}
teamSlug={props.teamSlug}
/>
{props.projectWalletSection}
<GetStartedSection project={props.project} />
<ProductsSection
@@ -47,7 +50,13 @@ export function ProjectFTUX(props: {
// Integrate API key section ------------------------------------------------------------
function IntegrateAPIKeySection({ project }: { project: Project }) {
function IntegrateAPIKeySection({
project,
teamSlug,
}: {
project: Project;
teamSlug: string;
}) {
const secretKeyMasked = project.secretKeys[0]?.masked;
const clientId = project.publishableKey;
@@ -81,6 +90,7 @@ function IntegrateAPIKeySection({ project }: { project: Project }) {
<SecretKeySection
project={project}
secretKeyMasked={secretKeyMasked}
vaultConfigUrl={`/team/${teamSlug}/${project.slug}/wallets/server-wallets/configuration`}
/>
)}
</div>
@@ -8,6 +8,7 @@ import { RotateSecretKeyButton } from "../../settings/ProjectGeneralSettingsPage
export function SecretKeySection(props: {
secretKeyMasked: string;
project: Project;
vaultConfigUrl: string;
}) {
const [secretKeyMasked, setSecretKeyMasked] = useState(props.secretKeyMasked);
@@ -34,6 +35,7 @@ export function SecretKeySection(props: {
project: props.project,
});
}}
vaultConfigUrl={props.vaultConfigUrl}
/>
</div>
</div>
@@ -20,6 +20,7 @@ import {
createThirdwebClient,
Engine,
getContract,
NATIVE_TOKEN_ADDRESS,
readContract,
type ThirdwebClient,
toUnits,
@@ -889,11 +890,16 @@ function SendProjectWalletModalContent(props: SendProjectWalletModalProps) {
const sendMutation = useMutation({
mutationFn: async (values: SendFormValues) => {
const normalizedTokenAddress =
values.tokenAddress?.toLowerCase() ===
NATIVE_TOKEN_ADDRESS.toLowerCase()
? undefined
: values.tokenAddress;
let decimals = 18;
if (values.tokenAddress) {
if (normalizedTokenAddress) {
const decimalsRpc = await readContract({
contract: getContract({
address: values.tokenAddress,
address: normalizedTokenAddress,
chain: selectedChain,
client,
}),
@@ -914,7 +920,9 @@ function SendProjectWalletModalContent(props: SendProjectWalletModalProps) {
teamId,
walletAddress,
secretKey: secretKeyValue,
...(values.tokenAddress ? { tokenAddress: values.tokenAddress } : {}),
...(normalizedTokenAddress
? { tokenAddress: normalizedTokenAddress }
: {}),
...(vaultAccessTokenValue
? { vaultAccessToken: vaultAccessTokenValue }
: {}),
@@ -956,7 +964,7 @@ function SendProjectWalletModalContent(props: SendProjectWalletModalProps) {
<Form {...form}>
<form
onSubmit={form.handleSubmit((values) => {
void sendMutation.mutateAsync(values);
sendMutation.mutate(values);
})}
>
<div className="space-y-4 px-4 pb-8 lg:px-6">
@@ -62,6 +62,8 @@ import { ToolTipLabel } from "@/components/ui/tooltip";
import type { RotateSecretKeyAPIReturnType } from "@/hooks/useApi";
import {
deleteProjectClient,
MANAGED_VAULT_BLOCKS_ROTATION_CODE,
RotateSecretKeyError,
rotateSecretKeyClient,
updateProjectClient,
} from "@/hooks/useApi";
@@ -100,6 +102,7 @@ type ProjectSettingPaths = {
inAppConfig: string;
aaConfig: string;
payConfig: string;
vaultConfig: string;
afterDeleteRedirectTo: string;
};
@@ -224,6 +227,7 @@ export function ProjectGeneralSettingsPageUI(props: {
afterDeleteRedirectTo: `/team/${props.teamSlug}`,
inAppConfig: `${projectLayout}/wallets/user-wallets/configuration`,
payConfig: `${projectLayout}/bridge/configuration`,
vaultConfig: `${projectLayout}/wallets/server-wallets/configuration`,
};
const { project } = props;
@@ -343,6 +347,7 @@ export function ProjectGeneralSettingsPageUI(props: {
<ProjectKeyDetails
project={project}
rotateSecretKey={props.rotateSecretKey}
vaultConfigUrl={paths.vaultConfig}
/>
<ProjectIdCard project={project} />
<AllowedDomainsSetting
@@ -845,9 +850,11 @@ function EnabledServicesSetting(props: {
function ProjectKeyDetails({
project,
rotateSecretKey,
vaultConfigUrl,
}: {
rotateSecretKey: RotateSecretKey;
project: Project;
vaultConfigUrl: string;
}) {
// currently only showing the first secret key
const { createdAt, updatedAt, lastAccessedAt } = project;
@@ -893,6 +900,7 @@ function ProjectKeyDetails({
setSecretKeyMasked(data.data.secretMasked);
}}
rotateSecretKey={rotateSecretKey}
vaultConfigUrl={vaultConfigUrl}
/>
</div>
</div>
@@ -975,6 +983,7 @@ function DeleteProject(props: {
export function RotateSecretKeyButton(props: {
rotateSecretKey: RotateSecretKey;
onSuccess: (data: RotateSecretKeyAPIReturnType) => void;
vaultConfigUrl: string;
}) {
const [isOpen, setIsOpen] = useState(false);
const [isModalCloseAllowed, setIsModalCloseAllowed] = useState(true);
@@ -1011,6 +1020,7 @@ export function RotateSecretKeyButton(props: {
disableModalClose={() => setIsModalCloseAllowed(false)}
onSuccess={props.onSuccess}
rotateSecretKey={props.rotateSecretKey}
vaultConfigUrl={props.vaultConfigUrl}
/>
</DialogContent>
</Dialog>
@@ -1026,6 +1036,7 @@ function RotateSecretKeyModalContent(props: {
closeModal: () => void;
disableModalClose: () => void;
onSuccess: (data: RotateSecretKeyAPIReturnType) => void;
vaultConfigUrl: string;
}) {
const [screen, setScreen] = useState<RotateSecretKeyScreen>({
id: "initial",
@@ -1050,6 +1061,7 @@ function RotateSecretKeyModalContent(props: {
setScreen({ id: "save-newkey", secretKey: data.data.secret });
}}
rotateSecretKey={props.rotateSecretKey}
vaultConfigUrl={props.vaultConfigUrl}
/>
);
}
@@ -1061,13 +1073,29 @@ function RotateSecretKeyInitialScreen(props: {
rotateSecretKey: RotateSecretKey;
onSuccess: (data: RotateSecretKeyAPIReturnType) => void;
closeModal: () => void;
vaultConfigUrl: string;
}) {
const router = useDashboardRouter();
const [isConfirmed, setIsConfirmed] = useState(false);
const rotateKeyMutation = useMutation({
mutationFn: props.rotateSecretKey,
onError: (err) => {
console.error(err);
toast.error("Failed to rotate secret key");
if (
err instanceof RotateSecretKeyError &&
err.code === MANAGED_VAULT_BLOCKS_ROTATION_CODE
) {
toast.error("Eject your server-wallet vault first", {
description:
"This project has a managed vault. Redirecting you to the vault configuration page so you can eject it before rotating the secret key.",
});
props.closeModal();
router.push(props.vaultConfigUrl);
return;
}
toast.error("Failed to rotate secret key", {
description: err instanceof Error ? err.message : undefined,
});
},
onSuccess: (data) => {
props.onSuccess(data);
@@ -49,6 +49,14 @@ export function LinkAccount() {
});
};
const linkGithub = async () => {
linkProfile({
client: THIRDWEB_CLIENT,
strategy: "github",
mode: "redirect",
});
};
return (
<div className="flex flex-col gap-4 p-6">
{account ? (
@@ -83,6 +91,14 @@ export function LinkAccount() {
>
Link Passkey
</Button>
<Button
className="rounded-full p-6"
disabled={isPending}
onClick={linkGithub}
variant="default"
>
Link Github
</Button>
</>
)}
{error && <p className="text-red-500">Error: {error.message}</p>}
+166 -151
View File
@@ -2,35 +2,29 @@ import {
ArchiveIcon,
ArrowUpRightIcon,
BrainIcon,
BringToFrontIcon,
CoinsIcon,
GlobeIcon,
ZapIcon,
} from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import { Heading } from "@/components/Document";
import { ChatButton } from "../components/AI/chat-button";
import { Button } from "../components/ui/button";
import {
DotNetIcon,
ExternalLinkIcon,
ReactIcon,
TypeScriptIcon,
UnityIcon,
UnrealEngineIcon,
} from "../icons";
import { ConnectIcon } from "../icons/products/ConnectIcon";
import DocsHeroDark from "./_images/docs-hero-dark.png";
import DocsHeroLight from "./_images/docs-hero-light.png";
export default function Page() {
return (
<main
className="container max-w-5xl grow pb-[4.75rem] scale-y-[0.95] origin-top"
data-noindex
>
<main className="container max-w-5xl grow pb-24" data-noindex>
<Hero />
<div className="space-y-8">
<LearningResourcesSection />
<div className="space-y-24">
<ProductsSection />
<ReferenceSection />
<ArchiveSection />
</div>
@@ -40,36 +34,95 @@ export default function Page() {
function Hero() {
return (
<section className="grid gap-4 pt-14 pb-6 lg:grid-cols-[1fr_420px] lg:py-0">
{/* Left */}
<div className="flex flex-col justify-center">
<div>
<h1 className="mb-3 font-bold text-4xl tracking-tighter lg:text-6xl">
thirdweb Documentation
</h1>
<p className="mb-6 max-w-lg text-base lg:text-lg text-muted-foreground leading-normal text-pretty">
Platform for building the next generation of internet products
</p>
<div className="flex gap-3">
<ChatButton />
<Button
asChild
className="flex items-center gap-2 rounded-full bg-card"
variant="outline"
>
<Link href="https://playground.thirdweb.com">
Playground
<ArrowUpRightIcon className="size-4" />
</Link>
</Button>
</div>
</div>
<section className="relative flex flex-col items-center justify-center text-center py-20 lg:py-24">
{/* Badge */}
<div className="mb-6 inline-flex items-center gap-2 rounded-full border backdrop-blur-sm px-4 py-1.5 text-sm text-muted-foreground">
Developer Documentation
</div>
{/* right */}
<div className="hidden justify-center lg:flex">
<Image alt="" className="dark-only w-full" src={DocsHeroDark} />
<Image alt="" className="light-only w-full" src={DocsHeroLight} />
{/* Title */}
<h1 className="mb-2 lg:mb-4 font-semibold lg:font-bold text-3xl tracking-tighter lg:text-6xl max-w-2xl bg-gradient-to-t dark:bg-gradient-to-b from-foreground to-foreground/70 bg-clip-text text-transparent">
Build the next generation of internet products
</h1>
{/* Subtitle */}
<p className="mb-8 text-base lg:text-lg text-muted-foreground max-w-xl">
Where users and AI can spend, earn and transact autonomously.
</p>
{/* CTAs */}
<div className="flex flex-wrap justify-center gap-2">
<ChatButton className="bg-card rounded-xl px-6" />
<Button
asChild
variant="outline"
className="gap-2 bg-card rounded-xl px-6"
>
<Link href="https://playground.thirdweb.com" target="_blank">
Playground
<ArrowUpRightIcon className="size-4 text-muted-foreground" />
</Link>
</Button>
</div>
</section>
);
}
function SectionHeader(props: { title: string; description: string }) {
return (
<div className="text-center mb-8">
<h2 className="font-semibold text-3xl tracking-tight mb-1">
{props.title}
</h2>
<p className="text-muted-foreground">{props.description}</p>
</div>
);
}
function ReferenceSection() {
return (
<section>
<SectionHeader
title="SDKs"
description="Build on any platform with our SDKs"
/>
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
<Card
title="TypeScript"
description="SDK for web and node.js applications"
href="/references/typescript/v5"
icon={TypeScriptIcon}
/>
<Card
title="React"
description="Hooks and components for React apps"
href="/references/typescript/v5"
icon={ReactIcon}
/>
<Card
title="React Native"
description="SDK for React Native apps"
href="/references/typescript/v5"
icon={ReactIcon}
/>
<Card
title=".NET"
description="SDK for .NET applications"
href="/dotnet"
icon={DotNetIcon}
/>
<Card
title="Unity"
description="SDK for Unity games"
href="/unity"
icon={UnityIcon}
/>
<Card
title="Unreal Engine"
description="SDK for Unreal Engine games"
href="/unreal-engine"
icon={UnrealEngineIcon}
/>
</div>
</section>
);
@@ -78,183 +131,145 @@ function Hero() {
function ArchiveSection() {
return (
<section>
<SectionTitle anchorId="client" title="Archived Documentation" />
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
<ArticleCardIndex
<p className="font-semibold text-muted-foreground text-3xl tracking-tighter mb-8 text-center">
Archived Documentation
</p>
<div className="grid gap-4 md:grid-cols-2">
<MinimalCard
title="Insight API"
description="Insight API Documentation"
href="https://insight.thirdweb.com/reference"
icon={ArchiveIcon}
title="Insight API"
external
/>
<ArticleCardIndex
<MinimalCard
title="Payments API"
description="Payments API Documentation"
href="https://bridge.thirdweb.com/reference"
icon={ArchiveIcon}
title="Payments API"
external
/>
<ArticleCardIndex
<MinimalCard
title="Transactions"
description="Transactions knowledge base and guides"
href="/engine"
icon={ArchiveIcon}
title="Transactions"
external
/>
<ArticleCardIndex
<MinimalCard
title="Contracts"
description="Contracts knowledge base and guides"
href="/contracts"
icon={ArchiveIcon}
title="Contracts"
external
/>
</div>
</section>
);
}
function ReferenceSection() {
function ProductsSection() {
return (
<section>
<SectionTitle anchorId="client" title="Client libraries" />
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
<SDKCard
href="/references/typescript/v5"
icon={TypeScriptIcon}
title="TypeScript"
/>
<SDKCard
href="/references/typescript/v5"
icon={ReactIcon}
title="React"
/>
<SDKCard
href="/references/typescript/v5"
icon={ReactIcon}
title="React Native"
/>
<SDKCard href="/dotnet" icon={DotNetIcon} title="DotNet" />
<SDKCard href="/unity" icon={UnityIcon} title="Unity" />
<SDKCard
href="/unreal-engine"
icon={UnrealEngineIcon}
title="Unreal Engine"
/>
</div>
</section>
);
}
function LearningResourcesSection() {
return (
<section>
<SectionTitle anchorId="learning" title="Documentation" />
<div className="grid gap-4 md:grid-cols-1 lg:grid-cols-3">
<ArticleCardIndex
description="Create wallets to read and transact."
<Card
title="Wallets"
description="Create wallets for your users with flexible authentication options"
href="/wallets"
icon={ConnectIcon}
title="Wallets"
/>
<ArticleCardIndex
description="Create internet native payments with x402"
<Card
title="x402"
description="Internet-native payments with the HTTP 402 protocol"
href="/x402"
icon={ZapIcon}
title="x402"
/>
<ArticleCardIndex
description="Swap and bridge tokens across chains"
href="/bridge"
icon={CoinsIcon}
<Card
title="Bridge"
description="Swap and bridge tokens seamlessly across chains"
href="/bridge"
icon={BringToFrontIcon}
/>
<ArticleCardIndex
description="Launch tokens and markets"
<Card
title="Tokens"
description="Launch and manage tokens and create markets on any blockchain"
href="/tokens"
icon={CoinsIcon}
title="Tokens"
/>
<ArticleCardIndex
<Card
title="Blockchain LLM"
description="Read and write onchain via natural language"
href="/ai/chat"
icon={BrainIcon}
title="AI"
/>
<ArticleCardIndex
description="Build products with our HTTP API"
href="/reference"
icon={ConnectIcon}
<Card
title="HTTP API"
description="Build products with our comprehensive HTTP API"
href="/reference"
icon={GlobeIcon}
/>
</div>
</section>
);
}
function SectionTitle(props: { title: string; anchorId: string }) {
return (
<Heading anchorId={props.anchorId} anchorClassName="mb-2" level={2}>
{props.title}
</Heading>
);
}
/***
* This component is only for the index page
*/
function ArticleCardIndex(props: {
function Card(props: {
title: string;
description: string;
description?: string;
href: string;
icon: React.FC<{ className?: string }>;
external?: boolean;
}) {
return (
<div className="rounded-lg border bg-card p-4 hover:border-active-border relative">
<div className="flex mb-3">
<div className="p-2 rounded-full border bg-background">
<props.icon className="size-4 text-muted-foreground" />
<Link
href={props.href}
target={props.external ? "_blank" : undefined}
className="group relative flex flex-col rounded-2xl border bg-card px-6 py-8 md:py-10 transition-all duration-300 hover:border-active-border"
>
{/* Icon */}
<div className="items-center justify-start flex mb-5">
<div className="rounded-full bg-background border p-2.5">
<props.icon className="size-5 text-muted-foreground transition-colors" />
</div>
</div>
<h3 className="mb-0.5 font-medium text-lg tracking-tight">
<Link
className="before:absolute before:inset-0"
href={props.href}
target={props.external ? "_blank" : undefined}
>
{props.title}
</Link>
</h3>
<p className="text-sm text-muted-foreground">{props.description}</p>
</div>
{/* Content */}
<div className="space-y-1">
<h3 className="font-semibold text-xl tracking-tight">{props.title}</h3>
{props.description && (
<p className="text-sm text-muted-foreground text-pretty">
{props.description}
</p>
)}
</div>
</Link>
);
}
function SDKCard(props: {
function MinimalCard(props: {
title: string;
description?: string;
href: string;
icon: React.FC<{ className?: string }>;
external?: boolean;
}) {
return (
<div className="relative flex items-center gap-3 rounded-lg border bg-card p-4 transition-colors hover:border-active-border text-foreground/80 hover:text-foreground">
<div className="p-2 rounded-full border bg-background">
<props.icon className="size-4 shrink-0" />
<Link
href={props.href}
target={props.external ? "_blank" : undefined}
className="group relative items-center flex rounded-2xl border bg-card p-6 transition-all duration-300 hover:border-active-border gap-4"
>
<div className="rounded-full bg-background border p-3">
<props.icon className="size-4 text-muted-foreground" />
</div>
<div className="flex flex-col">
<h3 className="font-semibold text-base text-foreground mb-0.5">
<Link
href={props.href}
target={props.href.includes("http") ? "_blank" : undefined}
className="before:absolute before:inset-0"
>
{props.title}
</Link>
</h3>
<p className="inline-flex items-center gap-1 text-muted-foreground text-xs">
View docs
<ExternalLinkIcon className="size-3.5 shrink-0 text-muted-foreground/50" />
</p>
{/* Content */}
<div className="space-y-0.5">
<h3 className="font-medium text-lg">{props.title}</h3>
{props.description && (
<p className="text-sm text-muted-foreground text-pretty">
{props.description}
</p>
)}
</div>
</div>
</Link>
);
}
@@ -52,12 +52,27 @@ export function getTDocPage(options: {
// category pages
if (docSlug in subgroups) {
return (
<CategoryPage
doc={doc}
packageSlug={packageSlug}
slug={docSlug as keyof typeof subgroups}
version={version}
/>
<div>
<Breadcrumb
crumbs={[
{
href: `/references/${packageSlug}/${version}`,
name: sdkTitle,
},
{
href: `/references/${packageSlug}/${version}/${docSlug}`,
name: docSlug,
},
]}
/>
<CategoryPage
doc={doc}
packageSlug={packageSlug}
slug={docSlug as keyof typeof subgroups}
version={version}
/>
</div>
);
}
@@ -74,7 +89,7 @@ export function getTDocPage(options: {
crumbs={[
{
href: `/references/${packageSlug}/${version}`,
name: "References",
name: sdkTitle,
},
{
href: `/references/${packageSlug}/${version}/${selectedDoc.name}`,
@@ -209,8 +224,8 @@ async function IndexContent(props: {
return (
<div>
<Heading anchorId="reference" level={1}>
{props.sdkTitle} Reference
<Heading anchorId="reference" level={1} className="mb-6 mt-2">
{props.sdkTitle}
</Heading>
<div className="flex flex-col gap-3">
@@ -49,6 +49,8 @@ Required headers:
<OpenApiEndpoint path="/v1/wallets/user" method="GET" />
<br/>
For ecosystem wallets, include the ecosystem headers in your requests.
</TabsContent>
@@ -10,7 +10,7 @@ const Chat = lazy(() =>
import("./chat").then((mod) => ({ default: mod.Chat })),
);
export function ChatButton() {
export function ChatButton(props: { className?: string }) {
const [isOpen, setIsOpen] = useState(false);
const [hasBeenOpened, setHasBeenOpened] = useState(false);
const closeModal = useCallback(() => setIsOpen(false), []);
@@ -20,7 +20,7 @@ export function ChatButton() {
<>
{/* Inline Button (not floating) */}
<Button
className="gap-2 rounded-full bg-background"
className={cn("gap-2 rounded-full bg-background", props.className)}
onClick={() => {
setIsOpen(true);
setHasBeenOpened(true);
@@ -130,12 +130,12 @@ export function ApiEndpoint(props: { metadata: ApiEndpointMeta }) {
hasMultipleExamples={true}
/>
) : (
<div className="rounded-lg border">
<div className="rounded-lg border bg-card">
<RequestExample
codeExamples={requestExamples.map((example) => ({
code: (
<CodeBlock
className="rounded-none border-none"
className="rounded-none border-none !bg-card"
code={example.code}
containerClassName="m-0"
lang={example.lang}
@@ -190,16 +190,17 @@ export function ApiEndpoint(props: { metadata: ApiEndpointMeta }) {
>
Response
</Heading>
<div className="overflow-hidden rounded-lg border">
<div className="overflow-hidden rounded-lg border bg-card">
<Tabs className="w-full" defaultValue={responseKeys[0]}>
<TabsList className="w-full">
<TabsList className="w-full pt-1">
{responseKeys.map((status) => (
<TabsTrigger key={status} value={status}>
<div className="flex items-center gap-2 py-1">
<div className="flex items-center gap-1.5 px-0.5">
<span
className={cn("h-2 w-2 rounded-full", {
"bg-green-500": status.startsWith("2"),
"bg-red-500": status.startsWith("4"),
"bg-orange-500": status.startsWith("3"),
"bg-yellow-500": status.startsWith("5"),
})}
/>
@@ -212,7 +213,7 @@ export function ApiEndpoint(props: { metadata: ApiEndpointMeta }) {
{responseKeys.map((status) => (
<TabsContent className="m-0" key={status} value={status}>
<CodeBlock
className="rounded-none border-none"
className="rounded-none border-none !bg-card"
code={responseExamples[status] as string}
containerClassName="m-0"
lang="json"
@@ -237,15 +238,16 @@ function ParameterSection(props: {
summary={
<div className="flex items-center gap-3">
<span className="text-sm font-medium">{props.title}</span>
<span className="text-xs text-muted-foreground bg-muted px-2 py-1 rounded">
<span className="text-xs text-muted-foreground bg-muted size-6 rounded-full inline-flex justify-center items-center">
{props.parameters.length}
</span>
</div>
}
accordionItemClassName="border-0 my-0"
accordionTriggerClassName="p-4 hover:bg-muted/50 transition-colors"
headingClassName="!no-underline"
>
<div className="px-4 pb-4">
<div className="px-4 pb-4 space-y-2">
{props.parameters
.sort((a, b) => {
if (a.required === b.required) {
@@ -266,16 +268,16 @@ function InlineParameterItem({ param }: { param: APIParameter }) {
return (
<div className="flex flex-col gap-2 p-3">
<div className="flex items-center gap-2 flex-wrap">
<code className="text-foreground text-sm font-mono bg-background px-2 py-1 rounded border">
<code className="text-foreground text-base font-mono font-medium">
{param.name}
</code>
{param.type && (
<span className="text-xs text-muted-foreground px-2 py-1 bg-muted rounded">
<span className="text-xs text-muted-foreground px-2 py-1 bg-muted rounded-lg">
{param.type}
</span>
)}
{param.required && (
<span className="text-xs text-warning-text px-2 py-1 rounded border border-warning-text">
<span className="text-xs text-warning-text px-2 py-1 rounded-lg border border-warning-text/30 bg-warning-text/15">
Required
</span>
)}
@@ -289,6 +291,7 @@ function InlineParameterItem({ param }: { param: APIParameter }) {
<div className="text-sm flex flex-col gap-2">
<span className="text-muted-foreground">Example: </span>
<CodeBlock
className="!bg-card"
code={
typeof param.example === "object"
? JSON.stringify(param.example)
@@ -29,16 +29,16 @@ function InlineParameterItem({ param }: { param: APIParameter }) {
return (
<div className="flex flex-col gap-2 p-3 rounded-lg">
<div className="flex items-center gap-2 flex-wrap">
<code className="text-foreground text-sm font-mono bg-background px-2 py-1 rounded border">
<code className="text-foreground text-base font-mono font-medium">
{param.name}
</code>
{param.type && (
<span className="text-xs text-muted-foreground px-2 py-1 bg-muted rounded">
<span className="text-xs text-muted-foreground px-2 py-1 bg-muted rounded-lg">
{param.type}
</span>
)}
{param.required && (
<span className="text-xs text-warning-text px-2 py-1 rounded border border-warning-text">
<span className="text-xs text-warning-text px-2 py-1 rounded-lg border border-warning-text/30 bg-warning-text/15">
Required
</span>
)}
@@ -49,15 +49,15 @@ function InlineParameterItem({ param }: { param: APIParameter }) {
)}
{param.example !== undefined && (
<div className="text-sm flex flex-col gap-2">
<span className="text-muted-foreground">Example: </span>
<div className="text-sm flex flex-col gap-2 my-3">
<span className="text-muted-foreground">Example </span>
<CodeClient
code={
typeof param.example === "object"
? JSON.stringify(param.example)
: String(param.example)
}
className="rounded-none border-none"
className="rounded-lg"
lang="json"
scrollableContainerClassName="m-0"
scrollableClassName="max-h-[200px]"
@@ -78,10 +78,11 @@ function ParameterSection(props: {
<div className="border-b last:border-b-0">
<Details
key={props.title}
headingClassName="!no-underline"
summary={
<div className="flex items-center gap-3">
<span className="text-sm font-medium">{props.title}</span>
<span className="text-xs text-muted-foreground bg-muted px-2 py-1 rounded">
<span className="text-xs text-muted-foreground bg-muted size-6 rounded-full inline-flex justify-center items-center">
{props.parameters.length}
</span>
</div>
@@ -138,7 +139,7 @@ export function DynamicRequestExample(props: DynamicRequestExampleProps) {
return (
<QueryClientProvider client={queryClient}>
<div className="rounded-lg border">
<div className="rounded-lg border bg-card">
<RequestExample
codeExamples={props.requestExamples.map((example) => ({
code: (
@@ -1,3 +1,4 @@
import { Spinner } from "@workspace/ui/components/spinner";
import type { OpenAPIV3_1 } from "openapi-types";
import { cache, Suspense } from "react";
import {
@@ -455,10 +456,8 @@ function transformOpenApiToApiEndpointMeta(
function LoadingFallback() {
return (
<div className="flex items-center justify-center p-8">
<div className="text-sm text-muted-foreground">
Loading API documentation...
</div>
<div className="flex items-center justify-center p-8 border rounded-lg min-h-[300px] bg-card">
<Spinner className="size-8 text-muted-foreground" />
</div>
);
}
@@ -109,7 +109,7 @@ export function RequestExample(props: {
}}
value={selectedFormat}
>
<SelectTrigger className="w-[130px] rounded-full bg-card">
<SelectTrigger className="w-[130px] rounded-xl bg-card ">
<SelectValue />
</SelectTrigger>
<SelectContent className="bg-background rounded-xl">
@@ -144,7 +144,7 @@ export function RequestExample(props: {
}}
value={selectedExampleType}
>
<SelectTrigger className="w-[130px] rounded-full bg-card">
<SelectTrigger className="md:w-[250px] rounded-xl bg-card text-left">
<SelectValue />
</SelectTrigger>
<SelectContent className="bg-background rounded-xl">
@@ -169,7 +169,7 @@ export function RequestExample(props: {
}}
value={selectedExample?.label}
>
<SelectTrigger className="w-[130px] rounded-full bg-card">
<SelectTrigger className="w-[150px] rounded-xl bg-card">
<SelectValue />
</SelectTrigger>
<SelectContent className="bg-background rounded-xl">
@@ -57,12 +57,7 @@ export function DocLayout(props: DocLayoutProps) {
data-no-llm={props.noLLM}
data-noindex={props.noIndex}
>
<div className="grow xl:mt-6">
<h5 className="mb-2 text-sm text-muted-foreground">
{props.sideBar.name}
</h5>
{props.children}
</div>
<div className="grow xl:mt-6">{props.children}</div>
<div className="mt-16 xl:mt-20">
<PageFooter
editPageButton={props.editPageButton}
+30 -6
View File
@@ -51,18 +51,28 @@ type ReferenceSideBarProps = {
onLinkClick?: () => void;
header?: React.ReactNode;
name: string;
className?: string;
};
export function DocSidebar(props: ReferenceSideBarProps) {
return (
<div className="flex h-full flex-col pb-10 pt-6 text-muted-foreground text-sm">
<div
className={cn(
"flex h-full flex-col pb-10 pt-6 text-muted-foreground text-sm",
props.className,
)}
>
{/* Side bar Name */}
{props.header}
<ul className="styled-scrollbar transform-gpu space-y-1">
{props.links.map((link, i) => (
// biome-ignore lint/suspicious/noArrayIndexKey: TODO - fix this
<li key={i}>
<SidebarItem link={link} onLinkClick={props.onLinkClick} />
<SidebarItem
link={link}
onLinkClick={props.onLinkClick}
isFirst={i === 0}
/>
</li>
))}
</ul>
@@ -70,7 +80,11 @@ export function DocSidebar(props: ReferenceSideBarProps) {
);
}
function SidebarItem(props: { link: SidebarLink; onLinkClick?: () => void }) {
function SidebarItem(props: {
link: SidebarLink;
onLinkClick?: () => void;
isFirst: boolean;
}) {
const pathname = usePathname();
if ("separator" in props.link) {
@@ -86,6 +100,7 @@ function SidebarItem(props: { link: SidebarLink; onLinkClick?: () => void }) {
if (link.isCollapsible === false) {
return (
<DocSidebarNonCollapsible
isFirst={props.isFirst}
key={link.name}
linkGroup={link}
onLinkClick={props.onLinkClick}
@@ -139,13 +154,14 @@ function SidebarItem(props: { link: SidebarLink; onLinkClick?: () => void }) {
function DocSidebarNonCollapsible(props: {
linkGroup: LinkGroup;
onLinkClick?: () => void;
isFirst: boolean;
}) {
const pathname = usePathname();
const { href, name, links, icon } = props.linkGroup;
const isCategoryActive = href ? isSamePage(pathname, href) : false;
return (
<div className="my-4">
<div className={cn("my-4", props.isFirst && "mt-0")}>
<div className="mb-2 flex items-center gap-2 rounded-lg text-foreground">
{icon && <SidebarIcon icon={icon} />}
{href ? (
@@ -167,7 +183,11 @@ function DocSidebarNonCollapsible(props: {
return (
// biome-ignore lint/suspicious/noArrayIndexKey: TODO - fix this
<li key={i}>
<SidebarItem link={link} onLinkClick={props.onLinkClick} />
<SidebarItem
link={link}
onLinkClick={props.onLinkClick}
isFirst={i === 0}
/>
</li>
);
})}
@@ -232,7 +252,11 @@ function DocSidebarCategory(props: {
return (
// biome-ignore lint/suspicious/noArrayIndexKey: TODO - fix this
<li key={i}>
<SidebarItem link={link} onLinkClick={props.onLinkClick} />
<SidebarItem
link={link}
onLinkClick={props.onLinkClick}
isFirst={i === 0}
/>
</li>
);
})}
+80
View File
@@ -1,5 +1,85 @@
# wagmi-inapp
## 0.0.58
### Patch Changes
- Updated dependencies [[`49194e3`](https://github.com/thirdweb-dev/js/commit/49194e3a2a1707c5d1e0a2cc67c328e84ef5e9a0)]:
- thirdweb@5.120.1
- @thirdweb-dev/wagmi-adapter@0.2.213
## 0.0.57
### Patch Changes
- Updated dependencies [[`23d74a0`](https://github.com/thirdweb-dev/js/commit/23d74a0a54247930e6889bbf66f88fa673a23f1a)]:
- thirdweb@5.120.0
- @thirdweb-dev/wagmi-adapter@0.2.212
## 0.0.56
### Patch Changes
- Updated dependencies [[`83198b2`](https://github.com/thirdweb-dev/js/commit/83198b2ea4dd29b1debb7db2dc2eabba57e9c4d7), [`ad49560`](https://github.com/thirdweb-dev/js/commit/ad4956033107c52ecdf4cd9f5b2bff87867f3bec)]:
- thirdweb@5.119.4
- @thirdweb-dev/wagmi-adapter@0.2.211
## 0.0.55
### Patch Changes
- Updated dependencies [[`3a18c6e`](https://github.com/thirdweb-dev/js/commit/3a18c6e6a8c12cecaf684fff2dfc5a73c77c40c9)]:
- thirdweb@5.119.3
- @thirdweb-dev/wagmi-adapter@0.2.210
## 0.0.54
### Patch Changes
- Updated dependencies [[`32c2ff6`](https://github.com/thirdweb-dev/js/commit/32c2ff62f8a2ca8da82c1e8d9bb73def95ec41db)]:
- thirdweb@5.119.2
- @thirdweb-dev/wagmi-adapter@0.2.209
## 0.0.53
### Patch Changes
- Updated dependencies [[`e13b9a7`](https://github.com/thirdweb-dev/js/commit/e13b9a784aca3a9b5d797fc6e011c6d1a10542e9), [`da4a4a5`](https://github.com/thirdweb-dev/js/commit/da4a4a540a6b141050af8fc8332621826d8dd835)]:
- thirdweb@5.119.1
- @thirdweb-dev/wagmi-adapter@0.2.208
## 0.0.52
### Patch Changes
- Updated dependencies [[`5352152`](https://github.com/thirdweb-dev/js/commit/53521528353a00691e82405460d4fb869ac986de)]:
- thirdweb@5.119.0
- @thirdweb-dev/wagmi-adapter@0.2.207
## 0.0.51
### Patch Changes
- Updated dependencies [[`1caf6dd`](https://github.com/thirdweb-dev/js/commit/1caf6dd4609ac72a06999ef0d70f31a371e5108a)]:
- thirdweb@5.118.2
- @thirdweb-dev/wagmi-adapter@0.2.206
## 0.0.50
### Patch Changes
- Updated dependencies [[`b50e304`](https://github.com/thirdweb-dev/js/commit/b50e304e0ccd1ac7eae551c3d49e82312ffc82d1)]:
- thirdweb@5.118.1
- @thirdweb-dev/wagmi-adapter@0.2.205
## 0.0.49
### Patch Changes
- Updated dependencies [[`281759f`](https://github.com/thirdweb-dev/js/commit/281759f06a276d08028825ed171f674984d66e85), [`2d98fe2`](https://github.com/thirdweb-dev/js/commit/2d98fe2799b0a5c17a41f0bb87c8852e21007e4a)]:
- thirdweb@5.118.0
- @thirdweb-dev/wagmi-adapter@0.2.204
## 0.0.48
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "wagmi-inapp",
"private": true,
"version": "0.0.48",
"version": "0.0.58",
"type": "module",
"scripts": {
"dev": "vite",
+70
View File
@@ -1,5 +1,75 @@
# @thirdweb-dev/nebula
## 0.2.116
### Patch Changes
- Updated dependencies [[`49194e3`](https://github.com/thirdweb-dev/js/commit/49194e3a2a1707c5d1e0a2cc67c328e84ef5e9a0)]:
- thirdweb@5.120.1
## 0.2.115
### Patch Changes
- Updated dependencies [[`23d74a0`](https://github.com/thirdweb-dev/js/commit/23d74a0a54247930e6889bbf66f88fa673a23f1a)]:
- thirdweb@5.120.0
## 0.2.114
### Patch Changes
- Updated dependencies [[`83198b2`](https://github.com/thirdweb-dev/js/commit/83198b2ea4dd29b1debb7db2dc2eabba57e9c4d7), [`ad49560`](https://github.com/thirdweb-dev/js/commit/ad4956033107c52ecdf4cd9f5b2bff87867f3bec)]:
- thirdweb@5.119.4
## 0.2.113
### Patch Changes
- Updated dependencies [[`3a18c6e`](https://github.com/thirdweb-dev/js/commit/3a18c6e6a8c12cecaf684fff2dfc5a73c77c40c9)]:
- thirdweb@5.119.3
## 0.2.112
### Patch Changes
- Updated dependencies [[`32c2ff6`](https://github.com/thirdweb-dev/js/commit/32c2ff62f8a2ca8da82c1e8d9bb73def95ec41db)]:
- thirdweb@5.119.2
## 0.2.111
### Patch Changes
- Updated dependencies [[`e13b9a7`](https://github.com/thirdweb-dev/js/commit/e13b9a784aca3a9b5d797fc6e011c6d1a10542e9), [`da4a4a5`](https://github.com/thirdweb-dev/js/commit/da4a4a540a6b141050af8fc8332621826d8dd835)]:
- thirdweb@5.119.1
## 0.2.110
### Patch Changes
- Updated dependencies [[`5352152`](https://github.com/thirdweb-dev/js/commit/53521528353a00691e82405460d4fb869ac986de)]:
- thirdweb@5.119.0
## 0.2.109
### Patch Changes
- Updated dependencies [[`1caf6dd`](https://github.com/thirdweb-dev/js/commit/1caf6dd4609ac72a06999ef0d70f31a371e5108a)]:
- thirdweb@5.118.2
## 0.2.108
### Patch Changes
- Updated dependencies [[`b50e304`](https://github.com/thirdweb-dev/js/commit/b50e304e0ccd1ac7eae551c3d49e82312ffc82d1)]:
- thirdweb@5.118.1
## 0.2.107
### Patch Changes
- Updated dependencies [[`281759f`](https://github.com/thirdweb-dev/js/commit/281759f06a276d08028825ed171f674984d66e85), [`2d98fe2`](https://github.com/thirdweb-dev/js/commit/2d98fe2799b0a5c17a41f0bb87c8852e21007e4a)]:
- thirdweb@5.118.0
## 0.2.106
### Patch Changes
+1 -1
View File
@@ -57,5 +57,5 @@
"type": "module",
"types": "./dist/types/exports/thirdweb.d.ts",
"typings": "./dist/types/exports/thirdweb.d.ts",
"version": "0.2.106"
"version": "0.2.116"
}
+73
View File
@@ -1,5 +1,78 @@
# thirdweb
## 5.120.1
### Patch Changes
- [#8801](https://github.com/thirdweb-dev/js/pull/8801) [`49194e3`](https://github.com/thirdweb-dev/js/commit/49194e3a2a1707c5d1e0a2cc67c328e84ef5e9a0) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - Fix Arc Testnet native currency decimals (USDC) from 6 to 18 to match the chain's RPC balance encoding
## 5.120.0
### Minor Changes
- [#8764](https://github.com/thirdweb-dev/js/pull/8764) [`23d74a0`](https://github.com/thirdweb-dev/js/commit/23d74a0a54247930e6889bbf66f88fa673a23f1a) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - [SDK] Add RampNow as a new onramp provider
## 5.119.4
### Patch Changes
- [#8733](https://github.com/thirdweb-dev/js/pull/8733) [`83198b2`](https://github.com/thirdweb-dev/js/commit/83198b2ea4dd29b1debb7db2dc2eabba57e9c4d7) Thanks [@Dhaiwat10](https://github.com/Dhaiwat10)! - Updates the hardcoded ENS Universal Resolver address from 0xce01f8eee7E479C928F8919abD53E553a36CeF67 (old) to 0xeeeeeeee14d718c2b47d9923deab1335e144eeee (new)
- [#8735](https://github.com/thirdweb-dev/js/pull/8735) [`ad49560`](https://github.com/thirdweb-dev/js/commit/ad4956033107c52ecdf4cd9f5b2bff87867f3bec) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - ENS: add coinType param to reverse resolver
## 5.119.3
### Patch Changes
- [#8726](https://github.com/thirdweb-dev/js/pull/8726) [`3a18c6e`](https://github.com/thirdweb-dev/js/commit/3a18c6e6a8c12cecaf684fff2dfc5a73c77c40c9) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - [CLI] fix stylus abi exports
## 5.119.2
### Patch Changes
- [#8724](https://github.com/thirdweb-dev/js/pull/8724) [`32c2ff6`](https://github.com/thirdweb-dev/js/commit/32c2ff62f8a2ca8da82c1e8d9bb73def95ec41db) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - [CLI] create-stylus fixes
## 5.119.1
### Patch Changes
- [#8700](https://github.com/thirdweb-dev/js/pull/8700) [`e13b9a7`](https://github.com/thirdweb-dev/js/commit/e13b9a784aca3a9b5d797fc6e011c6d1a10542e9) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - Deprecate the `thirdweb create` CLI command
- [#8698](https://github.com/thirdweb-dev/js/pull/8698) [`da4a4a5`](https://github.com/thirdweb-dev/js/commit/da4a4a540a6b141050af8fc8332621826d8dd835) Thanks [@Yash094](https://github.com/Yash094)! - Add `screen` prop to `useWalletDetailsModal` to allow opening the modal directly at a specific screen. Use `screen: "export"` to open directly at the Export Private Key screen.
## 5.119.0
### Minor Changes
- [#8686](https://github.com/thirdweb-dev/js/pull/8686) [`5352152`](https://github.com/thirdweb-dev/js/commit/53521528353a00691e82405460d4fb869ac986de) Thanks [@Yash094](https://github.com/Yash094)! - Add `requireApproval` option to `useConnectModal` hook to require terms of service and privacy policy acceptance before connecting an in-app wallet
## 5.118.2
### Patch Changes
- [#8671](https://github.com/thirdweb-dev/js/pull/8671) [`1caf6dd`](https://github.com/thirdweb-dev/js/commit/1caf6dd4609ac72a06999ef0d70f31a371e5108a) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - fix walletconnect not working on berachain and unallowlisted chains
## 5.118.1
### Patch Changes
- [#8664](https://github.com/thirdweb-dev/js/pull/8664) [`b50e304`](https://github.com/thirdweb-dev/js/commit/b50e304e0ccd1ac7eae551c3d49e82312ffc82d1) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Fix SiteLink not handling hashed URL paths
## 5.118.0
### Minor Changes
- [#8634](https://github.com/thirdweb-dev/js/pull/8634) [`281759f`](https://github.com/thirdweb-dev/js/commit/281759f06a276d08028825ed171f674984d66e85) Thanks [@montycheese](https://github.com/montycheese)! - Add Base Account SDK integration with `@base-org/account`
- Add @base-org/account 2.5.0 dependency
- Introduce Base Account SDK wallet connector
- Add base-account-web.ts with EIP-1193 provider implementation
- Add base-account-wallet.ts with core wallet logic
- Add types and helper function exports
### Patch Changes
- [#8643](https://github.com/thirdweb-dev/js/pull/8643) [`2d98fe2`](https://github.com/thirdweb-dev/js/commit/2d98fe2799b0a5c17a41f0bb87c8852e21007e4a) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Support linking accounts with redirect mode
## 5.117.2
### Patch Changes
+3 -2
View File
@@ -11,6 +11,7 @@
"url": "https://github.com/thirdweb-dev/js/issues"
},
"dependencies": {
"@base-org/account": "2.5.0",
"@coinbase/wallet-sdk": "4.3.0",
"@emotion/react": "11.14.0",
"@emotion/styled": "11.14.1",
@@ -343,7 +344,7 @@
"lint": "knip && biome check ./src && tsc --project ./tsconfig.build.json --module nodenext --moduleResolution nodenext --noEmit",
"size": "size-limit",
"storybook": "storybook dev -p 6006",
"test": "NODE_OPTIONS=--max-old-space-size=8192 vitest run -c ./test/vitest.config.ts --coverage",
"test": "NODE_OPTIONS=--max-old-space-size=12288 vitest run -c ./test/vitest.config.ts --coverage",
"test:cov": "NODE_OPTIONS=--max-old-space-size=8192 vitest dev -c ./test/vitest.config.ts --coverage",
"test:dev": "NODE_OPTIONS=--max-old-space-size=8192 vitest run -c ./test/vitest.config.ts",
"test:react": "vitest run -c ./test/vitest.config.ts dev --ui src/react",
@@ -430,5 +431,5 @@
}
},
"typings": "./dist/types/exports/thirdweb.d.ts",
"version": "5.117.2"
"version": "5.120.1"
}
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 1280">
<defs>
<style>
.cls-1 {
fill: blue;
}
</style>
</defs>
<path class="cls-1" d="M0,101.12c0-34.64,0-51.95,6.53-65.28,6.25-12.76,16.56-23.07,29.32-29.32C49.17,0,66.48,0,101.12,0h1077.76c34.63,0,51.96,0,65.28,6.53,12.75,6.25,23.06,16.56,29.32,29.32,6.52,13.32,6.52,30.64,6.52,65.28v1077.76c0,34.63,0,51.96-6.52,65.28-6.26,12.75-16.57,23.06-29.32,29.32-13.32,6.52-30.65,6.52-65.28,6.52H101.12c-34.64,0-51.95,0-65.28-6.52-12.76-6.26-23.07-16.57-29.32-29.32-6.53-13.32-6.53-30.65-6.53-65.28V101.12Z"/>
</svg>

After

Width:  |  Height:  |  Size: 672 B

@@ -175,5 +175,33 @@
"native": null,
"universal": null
}
},
{
"id": "org.base.account",
"name": "Base Account",
"homepage": "https://base.org/",
"image_id": "base.svg",
"app": {
"browser": null,
"ios": null,
"android": null,
"mac": null,
"windows": null,
"linux": null,
"chrome": null,
"firefox": null,
"safari": null,
"edge": null,
"opera": null
},
"rdns": "org.base.account",
"mobile": {
"native": null,
"universal": null
},
"desktop": {
"native": null,
"universal": null
}
}
]
@@ -115,4 +115,33 @@ describe.runIf(process.env.TW_SECRET_KEY)("Bridge.Onramp.prepare", () => {
// Steps array should be defined (it may be empty if the provider supports the destination token natively)
expect(Array.isArray(prepared.steps)).toBe(true);
});
// The Rampnow live-API test is gated on a separate env var because the
// server-side schema for `onramp: "rampnow"` lands in a separate deploy.
// Once `api.thirdweb-dev.com` accepts the new provider, drop the runIf and
// mirror the stripe/coinbase/transak assertions above.
it.runIf(process.env.TW_BRIDGE_RAMPNOW)(
"should prepare a Rampnow onramp successfully",
async () => {
const prepared = await Onramp.prepare({
amount: toWei("0.01"),
chainId: 1,
client: TEST_CLIENT,
onramp: "rampnow",
receiver: RECEIVER_ADDRESS,
tokenAddress: NATIVE_TOKEN_ADDRESS,
});
expect(prepared).toBeDefined();
expect(typeof prepared.destinationAmount).toBe("bigint");
expect(prepared.destinationAmount > 0n).toBe(true);
expect(prepared.link).toBeDefined();
expect(typeof prepared.link).toBe("string");
expect(prepared.intent).toBeDefined();
expect(prepared.intent.receiver.toLowerCase()).toBe(
RECEIVER_ADDRESS.toLowerCase(),
);
expect(Array.isArray(prepared.steps)).toBe(true);
},
);
});
+5 -5
View File
@@ -13,7 +13,7 @@ import type { TokenWithPrices } from "./types/Token.js";
export { status } from "./OnrampStatus.js";
type OnrampIntent = {
onramp: "stripe" | "coinbase" | "transak";
onramp: "stripe" | "coinbase" | "transak" | "rampnow";
chainId: number;
tokenAddress: ox__Address.Address;
receiver: ox__Address.Address;
@@ -42,7 +42,7 @@ type OnrampPrepareQuoteResponseData = {
// Explicit type for the API request body
interface OnrampApiRequestBody {
onramp: "stripe" | "coinbase" | "transak";
onramp: "stripe" | "coinbase" | "transak" | "rampnow";
chainId: number;
tokenAddress: ox__Address.Address;
receiver: ox__Address.Address;
@@ -128,7 +128,7 @@ interface OnrampApiRequestBody {
*
* @param options - The options for preparing the onramp.
* @param options.client - Your thirdweb client.
* @param options.onramp - The onramp provider to use (e.g., "stripe", "coinbase", "transak").
* @param options.onramp - The onramp provider to use (e.g., "stripe", "coinbase", "transak", "rampnow").
* @param options.chainId - The destination chain ID.
* @param options.tokenAddress - The destination token address.
* @param options.receiver - The address that will receive the output token.
@@ -272,8 +272,8 @@ export declare namespace prepare {
export type Options = {
/** Your thirdweb client */
client: ThirdwebClient;
/** The onramp provider to use (e.g., "stripe", "coinbase", "transak") */
onramp: "stripe" | "coinbase" | "transak";
/** The onramp provider to use (e.g., "stripe", "coinbase", "transak", "rampnow") */
onramp: "stripe" | "coinbase" | "transak" | "rampnow";
/** The destination chain ID */
chainId: number;
/** The destination token address */
@@ -12,6 +12,6 @@ export const arcTestnet = /* @__PURE__ */ defineChain({
],
id: 5042002,
name: "Arc Testnet",
nativeCurrency: { decimals: 6, name: "USDC", symbol: "USDC" },
nativeCurrency: { decimals: 18, name: "USDC", symbol: "USDC" },
testnet: true,
});
+8
View File
@@ -44,6 +44,14 @@ async function main() {
break;
}
case "create": {
console.info(
"The 'thirdweb create' command is deprecated. Please use the thirdweb dashboard instead: https://thirdweb.com/dashboard",
);
process.exit(1);
break;
}
case "login": {
// Not implemented yet
console.info(
@@ -1,6 +1,7 @@
import { spawnSync } from "node:child_process";
import { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { parseAbiItem } from "abitype";
import open from "open";
import ora, { type Ora } from "ora";
import prompts from "prompts";
@@ -16,12 +17,6 @@ export async function publishStylus(secretKey?: string) {
checkPrerequisites(spinner, "cargo", ["--version"], "Rust (cargo)");
checkPrerequisites(spinner, "rustc", ["--version"], "Rust compiler (rustc)");
checkPrerequisites(
spinner,
"solc",
["--version"],
"Solidity compiler (solc)",
);
const uri = await buildStylus(spinner, secretKey);
@@ -35,12 +30,6 @@ export async function deployStylus(secretKey?: string) {
checkPrerequisites(spinner, "cargo", ["--version"], "Rust (cargo)");
checkPrerequisites(spinner, "rustc", ["--version"], "Rust compiler (rustc)");
checkPrerequisites(
spinner,
"solc",
["--version"],
"Solidity compiler (solc)",
);
const uri = await buildStylus(spinner, secretKey);
@@ -99,9 +88,9 @@ async function buildStylus(spinner: Ora, secretKey?: string) {
}
spinner.succeed("Initcode generated.");
// Step 3: Run stylus command to generate abi
// Step 3: Run stylus command to generate abi (plain Solidity, no solc needed)
spinner.start("Generating ABI...");
const abiResult = spawnSync("cargo", ["stylus", "export-abi", "--json"], {
const abiResult = spawnSync("cargo", ["stylus", "export-abi"], {
encoding: "utf-8",
});
if (abiResult.status !== 0) {
@@ -109,15 +98,21 @@ async function buildStylus(spinner: Ora, secretKey?: string) {
process.exit(1);
}
const abiContent = abiResult.stdout.trim();
if (!abiContent) {
const solidityOutput = abiResult.stdout.trim();
if (!solidityOutput) {
spinner.fail("Failed to generate ABI.");
process.exit(1);
}
const interfaces = parseSolidityInterfaces(solidityOutput);
if (interfaces.length === 0) {
spinner.fail("No interfaces found in ABI output.");
process.exit(1);
}
spinner.succeed("ABI generated.");
// Step 3.5: detect the constructor
spinner.start("Detecting constructor…");
spinner.start("Detecting constructor\u2026");
const constructorResult = spawnSync("cargo", ["stylus", "constructor"], {
encoding: "utf-8",
});
@@ -127,23 +122,16 @@ async function buildStylus(spinner: Ora, secretKey?: string) {
process.exit(1);
}
const constructorSigRaw = constructorResult.stdout.trim(); // e.g. "constructor(address owner)"
const constructorSigRaw = constructorResult.stdout.trim();
spinner.succeed(`Constructor found: ${constructorSigRaw || "none"}`);
// Step 4: Process the output
const parts = abiContent.split(/======= <stdin>:/g).filter(Boolean);
const contractNames = extractContractNamesFromExportAbi(abiContent);
let selectedIndex = 0;
let selectedContractName: string | undefined;
let selectedAbiContent: string | undefined;
if (contractNames.length === 1) {
selectedContractName = contractNames[0]?.replace(/^I/, "");
selectedAbiContent = parts[0];
} else {
if (interfaces.length > 1) {
const response = await prompts({
choices: contractNames.map((name, idx) => ({
title: name,
choices: interfaces.map((iface, idx) => ({
title: iface.name,
value: idx,
})),
message: "Select entrypoint:",
@@ -151,46 +139,31 @@ async function buildStylus(spinner: Ora, secretKey?: string) {
type: "select",
});
const selectedIndex = response.contract;
if (typeof selectedIndex !== "number") {
if (typeof response.contract !== "number") {
spinner.fail("No contract selected.");
process.exit(1);
}
selectedContractName = contractNames[selectedIndex]?.replace(/^I/, "");
selectedAbiContent = parts[selectedIndex];
selectedIndex = response.contract;
}
if (!selectedAbiContent) {
throw new Error("Entrypoint not found");
}
if (!selectedContractName) {
spinner.fail("Error: Could not determine contract name from ABI output.");
const selectedInterface = interfaces[selectedIndex];
if (!selectedInterface) {
spinner.fail("No interface found.");
process.exit(1);
}
let cleanedAbi = "";
try {
const jsonMatch = selectedAbiContent.match(/\[.*\]/s);
if (jsonMatch) {
cleanedAbi = jsonMatch[0];
} else {
throw new Error("No valid JSON ABI found in the file.");
}
} catch (error) {
spinner.fail("Error: ABI file contains invalid format.");
console.error(error);
process.exit(1);
}
// biome-ignore lint/suspicious/noExplicitAny: <>
const abiArray: any[] = JSON.parse(cleanedAbi);
const selectedContractName = selectedInterface.name.replace(/^I/, "");
// biome-ignore lint/suspicious/noExplicitAny: ABI is untyped JSON from parseAbiItem
const abiArray: any[] = selectedInterface.abi;
const constructorAbi = constructorSigToAbi(constructorSigRaw);
if (constructorAbi && !abiArray.some((e) => e.type === "constructor")) {
abiArray.unshift(constructorAbi); // put it at the top for readability
if (
constructorAbi &&
// biome-ignore lint/suspicious/noExplicitAny: ABI entries have varying shapes
!abiArray.some((e: any) => e.type === "constructor")
) {
abiArray.unshift(constructorAbi);
}
const metadata = {
@@ -256,10 +229,94 @@ async function buildStylus(spinner: Ora, secretKey?: string) {
}
}
function extractContractNamesFromExportAbi(abiRawOutput: string): string[] {
return [...abiRawOutput.matchAll(/<stdin>:(I?[A-Za-z0-9_]+)/g)]
.map((m) => m[1])
.filter((name): name is string => typeof name === "string");
// biome-ignore lint/suspicious/noExplicitAny: ABI items from parseAbiItem are untyped
type AbiEntry = any;
type ParsedInterface = { name: string; abi: AbiEntry[] };
function parseSolidityInterfaces(source: string): ParsedInterface[] {
const results: ParsedInterface[] = [];
const ifaceRegex = /interface\s+(I?[A-Za-z0-9_]+)\s*\{([\s\S]*?)\n\}/g;
for (
let ifaceMatch = ifaceRegex.exec(source);
ifaceMatch !== null;
ifaceMatch = ifaceRegex.exec(source)
) {
const name = ifaceMatch[1] ?? "";
const body = ifaceMatch[2] ?? "";
const abi: AbiEntry[] = [];
// Build struct lookup: name -> tuple type string
const structs = new Map<string, string>();
const structRegex = /struct\s+(\w+)\s*\{([^}]*)\}/g;
for (
let structMatch = structRegex.exec(body);
structMatch !== null;
structMatch = structRegex.exec(body)
) {
const fields = (structMatch[2] ?? "")
.split(";")
.map((f) => f.trim())
.filter(Boolean)
.map((f) => f.split(/\s+/)[0] ?? "");
structs.set(structMatch[1] ?? "", `(${fields.join(",")})`);
}
// Resolve struct references in a type string (iterative for nested structs)
const resolveStructs = (sig: string): string => {
let resolved = sig;
for (let i = 0; i < 10; i++) {
let changed = false;
for (const [sName, sTuple] of structs) {
const re = new RegExp(`\\b${sName}\\b(\\[\\])?`, "g");
const next = resolved.replace(
re,
(_, arr) => `${sTuple}${arr ?? ""}`,
);
if (next !== resolved) {
resolved = next;
changed = true;
}
}
if (!changed) break;
}
return resolved;
};
// Extract each statement (function/error/event) delimited by ;
const statements = body
.split(";")
.map((s) => s.replace(/\n/g, " ").trim())
.filter(
(s) =>
s.startsWith("function ") ||
s.startsWith("error ") ||
s.startsWith("event "),
);
for (const stmt of statements) {
// Strip Solidity qualifiers that abitype doesn't expect
let cleaned = stmt
.replace(/\b(external|public|internal|private)\b/g, "")
.replace(/\b(memory|calldata|storage)\b/g, "")
.replace(/\s+/g, " ")
.trim();
// Resolve struct type names to tuple types
cleaned = resolveStructs(cleaned);
try {
const parsed = parseAbiItem(cleaned);
abi.push(parsed);
} catch {
// Skip unparseable items
}
}
results.push({ abi, name });
}
return results;
}
function getUrl(hash: string, command: string) {
@@ -8,12 +8,6 @@ export async function createStylusProject() {
checkPrerequisites(spinner, "cargo", ["--version"], "Rust (cargo)");
checkPrerequisites(spinner, "rustc", ["--version"], "Rust compiler (rustc)");
checkPrerequisites(
spinner,
"solc",
["--version"],
"Solidity compiler (solc)",
);
// Step 1: Ensure cargo is installed
const cargoCheck = spawnSync("cargo", ["--version"]);
@@ -24,7 +18,7 @@ export async function createStylusProject() {
// Step 2: Install stylus etc.
spinner.start("Installing Stylus...");
const install = spawnSync("cargo", ["install", "--force", "cargo-stylus"], {
const install = spawnSync("cargo", ["install", "cargo-stylus"], {
stdio: "inherit",
});
if (install.status !== 0) {
@@ -33,7 +27,7 @@ export async function createStylusProject() {
}
spinner.succeed("Stylus installed.");
spawnSync("rustup", ["default", "1.87"], {
spawnSync("rustup", ["default", "stable"], {
stdio: "inherit",
});
spawnSync("rustup", ["target", "add", "wasm32-unknown-unknown"], {
@@ -125,6 +125,7 @@ export type {
WalletConnectSession,
} from "../wallets/wallet-connect/receiver/types.js";
export type {
WalletDisconnectError,
WalletEmitter,
WalletEmitterEvents,
} from "../wallets/wallet-emitter.js";
+6
View File
@@ -11,6 +11,11 @@ export type {
InjectedSupportedWalletIds,
WCSupportedWalletIds,
} from "../wallets/__generated__/wallet-ids.js";
export type {
BaseAccountSDKWalletConnectionOptions,
BaseAccountWalletCreationOptions,
} from "../wallets/base-account/base-account-web.js";
export { isBaseAccountSDKWallet } from "../wallets/base-account/base-account-web.js";
export type {
CoinbaseSDKWalletConnectionOptions,
CoinbaseWalletCreationOptions,
@@ -124,6 +129,7 @@ export type {
WCConnectOptions,
} from "../wallets/wallet-connect/types.js";
export type {
WalletDisconnectError,
WalletEmitter,
WalletEmitterEvents,
} from "../wallets/wallet-emitter.js";
@@ -82,6 +82,7 @@ export {
getUserEmail,
getUserPhoneNumber,
linkProfile,
linkProfileWithRedirect,
preAuthenticate,
unlinkProfile,
} from "../../wallets/in-app/web/lib/auth/index.js";
@@ -14,14 +14,22 @@ export type ReverseParams = {
type: "bytes";
name: "reverseName";
}>;
coinType: AbiParameterToPrimitiveType<{
type: "uint256";
name: "coinType";
}>;
};
export const FN_SELECTOR = "0xec11c823" as const;
export const FN_SELECTOR = "0x5d78a217" as const;
const FN_INPUTS = [
{
name: "reverseName",
type: "bytes",
},
{
name: "coinType",
type: "uint256",
},
] as const;
const FN_OUTPUTS = [
{
@@ -33,9 +41,6 @@ const FN_OUTPUTS = [
{
type: "address",
},
{
type: "address",
},
] as const;
/**
@@ -70,7 +75,10 @@ export function isReverseSupported(availableSelectors: string[]) {
* ```
*/
export function encodeReverseParams(options: ReverseParams) {
return encodeAbiParameters(FN_INPUTS, [options.reverseName]);
return encodeAbiParameters(FN_INPUTS, [
options.reverseName,
options.coinType,
]);
}
/**
@@ -128,6 +136,6 @@ export async function reverse(options: BaseTransactionOptions<ReverseParams>) {
return readContract({
contract: options.contract,
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
params: [options.reverseName],
params: [options.reverseName, options.coinType],
});
}
@@ -1,5 +1,5 @@
export const UNIVERSAL_RESOLVER_ADDRESS =
"0xce01f8eee7E479C928F8919abD53E553a36CeF67";
"0xeeeeeeee14d718c2b47d9923deab1335e144eeee";
export const BASENAME_RESOLVER_ADDRESS =
"0xC6d566A56A1aFf6508b41f6c90ff131615583BCD";
export const BASE_SEPOLIA_BASENAME_RESOLVER_ADDRESS =
@@ -3,8 +3,6 @@ import { ethereum } from "../../chains/chain-definitions/ethereum.js";
import type { Chain } from "../../chains/types.js";
import type { ThirdwebClient } from "../../client/client.js";
import { getContract } from "../../contract/contract.js";
import { toHex } from "../../utils/encoding/hex.js";
import { packetToBytes } from "../../utils/ens/packetToBytes.js";
import { withCache } from "../../utils/promise/withCache.js";
import { reverse } from "./__generated__/UniversalResolver/read/reverse.js";
import { UNIVERSAL_RESOLVER_ADDRESS } from "./constants.js";
@@ -33,7 +31,9 @@ export type ResolveNameOptions = {
* @extension ENS
* @returns A promise that resolves to the Ethereum address.
*/
export async function resolveName(options: ResolveNameOptions) {
export async function resolveName(
options: ResolveNameOptions,
): Promise<string | null> {
const { client, address, resolverAddress, resolverChain } = options;
return withCache(
@@ -44,25 +44,28 @@ export async function resolveName(options: ResolveNameOptions) {
client,
});
const reverseName = toHex(
packetToBytes(`${address.toLowerCase().substring(2)}.addr.reverse`),
);
const [name, resolvedAddress] = await reverse({
const [name] = await reverse({
contract,
reverseName,
reverseName: address as `0x${string}`,
coinType: 60n,
}).catch((e) => {
if ("data" in e && e.data === "0x7199966d") {
return [null, address] as const;
// Re-throw verification errors so callers can detect data integrity issues
if (
typeof e === "object" &&
e !== null &&
"data" in e &&
typeof e.data === "string"
) {
// ReverseAddressMismatch(string,bytes) = 0xef9c03ce
if (e.data.startsWith("0xef9c03ce")) {
throw e;
}
}
throw e;
// Swallow expected "no resolver" / "no name" errors
return [null] as const;
});
if (address.toLowerCase() !== resolvedAddress.toLowerCase()) {
return null;
}
return name;
return name || null;
},
{
cacheKey: `ens:name:${resolverChain?.id || 1}:${address}`,
@@ -21,7 +21,7 @@ import { getInstalledModules } from "../__generated__/IModularCore/read/getInsta
import { grantMinterRole } from "../common/grantMinterRole.js";
import * as MintableERC721 from "./index.js";
describe.runIf(process.env.TW_SECRET_KEY)("ModularTokenERC721", () => {
describe.skip("ModularTokenERC721", () => {
let contract: ThirdwebContract;
beforeAll(async () => {
const address = await deployModularContract({
@@ -290,12 +290,14 @@ export async function getBuyWithFiatQuote(
// map preferred provider (FiatProvider) → onramp string expected by Onramp.prepare
const mapProviderToOnramp = (
provider?: FiatProvider,
): "stripe" | "coinbase" | "transak" => {
): "stripe" | "coinbase" | "transak" | "rampnow" => {
switch (provider) {
case "stripe":
return "stripe";
case "transak":
return "transak";
case "rampnow":
return "rampnow";
default: // default to coinbase when undefined or any other value
return "coinbase";
}
@@ -463,7 +465,7 @@ export async function getBuyWithFiatQuote(
onRampLink: prepared.link,
onRampToken: onRampTokenObject,
processingFees: [],
provider: (params.preferredProvider ?? "COINBASE") as FiatProvider,
provider: params.preferredProvider ?? "coinbase",
routingToken: routingTokenObject,
toAddress: params.toAddress,
toAmountMin: toAmountMin,
@@ -19,4 +19,4 @@ export type PayOnChainTransactionDetails = {
export type FiatProvider = (typeof FiatProviders)[number];
const FiatProviders = ["coinbase", "stripe", "transak"] as const;
const FiatProviders = ["coinbase", "stripe", "transak", "rampnow"] as const;
@@ -0,0 +1,109 @@
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { renderHook, waitFor } from "@testing-library/react";
import type React from "react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { TEST_CLIENT } from "~test/test-clients.js";
import { prepare as prepareOnramp } from "../../../../bridge/Onramp.js";
import { getToken } from "../../../../pay/convert/get-token.js";
import { useBuyWithFiatQuotesForProviders } from "./useBuyWithFiatQuotesForProviders.js";
vi.mock("../../../../bridge/Onramp.js");
vi.mock("../../../../pay/convert/get-token.js");
const RECEIVER = "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709" as const;
const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" as const;
describe("useBuyWithFiatQuotesForProviders", () => {
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(getToken).mockResolvedValue({
address: USDC,
chainId: 1,
decimals: 6,
name: "USD Coin",
priceUsd: 1,
prices: { USD: 1 },
symbol: "USDC",
});
// Return a minimal valid prepared-onramp response per call.
vi.mocked(prepareOnramp).mockImplementation(async (opts) => ({
currency: opts.currency ?? "USD",
currencyAmount: 1,
destinationAmount: opts.amount ?? 1n,
destinationToken: {
address: opts.tokenAddress,
chainId: opts.chainId,
decimals: 6,
name: "USD Coin",
priceUsd: 1,
prices: { USD: 1 },
symbol: "USDC",
},
id: `mock-${opts.onramp}`,
intent: {
amount: (opts.amount ?? 1n).toString(),
chainId: opts.chainId,
onramp: opts.onramp,
receiver: opts.receiver,
tokenAddress: opts.tokenAddress,
},
link: `https://example.com/${opts.onramp}`,
steps: [],
timestamp: 0,
}));
});
const wrapper = ({ children }: { children: React.ReactNode }) => {
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
});
return (
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
);
};
it("fans out to all four onramp providers (including rampnow)", async () => {
const { result } = renderHook(
() =>
useBuyWithFiatQuotesForProviders({
amount: "10",
chainId: 1,
client: TEST_CLIENT,
country: "US",
currency: "USD",
receiver: RECEIVER,
tokenAddress: USDC,
}),
{ wrapper },
);
await waitFor(() => {
expect(result.current.every((q) => q.isSuccess)).toBe(true);
});
expect(result.current).toHaveLength(4);
// Each provider should be called exactly once with the expected `onramp` value.
const calls = vi.mocked(prepareOnramp).mock.calls.map((c) => c[0].onramp);
expect(calls.sort()).toEqual(
["coinbase", "rampnow", "stripe", "transak"].sort(),
);
// The hook should surface the prepared link per provider.
const links = result.current.map((q) => q.data?.link);
expect(links).toContain("https://example.com/rampnow");
expect(links).toContain("https://example.com/stripe");
expect(links).toContain("https://example.com/coinbase");
expect(links).toContain("https://example.com/transak");
});
it("is disabled when no params are provided", () => {
const { result } = renderHook(() => useBuyWithFiatQuotesForProviders(), {
wrapper,
});
expect(result.current).toHaveLength(4);
expect(result.current.every((q) => !q.isSuccess && !q.isError)).toBe(true);
expect(vi.mocked(prepareOnramp)).not.toHaveBeenCalled();
});
});
@@ -60,13 +60,13 @@ type UseBuyWithFiatQuotesForProvidersResult = {
/**
* @internal
* Hook to get prepared onramp quotes from Coinbase, Stripe, and Transak providers.
* Hook to get prepared onramp quotes from Coinbase, Stripe, Transak, and Rampnow providers.
*/
export function useBuyWithFiatQuotesForProviders(
params?: UseBuyWithFiatQuotesForProvidersParams,
queryOptions?: OnrampQuoteQueryOptions,
): UseBuyWithFiatQuotesForProvidersResult {
const providers = ["coinbase", "stripe", "transak"] as const;
const providers = ["coinbase", "stripe", "transak", "rampnow"] as const;
const queries = useQueries({
queries: providers.map((provider) => ({
@@ -81,6 +81,23 @@ describe("useBridgePrepare", () => {
expect(onrampRequest.client).toBe(mockClient);
});
it("should accept all supported onramp providers including rampnow", () => {
const providers = ["stripe", "coinbase", "transak", "rampnow"] as const;
for (const onramp of providers) {
const onrampRequest: BridgePrepareRequest = {
amount: 1000000n,
chainId: 1,
client: mockClient,
onramp,
receiver: "0x1234567890123456789012345678901234567890",
tokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
type: "onramp",
};
expect(onrampRequest.type).toBe("onramp");
expect(onrampRequest.onramp).toBe(onramp);
}
});
it("should handle UseBridgePrepareParams with enabled option", () => {
const params: UseBridgePrepareParams = {
amount: 1000000n,
@@ -94,7 +94,7 @@ export function useLinkProfile() {
onSuccess() {
setTimeout(() => {
queryClient.invalidateQueries({ queryKey: ["profiles"] });
}, 500);
}, 1000);
},
});
}
@@ -21,7 +21,9 @@ import { Text } from "../../components/text.js";
interface FiatProviderSelectionProps {
client: ThirdwebClient;
onProviderSelected: (provider: "coinbase" | "stripe" | "transak") => void;
onProviderSelected: (
provider: "coinbase" | "stripe" | "transak" | "rampnow",
) => void;
toChainId: number;
toTokenAddress: string;
toAddress: string;
@@ -49,6 +51,12 @@ const PROVIDERS = [
id: "transak" as const,
name: "Transak",
},
{
description: "Cards, bank transfers and more",
iconUri: "https://app.rampnow.io/favicon.ico",
id: "rampnow" as const,
name: "Rampnow",
},
];
export function FiatProviderSelection({
@@ -184,7 +184,7 @@ export function PaymentSelection({
};
const handleOnrampProviderSelected = (
provider: "coinbase" | "stripe" | "transak",
provider: "coinbase" | "stripe" | "transak" | "rampnow",
) => {
const recipientAddress =
receiverAddress || payerWallet?.getAccount()?.address;
@@ -44,5 +44,5 @@ export type PaymentMethod =
type: "fiat";
payerWallet?: Wallet;
currency: SupportedFiatCurrency;
onramp: "stripe" | "coinbase" | "transak";
onramp: "stripe" | "coinbase" | "transak" | "rampnow";
};
@@ -383,8 +383,11 @@ export function DetailsModal(props: {
connectOptions: DetailsModalConnectOptions | undefined;
assetTabs?: AssetTabs[];
showBalanceInFiat?: SupportedFiatCurrency;
initialScreen?: WalletDetailsModalScreen;
}) {
const [screen, setScreen] = useState<WalletDetailsModalScreen>("main");
const [screen, setScreen] = useState<WalletDetailsModalScreen>(
props.initialScreen || "main",
);
const { disconnect } = useDisconnect();
const [isOpen, setIsOpen] = useState(true);
@@ -887,7 +890,7 @@ export function DetailsModal(props: {
supportedTokens={props.supportedTokens}
/>
);
} else if (screen === "private-key") {
} else if (screen === "private-key" || screen === "export") {
content = (
<PrivateKey
client={client} // do not use the useCustomTheme hook to get this, it's not valid here
@@ -1724,6 +1727,22 @@ export type UseWalletDetailsModalOptions = {
* @param screen The name of the screen that was being shown when user closed the modal
*/
onClose?: (screen: string) => void;
/**
* The initial screen to show when the modal opens.
*
* @defaultValue "main"
*
* @example
* ```tsx
* // Open directly to the Export Private Key screen
* detailsModal.open({
* client,
* screen: "export"
* });
* ```
*/
screen?: WalletDetailsModalScreen;
};
/**
@@ -1750,6 +1769,14 @@ export type UseWalletDetailsModalOptions = {
* }
* ```
*
* ### Open directly to Export Private Key screen
* ```tsx
* detailsModal.open({
* client,
* screen: "export"
* });
* ```
*
* ### Callback for when the modal is closed
* ```tsx
* detailsModal.open({
@@ -1800,6 +1827,7 @@ export function useWalletDetailsModal() {
showTestnetFaucet: props.showTestnetFaucet,
}}
displayBalanceToken={props.displayBalanceToken}
initialScreen={props.screen}
locale={locale}
onDisconnect={(info) => {
props.onDisconnect?.(info);
@@ -118,6 +118,7 @@ function Modal(
termsOfServiceUrl: props.termsOfServiceUrl,
title: props.title,
titleIconUrl: props.titleIcon,
requireApproval: props.requireApproval,
};
}, [
props.privacyPolicyUrl,
@@ -125,6 +126,7 @@ function Modal(
props.termsOfServiceUrl,
props.title,
props.titleIcon,
props.requireApproval,
]);
return (
@@ -449,6 +451,22 @@ export type UseConnectModalOptions = {
* Refer to the [`SiweAuthOptions`](https://portal.thirdweb.com/references/typescript/v5/SiweAuthOptions) for more details
*/
auth?: SiweAuthOptions;
/**
* Require terms of service and privacy policy to be accepted before connecting an in-app wallet.
*
* By default it's `false`
* @example
* ```tsx
* function Example() {
* const { connect } = useConnectModal();
* return <button onClick={() => connect({ client, requireApproval: true })}>
* Connect
* </button>
* }
* ```
*/
requireApproval?: boolean;
};
// TODO: consilidate Button/Embed/Modal props into one type with extras
@@ -62,4 +62,25 @@ describe("SiteLink", () => {
expect(anchor).toBeTruthy();
await waitFor(() => expect(anchor?.href).toContain("walletId=inApp"));
});
it("preserves hash fragment for hash-routed URLs", async () => {
const testUrl = "https://snapshot.org/#/s:wampei.eth";
const { container } = render(
<SiteLink client={TEST_CLIENT} href={testUrl}>
Test Link
</SiteLink>,
{
setConnectedWallet: true,
},
);
const anchor = container.querySelector("a");
expect(anchor).toBeTruthy();
await waitFor(() => {
const href = anchor?.href ?? "";
// Hash fragment must be preserved in the URL
expect(href).toContain("#/s:wampei.eth");
expect(href).toContain("walletId=");
});
});
});
File diff suppressed because it is too large Load Diff
+352 -308
View File
@@ -2,421 +2,433 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
// 443 wallets
// 476 wallets
export type WCSupportedWalletIds =
| "io.1inch.wallet"
| "com.binance.wallet"
| "com.ledger"
| "com.bitpay"
| "com.bestwallet"
| "io.metamask"
| "com.trustwallet.app"
| "io.zerion.wallet"
| "com.okex.wallet"
| "com.binance.wallet"
| "com.bitget.web3"
| "com.safepal"
| "pro.tokenpocket"
| "org.uniswap"
| "com.bestwallet"
| "com.ledger"
| "com.bybit"
| "com.elrond.maiar.wallet"
| "com.fireblocks"
| "com.bitget.web3"
| "pro.tokenpocket"
| "com.safepal"
| "org.uniswap"
| "io.zerion.wallet"
| "com.elrond.maiar.wallet"
| "com.crypto.wallet"
| "com.bitcoin"
| "com.bifrostwallet"
| "im.token"
| "io.1inch.wallet"
| "com.blockchain.login"
| "global.safe"
| "com.bitpay"
| "jp.co.rakuten-wallet"
| "co.arculus"
| "com.bybit"
| "com.blockchain.login"
| "io.trezor"
| "im.token"
| "global.safe"
| "xyz.ctrl"
| "co.arculus"
| "com.roninchain.wallet"
| "com.okex.wallet"
| "com.wemixplay"
| "me.haha"
| "com.hashpack.wallet"
| "me.rainbow"
| "id.co.pintu"
| "com.exodus"
| "com.wigwam.wallet"
| "com.tangem"
| "ag.jup"
| "com.exodus"
| "com.hashpack.wallet"
| "id.co.pintu"
| "network.blackfort"
| "io.ibvm"
| "com.bee"
| "com.kraken"
| "io.magiceden.wallet"
| "org.hot-labs.app"
| "com.dcentwallet"
| "cc.avacus"
| "com.kucoin"
| "app.keplr"
| "org.mathwallet"
| "io.yowallet"
| "io.internetmoney"
| "com.opera"
| "com.wigwam.wallet"
| "app.backpack"
| "com.robinhood.wallet"
| "com.socios.app"
| "com.chain"
| "app.core.extension"
| "io.huddln"
| "xyz.joeywallet"
| "so.onekey.app.wallet"
| "com.flowfoundation.wallet"
| "app.wombat"
| "pk.modular"
| "app.subwallet"
| "xyz.argent"
| "app.kabila"
| "com.mewwallet"
| "com.sabay.wallet"
| "io.loopring.wallet"
| "io.tokoin"
| "com.klipwallet"
| "io.novawallet"
| "org.thorwallet"
| "com.zengo"
| "com.oasys-wallet"
| "com.fastex.wallet"
| "network.cvl"
| "com.bitso"
| "io.cypherhq"
| "com.valoraapp"
| "io.leapwallet"
| "app.everspace"
| "io.atomicwallet"
| "xyz.coca"
| "io.kriptomat"
| "money.unstoppable"
| "xyz.uniultra.wallet"
| "io.oxalus"
| "com.ullapay"
| "cc.avacus"
| "me.rainbow"
| "so.onekey.app.wallet"
| "me.haha"
| "com.bee"
| "ag.jup"
| "app.keplr"
| "org.hot-labs"
| "com.dcentwallet"
| "com.kraken"
| "com.kucoin"
| "io.magiceden.wallet"
| "com.tomi"
| "xyz.frontier.wallet"
| "com.coldwallet"
| "xyz.coca"
| "app.krystal"
| "network.over"
| "org.creditcoin.app"
| "org.gooddollar"
| "com.monarchwallet"
| "tech.okto"
| "org.alephium"
| "com.mtpelerin"
| "com.burritowallet"
| "io.enjin"
| "com.veworld"
| "co.family.wallet"
| "cc.localtrade.lab"
| "com.ellipal"
| "com.xcapit"
| "io.ibvm"
| "com.mewwallet"
| "com.socios.app"
| "xyz.argent"
| "org.thorwallet"
| "io.internetmoney"
| "org.mathwallet"
| "io.cypherhq"
| "io.novawallet"
| "io.yowallet"
| "com.flowfoundation.wallet"
| "app.kabila"
| "com.opera"
| "com.valoraapp"
| "com.robinhood.wallet"
| "com.chain"
| "io.huddln"
| "app.core.extension"
| "world.freedom"
| "money.unstoppable"
| "pk.modular"
| "app.wombat"
| "com.klipwallet"
| "com.gemwallet"
| "dev.auroracloud"
| "com.sabay.wallet"
| "com.zengo"
| "xyz.joeywallet"
| "io.tokoin"
| "io.alpha-u.wallet.web"
| "network.cvl"
| "io.leapwallet"
| "io.xenea"
| "com.oasys-wallet"
| "com.bitso"
| "io.enjin"
| "com.coldwallet"
| "org.creditcoin.app"
| "app.everspace"
| "app.zeal"
| "io.compasswallet"
| "com.coin98"
| "app.linen"
| "app.whitewallet"
| "ai.purewallet"
| "com.fastex.wallet"
| "io.kriptomat"
| "com.ullapay"
| "io.atomicwallet"
| "com.pionewallet"
| "io.oxalus"
| "xyz.uniultra.wallet"
| "xyz.frontier.wallet"
| "com.coolbitx.cwsapp"
| "io.nabox"
| "io.noone"
| "app.walletnow"
| "org.gooddollar"
| "com.cakewallet"
| "com.ellipal"
| "app.krystal"
| "com.monarchwallet"
| "com.burritowallet"
| "co.family.wallet"
| "com.mtpelerin"
| "app.keyring"
| "cc.localtrade.lab"
| "tech.okto"
| "com.xcapit"
| "com.gayawallet"
| "app.nightly"
| "com.coin98"
| "xyz.coca"
| "app.linen"
| "dev.auroracloud"
| "com.coinomi"
| "my.mone"
| "org.alephium"
| "com.alicebob"
| "io.koalawallet"
| "com.veworld"
| "com.withpaper"
| "io.noone"
| "network.haqq"
| "io.ricewallet"
| "finance.openwallet"
| "me.iopay"
| "app.walletnow"
| "io.okse"
| "io.koalawallet"
| "network.over"
| "com.aktionariat"
| "com.cakewallet"
| "com.paybolt"
| "com.plasma-wallet"
| "ai.purewallet"
| "my.mone"
| "org.bytebank"
| "io.yusetoken"
| "com.optowallet"
| "io.ethermail"
| "app.beewallet"
| "com.optowallet"
| "finance.openwallet"
| "xyz.sequence"
| "com.foxwallet"
| "com.pionewallet"
| "app.hbwallet"
| "it.airgap"
| "com.holdstation"
| "org.thepulsewallet"
| "io.universaleverything"
| "com.abra"
| "app.keyring"
| "org.thepulsewallet"
| "com.premanft"
| "io.miraiapp"
| "xyz.timelesswallet"
| "social.halo"
| "me.iopay"
| "org.bitizen"
| "app.ultimate"
| "io.compasswallet"
| "app.fizzwallet"
| "app.nightly"
| "com.coinomi"
| "app.stickey"
| "io.uptn.dapp-web"
| "ai.pundi"
| "app.coinstats"
| "com.xovawallet"
| "app.nicegram"
| "io.harti"
| "fi.pillar"
| "app.hbwallet"
| "io.dttd"
| "io.zelcore"
| "app.freighter"
| "app.stickey"
| "app.coinstats"
| "io.harti"
| "io.dttd"
| "com.tellaw"
| "com.trusteeglobal"
| "is.callback"
| "io.bladewallet"
| "io.summonersarena"
| "com.bitpie"
| "world.ixo"
| "net.gateweb3"
| "io.klever"
| "com.unstoppabledomains"
| "io.cosmostation"
| "xyz.sequence"
| "is.callback"
| "ai.pundi"
| "io.summonersarena"
| "io.fizen"
| "fi.pillar"
| "world.ixo"
| "org.thetatoken"
| "net.gateweb3"
| "app.ammer"
| "us.binance"
| "org.thetatoken"
| "world.freedom"
| "io.yusetoken"
| "co.muza"
| "io.neopin"
| "com.neonwallet"
| "app.ryipay"
| "com.saakuru.app"
| "org.dota168"
| "io.legacynetwork"
| "com.coininn"
| "xyz.timelesswallet"
| "io.hyperpay"
| "com.safemoon"
| "me.easy"
| "io.myabcwallet"
| "com.secuxtech"
| "io.cosmostation"
| "app.ryipay"
| "io.wallet3"
| "org.dota168"
| "com.bitpie"
| "com.coininn"
| "me.easy"
| "xyz.timelesswallet"
| "io.shido"
| "com.neonwallet"
| "com.secuxtech"
| "com.unitywallet"
| "io.miraiapp"
| "com.beexo"
| "social.halo"
| "com.gemspocket"
| "app.status"
| "com.midoin"
| "id.competence"
| "com.safemoon"
| "llc.besc"
| "app.onto"
| "baby.smart"
| "io.klever"
| "com.beexo"
| "app.onto"
| "com.ivirse"
| "com.alphawallet"
| "one.mixin.messenger"
| "cash.abpay"
| "ch.dssecurity"
| "com.concordium"
| "com.gemspocket"
| "com.concordium.wallet"
| "io.zkape"
| "com.unitywallet"
| "com.paliwallet"
| "io.pitaka"
| "com.saitamatoken"
| "com.crossmint"
| "app.status"
| "org.mugambo"
| "io.shido"
| "fi.stablez"
| "io.legacynetwork"
| "com.meld.app"
| "io.bladewallet"
| "com.authentrend"
| "com.paliwallet"
| "io.talken"
| "com.webauth"
| "xyz.tucop"
| "pro.fintoken"
| "io.fizen"
| "io.nash"
| "vc.uincubator.api"
| "io.unagi.unawallet"
| "com.ambire"
| "io.nonbank"
| "io.armana.portal"
| "com.x9wallet"
| "io.kigo"
| "com.kryptogo"
| "com.alphawallet"
| "com.getcogni"
| "io.wallacy"
| "one.mixin.messenger"
| "xyz.tucop"
| "com.kresus"
| "app.sinum"
| "finance.soulswap.app"
| "com.ballet"
| "io.loopring.wallet"
| "com.shapeshift"
| "io.nash"
| "io.trinity-tech"
| "money.keychain"
| "io.getclave"
| "com.superhero.cordova"
| "com.bettatrade"
| "io.pockie"
| "online.puzzle"
| "finance.voltage"
| "network.mrhb"
| "xyz.echooo"
| "io.trustasset"
| "io.nonbank"
| "gg.indi"
| "io.tradestrike"
| "xyz.echooo"
| "com.kryptogo"
| "io.trustasset"
| "app.utorg"
| "app.dfinnwallet"
| "org.rezor"
| "io.legionnetwork"
| "cc.maxwallet"
| "com.ripio"
| "com.fxwallet"
| "inc.tomo"
| "me.komet.app"
| "io.guardiianwallet"
| "org.rezor"
| "app.utorg"
| "io.hacken.hai"
| "com.zypto"
| "io.nabox"
| "com.fxwallet"
| "com.bitget.web3"
| "com.tastycrypto"
| "live.superex"
| "io.alpha-u.wallet.web"
| "io.trinity-tech"
| "io.universaleverything"
| "gg.indi"
| "com.ballet"
| "io.talken"
| "io.wallacy"
| "network.mrhb"
| "io.pockie"
| "me.astrox"
| "com.thirdweb"
| "com.poolsmobility.wallet"
| "xyz.roam.wallet"
| "app.gamic"
| "app.m1nty"
| "io.buzz-up"
| "network.trustkeys"
| "com.caesiumlab"
| "app.catecoin"
| "com.hootark"
| "com.crossmint"
| "com.coincircle"
| "io.copiosa"
| "io.ttmwallet"
| "io.bharatbox"
| "world.dosi.vault"
| "app.qubic.wallet"
| "net.spatium"
| "com.nufinetes"
| "nl.greenhood.wallet"
| "co.swopme"
| "land.liker"
| "com.kresus"
| "com.dolletwallet"
| "com.gayawallet"
| "net.shinobi-wallet"
| "com.azcoiner"
| "com.passwallet.app"
| "xyz.bonuz"
| "app.qubic.wallet"
| "com.coinex.wallet"
| "app.xverse"
| "com.coinsdo"
| "com.flash-wallet"
| "com.nodle"
| "com.vgxfoundation"
| "org.arianee"
| "network.trustkeys"
| "io.ozonewallet"
| "io.konio"
| "io.myabcwallet"
| "io.owallet"
| "io.zelus"
| "net.myrenegade"
| "io.clingon"
| "com.icewal"
| "cc.maxwallet"
| "io.streakk"
| "com.pandoshi"
| "com.dokwallet"
| "finance.porta"
| "io.prettygood.x"
| "io.earthwallet"
| "io.up"
| "net.spatium.wallet"
| "live.superex"
| "com.adftechnology"
| "com.opz"
| "com.bscecowallet"
| "io.wallypto"
| "com.reown"
| "org.kelp"
| "com.reown"
| "co.xellar"
| "world.qoin"
| "com.daffione"
| "finance.voltage"
| "com.walletconnect"
| "io.passpay"
| "com.bscecowallet"
| "fun.tobi"
| "technology.obvious"
| "com.liberawallet"
| "com.caesiumlab"
| "trade.flooz.wallet"
| "com.greengloryglobal"
| "com.kriptonio"
| "com.bitnovo"
| "com.get-verso"
| "io.plutope"
| "io.buzz-up"
| "co.xellar"
| "com.kaxaa"
| "io.pltwallet"
| "com.apollox"
| "com.pierwallet"
| "org.shefi"
| "xyz.orion"
| "nl.greenhood.wallet"
| "io.helixid"
| "world.dosi.vault"
| "network.gridlock"
| "app.keeper-wallet"
| "com.webauth"
| "com.wemix"
| "finance.plena"
| "cc.dropp"
| "io.scramberry"
| "xyz.bonuz"
| "com.bmawallet"
| "co.lifedefi"
| "io.ready"
| "com.amazewallet"
| "com.get-verso"
| "io.blocto"
| "com.pandoshi"
| "io.getclave"
| "technology.jambo"
| "io.didwallet"
| "fi.dropmate"
| "app.edge"
| "io.banksocial"
| "com.obliowallet"
| "org.ecoinwallet"
| "com.3swallet"
| "com.ipmb"
| "io.konio"
| "com.qubetics"
| "ai.hacken"
| "app.imem"
| "me.astrox"
| "com.purechain"
| "io.ethos"
| "io.prettygood.x"
| "com.revelator.wallet"
| "com.lif3"
| "com.broearn"
| "io.blocto"
| "app.girin"
| "finance.plena"
| "zone.bitverse"
| "com.saify"
| "io.plutope"
| "com.alicebob"
| "finance.islamicoin"
| "com.dokwallet"
| "io.paraswap"
| "xyz.nestwallet"
| "app.w3wallet"
| "com.cryptnox"
| "io.hippowallet"
| "io.didwallet"
| "com.dextrade"
| "io.ukiss"
| "io.bimwallet"
| "cc.dropp"
| "app.tofee"
| "com.reown.docs"
| "org.kelp"
| "xyz.nestwallet"
| "com.cryptnox"
| "land.liker"
| "io.hippowallet"
| "io.certhis"
| "com.payperless"
| "io.safecryptowallet"
| "com.saify"
| "com.tiduswallet"
| "app.herewallet"
| "io.uptn.dapp-web"
| "com.it.onewallet"
| "com.rktechworks"
| "com.revelator.wallet"
| "com.sinohope"
| "world.fncy"
| "network.dgg"
| "co.cyber.wallet"
| "io.up"
| "com.lif3"
| "io.bimwallet"
| "pub.dg"
| "com.reown.appkit-lab"
| "io.moonstake"
| "com.mpcvault.broswerplugin"
| "io.altme"
| "app.clot"
| "org.talkapp"
| "social.gm2"
| "digital.minerva"
| "com.wemix"
| "com.pierwallet"
| "net.stasis"
| "com.cryptokara"
| "com.peakdefi"
| "io.xucre"
| "com.3swallet"
| "com.example.subdomain"
| "io.transi"
| "finance.panaroma"
| "com.reown.appkit-lab"
| "com.opz"
| "ai.spotonchain.platform"
| "org.dailychain.wallet"
| "app.omni"
| "com.humbl"
| "id.plumaa"
| "io.ttmwallet"
| "io.kgen"
| "com.nufinetes"
| "com.squirrelwallet"
| "eu.trusteeglobal"
| "com.daffione"
| "com.saakuru.app"
| "io.r0ar"
| "com.nodle"
| "app.tofee"
| "io.pltwallet"
| "org.talkapp"
| "io.ready"
| "app.w3wallet"
| "pro.ds.app"
| "com.reown.docs"
| "com.apollox"
| "com.ipmb"
| "com.payperless"
| "com.obliowallet"
| "app.keeper-wallet"
| "io.paraswap"
| "org.ecoinwallet"
| "fi.dropmate"
| "com.cryptokara"
| "co.cyber.wallet"
| "com.kriptonio"
| "digital.minerva"
| "com.mpcvault.broswerplugin"
| "com.liberawallet"
| "io.helixid"
| "com.broearn"
| "io.altme"
| "app.herewallet"
| "com.coinsdo"
| "trade.flooz.wallet"
| "com.tapwallet"
| "fun.tobi"
| "com.bitnovo"
| "io.xucre"
| "app.girin"
| "finance.panaroma"
| "app.clot"
| "io.transi"
| "world.qoin"
| "com.greengloryglobal"
| "com.amazewallet"
| "zone.bitverse"
| "social.gm2"
| "io.ozonewallet"
| "io.ukiss"
| "finance.islamicoin"
| "io.copiosa"
| "world.fncy"
| "io.moonstake"
| "xyz.coca"
| "io.nabox"
| "com.trusteeglobal"
| "net.spatium"
| "co.filwallet"
| "money.snowball"
| "com.ennowallet"
@@ -437,93 +449,125 @@ export type WCSupportedWalletIds =
| "network.trustkeys"
| "finance.voltage"
| "app.imem"
| "io.xenea"
| "com.superhero.cordova"
| "io.kgen"
| "io.r0ar"
| "io.r0ar"
| "org.dailychain.wallet"
| "app.freighter"
| "org.ab"
| "com.dexari"
| "io.cfcx"
| "com.socjsc"
| "com.tokenb"
| "org.onyx"
| "io.gk8"
| "com.anchorage"
| "com.hashport.wallet"
| "io.billionwallet"
| "com.dlicom"
| "com.tychiwallet"
| "at.swe"
| "network.wali"
| "io.diamante"
| "ai.interlinklabs"
| "com.walllet"
| "org.lunascape"
| "com.nvxowallet"
| "today.paywithcrypto.wallet"
| "ai.iluminary"
| "io.reactwallet"
| "com.rewardywallet"
| "io.walletv"
| "app.outlawgames"
| "io.ironwallet"
| "com.mecowallet"
| "com.onlybulls"
| "me.qiewallet"
| "fund.lflabs"
| "io.walletverse"
| "com.berasig";
// 75 wallets
// 86 wallets
export type InjectedSupportedWalletIds =
| "com.binance.wallet"
| "io.metamask"
| "com.trustwallet.app"
| "io.zerion.wallet"
| "com.okex.wallet"
| "com.binance.wallet"
| "com.bitget.web3"
| "pro.tokenpocket"
| "com.bybit"
| "io.zerion.wallet"
| "com.elrond.maiar.wallet"
| "com.crypto.wallet"
| "com.bifrostwallet"
| "com.bybit"
| "xyz.ctrl"
| "com.roninchain.wallet"
| "com.okex.wallet"
| "com.hashpack.wallet"
| "me.rainbow"
| "com.wigwam.wallet"
| "app.backpack"
| "app.subwallet"
| "me.rainbow"
| "so.onekey.app.wallet"
| "app.keplr"
| "org.hot-labs"
| "app.phantom"
| "io.magiceden.wallet"
| "org.hot-labs.app"
| "com.coinbase.wallet"
| "app.keplr"
| "app.backpack"
| "com.flowfoundation.wallet"
| "com.robinhood.wallet"
| "app.core.extension"
| "so.onekey.app.wallet"
| "com.flowfoundation.wallet"
| "app.subwallet"
| "io.loopring.wallet"
| "app.zeal"
| "com.fastex.wallet"
| "xyz.frontier.wallet"
| "com.coolbitx.cwsapp"
| "io.rabby"
| "co.family.wallet"
| "app.zeal"
| "com.coin98"
| "pro.hinkal.walletconnect"
| "com.coolbitx.cwsapp"
| "com.brave.wallet"
| "com.pionewallet"
| "app.nightly"
| "com.coin98"
| "com.brave.wallet"
| "io.zelcore"
| "fi.nu"
| "pro.hinkal.walletconnect"
| "app.status"
| "one.mixin.messenger"
| "com.concordium.wallet"
| "com.meld.app"
| "com.moongate.one"
| "tech.levain"
| "com.enkrypt"
| "one.mixin.messenger"
| "com.scramble"
| "io.loopring.wallet"
| "com.superhero.cordova"
| "io.finoa"
| "inc.tomo"
| "me.komet.app"
| "com.cryptnox"
| "com.zypto"
| "com.walletconnect.com"
| "com.blazpay.wallet"
| "io.getjoin.prd"
| "xyz.talisman"
| "eu.flashsoft.clear-wallet"
| "app.berasig"
| "xyz.roam.wallet"
| "nl.greenhood.wallet"
| "com.passwallet.app"
| "com.wallet.reown"
| "io.owallet"
| "nl.greenhood.wallet"
| "com.blanqlabs.wallet"
| "xyz.nestwallet"
| "com.dextrade"
| "com.mpcvault.broswerplugin"
| "com.cryptokara"
| "xyz.nestwallet"
| "com.example.subdomain"
| "com.superhero.cordova"
| "io.runonflux.sspwallet"
| "com.blanqlabs.wallet"
| "com.cryptokara"
| "com.mpcvault.broswerplugin"
| "io.hero.wallet"
| "com.dlicom"
| "network.verified.custody"
| "console.utila.io"
| "today.paywithcrypto.wallet"
| "com.micet.wallet"
| "world.dolphinode.chain"
| "me.qiewallet"
| "com.lootrush"
| "app.core.extension"
| "xyz.dawnwallet"
| "xyz.abs"
| "sh.frame"
| "io.useglyph";
| "io.useglyph"
| "org.base.account";
export type DeepLinkSupportedWalletIds = "io.metamask" | "app.phantom";
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRkgNAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSEgEAAABCsqutj1qpL9cIBqkRgKpbKEONTkHp2aiV51zmDzTwbJX7rjzbjIW3ne6AHMTHZiAZG6g8YTOuFc5k8O/+SmKqv+bsPv4voiYAPx/1ohY9mvDyYkN23fv4e39iSS+ZlsRA4jw4AvDO2bSmeyl5XulRpOZ+veWMZtJz+wYft4Kay4QTYxPnlq8Ld3m3MnJ8UQ0oCszPLR+Ll+SvS7lGYfCpCEKfjC/JL1K84ymZozYdK7R9zLlpmOok9XfXq61+t7GGn2b0MaqVLHS7nsf+erPq7QQny08k37FArHvzE/OPZJ+fsSfkL/ePLvckv7GIr3tI3P/xar0P2f3m36xU9elHill++P9hYrUJSP5YeuvUqe4xXMrvrjc1ythyFvRqQdSt0xRL8WO1KV+60dj3qETUs8nyCt8VOr6yEpvhKbq2qpTyBNfPJD6ZvTC1stS57Std+//2tc7Uq/sBal7tHtjpiraYzJ7YIj916X+6QAaruHbWQnhxbeE6+bZKghMpmufFCWM+Ilb8XNtIJDjLs0+klA+IndWFSScBXLl52eAlFJuJK5ISIurujO+rYBSRqOr2N9tUPBv6sacrklYkcwugrkWMEhBZwMfNCS0xAOOwvMSXmJHg0sA0aCTwIY2QLiBHUTnJMQcdZDIg5RHB2MlkErUKTwpYUbuYJ0E6pTV4fkcUIvcYfg2UIwqY2cfajQUkRmwMKKw0mClLYWdAStjK17NgkWoGC6AVUBF8hZYlFRM3AeLWLGhDBZtUGxvgsWk2N0CC0mxpwkW71FQCywkxfYmWEyKDWWwaINi4j5YxIrkLbAoqRgugFVAxatZsAgVdgasjK2w0mClLUVkBiyMKIydYKGhwOHbQDEK9fOLQOW4g3UKqJNWh/AkUMgdcKwEUomwcyIPUh4dROdA4qiDwIY2QLiBHeDgEkA0iE7D8wAROxr4oAEO8YAjDOZawCAFhXNzugYMktkFxv5ug4J/k+jW+LYMSgWNrnBVEZQrCeHiXAmQZz8LN6kASIFcwdlHYDwidDd+rg0Ectwl/KQIBH4i3DbPVkFgMl3Dty6CkH1buG6IA9cBoP1ouIZopiraYzKxp/aC9tAWPX7/V80hiZ5vu6w12ooe/OKBxhiFF0NTdW3VKeQJXHlEW0ej6NHYCU2dIPQsHa1rqH4khh7mqQfaYYqip0NfXNYM4Qrh9S2/agW3Ch++v1DRBiMJX9qp65qglI0+Nfdnqxrgi/tN9O/bZ4stn+EyvSl8bX5y7pGvHvEnhH6Pzxae+QYLxEKHq36+Wmn7ALk4R0KXiW8v11oewxp9t0Zo1IhN5xqeotx0DIVezeAH80ueoXlGU+iXwkPr5/KlnpXyjENhEpoORBPjkydzt13jxVOT44loQOg9bD0/vGMmncleWr5XajSZqX9vGbOZ9MyO4RcGwwJGI2LZrw0nJzZs38O7t/cnkviabUUM8Z8sVlA4INoIAABQKgCdASqAAIAAPm0wk0akIyGhKBUNqIANiUASyulQmd4jUdvenPXO623/mA83z0Z+gB+wHWhei75bPs+4Bx/SO1r+7dH97KlyWJfv95e4v9sDe8sv98Fqa3oHGkfZPUF/R/obfTvoM+p/YQ/Wrq/eiB+qqOhuD7m+iLn+IOOiPkt22NuiYFyrfDUgGFDydaiJrT0PbVtFvyd1w8PFEsvS36QEKgdtVSBaVtcx4ZPdxTvH3QMyR1qdB6EIDB+0mbNvOiqvd4RvZ8LdRSfPOZ+7vumZaMregdqumYxGleMbMcS5WZYeo0d9qVki/2IpegmLhGoBdE+5Zm7JlE8ahOcrpIS/IYDfuHpb6D5KVBju4fgjn9YGxkOqUYc1yFr95HK4dcHm78jN4TZ1/+3XyFDYV24QRKuyWh2mCI7o54biXMhnOidh21/zL5Rk324CFAV39s+bLkRONJeNwAD+/TZ6HI6K3IFMxLA3AASHDZFab3CwnbZ1V9tHztH/j+AM+9TJhEYKm7insyZK42RrdHSqoLC5sQB5AySldgf1/HNa70GhJIDYZ4cHPqxkBOKwq4dZppBokyhQWQKAAS5Mljyci60iU7HRxOc1jo4WBouj5SEmRAsbXmDjp3jRTtYwcKHPvnU5V0e1P7E/f3w2hp9dGcStk9ntSEvk/TDf9VJWxI+zjr8ofKnAXebJz2alrxBszdJu0IOQbxwm+iP+h/f/q9GJUmOAiG6S3gB79clIqwl1XtPEmDmfdvslw/g+Ab7o8k4gREojEl8IsNLw5UHnn/BA+p8/LNIVV9dfpfddDjpaNFC5ccrf6zceu90kBXkVZFUNjz+xuygsNFJ7Iav7XBJavAkMhs6QYSoSdVHunrlC4t+Ax1ZAgwcYdAeM8VfbLddD2ZDnqswfk0ZiF67tDpZ8bq4TBLceuXRBIq/QlAUGFpTSd249S5Q08Sa847LfQzfh28od49cD6V91NxDXd21ZpyQRUDQrXZlgTGIvWObyrRJyVtQSkZ8y2RPLViuy9z4GZaPCEOWKzOtARucH/M9+PniQVlsk6dWz/zh2NkWaoLrbF/tqF90gUb62lTBuKZoqcvmWOjGOXmLL66weg0JL6neOksbBfRrlNWlvrqR36z5HbaIZn+Jx/APeu+VDBVmRvP3PDSEjubHj0GMZJ+vCdhXWF6szTOJJ6zGkeHZJv6QPTdBTvnAw9G1GhBrxiJDPKFE/WHzZcXWe0Fce0XWOVAr1IfqtCmhcFK3VVZVe2i4imiDej/hraaAriQplQzeeRFDtSY2q1RgBfO54fkawFXQ2I7NqFiVhhXHrT2eovhlJK4G1SYZkhLy8uvd7Ax66AqatRgdOmiTBn1dWSf01EmLB2HFL5dCDZiuH8Wua64mqDpnbB18eJ38VaoShVLkju08NnzoRCGrKFj8YWdyzEiLIUPrdjjlvMaWu9wR3cmiI7HS6HcPEuwiXnlidkWjRq3a+tUqwVrb9+ZqVyXiDCyV3RYAZHqT7JUoHcZEdvI3MvGyX/irjRCZj6Adyd2OTxtMIo4Qhw3yuP2CVddrt2RiT3zV9iSc348MMyA8ly71YMTxnHBndOZb+9zBPM7v9LEDfVJVa/47ZzZBaR/2TEDW+YEMna1hdNzrL+TE9udJOjDGtKawGXpSeC45q5pD0vVWhGWKMMc5v7rRrkAVmaz37EzcBgrDpltqlT4N4RrqO/Yk8/f71pPcBr748AXhldclRBzE4QH6klRJc+DFTKZEfgMArMhD+8ZjNXL1I/3aPc0mk4cPANu7KeIzxpzgvPPnCAMVUhEGDsmr887mOJTB4GU+fif/BSOfiI9ylJ06av3fJQDNJJzuyqASvfC/0Y1XXN3/LeppsOLkM625VRn8sTa9PaMXJpo/t3Abeho2JlILvIiiyWgo6JcrrWIb9slua+lWS6kpcxg0amPYwpCnhjCYdZ7aKtxPv8p5ZQAVq8dP2SKY+i70eGJL9VjkBiBcN3oQSpqeJl1n94l75p/mLhuKuA4tyxemmj2KmSveVBTcFoeQAM2lV+4gKPrfxCd/MWsPKHF3gPKiAfGMWtqsfU25lg1W6Qcn/TonxtsgvKtX72N/mMEhfOY1Opqyh7a96I/ptgvUl24o3YXqwo2WkeT6v/+/w4wVLJU8yt6obZGq/7gVUDpSo3iqZau+Sb+UubcCGAfktGuJmo738WwdyQxpawvaN8Rk2NyWqroApS6PpW2lNGd6aG68YeEVtwX+cS3mYn+Bs8iQo+YyapSCgZnLyVtAjpLe6xjp9THJbVK9b2zzWli9A6LATheNGffgtlKJrfsPhpv2z8C/1o5GE9Gj2K/ipW8uw5f637GvYfbli1QhoLK90+BR9wuIs9g49KxG4WWZCPeSQd9BsihHS+aNBHj8lEhShWJmqlnSbSEPUMsH9FS5CGQzQWpVZ01GrgZ8zWukZHg/JahO4wfMt94rZkG75oZICH8wFF2MyuNgIw1LxfDE19+a0vNpIU5H5k1jt96tSW2bE3Kq+06oC6xDhBVpm/YApTeB+gw+TNCEultHeDd2wHK88EBJ7glTQrCNIGRo/XD+jw0KLnM7zMB3qkquiaurl4b3aO12Wj3la0lLLRU/jZ2Rzj7EN+6aTwOp9FGvRS9IRX3NYWD+4uubDqbJXTvmGerIng/4GMUX6jIALD1+a0wbykq4JgWARII2B7jV0FqZsiyRLXliiHzyP/O+7Kf1OXfUXwjk4XHPpHu/5FBBH+gfvhuFKwc3o27FBMF/t9JTJ9IdUMW7y9dsSxGmpCDBSMETQswBO6Mjh+oclEq6MgAv30K9He+SvgJXkMoi8sSWmgoUUoO3EbDNU6GvI/oSvHMO4UXlgNXOQuNhYZkfiRxcEQB4tmdu0bcTdeENT5yz1mJIde9wjYpL+EL80DEeKUCV+RzLapSw5K+8vOoL73qZ1Ny8WuX9/8Tf9B9FB81LF1jEp8QzcXU//DsS/oEH3pzUYSBItCaXC/ZSNFpH4837ujpiVP52qmUgA";
export default image;
@@ -0,0 +1,32 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "ai.iluminary",
name: "iLuminaryAi Wallet",
homepage: "https://iluminary.ai",
image_id: "0ba5381f-8779-4031-a3ac-944fdd087e00",
app: {
browser: "",
ios: "https://apps.apple.com/ro/app/iluminaryai-wallet/id6463699032",
android:
"https://play.google.com/store/apps/details?id=com.iluminary&hl=en",
mac: "",
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: "",
mobile: {
native: "iluminary://",
universal: "https://ilumi.app.link",
},
desktop: {
native: "",
universal: "",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,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";
export default image;
@@ -0,0 +1,32 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "ai.interlinklabs",
name: "ITLX Wallet",
homepage: "https://interlinklabs.ai/",
image_id: "ba64bb85-63c9-40e9-ba3f-03b8d54eb800",
app: {
browser: null,
ios: "https://apps.apple.com/us/app/interlink-network/id6737988220",
android:
"https://play.google.com/store/apps/details?id=org.ai.interlinklabs.interlinkId",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
},
rdns: null,
mobile: {
native: "interlinkid://",
universal: "https://interlinklabs.ai/deeplink/wallet",
},
desktop: {
native: "",
universal: "",
},
} as const;
@@ -27,7 +27,7 @@ export const wallet = {
universal: "https://backpack.app/ul/v1",
},
desktop: {
native: null,
universal: null,
native: "",
universal: "",
},
} as const;
@@ -1,7 +0,0 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,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";
export default image;
@@ -2,6 +2,6 @@
// Do not modify this file manually.
const image =
"data:image/webp;base64,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";
"data:image/webp;base64,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";
export default image;
@@ -5,7 +5,7 @@ export const wallet = {
id: "app.keplr",
name: "Keplr",
homepage: "https://keplr.app",
image_id: "527324b0-3849-462b-9a1a-72b53bdfea00",
image_id: "750e0f10-0700-4ca5-7c0d-b4a55da72f00",
app: {
browser: "https://wallet.keplr.app",
ios: "https://apps.apple.com/us/app/keplr-wallet/id1567851089",
@@ -24,10 +24,10 @@ export const wallet = {
rdns: "app.keplr",
mobile: {
native: "keplrwallet://wcV2",
universal: null,
universal: "https://deeplink.keplr.app/",
},
desktop: {
native: null,
native: "",
universal: "https://wallet.keplr.app",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,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";
export default image;
@@ -0,0 +1,32 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "app.outlawgames",
name: "Outlaw Wallet",
homepage: "https://www.outlawgames.app",
image_id: "290467db-2be9-4cfd-9996-742517ff6d00",
app: {
browser: "",
ios: "",
android:
"https://play.google.com/store/apps/details?id=com.outlawgame.android",
mac: "",
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: "",
mobile: {
native: "outlaw://",
universal: "",
},
desktop: {
native: "",
universal: "",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRsQDAABXRUJQVlA4ILgDAAAQGgCdASqAAIAAPm0skkYkIqGhMHbKEIANiWcA0hoDij7cfn/30U5+YzBpJ/iC/ONYtwzEjK5F4fly1qM8qR//witn9mO8rTPDp445xaalWpX32pp96wRVNYaly0P3C1BNP4JnzBSgo40Z6oswRiEkSiQvtPETs99keFMmEW4W88dURksKlEEoYetFLKIODiEMnz8B80NYXQSvO2Syzx0atiz8jYHcF4RU4ileUJY3BHjEXFxFdisT+aC2zu+6cJ9ShTiRP0xfRejTM8b/hW+sjRq8DtZ00C9AAP76To98HEPofGfrYwkowhFIUYvkEI8DMmtEOPbp1xYqKNmjfuo6HBNe1DBqcix9gH8ePrVthVFqEdr8dC79Ix+ncICsZKtVCdJ+cC5i6NT+NlR18XLwaI33FHk5at5A2bOpDYmZEm5nhnf1sVp+w6TbxD4wSJJUTpy5aUZXGEgHz3cJTsuvazsLjGYvquqkBAK9mzpPzifABDpWJRS0PRSevJlamrorThl/OdET920dsRpMAN/t5OLd9M/x1uPtjkGth6OzDcjF+2DL0jzjTHfQrXlrmZyyA5fdfcYPf0A9Mf6BdrmvVRMRVj+97abo4E5TFIVrtGLj8hKdP46QhYmcewRIyL4LwlEpCuNIBL/swbwpijfhIfHCFktA6p8TMqRzKFMfyppbQ3JXZLpDiSnwtEfUqBW6jnf8+FsijSmbRSr9dh8c/wmpHlxFC/z96JL8/dC6+pwBmIkawH0tk85NoCYW0WJVCIttjr2t9fEtw/v7F7/jD4i1pUUcUe9gLgQyCoR5de16V1bmkRdkJkPAUL2Cuu8bcbiSF9kJBDfwtoW//NZ7dxe7p4LoyxsksmXjZlhxT3mAfLk2qVI2KkZNbYbl6sBJM5BSzaN2egrj2/6ckvTfr8f1Bt91zWSwq0aAxdUdRZ+0qEPjRuZNdEcXyulX9w88jckVpno14KrDX+5oQVeuK/ILQdYdixgjuGNrMzhFHjJXYetVA7uTm/VFnM62sm5Z3d5IPtJPOd0PQn1LSUaXvE8xyrMVdnTv6+eG1KVkGzXZGvyBIcoB3QEYpzQk49Wjo++YAL0MKzltF/Yav/z7r6SBn5w8GMbvGsRGC1weizz4gj5Z3DEH+QxqrUGxnMwSGDqYSkyxMNsWnM5J7ePe6APgD01USKgXIOKuKY4ORZw3vjUuZqIC/9xggxxN2HHnNQWchlw9i2aDJksADJD+D9DS/ipYmuuso1f7uBZw5AgjNWFpAAAA";
export default image;
@@ -0,0 +1,32 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "app.whitewallet",
name: "Whitewallet",
homepage: "https://whitewallet.app/",
image_id: "328ddfc6-0987-4981-69cf-c4bd7a19dc00",
app: {
browser: null,
ios: "https://apps.apple.com/es/app/whitewallet-crypto-wallet/id6736445215",
android:
"https://play.google.com/store/apps/details?id=com.clear.whitewallet",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
},
rdns: null,
mobile: {
native: "whitewallet://",
universal: "https://whitewalletapp.io",
},
desktop: {
native: "",
universal: "",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRsYEAABXRUJQVlA4ILoEAAAwHACdASqAAIAAPm02l0akIyIhKhs5SIANiWIAlidQB7l+KvsO1n+xfbP8jvdA+wDwvbE/qv2q8AB+hv+q/j39O3wH7OdRr0AP1H///YAegB5Uv7GfBL+037d+2NmrFl/GRGmy0tIo0CTiDr2NtyzmdT3KDOq5aS7H3swy688AUv4VCmNiWn1mV97LsSdGRxcS/G3p7olJ4S6Cz5JF/abn6cq/hOqqkjaPa9p3ihS6sHCLyTc/l9eHQVupM2+8AEdVyzFJqVfa2dNhr3eeDdAbjZhuLEpc1zvNmnwkcA3Th/sLcC7T8DtuLAAA/u4KZzA2fYo//xlTxlTxlTFzAAd2yAYzLAIQ4PpvGsHtJNeaIEgXEKZfXRKupIkUT/65GXjB+DMK91qA/v6b1dMPAPbYiD6oXPl4ZPl4AwIEznsfytnq0RyV8QjbtIYM1z7cNvzE9PNjLka+e3efdHIF5kc3uwgd89H/7S7QVzjUJHvCK5h0uqdK53ynKDu/U/0+L+r3wwYNhHTpSgCnBTfHBJ6aiE+wmJ8XgqDv/mS578AaTINffv9YSjzTG5R54rWo4B5F9LOqSH6o/4p6KH4U56QbREDTIW+PwFOSBFFxP+Aq4H28n38+6OQLsIm2HXAM7+dwD3VEeLlG+RGjygvfQfjWpJtXhW5AOw/NF6qFhLp/BQrYDzBtc7LlNErs9ucTadmPlKE9fLDLlLcQjxXOy3DsHCFFuCy/T4lUCTbNQxf/ifRKlIEwx1fuQDNLloQyBkefoR3xQ0t5RdyXouTGOciuUAiX7jf/HDm8706yJP5N3jUGRAHJUBfgWnsITJOCPOUZdSNQujaFNxrXmwYRKHdZabhLk1t3YbtFBtvHBYnn++PnL4mOcP/Kgw9yI4pdlrIhOgEU3DK8xUwBGxpZ/I4I5dUS3QoTjWSDr5+OvhnVDEDCAmCkuAHJ9udfAdHZ23MihL0hG+b+Q3ndI7LqmcGLR4b3yfkeFnaSUFTaH+AQ/DbEcgzuzSCPPBycRMln8RlfIbTlt2Lw7jHzDOejlf2wkY/06zo0/S1uHuHWGE5ZwZ9WyNK9VsfZNYLg2LKt4wkkoO0NW18m2sz9K4NaddynYDkrr08d40E59KogVK+JQUsBIKRFcu0nRq8b5QJ8vKZ1U2Zl2qUaodpL3ay0LCd3Q2I7B7oq9LGxEFcw08eQY6jSy8yvbMAgmqQdIa4M1rj8jX+ltl+C3cBG5/mEpQPYKmkESDWResnmKtbQEeFguCEBSVeFAZ1YgTLnxJypgrt79/8usAGqyz67itDwVyPZI/DR/6h23EFJFNX1F6j6CzuPFwUf9yehcftIHopPofJvmDpiQoswpq5cbe4aamg88CnX2nwiFOz7uejyfdhj04nI7X8w5RIdwAsgI8QwdNvZ1TOFQMz3yVAK9p5NkqqQeDm3a7DXONhowvySWle3tCV3QE2biV1kG0cgfO6FFd/m8qpdTZCMu4D0oWQ+KDteOBK8PRTIn4dh2eGPQSUI7meq0J9Vti4pwAeOCCacQONspn8d6GeLQBiGduXxtTB20ltg+0itY9+y5e+Pt6TxNEFz8817BgQyY/w7xRKQTPloE5N1rAAAAAAA";
export default image;
@@ -0,0 +1,31 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "at.swe",
name: "Sweat Wallet",
homepage: "https://swe.at",
image_id: "df295afa-253d-4db9-fe94-4fd70c0b3500",
app: {
browser: null,
ios: "https://apps.apple.com/us/app/sweat-wallet-walk-into-crypto/id1619316571",
android: "https://play.google.com/store/apps/details?id=com.sweatwallet",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
},
rdns: null,
mobile: {
native: "sweat:///",
universal: "https://wallet.sweateconomy.com",
},
desktop: {
native: "",
universal: "",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRnwEAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSHwAAAABD9D/iAg4bhvJkdTrnxvChNKhde7bNe7sM6L/E8Av6CIsq1wzF2GWVK6kF5YtWwuPwne7NX3Fd8NFfov2tWn6aJIuotufsYhNfN+lydUqXFmCQjQWwIAw2HjXRVzidy6Pm0t1XZvGb+ISvb1bCN02s9c5Qx2IqvExbOwGVlA4INoDAABwGQCdASqAAIAAPm02l0gkIyIhJpYpGIANiWkC5AN2BM5sY1z4rC/4c6iOSGVi7jvQDSZTMvJD9X8DL0OSHXeb2nDGEMpb17j6pa8vhOg0BZE+jalMXDfNYrW6FUkWxnAunWGbX+fCOWUyZuzCTh3vcbCkiuyFbYM2DfbyfQ6jUhahPqvhNjMGdknlqLwQGjO/oO3X6AliAOqga3SgBjlqep7dErQmUfaJPdrGPvau7TDTNzR2iRyzaWEaoXh5oiIUwXtud/yM9tlg2uLO9adSfNYp4AD+9kbE/gxv/RnIAAvbTZt5z8PX/tOr5G6qWVAHwMbtiAn+GaH64oV9Me6TK4lC1cB9+IE0P0G9KvlTOKgFFM4Of/hXoVu9W6LOuShRgOCmXuNFDfU16U2kQgWUEsJlfc+7W8MdwtzQmAM0hHjZcHxThnX4122s6Yk2hDGQpmIT+RqBrZDQVvF/9una8zrhRwzBMfPFTvvWxb6Cv8QYw4DgMOjKwJRf77bdoC75ajeSU7+jEnUfE22g5NNf/LiGIN6TbuQz59sntvfjy29gs/fiOAGL8bmOvlxMwdZT+gZdrfawqV0X5a3zb5yfet1dwNHapPSVPeV8BPH61Scp/SAf8Q3Jj0b+YU1YcXyX2RfNvL+Rg76WXPP4ZskHE43D+9bFvoKq17SFaTJ5ludAd0ItayyE//WP6I/7/+kypuOc/gzzJ5b1XU+71WiXsSrejCkCba8i0T/6ll9RLhVExqPbcWPz/Fs0Yv8UMM3C/CVI4D/MzxOOimYb5M8H3dCrNSILcevS8nxXt+iqD0p1tdjeL/Zquhf4DLKhItK6EPuaJ9WXMAwgmhvQ9tpZMU8uch9lCLq/+vU9vUek5quYDAu6v4DKs1Avt052QYabYzeLRydPbufP0SJy1SW4RCRCMMXjSKa7Ubypt00+5PUFDCRuVJQ3QizZsbvcDXs4uUrZ3YHfTC/bt+y+hWfYZFZPT3No2llQoNPYwNaEWitgyNvZA1tq5wTn3mb2zU9s77wjhGOHJvXhpUY2JijUklRnBUSK62obgsFT/GfUlPg32GYnZMZBeEVPiwuqozIGg0HqdqgZgh3tLuEGpyCyaVlq3G79pBViXUEwN2KAWBmKlOl4dzFfSh36Xlkt667zvJ101kQS37EJVlAZ+DcCju+GiOmWu3qyBDRJYUM1vLyQizlwXx2e1+cFXtSlGjLgFR7b91vMhgpdwWbRs6GHmVaVaDV+oseYtvqM/9oELUvgpDjM5Kn6kHrXRQHwxXcDmroO6Qj3t2utZ7RcTZiBfh0HkPy6kAAAAA==";
export default image;
@@ -2,25 +2,25 @@
// Do not modify this file manually.
export const wallet = {
id: "org.ab",
name: "ABWallet",
homepage: "https://ab.org/abwallet",
image_id: "c2cb1d47-305e-45da-cdb8-b55b73ea4300",
id: "cash.abpay",
name: "AB Pay",
homepage: "https://abpay.cash",
image_id: "f635dbaa-dd03-419c-5dce-05aa0f127c00",
app: {
browser: null,
browser: "",
ios: "https://apps.apple.com/us/app/ab-wallet/id6745787849",
android:
"https://play.google.com/store/apps/details?id=org.ab.abwallet.android.release",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
mac: "",
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: null,
rdns: "",
mobile: {
native: "abwallet://walletconnect",
universal: "",
@@ -1,7 +0,0 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRuwEAABXRUJQVlA4IOAEAACwGgCdASqAAIAAPm00lUckIyIhKhTZcIANiUAazJVxvpUlg/tv4j5MEx/Zj99+7r4Jes/zBv1P6bPmN8GbsAP5b/gOts9AD9s/TX9mf9lv2g9oDVYtjnZjKQ4RaUdp0nf2r63ke3MiUlq3IqaDkFgB8hdIboEL7yxpbJXp1b/CjrjCcz+j2TTduA22NeBamFuDkVdM5sagcv3wTB+yu+dhC7OZ9hcdg6OwEeFNuwi9qKvq5Zw+oXWKwqPTg+lrnJX5t3IELodN8aMJYfUxvM+3oE1IdQ9Aq58vqKLlOAAA/vyoBX89TD48Pb7n3dIVakpqV+wcYRfvVPxPUfyVSP7XILKMm8D7u98Y+oF2sxA6GEzxNfU7Wb8tN2qlAsgJe5UX2c/1r+i3IItBAqvU1y3cG4/TuNjtQl+WP9DXY44fi5hCbjLVLtcxIwwHD/geBuGGZ3zb1i3q1xQpWpny3jhmL9Uwx5rXahJyYwUojErBm2Jrpww5X2YL/qn7oDR3pmmPXUFu847ZU2m/I8KJ5W6+IQFMveOKQ3p5aVrw6BkWZ7Kqq0RsAbxWzAwkkgBAPg6s/Dx+2sdY/1T/YgwlmBoady/v0mqD2OwhOgW072PAteIGdAiXpJC7EO6Wvtln+/iteN9q+lGTWOfZEX0QQCzPQP1ardNHkXgREleM83oiVKHJFAeAmFNHLt8vhbCQGCT2otkCzZ3DSPqFZwTz+po4o8M9yjnGiH0HU5YDwSi1IORkhanG/PW4lE6LQjpEiAIFEpTHnaRVY5pUvNuiEj8WUEH57gi/OLnQ/3oREyt019Cfl0fLrdjg9afhdb8VdwPM5gM1NqCM9dngAQ0lnlsvdRDY6C/tKIjPHaU836Lt6ZHFdWA4Nnf5xwBnGLZUnNu5UBUr39oJWmRl9TLPaQmT52LLffKwCT6TkeAkF5tEwLS8hDYe2OOYepz4U942HE/0vmP4FmivMtW2h4OHLXRM4seJ6gPQzdPdnK82bVHgUIehoV2g3lBHZWRG1pavpcQQPsUCQYVEPqiHehpe5tRFVmcop0uCPumm5kmmIqpBMuLV+B7v8+08n1sLlLcwA1he7Exa3uy1KUS+o9kbt/dqk53tGzSa55ZJDV1QIF862dG1CQrX6bC1WPEEbvhj9cudw5uHHFXc2trfLRjqSOoQJuOjayyNixKooZpFdhdNoEUWVrRc/8Q7EvSQjwLTC14xrNqoJB0xVxrdR8iB7b6dgXIytr3KPz1tavzoeioSHq4T31/ZmGyqspe1K8EsIzPPMNSLuOwib2RNivVMPV4N4fts+zfWxxknlWAKICvsJlMd2k0H6eaKV5wA33jfhYPP84/dtro54IlYLrGPt5D3s5BJzexqzHwlDwovR8pUrz6R57BFHesY522wfEEriQ0gvp3MLC6HFr3h9uwEBB/kq+4la1/FZAgJmJtfTTITfpaOmxHsxHrWEZYCOCOqqQkwm6GpXPkcavD7udI8mALdvITOGItKpVaKaJp/0gExkUB0Gi/ISoYkiM2Eq1Nz4M00KuNLimiIlxIDI2bkYFG94ijolo8WHLONKO0QpuXaFnsffhaLXbvTcJo0SbuB1TO4v2azy0j7fmHNVKmWfWZoVO4arYXnmAT11gRtVB7/TRvljl5O9TMNArjkkj/gAAA=";
export default image;
@@ -1,32 +0,0 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "com.ambire",
name: "Ambire Wallet",
homepage: "https://www.ambire.com",
image_id: "c39b3a16-1a38-4588-f089-cb7aeb584700",
app: {
browser: "https://wallet.ambire.com",
ios: "https://apps.apple.com/bg/app/ambire-smart-crypto-wallet/id6444863857",
android:
"https://play.google.com/store/apps/details?id=com.ambire.wallet&hl=en&gl=US",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
},
rdns: null,
mobile: {
native: "ambire://",
universal: "https://mobile.ambire.com",
},
desktop: {
native: null,
universal: "https://wallet.ambire.com",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRlgDAABXRUJQVlA4IEwDAAAQFgCdASqAAIAAPm02l0ekIyIhJpiaCIANiWkAFs0+Gf432c/1nlgkhP2J/U8IO8P/hn+E/J3gCeU8JWk4nTv6PxifVvsDfqv1bvRPKPgWpSJePvzs1RheBXZBqWr3O0rxYc2sC7EOpNjY/u7gmzQHbq2D9T/tJuzlOAArAuTfyprR5KzocgfVMUuQ9mhnS1+iYekYZ9RdnBoHwjapk8yeXQoP+nUrDhg9zvQrq33btceemBalJUyoAAD+/K0QD+gVl7LiswWd31MAD5i5WXs8el2Ovzv/30QeQpvZSR8fDqZ+ZsPmKJTt2QP/fMIHZ9Dlfq3AgHqR7z4NjWUm5/lC6KQcUYFyaIbJFj8JedMYuRpir+rzgrQlZtS3aQRFE8gkgII+nrdXymKcgkfb6A5Bfzjrk8Z92hVpJhaNdoqUhKLMcg0bz2+Ada0H8bSMzF/NV7uvLNqPheF47dvzZpTEGFyUH91KXPOkKtsobOot3E2DzfCkvHqTBWQ0VsviYw9Nsdl2Z5f0ijd4jowzOk1sTgMiqxZV6qiUZDdKYRMGM/ypUfmcOmWyyHoSAC9av0RjiTE/1f3xhNycCnr9cluQUpGFcglg9llG3+4ZMcFRyu5f2MDQkKImg9CJ2DueCsxfUeqKTJqNjLSumRywnb+cwm2tbPvJ0lYULWS2UBlzzqs69VRKMXjFCMBu5nzwe+QxHbeAObZxTCWmlch1gDOu7sPTS398U55TlgHDTauPJ65LcdTLhghORJu1ShUBIq1JW4izzUMHx83gHC45V4quWnRY6IS8VPkb0MANGu+YMCDSjnksxnojV3iT5x/dlZkyZUoxXfM1OfvxYlDy3NjpgvKK7R0iQsTFVllVL4yjyr82uwOLgzzpzJvY7KFex9/LF/HDjFOX4b6BDodQ6d1uuuGn/Wwn1BSiKooJC09lrkHSl04gWEvuverMiEtDfqsNbXL1GobCJ0w81NfL8p3VaxaNf381lmLxnE/BBbtWcZFDMwuh/Itq9pIVPSPtJLRrrG40UpKON2NP451qx8VTmZJjmhLKZyUaQ0cynAyd3/RZAllnWWojcCjwvlnbg4Uao/0c3ahPQipQk1nZrZrfFX8XCPNa4B6vgAAA";
export default image;
@@ -0,0 +1,31 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
export const wallet = {
id: "com.anchorage",
name: "Anchorage Digital ",
homepage: "https://www.anchorage.com/",
image_id: "f2eb2b7a-4d75-41ec-c401-179d0372d600",
app: {
browser: null,
ios: "https://apps.apple.com/us/app/porto-by-anchorage-digital/id6470914477",
android: null,
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
},
rdns: null,
mobile: {
native: null,
universal: "https://anchorage.com",
},
desktop: {
native: null,
universal: "https://www.anchorage.com/platform/self-custody",
},
} as const;
@@ -7,26 +7,26 @@ export const wallet = {
homepage: "https://www.bee.com/en",
image_id: "77743ed9-5ac6-48f7-867d-0f98e481b500",
app: {
browser: null,
browser: "",
ios: "https://apps.apple.com/app/id1529988919",
android: "https://play.google.com/store/apps/details?id=network.bee.app",
mac: null,
windows: null,
linux: null,
mac: "",
windows: "",
linux: "",
chrome:
"https://chrome.google.com/webstore/detail/bee-wallet/nankopfjhdflikcokhgohiaoehnjfako",
firefox: null,
safari: null,
edge: null,
opera: null,
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: null,
rdns: "",
mobile: {
native: "bee://",
universal: "https://main.apple.bee9527.com",
},
desktop: {
native: null,
universal: null,
native: "",
universal: "",
},
} as const;
@@ -26,7 +26,7 @@ export const wallet = {
universal: "https://best-wallet-prod.web.app/connect",
},
desktop: {
native: null,
universal: null,
native: "",
universal: "",
},
} as const;
@@ -7,18 +7,18 @@ export const wallet = {
homepage: "https://bifrostwallet.com",
image_id: "c1ab3987-7e3c-43fa-0b27-c746f6135a00",
app: {
browser: null,
browser: "",
ios: "https://apps.apple.com/us/app/bifrost-wallet/id1577198351",
android:
"https://play.google.com/store/apps/details?id=com.bifrostwallet.app",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
mac: "",
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: "com.bifrostwallet",
mobile: {
@@ -26,7 +26,7 @@ export const wallet = {
universal: "https://app.bifrostwallet.com/",
},
desktop: {
native: null,
universal: null,
native: "",
universal: "",
},
} as const;
@@ -7,25 +7,25 @@ export const wallet = {
homepage: "https://bitpay.com/wallet",
image_id: "c81295d5-363c-4476-16ef-1e8ab557b100",
app: {
browser: null,
ios: "https://apps.apple.com/us/app/bitpay-bitcoin-wallet-card/id1149581638?platform=iphone",
android: "https://play.google.com/store/apps/details?id=com.bitpay.wallet",
browser: "",
ios: "https://bitpay.onelink.me/Cenw/ejjaw7bs",
android: "https://bitpay.onelink.me/Cenw/ejjaw7bs",
mac: "https://apps.apple.com/us/app/bitpay-bitcoin-wallet-card/id1149581638?platform=ipad",
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: null,
rdns: "",
mobile: {
native: "bitpay://",
universal: "https://link.bitpay.com",
},
desktop: {
native: null,
universal: null,
native: "",
universal: "",
},
} as const;
@@ -2,6 +2,6 @@
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRqYEAABXRUJQVlA4IJoEAABQGwCdASqAAIAAPm0ylUckIyIhLBVZAIANiWIIcAcgn/wwGvdTo53+Sf5S9NHwD2wyi/oB/aex3+Z+onzAP056RPmA/XX9ivd9/wH65e6j/HeoB/Yv9j1l3oH/sl6ZnsmfuH6Rma5dhH+cryt9eVswf0xM0jyep5ewlKwbFnf5v40J/vFU13E+PHqy608njqKIMU25mrGj1AVVDVd/x0YNt4u/w5AnmrUs7MiGCO6orQmYaJVknFgxI387poD4ykRq4yBkZhh3mt50jfaglHNwOAjgR1BxdbezZb2nUzyGkguLAAD+FLl/7mGux1I3Cf/mpTrF70bZXWLbtNuydZdN/0JCSKjn5/nQ/07osyyWH4xLu7REagvyPHEY6WJLN+h9YpPbY/aaFMLjDgyfKWDzQbtNV53DwGvhTc39nVtUC4ohcoAcnfhZRWyOSR9li8BSZYGQIvkLNefmSHtyNBT69U5GPNLAW6JUmBygd2pjgDxyFMwZgzlWikP0xiwKp/8edTjN5LrwdDT/ZpBEZGWwq5r0EibYj/m5zRBA24UKpNGy61+kbFlDKtX0qbTtTMAGrbue+w+0RN1m11WCyY8/QOQWJSl2eYx/JgmYERZDLZA7bnb9QxkyzIVCt/N+fZCnLnvbB7iHGl/UgaJMQzJtHeJnFzaZbssyffoaGShBX3pFip5aYpAmEwkC6IYBtK4RDSOKDm6mYV/U8Q+UBs8kwVYrvz+clT1Rb11h+Cr74h6bDzHmX1TkPEyWKmvhcXJ/J3iLs+GLXaRsi4nkyTo/mxurILkz+RDbcbvSnwXTvMWpPA9o8dEq1Hz8qFJcS9k/lq1FmgLx4I671Q7u8hal3lARrSmRniLpH+EHmN/ZgKLEGPNomQLPdjAAtFHTm+SDlpzVLBMVDs/87bBEQd5udcnbKtfTxNgN1bZ2eXUV3yCfDOpiACF4JJvPZNo8Z7/EZXYdGVj3ypr40dYKHIEqy0k9naZKk/zGSx/a5f2m35yQSM2mSqFYl+SUYpIxjr2eLfAjmJa37Y/83341Wd4DN+kGN6QTeTTrw8ehSB/LOn5VWMBIEc7z2A5bTr7ausrsBtyoYcH6yFWCPoq+Nnmg0qaZNWzBDpSnO+qeU/6T/yUyCzGouNPK+QcicYifoOLe8vEwHf8Xtwnghlll+1n7+dttEbASVeBxgq8YXyVQh9v9G4Cxz1BRSHEsncs5NgwnJnmTrHjFZzhBscFcWCyJvetdsG4z6KDov2wtMYr83cSVEE+dn52ZznLc3+MhYAZ2gjzORDOkd9iw76QWcAiAuqdH7Izor+13V86uT891IxkrsnWgs/4MhxTV4Ayvnj9dTNpiivVxgVAXOUwmH3m3r8+F4ct6qHH/A+Ezohp4jzjmj9VBedLwA+6mxpWmx8KX2VGUyQzdjG51P9/cBQ6p/IXVcgC0pod5enWuP/xkxPEEfn3VGqIn7m4qeOR+syA8rllRozptoWF8RVgczOatjBCR1vrKNkyiqUac9841+VJHwdyfDdZXC9Z3F1sW5G9Nv7EdD7BrRLhmKJ8o6B2RrhyqCZQrZAAAAA==";
"data:image/webp;base64,UklGRvYAAABXRUJQVlA4IOoAAABQCQCdASqAAIAAPm02mUkkIyKhIggAgA2JaW7dX9+megAABpf+crcBjD+uc04+pqAT7M7qkRohclKOsAKxhM7sgmYxDqu6tni6BwJ1WXoRuC/KMAD+8LfGu+Q+2KSmSyb8joOcs3bGJpKE1Vb//dBP+XPDX/J0mhIr/8gP/8gP/5Af4mMZAKeoEGOQpul+7072ozv5yNhdY/qnZKiP9f8++SKCfh0Vm0Pc6EGsQAAAAUvO9N/fdSYa0y9uolRMbO/N/BnX7t/T/3um4etabTva44nHtPJTj9pWcpGSn3fTP8MuP+f6biAhQAA=";
export default image;
@@ -3,9 +3,9 @@
export const wallet = {
id: "com.coinbase.wallet",
name: "Coinbase Wallet",
homepage: "https://www.coinbase.com/wallet/",
image_id: "a5ebc364-8f91-4200-fcc6-be81310a0000",
name: "Base (formerly Coinbase Wallet)",
homepage: "https://base.app",
image_id: "04c88bf0-f115-4686-8c29-90a3d018a400",
app: {
browser: null,
ios: "https://apps.apple.com/app/apple-store/id1278383455",
@@ -2,32 +2,32 @@
// Do not modify this file manually.
export const wallet = {
id: "com.concordium",
id: "com.concordium.wallet",
name: "Concordium",
homepage: "https://concordium.com/",
image_id: "b1ca907e-2f5f-42a8-d11c-86a15a291600",
app: {
browser: "https://concordium.com/",
ios: "https://apps.apple.com/us/app/concordium-blockchain-wallet/id6444703764",
browser: "",
ios: "https://apps.apple.com/us/app/concordium-wallet/id1593386457",
android:
"https://play.google.com/store/apps/details?id=software.concordium.mobilewallet.seedphrase.mainnet&pli=1",
"https://play.google.com/store/apps/details?id=com.pioneeringtechventures.wallet&hl=en&pli=1",
mac: "",
windows: null,
linux: null,
chrome:
"https://chrome.google.com/webstore/detail/concordium-wallet/mnnkpffndmickbiakofclnpoiajlegmg?hl=en-US",
"https://chromewebstore.google.com/detail/concordium-wallet/mnnkpffndmickbiakofclnpoiajlegmg",
firefox: null,
safari: null,
edge: null,
opera: null,
},
rdns: null,
rdns: "com.concordium.wallet",
mobile: {
native: "concordiumwallet://",
universal: "https://wallet.concordium.software",
},
desktop: {
native: null,
universal: "https://concordium.com/",
native: "",
universal: "",
},
} as const;
@@ -11,22 +11,22 @@ export const wallet = {
ios: "https://apps.apple.com/app/id1583011693",
android:
"https://play.google.com/store/apps/details?id=com.cryptnox.cryptnoxwallet",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
mac: "",
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: null,
rdns: "",
mobile: {
native: "cryptnox://",
universal: null,
universal: "",
},
desktop: {
native: null,
native: "",
universal: "https://cryptnox.com",
},
} as const;
@@ -7,25 +7,25 @@ export const wallet = {
homepage: "https://www.daffione.com/",
image_id: "1e87bcb9-452c-4ad7-471c-130ae0115000",
app: {
browser: null,
ios: null,
browser: "",
ios: "",
android: "https://play.google.com/store/apps/details?id=com.me.daffione",
mac: null,
windows: null,
linux: null,
chrome: null,
firefox: null,
safari: null,
edge: null,
opera: null,
mac: "",
windows: "",
linux: "",
chrome: "",
firefox: "",
safari: "",
edge: "",
opera: "",
},
rdns: null,
rdns: "",
mobile: {
native: "DaffiOne:// wc://",
universal: null,
universal: "",
},
desktop: {
native: null,
universal: null,
native: "",
universal: "",
},
} as const;
@@ -0,0 +1,7 @@
// This file is auto-generated by the `scripts/wallets/generate.ts` script.
// Do not modify this file manually.
const image =
"data:image/webp;base64,UklGRqwDAABXRUJQVlA4IKADAABQEwCdASqAAIAAPm02mEgkIyKhJhaoyIANiWcKFshaXsALOq7b3nsG8p/hK7r/S8KMpXgnpYpknkq+rhivgBWpbwArUt1mCkL+baZ7W/8/zKDKX2zheUrrgmNYiJxxBIi0QAz/0XsdLnYj6VK1YsT+eJrnAKIWd+/J/MfjqPB6yCD94tLh+8tT6Bu9Xe8xrn7tniLYrrPTpAPHQZ+5LvN/cNIAAP7/J5p+K/lV6yl5hhKsAAAGX6l5hk/awmtxLAZgVuks9wZnCpHJgdPnj3csPG2urpXYKF9mnB9O+TbHyUElJ0k/A6zSe5tUSv/ELxqlEJeSqzfI8FDmNtoBEvQPXfmuKXvkID2uRjLQs9g3gH9MVU/TWZ/sAcLcBQTrer0V80HD6AiMbWqOA5TX40xSBIWpqz6No94FYAbmwUJNmx6GY7LaSupy0OsSJIj0ZLCbQp3Dws/tBVAACUGBN9NV/Y7ijXooF/WXd7foVqf5sThfCODQA2uNBySXvnv1l4T0YMXrpsEtydhof73Y6Hmxt/VUdGKCNa2uy+EUEFOysd3tPsg5/wgzFGMgjpidcwTyZKTRhid08OfAZaR+NbSeKIxX7NH/gQHOx18s8+9sSAa70kF7dY+ohX9NIxacxb5GjXLkA95DO4++WyNQ2RnEmimm03hkV4V7NhnfYLMpTj04Pm2mx315d8ADA6Y+eZwqyBVIVGJxs4dlunsFiDUEN2VIlkQxSH4W3Tdonv9SzrqOILs0Zl3+TFy1Z+qTSgt6vJdFSSiJwYLq+OnIozeXCVRyiBYO9zPys19DBTRek7T6EJ/4Gv6C69XYJHS3iQ9yafqGdNN/mi3jJjq7+eOFEtaf9vfkNJR4DSHORu+3KlWRm/kbm0EpDrxrI+GzIB8NStCawvA/W1Nfz6vkmdmaZegPBUk1908FTc14pK/BBb+P3LIJ+fBIV/O2iTam4S4rm048pRcfQU10mn3DXNoX4KHONnJTFFXxmYR9YPa0ZcRoIalg1AWoAY4+a5rKhbfwU4hS+uZmg1VLu+DMe6Bd9XITFKfzCQKyRxcv9WCHXJQkK12Cu/pW3WrQPm/k37fMg9S2JY6GPnwdHj+QKwvfh789Bdl+B3lASwXC8A+CGwC8rUIapC0IrCWYH5VJ9VJBS7uZSudFBwi+zJX2HoXjP3ZN30LIkphPNfUmrS0LlzUsMnodYU1I1QnhB8vbC42wRqt3zizzw1YAvAAAAAAA";
export default image;

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