saepenatus
Version:
Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, mul
440 lines (381 loc) • 10.5 kB
text/typescript
import type { ConnectionInfo } from 'ethers/lib/utils'
import type EventEmitter from 'eventemitter3'
import type { TypedData as EIP712TypedData } from 'eip-712'
import type { ethers } from 'ethers'
export type { TypedData as EIP712TypedData } from 'eip-712'
/**
* Types for request patching methods. Ethereum RPC request is mapped to
* the implementation that will replace the original.
* If a method is not supported set it to `null`
* and the appropriate error will get called.
*/
export type RequestPatch = {
eth_accounts?:
| ((args: {
baseRequest: EIP1193Provider['request']
}) => Promise<ProviderAccounts>)
| null
eth_getBalance?:
| ((args: { baseRequest: EIP1193Provider['request'] }) => Promise<Balance>)
| null
eth_requestAccounts?:
| ((args: {
baseRequest: EIP1193Provider['request']
}) => Promise<ProviderAccounts>)
| null
eth_selectAccounts?:
| ((args: {
baseRequest: EIP1193Provider['request']
}) => Promise<ProviderAccounts>)
| null
eth_chainId?:
| ((args: { baseRequest: EIP1193Provider['request'] }) => Promise<string>)
| null
eth_signTransaction?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: EthSignTransactionRequest['params']
}) => Promise<string>)
| null
eth_sendTransaction?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: EthSignTransactionRequest['params']
}) => Promise<string>)
| null
eth_sign?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: EthSignMessageRequest['params']
}) => Promise<string>)
| null
personal_sign?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: PersonalSignMessageRequest['params']
}) => Promise<string>)
| null
eth_signTypedData?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: EIP712Request['params']
}) => Promise<string>)
| null
wallet_switchEthereumChain?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: EIP3326Request['params']
}) => Promise<null>)
| null
wallet_addEthereumChain?:
| ((args: {
baseRequest: EIP1193Provider['request']
params: EIP3085Request['params']
}) => Promise<null>)
| null
}
export interface AppMetadata {
/* App name */
name: string
/* An SVG icon string or image url, with height set to 100%
Note: `icon` is displayed on both mobile AND desktop. If `logo`
below is provided then `icon` displays on mobile and `logo` on
desktop.
*/
icon?: string
/* SVG logo (icon and text) string or image url, with width set to 100%
Note: This will ONLY display on desktop. It is best used with wide
format logos. Use `icon` for standard 40x40 icons.
*/
logo?: string
/* Description of app*/
description?: string
/* Url to a getting started guide for app */
gettingStartedGuide?: string
/* Url that points to more information about app */
explore?: string
/** When no injected wallets detected, recommend the user to install some*/
recommendedInjectedWallets?: RecommendedInjectedWallets[]
agreement?: TermsOfServiceAgreementOptions | null
}
export type TermsOfServiceAgreementOptions = {
version: string
termsUrl?: string
privacyUrl?: string
}
export type RecommendedInjectedWallets = {
name: string
url: string
}
/**
* A method that takes `WalletHelpers` and
* returns an initialised `WalletModule` or array of `WalletModule`s.
*/
export type WalletInit = (
helpers: WalletHelpers
) => WalletModule | WalletModule[] | null
export type WalletHelpers = {
device: Device
}
export interface APIKey {
apiKey: string
}
export type Device = {
os: DeviceOS
type: DeviceType
browser: DeviceBrowser
}
export type Platform = DeviceOSName | DeviceBrowserName | DeviceType | 'all'
export type DeviceOS = {
name: DeviceOSName
version: string
}
export type DeviceBrowser = {
name: DeviceBrowserName
version: string
}
export type DeviceOSName =
| 'Windows Phone'
| 'Windows'
| 'macOS'
| 'iOS'
| 'Android'
| 'Linux'
| 'Chrome OS'
export type DeviceBrowserName =
| 'Android Browser'
| 'Chrome'
| 'Chromium'
| 'Firefox'
| 'Microsoft Edge'
| 'Opera'
| 'Safari'
export type DeviceType = 'desktop' | 'mobile' | 'tablet'
export interface WalletModule {
// The label of the wallet
label: string
/**
* Gets the icon of the wallet
* @returns
*/
getIcon: () => Promise<string>
/**
* @returns the wallet interface associated with the module
*/
getInterface: (helpers: GetInterfaceHelpers) => Promise<WalletInterface>
}
export type GetInterfaceHelpers = {
chains: Chain[]
appMetadata: AppMetadata | null
BigNumber: typeof ethers.BigNumber
EventEmitter: typeof EventEmitter
}
export type ChainId = string
export type DecimalChainId = number
export type RpcUrl = string
export type WalletInterface = {
provider: EIP1193Provider
instance?: unknown
}
export interface ProviderRpcError extends Error {
message: string
code: number
data?: unknown
}
export interface ProviderMessage {
type: string
data: unknown
}
export interface ProviderInfo {
chainId: ChainId
}
export type AccountAddress = string
/**
* An array of addresses
*/
export type ProviderAccounts = AccountAddress[]
export type ProviderEvent =
| 'connect'
| 'disconnect'
| 'message'
| 'chainChanged'
| 'accountsChanged'
export interface SimpleEventEmitter {
on(
event: ProviderEvent,
listener:
| ConnectListener
| DisconnectListener
| MessageListener
| ChainListener
| AccountsListener
): void
removeListener(
event: ProviderEvent,
listener:
| ConnectListener
| DisconnectListener
| MessageListener
| ChainListener
| AccountsListener
): void
}
export type ConnectListener = (info: ProviderInfo) => void
export type DisconnectListener = (error: ProviderRpcError) => void
export type MessageListener = (message: ProviderMessage) => void
export type ChainListener = (chainId: ChainId) => void
export type AccountsListener = (accounts: ProviderAccounts) => void
/**
* The hexadecimal representation of the users
*/
export type Balance = string
export interface TransactionObject {
data?: string
from: string
gas?: string
gasLimit?: string
gasPrice?: string
to: string
chainId: number
value?: string
maxFeePerGas?: string
maxPriorityFeePerGas?: string
nonce?: string
}
interface BaseRequest {
params?: never
}
export interface EthAccountsRequest extends BaseRequest {
method: 'eth_accounts'
}
export interface EthChainIdRequest extends BaseRequest {
method: 'eth_chainId'
}
export interface EthSignTransactionRequest {
method: 'eth_signTransaction'
params: [TransactionObject]
}
type Address = string
type Message = string
export interface EthSignMessageRequest {
method: 'eth_sign'
params: [Address, Message]
}
//https://geth.ethereum.org/docs/rpc/ns-personal#personal_sign
export interface PersonalSignMessageRequest {
method: 'personal_sign'
params: [Message, Address]
}
// request -> signTypedData_v3`
export interface EIP712Request {
method: 'eth_signTypedData'
params: [Address, EIP712TypedData]
}
export interface EthBalanceRequest {
method: 'eth_getBalance'
params: [string, (number | 'latest' | 'earliest' | 'pending')?]
}
export interface EIP1102Request extends BaseRequest {
method: 'eth_requestAccounts'
}
export interface SelectAccountsRequest extends BaseRequest {
method: 'eth_selectAccounts'
}
export interface EIP3085Request {
method: 'wallet_addEthereumChain'
params: AddChainParams[]
}
export interface EIP3326Request {
method: 'wallet_switchEthereumChain'
params: [{ chainId: ChainId }]
}
export type AddChainParams = {
chainId: ChainId
chainName?: string
nativeCurrency: {
name?: string
symbol?: string
decimals: number
}
rpcUrls: string[]
}
export interface EIP1193Provider extends SimpleEventEmitter {
on(event: 'connect', listener: ConnectListener): void
on(event: 'disconnect', listener: DisconnectListener): void
on(event: 'message', listener: MessageListener): void
on(event: 'chainChanged', listener: ChainListener): void
on(event: 'accountsChanged', listener: AccountsListener): void
request(args: EthAccountsRequest): Promise<ProviderAccounts>
request(args: EthBalanceRequest): Promise<Balance>
request(args: EIP1102Request): Promise<ProviderAccounts>
request(args: SelectAccountsRequest): Promise<ProviderAccounts>
request(args: EIP3326Request): Promise<null>
request(args: EIP3085Request): Promise<null>
request(args: EthChainIdRequest): Promise<ChainId>
request(args: EthSignTransactionRequest): Promise<string>
request(args: EthSignMessageRequest): Promise<string>
request(args: PersonalSignMessageRequest): Promise<string>
request(args: EIP712Request): Promise<string>
request(args: { method: string; params?: Array<unknown> }): Promise<unknown>
disconnect?(): void
}
export enum ProviderRpcErrorCode {
ACCOUNT_ACCESS_REJECTED = 4001,
ACCOUNT_ACCESS_ALREADY_REQUESTED = -32002,
UNAUTHORIZED = 4100,
INVALID_PARAMS = -32602,
UNSUPPORTED_METHOD = 4200,
DISCONNECTED = 4900,
CHAIN_DISCONNECTED = 4901,
CHAIN_NOT_ADDED = 4902,
DOES_NOT_EXIST = -32601,
UNRECOGNIZED_CHAIN_ID = -32603
}
export interface Chain {
namespace?: 'evm'
id: ChainId
rpcUrl: string
label: string
token: TokenSymbol // eg ETH, BNB, MATIC
color?: string
icon?: string // svg string
providerConnectionInfo?: ConnectionInfo
publicRpcUrl?: string
blockExplorerUrl?: string
}
export type ChainWithDecimalId = Omit<Chain, 'id'> & { id: DecimalChainId }
export type TokenSymbol = string // eg ETH
export interface CustomNetwork {
networkId: number
genesis: GenesisBlock
hardforks: Hardfork[]
bootstrapNodes: BootstrapNode[]
}
export interface GenesisBlock {
hash: string
timestamp: string | null
gasLimit: number
difficulty: number
nonce: string
extraData: string
stateRoot: string
}
export interface Hardfork {
name: string
block: number | null
}
export interface BootstrapNode {
ip: string
port: number | string
network?: string
chainId?: number
id: string
location: string
comment: string
}
export interface RPCResponse {
id: number
jsonrpc: string
error?: { code: number; message: string }
result?: any
}