PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/viem/experimental/erc7846/actions
Просмотр файла: connect.ts
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>,
)
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!