FRE-600: Fix code review blockers

- Consolidated duplicate UndoManagers to single instance
- Fixed connection promise to only resolve on 'connected' status
- Fixed WebSocketProvider import (WebsocketProvider)
- Added proper doc.destroy() cleanup
- Renamed isPresenceInitialized property to avoid conflict

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 00:08:01 -04:00
parent 65b552bb08
commit 7c684a42cc
48450 changed files with 5679671 additions and 383 deletions

View File

@@ -0,0 +1,179 @@
import type { Address } from 'abitype'
import {
type RequestAddressesErrorType,
requestAddresses,
} from '../../../actions/wallet/requestAddresses.js'
import type { Client } from '../../../clients/createClient.js'
import type { Transport } from '../../../clients/transports/createTransport.js'
import type { BaseError } from '../../../errors/base.js'
import type { ExtractCapabilities } from '../../../types/capabilities.js'
import type { Chain } from '../../../types/chain.js'
import type { Prettify } from '../../../types/utils.js'
import type { RequestErrorType } from '../../../utils/buildRequest.js'
import { numberToHex } from '../../../utils/encoding/toHex.js'
export type ConnectParameters = Prettify<{
capabilities?: ExtractCapabilities<'connect', 'Request'> | undefined
}>
export type ConnectReturnType = Prettify<{
accounts: readonly {
address: Address
capabilities?: ExtractCapabilities<'connect', 'ReturnType'> | undefined
}[]
}>
export type ConnectErrorType = RequestErrorType | RequestAddressesErrorType
/**
* Requests to connect account(s) with optional capabilities.
*
* - Docs: https://viem.sh/experimental/erc7846/connect
* - JSON-RPC Methods: [`wallet_connect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
*
* @param client - Client to use
* @param parameters - {@link ConnectParameters}
* @returns List of accounts managed by a wallet {@link ConnectReturnType}
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { connect } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
* const response = await connect(client)
*/
export async function connect<chain extends Chain | undefined>(
client: Client<Transport, chain>,
parameters: ConnectParameters = {},
): Promise<ConnectReturnType> {
const capabilities = formatRequestCapabilities(parameters.capabilities)
const response = await (async () => {
try {
return await client.request(
{ method: 'wallet_connect', params: [{ capabilities, version: '1' }] },
{ dedupe: true, retryCount: 0 },
)
} catch (e) {
const error = e as BaseError
// If the wallet does not support `wallet_connect`, and has no
// capabilities, attempt to use `eth_requestAccounts` instead.
if (
!parameters.capabilities &&
(error.name === 'InvalidInputRpcError' ||
error.name === 'InvalidParamsRpcError' ||
error.name === 'MethodNotFoundRpcError' ||
error.name === 'MethodNotSupportedRpcError' ||
error.name === 'UnsupportedProviderMethodError')
) {
const addresses = await requestAddresses(client)
return {
accounts: addresses.map((address) => ({
address,
capabilities: {},
})),
}
}
throw error
}
})()
return {
...response,
accounts: (response.accounts ?? []).map((account) => ({
...account,
capabilities: formatResponseCapabilities(account.capabilities),
})),
}
}
function formatRequestCapabilities(
capabilities: ExtractCapabilities<'connect', 'Request'> | undefined,
) {
const {
unstable_addSubAccount,
unstable_getSubAccounts: getSubAccounts,
unstable_signInWithEthereum,
...rest
} = capabilities ?? {}
const addSubAccount = unstable_addSubAccount
? {
...unstable_addSubAccount,
account: {
...unstable_addSubAccount.account,
...(unstable_addSubAccount.account.chainId
? {
chainId: numberToHex(unstable_addSubAccount.account.chainId),
}
: {}),
},
}
: undefined
const { chainId, expirationTime, issuedAt, notBefore } =
unstable_signInWithEthereum ?? {}
const signInWithEthereum = unstable_signInWithEthereum
? {
...unstable_signInWithEthereum,
chainId: numberToHex(chainId!),
...(expirationTime
? {
expirationTime: expirationTime.toISOString(),
}
: {}),
...(issuedAt
? {
issuedAt: issuedAt.toISOString(),
}
: {}),
...(notBefore
? {
notBefore: notBefore.toISOString(),
}
: {}),
}
: undefined
return {
...rest,
...(addSubAccount
? {
addSubAccount,
}
: {}),
...(getSubAccounts
? {
getSubAccounts,
}
: {}),
...(signInWithEthereum
? {
signInWithEthereum,
}
: {}),
}
}
function formatResponseCapabilities(
capabilities: ExtractCapabilities<'connect', 'ReturnType'> | undefined,
) {
return Object.entries(capabilities ?? {}).reduce(
(capabilities, [key, value]) => {
const k = (() => {
if (key === 'signInWithEthereum') return 'unstable_signInWithEthereum'
if (key === 'subAccounts') return 'unstable_subAccounts'
return key
})()
capabilities[k] = value
return capabilities
},
{} as Record<string, unknown>,
)
}

