diff --git a/.changeset/eleven-chicken-smile.md b/.changeset/eleven-chicken-smile.md new file mode 100644 index 00000000000..c619b0d3a99 --- /dev/null +++ b/.changeset/eleven-chicken-smile.md @@ -0,0 +1,47 @@ +--- +"thirdweb": minor +--- + +Adds EIP1193 adapters that allow conversion between Thirdweb wallets and EIP-1193 providers: + +- `EIP1193.fromProvider()`: Creates a Thirdweb wallet from any EIP-1193 compatible provider (like MetaMask, WalletConnect) +- `EIP1193.toProvider()`: Converts a Thirdweb wallet into an EIP-1193 provider that can be used with any web3 library + +Key features: +- Full EIP-1193 compliance for seamless integration +- Handles account management (connect, disconnect, chain switching) +- Supports all standard Ethereum JSON-RPC methods +- Comprehensive event system for state changes +- Type-safe interfaces with full TypeScript support + +Examples: + +```ts +// Convert MetaMask's provider to a Thirdweb wallet +const wallet = EIP1193.fromProvider({ + provider: window.ethereum, + walletId: "io.metamask" +}); + +// Use like any other Thirdweb wallet +const account = await wallet.connect({ + client: createThirdwebClient({ clientId: "..." }) +}); + +// Convert a Thirdweb wallet to an EIP-1193 provider +const provider = EIP1193.toProvider({ + wallet, + chain: ethereum, + client: createThirdwebClient({ clientId: "..." }) +}); + +// Use with any EIP-1193 compatible library +const accounts = await provider.request({ + method: "eth_requestAccounts" +}); + +// Listen for events +provider.on("accountsChanged", (accounts) => { + console.log("Active accounts:", accounts); +}); +``` diff --git a/packages/thirdweb/scripts/wallets/extra-wallet-icons/abstract.png b/packages/thirdweb/scripts/wallets/extra-wallet-icons/abstract.png new file mode 100644 index 00000000000..dd1d1f698d8 Binary files /dev/null and b/packages/thirdweb/scripts/wallets/extra-wallet-icons/abstract.png differ diff --git a/packages/thirdweb/scripts/wallets/extra-wallets.json b/packages/thirdweb/scripts/wallets/extra-wallets.json index 0e42e280091..b9da2e61c64 100644 --- a/packages/thirdweb/scripts/wallets/extra-wallets.json +++ b/packages/thirdweb/scripts/wallets/extra-wallets.json @@ -91,5 +91,33 @@ "native": null, "universal": null } + }, + { + "id": "abstract", + "name": "Abstract Global Wallet", + "homepage": "https://abs.xyz/", + "image_id": "abstract.png", + "app": { + "browser": null, + "ios": null, + "android": null, + "mac": null, + "windows": null, + "linux": null, + "chrome": null, + "firefox": null, + "safari": null, + "edge": null, + "opera": null + }, + "rdns": "xyz.abs", + "mobile": { + "native": null, + "universal": null + }, + "desktop": { + "native": null, + "universal": null + } } ] diff --git a/packages/thirdweb/src/adapters/eip1193/from-eip1193.test.ts b/packages/thirdweb/src/adapters/eip1193/from-eip1193.test.ts new file mode 100644 index 00000000000..48d9c4def2e --- /dev/null +++ b/packages/thirdweb/src/adapters/eip1193/from-eip1193.test.ts @@ -0,0 +1,138 @@ +import { describe, expect, test, vi } from "vitest"; +import { TEST_ACCOUNT_A } from "~test/test-wallets.js"; +import { ANVIL_CHAIN } from "../../../test/src/chains.js"; +import { TEST_CLIENT } from "../../../test/src/test-clients.js"; +import { trackConnect } from "../../analytics/track/connect.js"; +import { fromProvider } from "./from-eip1193.js"; +import type { EIP1193Provider } from "./types.js"; + +vi.mock("../../analytics/track/connect.js"); + +describe("fromProvider", () => { + const mockProvider: EIP1193Provider = { + on: vi.fn(), + removeListener: vi.fn(), + request: vi.fn(), + }; + + const mockAccount = TEST_ACCOUNT_A; + + test("should create a wallet with the correct properties", () => { + const wallet = fromProvider({ + provider: mockProvider, + walletId: "io.metamask", + }); + + expect(wallet.id).toBe("io.metamask"); + expect(wallet.subscribe).toBeDefined(); + expect(wallet.connect).toBeDefined(); + expect(wallet.disconnect).toBeDefined(); + expect(wallet.getAccount).toBeDefined(); + expect(wallet.getChain).toBeDefined(); + expect(wallet.getConfig).toBeDefined(); + expect(wallet.switchChain).toBeDefined(); + }); + + test("should use 'adapter' as default walletId", () => { + const wallet = fromProvider({ + provider: mockProvider, + }); + + expect(wallet.id).toBe("adapter"); + }); + + test("should handle async provider function", async () => { + const wallet = fromProvider({ + provider: async () => + Promise.resolve({ + ...mockProvider, + request: () => Promise.resolve([mockAccount.address]), + }), + }); + + // Connect to trigger provider initialization + await wallet.connect({ + client: TEST_CLIENT, + }); + + expect(wallet.getAccount()?.address).toBe(mockAccount.address); + }); + + test("should emit events on connect", async () => { + const wallet = fromProvider({ + provider: { + ...mockProvider, + request: () => Promise.resolve([mockAccount.address]), + }, + }); + + const onConnectSpy = vi.fn(); + wallet.subscribe("onConnect", onConnectSpy); + + await wallet.connect({ + client: TEST_CLIENT, + chain: ANVIL_CHAIN, + }); + + expect(onConnectSpy).toHaveBeenCalled(); + expect(trackConnect).toHaveBeenCalledWith({ + client: TEST_CLIENT, + walletType: "adapter", + walletAddress: mockAccount.address, + }); + }); + + test("should emit events on disconnect", async () => { + const wallet = fromProvider({ + provider: mockProvider, + }); + + const onDisconnectSpy = vi.fn(); + wallet.subscribe("disconnect", onDisconnectSpy); + + await wallet.disconnect(); + + expect(onDisconnectSpy).toHaveBeenCalled(); + }); + + test("should handle chain changes", async () => { + const wallet = fromProvider({ + provider: { + ...mockProvider, + request: () => Promise.resolve([mockAccount.address]), + }, + }); + + const onChainChangedSpy = vi.fn(); + wallet.subscribe("chainChanged", onChainChangedSpy); + + await wallet.connect({ + client: TEST_CLIENT, + chain: ANVIL_CHAIN, + }); + + const chain = wallet.getChain(); + expect(chain).toBe(ANVIL_CHAIN); + }); + + test("should reset state on disconnect", async () => { + const wallet = fromProvider({ + provider: { + ...mockProvider, + request: () => Promise.resolve([mockAccount.address]), + }, + }); + + mockProvider.request = vi.fn().mockResolvedValueOnce([mockAccount.address]); + + await wallet.connect({ + client: TEST_CLIENT, + chain: ANVIL_CHAIN, + }); + + await wallet.disconnect(); + + expect(wallet.getAccount()).toBeUndefined(); + expect(wallet.getChain()).toBeUndefined(); + }); +}); diff --git a/packages/thirdweb/src/adapters/eip1193/from-eip1193.ts b/packages/thirdweb/src/adapters/eip1193/from-eip1193.ts new file mode 100644 index 00000000000..7ac33cc4a73 --- /dev/null +++ b/packages/thirdweb/src/adapters/eip1193/from-eip1193.ts @@ -0,0 +1,171 @@ +import * as ox__Hex from "ox/Hex"; +import { trackConnect } from "../../analytics/track/connect.js"; +import type { Chain } from "../../chains/types.js"; +import { getCachedChainIfExists } from "../../chains/utils.js"; +import { + autoConnectEip1193Wallet, + connectEip1193Wallet, +} from "../../wallets/injected/index.js"; +import type { Account, Wallet } from "../../wallets/interfaces/wallet.js"; +import { createWalletEmitter } from "../../wallets/wallet-emitter.js"; +import type { WalletId } from "../../wallets/wallet-types.js"; +import type { EIP1193Provider } from "./types.js"; + +/** + * Options for creating an EIP-1193 provider adapter. + */ +export type FromEip1193AdapterOptions = { + provider: EIP1193Provider | (() => Promise); + walletId?: WalletId; +}; + +/** + * Creates a Thirdweb wallet from an EIP-1193 compatible provider. + * + * This adapter allows you to use any EIP-1193 provider (like MetaMask, WalletConnect, etc.) as a Thirdweb wallet. + * It handles all the necessary conversions between the EIP-1193 interface and Thirdweb's wallet interface. + * + * @param options - Configuration options for creating the wallet adapter + * @param options.provider - An EIP-1193 compatible provider or a function that returns one + * @param options.walletId - Optional custom wallet ID to identify this provider (defaults to "adapter") + * @returns A Thirdweb wallet instance that wraps the EIP-1193 provider + * + * @example + * ```ts + * import { EIP1193 } from "thirdweb/wallets"; + * + * // Create a Thirdweb wallet from MetaMask's provider + * const wallet = EIP1193.fromProvider({ + * provider: window.ethereum, + * walletId: "io.metamask" + * }); + * + * // Use like any other Thirdweb wallet + * const account = await wallet.connect({ + * client: createThirdwebClient({ clientId: "..." }) + * }); + * + * // Sign messages + * await account.signMessage({ message: "Hello World" }); + * + * // Send transactions + * await account.sendTransaction({ + * to: "0x...", + * value: 1000000000000000000n + * }); + * ``` + */ +export function fromProvider(options: FromEip1193AdapterOptions): Wallet { + const id: WalletId = options.walletId ?? "adapter"; + const emitter = createWalletEmitter(); + let account: Account | undefined = undefined; + let chain: Chain | undefined = undefined; + let provider: EIP1193Provider | undefined = undefined; + const getProvider = async () => { + if (!provider) { + provider = + typeof options.provider === "function" + ? await options.provider() + : options.provider; + } + return provider; + }; + + const unsubscribeChain = emitter.subscribe("chainChanged", (newChain) => { + chain = newChain; + }); + + function reset() { + account = undefined; + chain = undefined; + } + + let handleDisconnect = async () => {}; + + const unsubscribeDisconnect = emitter.subscribe("disconnect", () => { + reset(); + unsubscribeChain(); + unsubscribeDisconnect(); + }); + + emitter.subscribe("accountChanged", (_account) => { + account = _account; + }); + + let handleSwitchChain: (c: Chain) => Promise = async (c) => { + await provider?.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: ox__Hex.fromNumber(c.id) }], + }); + }; + + return { + id, + subscribe: emitter.subscribe, + getConfig: () => undefined, + getChain() { + if (!chain) { + return undefined; + } + + chain = getCachedChainIfExists(chain.id) || chain; + return chain; + }, + getAccount: () => account, + connect: async (connectOptions) => { + const [connectedAccount, connectedChain, doDisconnect, doSwitchChain] = + await connectEip1193Wallet({ + id, + provider: await getProvider(), + client: connectOptions.client, + chain: connectOptions.chain, + emitter, + }); + // set the states + account = connectedAccount; + chain = connectedChain; + handleDisconnect = doDisconnect; + handleSwitchChain = doSwitchChain; + emitter.emit("onConnect", connectOptions); + trackConnect({ + client: connectOptions.client, + walletType: id, + walletAddress: account.address, + }); + // return account + return account; + }, + autoConnect: async (connectOptions) => { + const [connectedAccount, connectedChain, doDisconnect, doSwitchChain] = + await autoConnectEip1193Wallet({ + id, + provider: await getProvider(), + emitter, + chain: connectOptions.chain, + client: connectOptions.client, + }); + // set the states + account = connectedAccount; + chain = connectedChain; + handleDisconnect = doDisconnect; + handleSwitchChain = doSwitchChain; + emitter.emit("onConnect", connectOptions); + trackConnect({ + client: connectOptions.client, + walletType: id, + walletAddress: account.address, + }); + // return account + return account; + }, + disconnect: async () => { + reset(); + await handleDisconnect(); + emitter.emit("disconnect", undefined); + }, + switchChain: async (c) => { + await handleSwitchChain(c); + emitter.emit("chainChanged", c); + }, + }; +} diff --git a/packages/thirdweb/src/adapters/eip1193/index.ts b/packages/thirdweb/src/adapters/eip1193/index.ts new file mode 100644 index 00000000000..f32707c0925 --- /dev/null +++ b/packages/thirdweb/src/adapters/eip1193/index.ts @@ -0,0 +1,11 @@ +export { + type FromEip1193AdapterOptions, + fromProvider, +} from "./from-eip1193.js"; + +export { + type ToEip1193ProviderOptions, + toProvider, +} from "./to-eip1193.js"; + +export type { EIP1193Provider } from "./types.js"; diff --git a/packages/thirdweb/src/adapters/eip1193/to-eip1193.test.ts b/packages/thirdweb/src/adapters/eip1193/to-eip1193.test.ts new file mode 100644 index 00000000000..580e664fabd --- /dev/null +++ b/packages/thirdweb/src/adapters/eip1193/to-eip1193.test.ts @@ -0,0 +1,187 @@ +import * as ox__Hex from "ox/Hex"; +import { describe, expect, test, vi } from "vitest"; +import { TEST_WALLET_B } from "~test/addresses.js"; +import { TEST_ACCOUNT_A } from "~test/test-wallets.js"; +import { typedData } from "~test/typed-data.js"; +import { ANVIL_CHAIN } from "../../../test/src/chains.js"; +import { TEST_CLIENT } from "../../../test/src/test-clients.js"; +import { prepareTransaction } from "../../transaction/prepare-transaction.js"; +import type { Account, Wallet } from "../../wallets/interfaces/wallet.js"; +import { createWalletEmitter } from "../../wallets/wallet-emitter.js"; +import { toProvider } from "./to-eip1193.js"; + +describe("toProvider", () => { + const mockAccount: Account = TEST_ACCOUNT_A; + const emitter = createWalletEmitter(); + + const mockWallet: Wallet = { + id: "io.metamask", + subscribe: emitter.subscribe, + connect: vi.fn().mockResolvedValue(mockAccount), + autoConnect: vi.fn().mockResolvedValue(mockAccount), + disconnect: vi.fn(), + getAccount: () => mockAccount, + getChain: () => ANVIL_CHAIN, + getConfig: () => undefined, + switchChain: vi.fn(), + }; + + test("should create a provider with the correct interface", () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + expect(provider.on).toBeDefined(); + expect(provider.removeListener).toBeDefined(); + expect(provider.request).toBeDefined(); + }); + + test("should handle eth_requestAccounts", async () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + const accounts = await provider.request({ + method: "eth_requestAccounts", + params: [], + }); + + expect(accounts).toEqual([mockAccount.address]); + }); + + test("should handle eth_accounts", async () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + const accounts = await provider.request({ + method: "eth_accounts", + params: [], + }); + + expect(accounts).toEqual([mockAccount.address]); + }); + + test("should handle personal_sign", async () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + const message = "0x48656c6c6f20776f726c64"; + const result = await provider.request({ + method: "personal_sign", + params: [message, mockAccount.address], + }); + + expect(result).toEqual( + "0x15a3fe3974ebe469b00e67ad67bb3860ad3fc3d739287cdbc4ba558ce7130bee205e5e38d6ef156f1ff6a4df17bfa72a1e61c429f92613f3efbc58394d00c9891b", + ); + }); + + test("should handle eth_signTypedData_v4", async () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + const result = await provider.request({ + method: "eth_signTypedData_v4", + params: [mockAccount.address, JSON.stringify(typedData.basic)], + }); + + expect(result).toEqual( + "0x32f3d5975ba38d6c2fba9b95d5cbed1febaa68003d3d588d51f2de522ad54117760cfc249470a75232552e43991f53953a3d74edf6944553c6bef2469bb9e5921b", + ); + }); + + test("should handle eth_sendTransaction", async () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + const tx = prepareTransaction({ + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + value: 100n, + to: TEST_WALLET_B, + }); + + const result = await provider.request({ + method: "eth_sendTransaction", + params: [tx], + }); + + expect(ox__Hex.validate(result)).toBe(true); + }); + + test("should handle eth_estimateGas", async () => { + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + const tx = prepareTransaction({ + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + value: 100n, + to: TEST_WALLET_B, + }); + + const result = await provider.request({ + method: "eth_estimateGas", + params: [tx], + }); + + expect(result).toBeGreaterThan(0n); + }); + + test("should throw error when account is not connected", async () => { + const walletWithoutAccount = { + ...mockWallet, + getAccount: () => undefined, + }; + + const provider = toProvider({ + wallet: walletWithoutAccount, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + }); + + await expect( + provider.request({ + method: "eth_accounts", + params: [], + }), + ).rejects.toThrow("Account not connected"); + }); + + test("should use custom connect override when provided", async () => { + const customConnect = vi.fn().mockResolvedValue(mockAccount); + + const provider = toProvider({ + wallet: mockWallet, + chain: ANVIL_CHAIN, + client: TEST_CLIENT, + connectOverride: customConnect, + }); + + await provider.request({ + method: "eth_requestAccounts", + params: [], + }); + + expect(customConnect).toHaveBeenCalledWith(mockWallet); + }); +}); diff --git a/packages/thirdweb/src/adapters/eip1193/to-eip1193.ts b/packages/thirdweb/src/adapters/eip1193/to-eip1193.ts new file mode 100644 index 00000000000..ac87114ab3f --- /dev/null +++ b/packages/thirdweb/src/adapters/eip1193/to-eip1193.ts @@ -0,0 +1,132 @@ +import type { Account } from "viem/accounts"; + +import type { Chain } from "../../chains/types.js"; +import type { ThirdwebClient } from "../../client/client.js"; +import { getRpcClient } from "../../rpc/rpc.js"; +import { estimateGas } from "../../transaction/actions/estimate-gas.js"; +import { sendTransaction } from "../../transaction/actions/send-transaction.js"; +import { prepareTransaction } from "../../transaction/prepare-transaction.js"; +import type { Wallet } from "../../wallets/interfaces/wallet.js"; +import type { EIP1193Provider } from "./types.js"; + +export type ToEip1193ProviderOptions = { + wallet: Wallet; + chain: Chain; + client: ThirdwebClient; + connectOverride?: (wallet: Wallet) => Promise; +}; + +/** + * Converts a Thirdweb wallet into an EIP-1193 compatible provider. + * + * This adapter allows you to use a Thirdweb wallet with any library or dApp that expects an EIP-1193 provider. + * The provider implements the standard EIP-1193 interface including request handling and event subscription. + * + * @param options - Configuration options for creating the provider + * @param options.wallet - The Thirdweb wallet to adapt into a provider + * @param options.chain - The blockchain chain to connect to + * @param options.client - The Thirdweb client instance + * @param options.connectOverride - Optional custom connect handler to override default connection behavior + * @returns An EIP-1193 compatible provider that wraps the Thirdweb wallet + * + * @example + * ```ts + * import { EIP1193 } from "thirdweb/wallets"; + * + * // Create an EIP-1193 provider from a Thirdweb wallet + * const provider = EIP1193.toProvider({ + * wallet, + * chain: ethereum, + * client: createThirdwebClient({ clientId: "..." }) + * }); + * + * // Use with any EIP-1193 compatible library + * const accounts = await provider.request({ + * method: "eth_requestAccounts" + * }); + * + * // Listen for events + * provider.on("accountsChanged", (accounts) => { + * console.log("Active accounts:", accounts); + * }); + * ``` + */ +export function toProvider(options: ToEip1193ProviderOptions): EIP1193Provider { + const { chain, client, wallet, connectOverride } = options; + const rpcClient = getRpcClient({ client, chain }); + return { + on: wallet.subscribe, + removeListener: () => { + // should invoke the return fn from subscribe instead + }, + request: async (request) => { + if (request.method === "eth_sendTransaction") { + const account = wallet.getAccount(); + if (!account) { + throw new Error("Account not connected"); + } + const result = await sendTransaction({ + transaction: prepareTransaction({ + ...request.params[0], + chain, + client, + }), + account: account, + }); + return result.transactionHash; + } + if (request.method === "eth_estimateGas") { + const account = wallet.getAccount(); + if (!account) { + throw new Error("Account not connected"); + } + return estimateGas({ + transaction: prepareTransaction({ + ...request.params[0], + chain, + client, + }), + account, + }); + } + if (request.method === "personal_sign") { + const account = wallet.getAccount(); + if (!account) { + throw new Error("Account not connected"); + } + return account.signMessage({ + message: { + raw: request.params[0], + }, + }); + } + if (request.method === "eth_signTypedData_v4") { + const account = wallet.getAccount(); + if (!account) { + throw new Error("Account not connected"); + } + const data = JSON.parse(request.params[1]); + return account.signTypedData(data); + } + if (request.method === "eth_accounts") { + const account = wallet.getAccount(); + if (!account) { + throw new Error("Account not connected"); + } + return [account.address]; + } + if (request.method === "eth_requestAccounts") { + const account = connectOverride + ? await connectOverride(wallet) + : await wallet.connect({ + client, + }); + if (!account) { + throw new Error("Unable to connect wallet"); + } + return [account.address]; + } + return rpcClient(request); + }, + }; +} diff --git a/packages/thirdweb/src/adapters/eip1193/types.ts b/packages/thirdweb/src/adapters/eip1193/types.ts new file mode 100644 index 00000000000..f9d06505711 --- /dev/null +++ b/packages/thirdweb/src/adapters/eip1193/types.ts @@ -0,0 +1,9 @@ +// loose interface on purpose to adapt to any version of viem, ethers, ox, web3js, etc +export type EIP1193Provider = { + // biome-ignore lint/suspicious/noExplicitAny: + on(event: any, listener: (params: any) => any): void; + // biome-ignore lint/suspicious/noExplicitAny: + removeListener(event: any, listener: (params: any) => any): void; + // biome-ignore lint/suspicious/noExplicitAny: + request: (params: any) => Promise; +}; diff --git a/packages/thirdweb/src/analytics/track/transaction.ts b/packages/thirdweb/src/analytics/track/transaction.ts index a8b137df4bc..9ef22c120ab 100644 --- a/packages/thirdweb/src/analytics/track/transaction.ts +++ b/packages/thirdweb/src/analytics/track/transaction.ts @@ -9,7 +9,7 @@ type TransactionEvent = { ecosystem?: Ecosystem; transactionHash?: string; walletAddress?: string; - walletType?: WalletId; + walletType?: WalletId | ({} & string); chainId?: number; contractAddress?: string; functionName?: string; diff --git a/packages/thirdweb/src/exports/wallets.native.ts b/packages/thirdweb/src/exports/wallets.native.ts index 09f819e208d..740c2fa3bdf 100644 --- a/packages/thirdweb/src/exports/wallets.native.ts +++ b/packages/thirdweb/src/exports/wallets.native.ts @@ -134,6 +134,9 @@ export type { WalletConnectSession, } from "../wallets/wallet-connect/receiver/types.js"; +// eip1193 +export * as EIP1193 from "../adapters/eip1193/index.js"; + // NOT SUPPORTED export const injectedProvider = () => { diff --git a/packages/thirdweb/src/exports/wallets.ts b/packages/thirdweb/src/exports/wallets.ts index 0c782c9783b..5213a09c3d1 100644 --- a/packages/thirdweb/src/exports/wallets.ts +++ b/packages/thirdweb/src/exports/wallets.ts @@ -144,6 +144,9 @@ export type { WalletConnectSession, } from "../wallets/wallet-connect/receiver/types.js"; +// eip1193 +export * as EIP1193 from "../adapters/eip1193/index.js"; + // WEB ONLY EXPORTS // injected diff --git a/packages/thirdweb/src/react/core/hooks/wallets/useAdminWallet.ts b/packages/thirdweb/src/react/core/hooks/wallets/useAdminWallet.ts index 27915f884d4..321fd834c1b 100644 --- a/packages/thirdweb/src/react/core/hooks/wallets/useAdminWallet.ts +++ b/packages/thirdweb/src/react/core/hooks/wallets/useAdminWallet.ts @@ -5,6 +5,7 @@ import { useConnectedWallets } from "./useConnectedWallets.js"; * Get the admin wallet for the active wallet * Useful for smart wallets to get the underlying personal account * @returns The admin wallet for the active wallet, or the active wallet if it doesn't have an admin account + * @walletConnection */ export function useAdminWallet() { const activeWallet = useActiveWallet(); diff --git a/packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.tsx b/packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.tsx index 46263420d3e..825441b3bc4 100644 --- a/packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.tsx +++ b/packages/thirdweb/src/react/web/ui/ConnectWallet/Modal/AnyWalletConnectUI.tsx @@ -9,7 +9,6 @@ import type { InjectedSupportedWalletIds, WCSupportedWalletIds, } from "../../../../../wallets/__generated__/wallet-ids.js"; -import { COINBASE } from "../../../../../wallets/constants.js"; import { isEcosystemWallet } from "../../../../../wallets/ecosystem/is-ecosystem-wallet.js"; import { getInstalledWalletProviders } from "../../../../../wallets/injected/mipdStore.js"; import type { Wallet } from "../../../../../wallets/interfaces/wallet.js"; @@ -197,27 +196,6 @@ export function AnyWalletConnectUI(props: { ); } - // coinbase wallet sdk - if (props.wallet.id === COINBASE) { - return ( - }> - { - setScreen("get-started"); - }} - onBack={props.onBack} - done={props.done} - wallet={props.wallet as Wallet} - walletInfo={walletInfo.data} - chain={props.chain} - client={props.client} - size={props.size} - /> - - ); - } - // wallet connect if (walletInfo.data.mobile.native || walletInfo.data.mobile.universal) { return ( @@ -294,6 +272,27 @@ export function AnyWalletConnectUI(props: { ); } + // any other known wallet + if (props.wallet.id) { + return ( + }> + { + setScreen("get-started"); + }} + onBack={props.onBack} + done={props.done} + wallet={props.wallet} + walletInfo={walletInfo.data} + chain={props.chain} + client={props.client} + size={props.size} + /> + + ); + } + // if can't connect in any way - show get started screen return ( void; onGetStarted: () => void; done: () => void; locale: InjectedWalletLocale; - wallet: Wallet; + wallet: Wallet; walletInfo: WalletInfo; client: ThirdwebClient; chain: Chain | undefined; @@ -70,4 +69,4 @@ function CoinbaseSDKWalletConnectUI(props: { ); } -export default CoinbaseSDKWalletConnectUI; +export default ExternalWalletConnectUI; diff --git a/packages/thirdweb/src/transaction/actions/to-serializable-transaction.ts b/packages/thirdweb/src/transaction/actions/to-serializable-transaction.ts index 22f34e1022a..cc0326b7dd6 100644 --- a/packages/thirdweb/src/transaction/actions/to-serializable-transaction.ts +++ b/packages/thirdweb/src/transaction/actions/to-serializable-transaction.ts @@ -1,6 +1,8 @@ import type { TransactionSerializable } from "viem"; import { getGasOverridesForTransaction } from "../../gas/fee-data.js"; import { getRpcClient } from "../../rpc/rpc.js"; +import { getAddress } from "../../utils/address.js"; +import { isZkSyncChain } from "../../utils/any-evm/zksync/isZkSyncChain.js"; import { resolvePromisedValue } from "../../utils/promise/resolve-promised-value.js"; import type { PreparedTransaction } from "../prepare-transaction.js"; import { encode } from "./encode.js"; @@ -45,6 +47,25 @@ export type ToSerializableTransactionOptions = { export async function toSerializableTransaction( options: ToSerializableTransactionOptions, ) { + // zk chains require a different rpc method for gas estimation and gas fees + const isZkSync = await isZkSyncChain(options.transaction.chain); + if (isZkSync) { + const { getZkGasFees } = await import( + "./zksync/send-eip712-transaction.js" + ); + const { gas, maxFeePerGas, maxPriorityFeePerGas } = await getZkGasFees({ + transaction: options.transaction, + from: options.from ? getAddress(options.from) : undefined, + }); + // passing these values here will avoid re-fetching them below + options.transaction = { + ...options.transaction, + gas, + maxFeePerGas, + maxPriorityFeePerGas, + }; + } + const rpcRequest = getRpcClient(options.transaction); const chainId = options.transaction.chain.id; const from = options.from; diff --git a/packages/thirdweb/src/transaction/actions/zksync/send-eip712-transaction.ts b/packages/thirdweb/src/transaction/actions/zksync/send-eip712-transaction.ts index e8719ef4e9a..6f4ac2c6555 100644 --- a/packages/thirdweb/src/transaction/actions/zksync/send-eip712-transaction.ts +++ b/packages/thirdweb/src/transaction/actions/zksync/send-eip712-transaction.ts @@ -1,9 +1,10 @@ import { hexToBytes, toRlp } from "viem"; import { eth_sendRawTransaction } from "../../../rpc/actions/eth_sendRawTransaction.js"; import { getRpcClient } from "../../../rpc/rpc.js"; -import { toBigInt } from "../../../utils/bigint.js"; +import { type Address, getAddress } from "../../../utils/address.js"; +import { replaceBigInts, toBigInt } from "../../../utils/bigint.js"; import { concatHex } from "../../../utils/encoding/helpers/concat-hex.js"; -import { type Hex, numberToHex, toHex } from "../../../utils/encoding/hex.js"; +import { type Hex, toHex } from "../../../utils/encoding/hex.js"; import { resolvePromisedValue } from "../../../utils/promise/resolve-promised-value.js"; import type { Account } from "../../../wallets/interfaces/wallet.js"; import type { PreparedTransaction } from "../../prepare-transaction.js"; @@ -87,57 +88,8 @@ export async function populateEip712Transaction( options: SendEip712TransactionOptions, ): Promise { const { account, transaction } = options; - let [data, to, value, gas, maxFeePerGas, maxPriorityFeePerGas, eip712] = - await Promise.all([ - encode(transaction), - resolvePromisedValue(transaction.to), - resolvePromisedValue(transaction.value), - resolvePromisedValue(transaction.gas), - resolvePromisedValue(transaction.maxFeePerGas), - resolvePromisedValue(transaction.maxPriorityFeePerGas), - resolvePromisedValue(transaction.eip712), - ]); - let gasPerPubdata = eip712?.gasPerPubdata; - if (!gas || !maxFeePerGas || !maxPriorityFeePerGas) { - // fetch fees and gas - const rpc = getRpcClient(transaction); - const result = (await rpc({ - // biome-ignore lint/suspicious/noExplicitAny: TODO add to RPC method types - method: "zks_estimateFee" as any, - params: [ - { - from: account.address, - to, - data, - value: value ? numberToHex(value) : undefined, - gasPerPubdata, - eip712Meta: { - ...eip712, - gasPerPubdata: gasPerPubdata ? toHex(gasPerPubdata) : toHex(50000n), - factoryDeps: eip712?.factoryDeps?.map((dep) => - Array.from(hexToBytes(dep)), - ), - }, - type: "0x71", - // biome-ignore lint/suspicious/noExplicitAny: TODO add to RPC method types - } as any, - ], - })) as { - gas_limit: string; - max_fee_per_gas: string; - max_priority_fee_per_gas: string; - gas_per_pubdata_limit: string; - }; - gas = toBigInt(result.gas_limit) * 2n; // overestimating to avoid issues when not accounting for paymaster extra gas ( we should really pass the paymaster input above for better accuracy ) - const baseFee = toBigInt(result.max_fee_per_gas); - maxFeePerGas = baseFee * 2n; // bumping the base fee per gas to ensure fast inclusion - maxPriorityFeePerGas = toBigInt(result.max_priority_fee_per_gas) || 1n; - gasPerPubdata = toBigInt(result.gas_per_pubdata_limit) * 2n; // doubling for fast inclusion; - if (gasPerPubdata < 50000n) { - // enforce a minimum gas per pubdata limit - gasPerPubdata = 50000n; - } - } + const { gas, maxFeePerGas, maxPriorityFeePerGas, gasPerPubdata } = + await getZkGasFees({ transaction, from: getAddress(account.address) }); // serialize the transaction (with fees, gas, nonce) const serializableTransaction = await toSerializableTransaction({ @@ -203,3 +155,76 @@ function serializeTransactionEIP712( // @ts-ignore - TODO: fix types return concatHex(["0x71", toRlp(serializedTransaction)]); } + +export async function getZkGasFees(args: { + transaction: PreparedTransaction; + from?: Address; +}) { + const { transaction, from } = args; + let [gas, maxFeePerGas, maxPriorityFeePerGas, eip712] = await Promise.all([ + resolvePromisedValue(transaction.gas), + resolvePromisedValue(transaction.maxFeePerGas), + resolvePromisedValue(transaction.maxPriorityFeePerGas), + resolvePromisedValue(transaction.eip712), + ]); + let gasPerPubdata = eip712?.gasPerPubdata; + if (!gas || !maxFeePerGas || !maxPriorityFeePerGas) { + const rpc = getRpcClient(transaction); + const params = await formatTransaction({ transaction, from }); + const result = (await rpc({ + // biome-ignore lint/suspicious/noExplicitAny: TODO add to RPC method types + method: "zks_estimateFee" as any, + // biome-ignore lint/suspicious/noExplicitAny: TODO add to RPC method types + params: [replaceBigInts(params, toHex)] as any, + })) as { + gas_limit: string; + max_fee_per_gas: string; + max_priority_fee_per_gas: string; + gas_per_pubdata_limit: string; + }; + gas = toBigInt(result.gas_limit) * 2n; // overestimating to avoid issues when not accounting for paymaster extra gas ( we should really pass the paymaster input above for better accuracy ) + const baseFee = toBigInt(result.max_fee_per_gas); + maxFeePerGas = baseFee * 2n; // bumping the base fee per gas to ensure fast inclusion + maxPriorityFeePerGas = toBigInt(result.max_priority_fee_per_gas) || 1n; + gasPerPubdata = toBigInt(result.gas_per_pubdata_limit) * 2n; // doubling for fast inclusion; + if (gasPerPubdata < 50000n) { + // enforce a minimum gas per pubdata limit + gasPerPubdata = 50000n; + } + } + return { + gas, + maxFeePerGas, + maxPriorityFeePerGas, + gasPerPubdata, + }; +} + +async function formatTransaction(args: { + transaction: PreparedTransaction; + from?: Address; +}) { + const { transaction, from } = args; + const [data, to, value, eip712] = await Promise.all([ + encode(transaction), + resolvePromisedValue(transaction.to), + resolvePromisedValue(transaction.value), + resolvePromisedValue(transaction.eip712), + ]); + const gasPerPubdata = eip712?.gasPerPubdata; + return { + from, + to, + data, + value, + gasPerPubdata, + eip712Meta: { + ...eip712, + gasPerPubdata: gasPerPubdata || 50000n, + factoryDeps: eip712?.factoryDeps?.map((dep) => + Array.from(hexToBytes(dep)), + ), + }, + type: "0x71", + }; +} diff --git a/packages/thirdweb/src/utils/bigint.ts b/packages/thirdweb/src/utils/bigint.ts index 4977d84036b..8301ee93a72 100644 --- a/packages/thirdweb/src/utils/bigint.ts +++ b/packages/thirdweb/src/utils/bigint.ts @@ -55,3 +55,44 @@ export function toBigInt(value: string | number | bigint | Uint8Array): bigint { return BigInt(value); } + +// replaceBigInts courtesy of ponder.sh: +// https://github.com/ponder-sh/ponder/blob/bc65b865898b6145e87031314192c59f9e8b621f/packages/utils/src/replaceBigInts.ts +type _ReplaceBigInts< + arr extends readonly unknown[], + type, + result extends readonly unknown[] = [], +> = arr extends [infer first, ...infer rest] + ? _ReplaceBigInts< + rest, + type, + readonly [...result, first extends bigint ? type : first] + > + : result; + +export type ReplaceBigInts = obj extends bigint + ? type + : obj extends unknown[] + ? _ReplaceBigInts, type> + : obj extends readonly [] + ? _ReplaceBigInts + : obj extends object + ? { [key in keyof obj]: ReplaceBigInts } + : obj; + +export const replaceBigInts = ( + obj: T, + replacer: (x: bigint) => type, +): ReplaceBigInts => { + if (typeof obj === "bigint") return replacer(obj) as ReplaceBigInts; + if (Array.isArray(obj)) + return obj.map((x) => replaceBigInts(x, replacer)) as ReplaceBigInts< + T, + type + >; + if (obj && typeof obj === "object") + return Object.fromEntries( + Object.entries(obj).map(([k, v]) => [k, replaceBigInts(v, replacer)]), + ) as ReplaceBigInts; + return obj as ReplaceBigInts; +}; diff --git a/packages/thirdweb/src/wallets/__generated__/getWalletInfo.ts b/packages/thirdweb/src/wallets/__generated__/getWalletInfo.ts index 8b72883a019..0cd9c692120 100644 --- a/packages/thirdweb/src/wallets/__generated__/getWalletInfo.ts +++ b/packages/thirdweb/src/wallets/__generated__/getWalletInfo.ts @@ -195,11 +195,13 @@ export async function getWalletInfo( : import("./wallet/io.1inch.wallet/index.js").then((w) => w.wallet) ) as Promise<[TImage] extends [true] ? string : any>; } - case "com.crypto": { + case "com.crypto.wallet": { return ( image - ? import("./wallet/com.crypto/image.js").then((img) => img.default) - : import("./wallet/com.crypto/index.js").then((w) => w.wallet) + ? import("./wallet/com.crypto.wallet/image.js").then( + (img) => img.default, + ) + : import("./wallet/com.crypto.wallet/index.js").then((w) => w.wallet) ) as Promise<[TImage] extends [true] ? string : any>; } case "com.exodus": { @@ -2871,6 +2873,24 @@ export async function getWalletInfo( : import("./wallet/id.plumaa/index.js").then((w) => w.wallet) ) as Promise<[TImage] extends [true] ? string : any>; } + case "social.gm2": { + return ( + image + ? import("./wallet/social.gm2/image.js").then((img) => img.default) + : import("./wallet/social.gm2/index.js").then((w) => w.wallet) + ) as Promise<[TImage] extends [true] ? string : any>; + } + case "nl.greenhood.wallet": { + return ( + image + ? import("./wallet/nl.greenhood.wallet/image.js").then( + (img) => img.default, + ) + : import("./wallet/nl.greenhood.wallet/index.js").then( + (w) => w.wallet, + ) + ) as Promise<[TImage] extends [true] ? string : any>; + } case "com.coinbase.wallet": { return ( image @@ -2996,6 +3016,15 @@ export async function getWalletInfo( : import("./wallet/app.nightly/index.js").then((w) => w.wallet) ) as Promise<[TImage] extends [true] ? string : any>; } + case "com.blazpay.wallet": { + return ( + image + ? import("./wallet/com.blazpay.wallet/image.js").then( + (img) => img.default, + ) + : import("./wallet/com.blazpay.wallet/index.js").then((w) => w.wallet) + ) as Promise<[TImage] extends [true] ? string : any>; + } case "com.lootrush": { return ( image @@ -3021,6 +3050,13 @@ export async function getWalletInfo( : import("./wallet/xyz.dawnwallet/index.js").then((w) => w.wallet) ) as Promise<[TImage] extends [true] ? string : any>; } + case "xyz.abs": { + return ( + image + ? import("./wallet/xyz.abs/image.js").then((img) => img.default) + : import("./wallet/xyz.abs/index.js").then((w) => w.wallet) + ) as Promise<[TImage] extends [true] ? string : any>; + } default: { throw new Error(`Wallet with id ${id} not found`); } diff --git a/packages/thirdweb/src/wallets/__generated__/wallet-ids.ts b/packages/thirdweb/src/wallets/__generated__/wallet-ids.ts index 37a478b541f..2d99e8d30cf 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet-ids.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet-ids.ts @@ -1,7 +1,7 @@ // This file is auto-generated by the `scripts/wallets/generate.ts` script. // Do not modify this file manually. -// 369 wallets +// 371 wallets export type WCSupportedWalletIds = | "io.metamask" | "com.trustwallet.app" @@ -19,7 +19,7 @@ export type WCSupportedWalletIds = | "io.zerion.wallet" | "com.robinhood.wallet" | "io.1inch.wallet" - | "com.crypto" + | "com.crypto.wallet" | "com.exodus" | "xyz.argent" | "im.token" @@ -371,9 +371,11 @@ export type WCSupportedWalletIds = | "io.owallet" | "com.beexo" | "com.webauth" - | "id.plumaa"; + | "id.plumaa" + | "social.gm2" + | "nl.greenhood.wallet"; -// 52 wallets +// 56 wallets export type InjectedSupportedWalletIds = | "io.metamask" | "com.trustwallet.app" @@ -383,6 +385,7 @@ export type InjectedSupportedWalletIds = | "pro.tokenpocket" | "io.zerion.wallet" | "com.robinhood.wallet" + | "com.crypto.wallet" | "io.magiceden.wallet" | "com.coinbase.wallet" | "app.backpack" @@ -424,8 +427,11 @@ export type InjectedSupportedWalletIds = | "com.walletconnect.com" | "io.leapwallet.CompassWallet" | "app.nightly" + | "nl.greenhood.wallet" + | "com.blazpay.wallet" | "com.lootrush" | "app.core.extension" - | "xyz.dawnwallet"; + | "xyz.dawnwallet" + | "xyz.abs"; export type DeepLinkSupportedWalletIds = "io.metamask"; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet-infos.ts b/packages/thirdweb/src/wallets/__generated__/wallet-infos.ts index 46c494ada37..c4d93292620 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet-infos.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet-infos.ts @@ -95,7 +95,7 @@ const ALL_MINIMAL_WALLET_INFOS = ([ hasMobileSupport: true, }, { - id: "com.crypto", + id: "com.crypto.wallet", name: "Crypto.com | DeFi Wallet", hasMobileSupport: true, }, @@ -906,7 +906,7 @@ const ALL_MINIMAL_WALLET_INFOS = ([ }, { id: "com.tomi", - name: "tomiPAY", + name: "tomi Wallet", hasMobileSupport: true, }, { @@ -1814,6 +1814,16 @@ const ALL_MINIMAL_WALLET_INFOS = ([ name: "Plumaa ID", hasMobileSupport: true, }, + { + id: "social.gm2", + name: "GM² Social", + hasMobileSupport: true, + }, + { + id: "nl.greenhood.wallet", + name: "Greenhood", + hasMobileSupport: true, + }, { id: "com.coinbase.wallet", name: "Coinbase Wallet", @@ -1889,6 +1899,11 @@ const ALL_MINIMAL_WALLET_INFOS = ([ name: "Nightly", hasMobileSupport: false, }, + { + id: "com.blazpay.wallet", + name: "Blazpay", + hasMobileSupport: false, + }, { id: "com.lootrush", name: "LootRush", @@ -1904,6 +1919,11 @@ const ALL_MINIMAL_WALLET_INFOS = ([ name: "Dawn Wallet", hasMobileSupport: false, }, + { + id: "xyz.abs", + name: "Abstract Global Wallet", + hasMobileSupport: false, + }, { id: "smart", name: "Smart Wallet", diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.blazpay.wallet/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.blazpay.wallet/image.ts new file mode 100644 index 00000000000..d923a9b1fed --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.blazpay.wallet/image.ts @@ -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,UklGRqQCAABXRUJQVlA4IJgCAAAQFACdASqAAIAAPm02lUgkIyIhKBQIKIANiUAPFf8l+OXPG6od8t/IIj1tfjPuA7T3mAfqT5qvqz8wHQo8pnrZvQU6YD9mP2d9lUwKJ3C2VVigvwo276H220Zi9WtzNbv+8R1U05PJRtbXNIRPuj0YFRVzQ1bTiRgnjp7U4B4uG48ZGTs07W9D5VorrcQD1Vo3Hp2n9pS8i5e1q1TMbZM9my/DmytlVYkAAP78+EADHBtm1Q+yrUjxsvjqK98Xnf/enhbkzUflG//8Gdp23hnIMFER+g2dlrSG/DycvjR1gIfEgaBfzu7zZouUyKmp78uY8eMl0P/Wnctf7sgny7GCsB7+CQBmSGEDPuVvsASPHxQOWwpjy2Ht/I6UpXT8VxjYaLCvUSv0UOEGKzTGxP9OHuSbjwmh6C7/7OCYz+tjYvPwCH9spOj7W4eJHoNSlGUL7EvWj3KAFa4f3bkHKRe9r4yRfhnu2+lCPZ2jy8BNwSQKHW5Jw2Dj/ZJ8OU1EnLZ9Nrbs9eQZhQnDefw+XDjtRGQCCB6STxhd6cbMPDV4kis5ZpGJCX774Mulrs/aFR6eyFnQbOQEmkqlPqE6x14nZAxVWzylXmE+DOatUB4uD78t2loNt7PuhqiGU04T7wHyLtNd9zUcdeEl0k9oM/zHKXgx7WTMXy0oqrZ1N4LMBPLTJ03+zp8JVu/fbBYzFLNKGiOW/51PoRFHImBLXQYK9Vl5PVfGYapZf8sAkO2y3kcDK/3q/4RJ/2Km/aOfT+3C+mGklPJFdIhJT09nJNNxNSrxrR7C8Zbgpg1lZUQ1V6KYRdlWofYqmnjpV2FnYtaeAbxXx1wW4oiQWkQIVlnAhuBdxiBg+a8Q1nR3oHi2GdFsKYqAAAAA"; + +export default image; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.blazpay.wallet/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.blazpay.wallet/index.ts new file mode 100644 index 00000000000..07234543f54 --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.blazpay.wallet/index.ts @@ -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: "com.blazpay.wallet", + name: "Blazpay", + homepage: "https://blazpay.com/download", + image_id: "ba0ed3d1-e94c-408d-c8f5-a384edcba700", + app: { + browser: null, + ios: null, + android: null, + mac: null, + windows: null, + linux: null, + chrome: + "https://chromewebstore.google.com/detail/blazpay/cecndeddohekaklkfehmcnhejflmclhc", + firefox: null, + safari: null, + edge: null, + opera: null, + }, + rdns: "com.blazpay.wallet", + mobile: { + native: null, + universal: null, + }, + desktop: { + native: null, + universal: null, + }, +} as const; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.crypto/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.crypto.wallet/image.ts similarity index 100% rename from packages/thirdweb/src/wallets/__generated__/wallet/com.crypto/image.ts rename to packages/thirdweb/src/wallets/__generated__/wallet/com.crypto.wallet/image.ts diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.crypto/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.crypto.wallet/index.ts similarity index 79% rename from packages/thirdweb/src/wallets/__generated__/wallet/com.crypto/index.ts rename to packages/thirdweb/src/wallets/__generated__/wallet/com.crypto.wallet/index.ts index 6cc245d049f..7907e125e42 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/com.crypto/index.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.crypto.wallet/index.ts @@ -2,7 +2,7 @@ // Do not modify this file manually. export const wallet = { - id: "com.crypto", + id: "com.crypto.wallet", name: "Crypto.com | DeFi Wallet", homepage: "https://crypto.com/", image_id: "88388eb4-4471-4e72-c4b4-852d496fea00", @@ -13,13 +13,14 @@ export const wallet = { mac: null, windows: null, linux: null, - chrome: null, + chrome: + "https://chromewebstore.google.com/detail/cryptocom-wallet-extensio/hifafgmccdpekplomjjkcfgodnhcellj", firefox: null, safari: null, edge: null, opera: null, }, - rdns: null, + rdns: "com.crypto.wallet", mobile: { native: "dfw://", universal: "https://wallet.crypto.com", diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.okex.wallet/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.okex.wallet/index.ts index 4d5f70935e6..7e110cf6363 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/com.okex.wallet/index.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.okex.wallet/index.ts @@ -7,7 +7,7 @@ export const wallet = { homepage: "https://www.okx.com/web3", image_id: "45f2f08e-fc0c-4d62-3e63-404e72170500", app: { - browser: "", + browser: null, ios: "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", android: "https://play.google.com/store/apps/details?id=com.okinc.okex.gp", mac: "https://www.okx.com/download", diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/image.ts index b72d466909c..51fe68d970d 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/image.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/image.ts @@ -2,6 +2,6 @@ // Do not modify this file manually. const image = - "data:image/webp;base64,UklGRsIEAABXRUJQVlA4ILYEAACQGQCdASqAAIAAPm00lkgkIqIhJxEpcIANiWIAlldNR6H5mNZ/qP4o3x0+vov7H/zvuA7RXmAfp3/lP7D1gPMB+uf7ddgn9UPYA/wH+L61j0APLb/b34Nf3F/c72b///nKvY3In9qLZLw0SBu9/tPsTMvtnxNbKT+/S8z+yB7Lat1RDs3GmJkz2Mp9JYijsE8FwR238lodzb/lxJ4R22Oca7BlLbNTa7O5fXsZCiyFOxZs4+oqEzbxRKRTCJy+2mT/KI9yksGXgl/YcbYT1Em+1BeXs0AA/vytEAKwO+XGOQac2rQtVbJmaS5vXcq3Bq3KjcgoCAOHPpqHfR/UrTrtNKzlD6piKAOSsG/eAxQPu80ksvIQatrL7Z5C1Ma4RVkz+S43EeP9/ydwj0xNZwntc7Fh7uG0cbRSd0UVQuTGAWohhgu2aT13VoUisNXgFGtrc7G49mN2oeqbSKt/7pFszYQED7h/b/kjFaPzbjo3Zz9i/TioKrAhz+6+OsNQALN/uTbp5HmW7Tmj14HeD/uEBvohOA2oD3MDP7vYwOQsG8jn7n/4f5U78tN74Y8LGmyizD7/pUI5bdbpPVvLIqWtksEtGQA2EdjdzkdoTKr7H0T55LndzfS+kVQ9IQqH1tGxba5GxyaMsB0NlfSxzhGmPkTbhUxnVUOwYRzUVNs/zPrTRdHCrGJojccH9XoWmF1qGCiq7VeANfgaYh3QPFg/b8bBeGrnVM0mOi34fOciw+JzLMf/9jYzUkTG2oYUQpX6QiTREXqa4OMzBIuJbp2zaaosyvZnw22r5lz7Qs3lLcJd5MAESoeZrrjl3souY4Z6Zim6ggt9HdhhyC9nnLiY0qMscYV3UdpgWTe1EuEjsPkDzJqEMZ7WrTVWecN+bwxDZeCnBZ/C2a8JHCMlrnvpMblycfMjdAPzITrl2f1zOzXCz8I0kZXuZjBwqQJ9+QVoF//g+RW8+DawVEG4LbzZy6V8OPIUE4xdmHJIjlkhGQeJI6cNIdFBOfDvg7mJP2L/hY8bS2HiqC3xJa601zLKxoJ5xWlvZCKZUy/SXNRjGcwdDORHGs2uGN8wqd8q5bMgb9Rsg/YHJq/DtTkefTPQ6Odvw6iIoF17QfHA8otODZGRg1TRi3sc42bu+oaPqmunoLVS029IBwV0m0Y4UM1K+Ndgr7GF7H9QlHXxrALWb/umrx344dNt95IZMgYog57m2JkJNX2O/1xMusVvHVu7zB/AyPJlHLS2tUBOR03ncqBs/jj1VxOsWw06kXUThEwQegkB/r2xzSnq/7GEOS78ogDMBaLr/8wvHX4v10RTZMPHz6m06dPL3UfPWgiKEyYF/6c6/ae0cXm7pQK0iad3pS4LeSGkWTOdOKHF+JMQjmgNyX0ya5Ff8jissyGR+lbJYsKKRgla1JToNQyjd5jVVQHdXY6+TVvDooWGXmpAf9kJ+Z+NMDnEctawVtk/JmYSJikhHvYIkrs7tspGUA4qK6oRqKvra7rGrdL3M4Z9OI1E7xc0kU9ZwgyKctAv2GQeYqjDUAAnsWnLClEbN0SwUsBTUJFsK1/VlkOnbYKUB6vDfghr/QCX2ZjYGFqVAJLwgAAAAAA="; + "data:image/webp;base64,UklGRowFAABXRUJQVlA4IIAFAAAQHgCdASqAAIAAPm0yl0akIyIhK5N5kIANiWIA1BIm/oGtc9T/LL+Ye81Wf7L+Bvx06Zw4vYb+W/qv5M/RD0H+JJ/g/tV7h/mL/W39gOlV9wD+wf3Pre/QX/Yj0xf2++ET9m/2o9oL/75yZ+i3cn/prIxtJjT+7EwY0zc0nyGvTZVfAO1vKjQo/LRZC4RlhVPRBpER14YZjYf4KhZW6FcpDJq9qCkDQtQG2B9eyPn2vCSnM8Pwl4Yg7IXufxDsc6CZP5xiDkPRJf8U/MI40XcW117fsrzBSqu+2tMyftObMRTreJoRttBGPNCTwh9DmyZShAPKVueOBAAA/u92011Hz5z/j4v8fF/j4vjyvfxcjV/O+pgh+FvLlVJETVFGvVlUYGlCYyuC3x+nCNpfcUi6MR0utDRVUoP/fopQ07e71avlXOcCMy201PWy+e/9G7B9yX4X78//LsyVZOEiJkFB1ErBhGo23/xY/Fh/HGlxDv/FT3zKuaRfIiVUV8KWCK+OBEhNbdLgn2RAz9xCGvu8xz98GP41TDeqdbRsTRBtlgf1Wc24PZUjglSbYAc9iS7/nNYWorx0/XIvu/NJDNGa/7j4Zz0tTDaiE5go9BPafWBjtQZJ4xlM/0SVaT40oi69LsxQx2zhTP8WKNLQiqVgHIlBY+fKbvUUwvHiuIrO5tpMoL5VgNNAI/VzwvFVWKba/l/M6HPgBQmT0jqCMaFC9mbUDjYmWRk0Y6MPm0Sacddel/S5zyiwUCIGXstjHGLKDHYYcAwVKMGNhH41/gE0Obim9YDP+bZXFpf/5VvTIqTjJ3f17QL071giBTPT0PPUgfO7Nc/FDI0Dc5B6xrB2FQ9MmNbCfFt5OZalGL+bTJuBIYDa1CQTobdgoQiaKmNN84DC2QSttphtAiqeuvcozJVGRTP0SBEjwZqaAu4n7Fc81Os4ipAxssxNSu4U3rGm3qIwzUAT3RF87j0rSufh0giu+oVFnkN87bVoobxfod9H/lxoJct4fuDxv2qamRuiVuXS9U1us5HYJDiPkwXHbWZXR8DO5Oahx9EI22ysS+BQrXUVR5ynonzsfMX+ln4ObsGJxuaUWvBh3e7SmvfSDP5lRRcbON5Kuov6wyGjAHfMfQgxbpVN3aSbBvmhnr6Ac2LZAQh70kwuV23WLNMa8HdaggZZ6CEJJijTkhOoXfAuU00wHuAP5Fs4QRHni8KAND2CnyphGTbbSZIcnspeM0nDGjis0oAOIm5KR18z1NpoxLSyirjEYrwHg2X9B59HIGOWA+lzTCrdZUWMCwXw9nJksjikIf5V+r5xpPXsjJ/nOf0/zh08c25i0fztHElZmoMIAtLSeVs2P+tV/2ck5JFMzTIal359abfBcfNgskT1suyy3sUP54HyRvp2vWkP53icBLg9vX6Fr62j8k6Ye8Lp1aiVX2f4AxZ0TUoag5rctnhh7LAEvlMEDj19ySyJ7O5T//f/FjzRq1QUW0gaLEakkKJSKCD4kWOCA5+iaVOiGGKyUTsupae2zBqrLEClwx35DRe1giJb6rL3Iipva+ilU4bYvTpVEhK3iDc5lxI5VF0k7nX1k5qB07VLxvbVGvhPqvZjFKfp4V6Oxv8b9daG30Uyl9eYIjSU2ZK/59xo003gcXWPwPnA5qDaoPNA1Y7WOrsvOS06W0UH0BdCx5G+gWyBHMSN6+CsRbpjNnxfGhCBqb91cLZvriC6nZfwMsw+H9z66dJweMkLfumFJTu3tgHUMEPHykUhN5BK53kTG9U2X8fy6Anr785lahyd3lLV2ml9T4Jgr/xFrEEpCP4jdAzhxapH3rQGI59ttZF/OT905SYoonFwdBkdId+rt8fcDCEHpe+/QAAAAAAA"; export default image; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/index.ts index 804266febab..e376a2fddd9 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/index.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.tomi/index.ts @@ -3,9 +3,9 @@ export const wallet = { id: "com.tomi", - name: "tomiPAY", + name: "tomi Wallet", homepage: "https://tomi.com/wallet", - image_id: "bf8bd7b8-b638-40f6-1caa-1d7678bb1900", + image_id: "ebc78bed-8771-4745-0fbd-f846cc107100", app: { browser: null, ios: "https://apps.apple.com/us/app/tomipay-digital-payment-system/id1643501440", diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/image.ts index dccfe950ece..71b3c918a75 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/image.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/image.ts @@ -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; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/index.ts index 2a4a31cd8ee..d4204e851d0 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/index.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/com.walletconnect.com/index.ts @@ -5,7 +5,7 @@ export const wallet = { id: "com.walletconnect.com", name: "SampleW", homepage: "https://walletconnect.com", - image_id: "361c7dfd-e4a1-46ce-e42a-241443ed5700", + image_id: "b81aaf2d-3548-4e65-46cd-fd59fbb6b300", app: { browser: null, ios: null, diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/net.myrenegade/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/net.myrenegade/index.ts index 30e9270d23f..e60ea68bae5 100644 --- a/packages/thirdweb/src/wallets/__generated__/wallet/net.myrenegade/index.ts +++ b/packages/thirdweb/src/wallets/__generated__/wallet/net.myrenegade/index.ts @@ -22,7 +22,7 @@ export const wallet = { rdns: null, mobile: { native: "renegade-web3wallet://", - universal: null, + universal: "https://webapp.myrenegade.net", }, desktop: { native: null, diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/nl.greenhood.wallet/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/nl.greenhood.wallet/image.ts new file mode 100644 index 00000000000..4e609d0f3da --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/nl.greenhood.wallet/image.ts @@ -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,UklGRvAIAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSAAEAAABoEZtm+lWe+Ok5rFt27Zt27Zt27Zt26ptt0nd7p39fkiTyczk94mICYC/7FTnc7Rpug7nrre2Ybq+1yOMoUNsV/sLobmIKVNtVblNPtmIiNnz+KIuVqNB3XLOFGiGPDGgSXEJR/K1nL776rO3L28fW9qzrJXKrgvEPI1LuVFm+JEPiWg63eva3IZacoo2FzOQO8WHXIhB8zNfLKqnIuQw+AOaKyzmgmPrw3FoufHZuFJE8s8ORrMz5vCg1CwvJJt+ornOsmIb9Gh+wnj2lPVPGpH4n7H5LSl7OBstDOrHnLbXZ7Rm2o6K5lW8KKClP9qz5jgtCq18r7E5lW+LaPHLRoy5rjOg1b93yavCIxEtv1mFrXz70pDCwGGmSjzMRYIHCjGV73gaUhk24X8FbmUjySUallwOG5DSsPEA9uczkaRhDDCs2ZGM1IYOUexIR6K/2rK0PB7plXyO65Hs3WoMDYtEmqVMJLyjADuNfZCH4gQlM8XuIRcDWwOrDutEPtyswIqiWyLycaU7K2WeIR8NPWWMOC1ATr6pCow2DubFek8KZA4ezjqFJQV2ISfTOyto6H9uy5gmRe3UMnPaRfHiWUmgcW4Oov7b/sEl1PI8Cu5AXi5wpqKnH/5f8t/b2sFUCy9exDSQUdHohQmUBP39oR4A4LAQeXnaA6gsecYUIgppr8a6Q+WbvDD2VdOhXmgGoqh/1GuQDy/eFwZKu4eYgygG+2XyYqaWliq3zOOn5FdaRovjYk6tVQG17YJ4JIVWk9FT7AiPhG0KoFfRL41DAdWB5lI3+ZO5CajWDM3hjlcVuqDYLd4kLwPK1T2zOPOyGG3gdpYv4WOBekXDOJ4I5x3oA90KnvxqCyzmfyuRk4yUpSwHJhUd9OT8Nq86dvXp5wQjLddKsQHq9QIx/R4PF8+CFZ8LlHj3Albz3xdJYcQiAPDwkehIX6xhBpp4EcOQCSBvkoJ0ni0D7MpGxRDDP21gfDYd39oDy7o1BmL4vMJqgYqkcVqmIP/hLGLiqftGGsRN+YDxCldEUigYkMabFYH5hg+J0fm7pZw9aPeaofiBKuBhpw/MpM9TAx+7fGcke5cd8LLjTyZyLrsBN2UtvjKQ+6gQ8LT2WwKSlYQX5YCrsnLXLLOy+KYacFZWeCdV0osawF/3OXp6xNvVgMdOfb7RIlyoDHxWNTgrUCBhxt5ywO2SiwKth3EriwLHnXpeTbfWn8nuwPeKS39YRXjQUwu813U6FkouZn8dsIWeo65Hksn5PM0NbGSRiXcjcy0LP9kYbGi+kVdCDJI5UvzzkXZgW9WtNr6NScuVEFHKSfowKx/YYPcOy+94RURH/L40rgjYamWhmo2r51fDXx0CVlA4IMoEAADwGwCdASqAAIAAPm0ylkckIz+hKBQLK/ANiWYA1qVoXn4r/cPyX/I75hrD/Y/wX+RWYz+KfqX/Q6RvmAfp3/ueot5gP1e/bDsNegB/Of7v1hnoJftv6aH7j/BV+4v7vfAb+x//qyCuCXbAa9Fix8QPQANpSo9tipbDz28l50QU/mmj8X7AawIGgf4g/PmRLPkW9UmQI844X7QExFqIqgqQ0FFb4MbmUPftqrc4om1y9HgNk1tjDDD/5TxIROcWDFMqNB8M2MK8Zcq0m1PrARsv8DO+n3WuwSTukSxJVg+NBiOJFS61s2SAAP78rRAAb//Su769oRks94dHHW6Z1wyouLrL/+B6YnqyY68mbMn+ZksYGxUAAMHR9qPukzM5PQW4sqm2m8+L2Gedcqx4rTuWeb6vviQt/9fc/9yLk3518oATtcvRdXzeeCa3IfKNgsxjIA6Cg1Ib6hRGM4BlZeRHrN+J56LCNCx9ewO1b4QKGjOJwCwb8Bpo3UEsG0avveUxOtKmkxTHVgRKLHWzvS3Myc3NxHKWW5xrs7gON6Ez+P6kpNwrsjag4ehcpKFW6CHAPiO9pW+oUbV9LrYgQSZregjI+ixcVOTjUvFliC76Yxp3lNZ7ctjf86nXD5beuXour5vKl/g/9AfG+YaJCZG048OPH3ipHR540IOzHFR/lI7Dl6VVxL9wAHTqWCYjiQ1rS7D2ID3Q98edirx6em7wXFOSh4wjvunT2lVNB9URof9vDS3AiIFZYdedFktNsjTzBPga6Or7IneGEAzBCd7/iKxHlVdva8rXZHY/ANND/cvsdPSvjbxHpr3cjpGAYcPw7+LTweBC4CO4tDjJ8mwWrimqGwhUlxHSKHzAucxiyjx4RpQ4whoG6KxORFSXZL6VS/+zCRskuaxOVhnJ+NXmNFPal5YRrRuq78GY912gG63Yrrh/3vX+Zlkyk3O3VrUTUZ2qR16lqHLGFLZAEqC/dSqS/1B1j//+lSbTX+CmnvxJvSVZVaQb2CfRh4p2ef4jsDtJBls4L35rbO65BzCrxc4tbtY7bJqmLy8FUbDBEgwIT0L1EC38jhzF2Cz0fefEPSTKQ7hDTik7EDWb4HPX8e4xN2uJQuSuuCsmaLEivexvtrwoCaafnlEpwazEuoysSVAAcImY4t8xJq+n29G8CkHoXC93Kiecitn+aWo0sK1+vq+Z/OVAAaiQrtDaviP5GPf0OrEfda18ZQAr+TStTanOIYgBjpfUDmH3O6ePsx9vy58s+4930l6JrliL0EkROaPyIEqi9+hewb2PrAnHwxGvVPpUNAj48kSIPcpI+3z7JGrmkXVAi40uXthyDdEuLhuQ8ZbJ0ylPFCZAU4ikbR4wAOHtA2ac2Hj7YjC8rGmVWXtdZ75aGRdDFtakuJoUv44fcxa2Kt9jiTcimT2oGNWwEeZTUnvc0HD4buKI2jdex/9wJteF04Jwb5kS0UdZUsyQ4f0ItDS/XtFugGTMf+8NalW9/YADfMtYNNAgnZy379XGqmA8zaEpcdeIJ7V6LGp7w+pcuVCEusvb/wvv0+76ORei+90Ap5nhMmiXavujsr+BMy32a1QR2SdBV2sc1JANLQncADWvv0hGB9hQZNAibgAAAAAAAA=="; + +export default image; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/nl.greenhood.wallet/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/nl.greenhood.wallet/index.ts new file mode 100644 index 00000000000..0f0405562fc --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/nl.greenhood.wallet/index.ts @@ -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: "nl.greenhood.wallet", + name: "Greenhood", + homepage: "https://www.greenhood.nl", + image_id: "7b6aaa4d-fa17-4cc6-71e1-79f2e68c0900", + app: { + browser: null, + ios: "https://apps.apple.com/us/app/greenhood-wallet/id1661248135", + android: + "https://play.google.com/store/apps/details?id=com.greehood.wallet", + mac: null, + windows: null, + linux: null, + chrome: null, + firefox: null, + safari: null, + edge: null, + opera: null, + }, + rdns: "nl.greenhood.wallet", + mobile: { + native: "greenhood://", + universal: null, + }, + desktop: { + native: null, + universal: null, + }, +} as const; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/social.gm2/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/social.gm2/image.ts new file mode 100644 index 00000000000..b01ad467a15 --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/social.gm2/image.ts @@ -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; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/social.gm2/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/social.gm2/index.ts new file mode 100644 index 00000000000..fe3329d2b17 --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/social.gm2/index.ts @@ -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: "social.gm2", + name: "GM² Social", + homepage: "https://gm2.social/", + image_id: "f5c2218d-56b4-4fc8-63bf-0ece7276d600", + app: { + browser: null, + ios: "https://apps.apple.com/us/app/gm-social/id6502584673", + android: + "https://play.google.com/store/apps/details?id=com.gm2.app.prod&hl=en", + mac: null, + windows: null, + linux: null, + chrome: null, + firefox: null, + safari: null, + edge: null, + opera: null, + }, + rdns: null, + mobile: { + native: "gm2://home", + universal: null, + }, + desktop: { + native: null, + universal: null, + }, +} as const; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/xyz.abs/image.ts b/packages/thirdweb/src/wallets/__generated__/wallet/xyz.abs/image.ts new file mode 100644 index 00000000000..9dc8aa56c2d --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/xyz.abs/image.ts @@ -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; diff --git a/packages/thirdweb/src/wallets/__generated__/wallet/xyz.abs/index.ts b/packages/thirdweb/src/wallets/__generated__/wallet/xyz.abs/index.ts new file mode 100644 index 00000000000..7100900faab --- /dev/null +++ b/packages/thirdweb/src/wallets/__generated__/wallet/xyz.abs/index.ts @@ -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: "xyz.abs", + name: "Abstract Global Wallet", + homepage: "https://abs.xyz/", + image_id: "abstract.png", + app: { + browser: null, + ios: null, + android: null, + mac: null, + windows: null, + linux: null, + chrome: null, + firefox: null, + safari: null, + edge: null, + opera: null, + }, + rdns: "xyz.abs", + mobile: { + native: null, + universal: null, + }, + desktop: { + native: null, + universal: null, + }, +} as const; diff --git a/packages/thirdweb/src/wallets/create-wallet.ts b/packages/thirdweb/src/wallets/create-wallet.ts index 229eded757e..aaa2dd146fb 100644 --- a/packages/thirdweb/src/wallets/create-wallet.ts +++ b/packages/thirdweb/src/wallets/create-wallet.ts @@ -7,7 +7,6 @@ import type { Account, Wallet } from "./interfaces/wallet.js"; import type { CreateWalletArgs, EcosystemWalletId, - InjectedConnectOptions, WalletAutoConnectionOption, WalletId, } from "./wallet-types.js"; @@ -23,6 +22,7 @@ import { COINBASE } from "./constants.js"; import { isEcosystemWallet } from "./ecosystem/is-ecosystem-wallet.js"; import { ecosystemWallet } from "./in-app/web/ecosystem.js"; import { inAppWallet } from "./in-app/web/in-app.js"; +import { getInjectedProvider } from "./injected/index.js"; import { smartWallet } from "./smart/smart-wallet.js"; import type { WCConnectOptions } from "./wallet-connect/types.js"; import { createWalletEmitter } from "./wallet-emitter.js"; @@ -226,7 +226,7 @@ export function createWallet( const { injectedProvider } = await import("./injected/mipdStore.js"); // injected wallet priority for autoConnect if (id !== "walletConnect" && injectedProvider(id)) { - const { autoConnectInjectedWallet } = await import( + const { autoConnectEip1193Wallet } = await import( "./injected/index.js" ); @@ -235,8 +235,9 @@ export function createWallet( connectedChain, doDisconnect, doSwitchChain, - ] = await autoConnectInjectedWallet({ + ] = await autoConnectEip1193Wallet({ id: id as InjectedSupportedWalletIds, + provider: getInjectedProvider(id), emitter, chain: options.chain, client: options.client, @@ -339,7 +340,7 @@ export function createWallet( const { injectedProvider } = await import("./injected/mipdStore.js"); if (injectedProvider(id) && !forceWalletConnectOption) { - const { connectInjectedWallet } = await import( + const { connectEip1193Wallet } = await import( "./injected/index.js" ); @@ -348,11 +349,13 @@ export function createWallet( connectedChain, doDisconnect, doSwitchChain, - ] = await connectInjectedWallet( - id as InjectedSupportedWalletIds, - options as InjectedConnectOptions, + ] = await connectEip1193Wallet({ + id: id as InjectedSupportedWalletIds, + provider: getInjectedProvider(id), + client: options.client, + chain: options.chain, emitter, - ); + }); // set the states account = connectedAccount; chain = connectedChain; diff --git a/packages/thirdweb/src/wallets/injected/index.ts b/packages/thirdweb/src/wallets/injected/index.ts index 0c1a05bdf3f..cc76d1869a9 100644 --- a/packages/thirdweb/src/wallets/injected/index.ts +++ b/packages/thirdweb/src/wallets/injected/index.ts @@ -1,4 +1,4 @@ -import type { Address } from "abitype"; +import type { EIP1193Provider } from "viem"; import { type SignTypedDataParameters, getTypesForEIP712Domain, @@ -18,13 +18,12 @@ import { } from "../../utils/encoding/hex.js"; import { parseTypedData } from "../../utils/signatures/helpers/parseTypedData.js"; import type { InjectedSupportedWalletIds } from "../__generated__/wallet-ids.js"; -import type { Ethereum } from "../interfaces/ethereum.js"; import type { Account, SendTransactionOption } from "../interfaces/wallet.js"; import type { DisconnectFn, SwitchChainFn } from "../types.js"; import { getValidPublicRPCUrl } from "../utils/chains.js"; import { normalizeChainId } from "../utils/normalizeChainId.js"; import type { WalletEmitter } from "../wallet-emitter.js"; -import type { InjectedConnectOptions, WalletId } from "../wallet-types.js"; +import type { WalletId } from "../wallet-types.js"; import { injectedProvider } from "./mipdStore.js"; // TODO: save the provider in data @@ -40,19 +39,38 @@ export function getInjectedProvider(walletId: WalletId) { /** * @internal */ -export async function connectInjectedWallet( - id: InjectedSupportedWalletIds, - options: InjectedConnectOptions, - emitter: WalletEmitter, -): Promise> { - const provider = getInjectedProvider(id); - const addresses = await provider.request({ - method: "eth_requestAccounts", - }); +export async function connectEip1193Wallet({ + id, + provider, + emitter, + client, + chain, +}: { + id: InjectedSupportedWalletIds | ({} & string); + provider: EIP1193Provider; + client: ThirdwebClient; + chain?: Chain; + emitter: WalletEmitter; +}): Promise> { + let addresses: string[] | undefined; + const retries = 3; + let attempts = 0; + // retry 3 times, some providers take a while to return accounts on connect + while (!addresses?.[0] && attempts < retries) { + try { + addresses = await provider.request({ + method: "eth_requestAccounts", + }); + } catch (e) { + console.error(e); + await new Promise((resolve) => setTimeout(resolve, 500)); + } + attempts++; + } - const addr = addresses[0]; + const addr = addresses?.[0]; if (!addr) { - throw new Error("no accounts available"); + throw new Error("Failed to connect to wallet, no accounts available"); } // use the first account @@ -64,14 +82,12 @@ export async function connectInjectedWallet( .then(normalizeChainId); let connectedChain = - options.chain && options.chain.id === chainId - ? options.chain - : getCachedChain(chainId); + chain && chain.id === chainId ? chain : getCachedChain(chainId); // if we want a specific chainId and it is not the same as the provider chainId, trigger switchChain - if (options.chain && options.chain.id !== chainId) { - await switchChain(provider, options.chain); - connectedChain = options.chain; + if (chain && chain.id !== chainId) { + await switchChain(provider, chain); + connectedChain = chain; } return onConnect({ @@ -79,7 +95,7 @@ export async function connectInjectedWallet( address, chain: connectedChain, emitter, - client: options.client, + client, id, }); } @@ -87,19 +103,19 @@ export async function connectInjectedWallet( /** * @internal */ -export async function autoConnectInjectedWallet({ +export async function autoConnectEip1193Wallet({ id, + provider, emitter, client, chain, }: { - id: InjectedSupportedWalletIds; + id: InjectedSupportedWalletIds | ({} & string); + provider: EIP1193Provider; emitter: WalletEmitter; client: ThirdwebClient; chain?: Chain; }): Promise> { - const provider = getInjectedProvider(id); - // connected accounts const addresses = await provider.request({ method: "eth_accounts", @@ -107,7 +123,7 @@ export async function autoConnectInjectedWallet({ const addr = addresses[0]; if (!addr) { - throw new Error("no accounts available"); + throw new Error("Failed to connect to wallet, no accounts available"); } // use the first account @@ -137,27 +153,44 @@ function createAccount({ client, id, }: { - provider: Ethereum; + provider: EIP1193Provider; address: string; client: ThirdwebClient; - id: WalletId; + id: WalletId | ({} & string); }) { const account: Account = { address: getAddress(address), async sendTransaction(tx: SendTransactionOption) { + const gasFees = tx.gasPrice + ? { + gasPrice: tx.gasPrice ? numberToHex(tx.gasPrice) : undefined, + } + : { + maxFeePerGas: tx.maxFeePerGas + ? numberToHex(tx.maxFeePerGas) + : undefined, + maxPriorityFeePerGas: tx.maxPriorityFeePerGas + ? numberToHex(tx.maxPriorityFeePerGas) + : undefined, + }; + const params = [ + { + ...gasFees, + nonce: tx.nonce ? numberToHex(tx.nonce) : undefined, + accessList: tx.accessList, + value: tx.value ? numberToHex(tx.value) : undefined, + gas: tx.gas ? numberToHex(tx.gas) : undefined, + from: this.address, + to: tx.to ? getAddress(tx.to) : undefined, + data: tx.data, + ...tx.eip712, + }, + ]; + const transactionHash = (await provider.request({ method: "eth_sendTransaction", - params: [ - { - accessList: tx.accessList, - value: tx.value ? numberToHex(tx.value) : undefined, - gas: tx.gas ? numberToHex(tx.gas) : undefined, - gasPrice: tx.gasPrice ? numberToHex(tx.gasPrice) : undefined, - from: this.address, - to: tx.to as Address, - data: tx.data, - }, - ], + // @ts-expect-error - overriding types here + params, })) as Hex; trackTransaction({ @@ -251,12 +284,12 @@ async function onConnect({ client, id, }: { - provider: Ethereum; + provider: EIP1193Provider; address: string; chain: Chain; emitter: WalletEmitter; client: ThirdwebClient; - id: WalletId; + id: WalletId | ({} & string); }): Promise<[Account, Chain, DisconnectFn, SwitchChainFn]> { const account = createAccount({ provider, address, client, id }); async function disconnect() { @@ -308,7 +341,7 @@ async function onConnect({ /** * @internal */ -async function switchChain(provider: Ethereum, chain: Chain) { +async function switchChain(provider: EIP1193Provider, chain: Chain) { const hexChainId = numberToHex(chain.id); try { await provider.request({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b248e077b7..e597ad8103f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -221,7 +221,7 @@ importers: version: 0.4.3(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) nextjs-toploader: specifier: ^1.6.12 - version: 1.6.12(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) + version: 1.6.12(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -290,7 +290,7 @@ importers: version: 2.5.4 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -405,7 +405,7 @@ importers: version: 5.36.3(@types/node@20.14.9)(typescript@5.6.3) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)) + version: 4.2.3(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)) postcss: specifier: 8.4.47 version: 8.4.47 @@ -414,7 +414,7 @@ importers: version: 8.4.2(bufferutil@4.0.8)(prettier@3.3.3)(utf-8-validate@5.0.10) tailwindcss: specifier: 3.4.14 - version: 3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + version: 3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) typescript: specifier: 5.6.3 version: 5.6.3 @@ -532,10 +532,10 @@ importers: version: 8.4.47 tailwindcss: specifier: 3.4.14 - version: 3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + version: 3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3))) typescript: specifier: 5.6.3 version: 5.6.3 @@ -598,7 +598,7 @@ importers: version: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) nextjs-toploader: specifier: ^1.6.12 - version: 1.6.12(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) + version: 1.6.12(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) node-html-parser: specifier: ^6.1.13 version: 6.1.13 @@ -634,7 +634,7 @@ importers: version: 2.5.4 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -695,13 +695,13 @@ importers: version: 3.17.5(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3))) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)) + version: 4.2.3(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)) postcss: specifier: 8.4.47 version: 8.4.47 tailwindcss: specifier: 3.4.14 - version: 3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + version: 3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) tsx: specifier: 4.19.2 version: 4.19.2 @@ -770,7 +770,7 @@ importers: version: 2.5.4 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -801,7 +801,7 @@ importers: version: 8.4.47 tailwindcss: specifier: 3.4.14 - version: 3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + version: 3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) typescript: specifier: 5.6.3 version: 5.6.3 @@ -23538,7 +23538,7 @@ snapshots: dependencies: fast-glob: 3.3.2 postcss: 8.4.47 - tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) eslint-scope@5.1.1: dependencies: @@ -27064,7 +27064,7 @@ snapshots: react: 19.0.0-rc-69d4b800-20241021 react-dom: 19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021) - next-sitemap@4.2.3(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)): + next-sitemap@4.2.3(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 @@ -27104,7 +27104,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextjs-toploader@1.6.12(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021): + nextjs-toploader@1.6.12(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021): dependencies: next: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.48.2)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) nprogress: 0.2.0 @@ -27814,7 +27814,7 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 @@ -29676,11 +29676,11 @@ snapshots: tailwind-merge@2.5.4: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3))): dependencies: - tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) - tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)): + tailwindcss@3.4.14(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -29699,7 +29699,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.9.1)(@types/node@20.14.9)(typescript@5.6.3)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8