Compare commits
39
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c521aa06a | ||
|
|
8ab8e07fb1 | ||
|
|
49194e3a2a | ||
|
|
50420fc119 | ||
|
|
a82e63319a | ||
|
|
23d74a0a54 | ||
|
|
eb07340118 | ||
|
|
dc07145543 | ||
|
|
901789983f | ||
|
|
ad49560331 | ||
|
|
83198b2ea4 | ||
|
|
a138681b6c | ||
|
|
3a18c6e6a8 | ||
|
|
fdd8c17813 | ||
|
|
32c2ff62f8 | ||
|
|
bef65c8b69 | ||
|
|
7afc2055b9 | ||
|
|
8e9c51ee7b | ||
|
|
01a20cb7d5 | ||
|
|
e13b9a784a | ||
|
|
da4a4a540a | ||
|
|
5e5c82fb2e | ||
|
|
1d28988253 | ||
|
|
5352152835 | ||
|
|
decbbb8f7a | ||
|
|
ecd5ae1feb | ||
|
|
1caf6dd460 | ||
|
|
19204e4654 | ||
|
|
674c8d5e6c | ||
|
|
1eb0cd9314 | ||
|
|
b7dfde2d68 | ||
|
|
b50e304e0c | ||
|
|
9baa251bb1 | ||
|
|
7f36303b0b | ||
|
|
13a46b7ff6 | ||
|
|
b9d93e44ca | ||
|
|
fc9e81f99a | ||
|
|
281759f06a | ||
|
|
2d98fe2799 |
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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];
|
||||
|
||||
+83
-39
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
+1
-4
@@ -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
|
||||
|
||||
+1
-18
@@ -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={
|
||||
|
||||
+19
-2
@@ -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"
|
||||
/>
|
||||
|
||||
+101
-2
@@ -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=""
|
||||
|
||||
+27
-2
@@ -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"
|
||||
|
||||
+15
@@ -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
|
||||
|
||||
+2
@@ -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"],
|
||||
|
||||
+2
@@ -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,
|
||||
}),
|
||||
|
||||
|
||||
+19
-21
@@ -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]">
|
||||
|
||||
+12
-2
@@ -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>
|
||||
|
||||
+2
@@ -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>
|
||||
|
||||
+12
-4
@@ -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">
|
||||
|
||||
+29
-1
@@ -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
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
})}
|
||||
|
||||
@@ -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,7 +1,7 @@
|
||||
{
|
||||
"name": "wagmi-inapp",
|
||||
"private": true,
|
||||
"version": "0.0.48",
|
||||
"version": "0.0.58",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
-6
@@ -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);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
+9
-1
@@ -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=");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+2002
-1656
File diff suppressed because it is too large
Load Diff
+352
-308
@@ -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";
|
||||
|
||||
+1203
-993
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,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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.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;
|
||||
+32
@@ -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;
|
||||
+14
-14
@@ -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;
|
||||
+11
-11
@@ -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;
|
||||
|
||||
+2
-2
@@ -26,7 +26,7 @@ export const wallet = {
|
||||
universal: "https://best-wallet-prod.web.app/connect",
|
||||
},
|
||||
desktop: {
|
||||
native: null,
|
||||
universal: null,
|
||||
native: "",
|
||||
universal: "",
|
||||
},
|
||||
} as const;
|
||||
|
||||
+11
-11
@@ -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;
|
||||
|
||||
+1
-1
@@ -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
-3
@@ -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",
|
||||
|
||||
+8
-8
@@ -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
-11
@@ -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;
|
||||
|
||||
+14
-14
@@ -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
Reference in New Issue
Block a user