View File

@@ -0,0 +1,36 @@
import type { Client } from '../../../clients/createClient.js'
import type { Transport } from '../../../clients/transports/createTransport.js'
import type { Chain } from '../../../types/chain.js'
import type { RequestErrorType } from '../../../utils/buildRequest.js'
export type DisconnectErrorType = RequestErrorType
/**
* Requests to disconnect connected accounts.
*
* - Docs: https://viem.sh/experimental/erc7846/disconnect
* - JSON-RPC Methods: [`wallet_disconnect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
*
* @param client - Client to use
* @returns void
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { disconnect } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* await disconnect(client)
*/
export async function disconnect<chain extends Chain | undefined>(
client: Client<Transport, chain>,
) {
return await client.request(
{ method: 'wallet_disconnect' },
{ dedupe: true, retryCount: 0 },
)
}

View File

@@ -0,0 +1,88 @@
import type { Client } from '../../../clients/createClient.js'
import type { Transport } from '../../../clients/transports/createTransport.js'
import type { Chain } from '../../../types/chain.js'
import {
type ConnectParameters,
type ConnectReturnType,
connect,
} from '../actions/connect.js'
import { disconnect } from '../actions/disconnect.js'
export type Erc7846Actions = {
/**
* Requests to connect to a wallet.
*
* - Docs: https://viem.sh/experimental/erc7846/connect
* - JSON-RPC Methods: [`wallet_connect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
*
* @param client - Client to use
* @param parameters - {@link ConnectParameters}
* @returns List of accounts managed by a wallet {@link ConnectReturnType}
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7846Actions } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* }).extend(erc7846Actions())
*
* const response = await client.connect()
*/
connect: (
parameters?: ConnectParameters | undefined,
) => Promise<ConnectReturnType>
/**
* Requests to disconnect connected accounts.
*
* - Docs: https://viem.sh/experimental/erc7846/disconnect
* - JSON-RPC Methods: [`wallet_disconnect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
*
* @param client - Client to use
* @returns void
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7846Actions } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* }).extend(erc7846Actions())
*
* await client.disconnect()
*/
disconnect: () => Promise<void>
}
/**
* A suite of ERC-7846 Wallet Actions.
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7846Actions } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7846Actions())
*
* const response = await client.connect()
*/
export function erc7846Actions() {
return <
transport extends Transport,
chain extends Chain | undefined = Chain | undefined,
>(
client: Client<transport, chain>,
): Erc7846Actions => {
return {
connect: (parameters) => connect(client, parameters),
disconnect: () => disconnect(client),
}
}
}

13
node_modules/viem/experimental/erc7846/index.ts generated vendored Normal file
View File

@@ -0,0 +1,13 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint
export {
type ConnectErrorType,
type ConnectParameters,
type ConnectReturnType,
connect,
} from './actions/connect.js'
export {
type DisconnectErrorType,
disconnect,
} from './actions/disconnect.js'
export { type Erc7846Actions, erc7846Actions } from './decorators/erc7846.js'

6
node_modules/viem/experimental/erc7846/package.json generated vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"type": "module",
"types": "../../_types/experimental/erc7846/index.d.ts",
"module": "../../_esm/experimental/erc7846/index.js",
"main": "../../_cjs/experimental/erc7846/index.js"
}