@initia/react-wallet-widget
v0.141.0
Published
## Getting started
Downloads
2,410
Keywords
Readme
@initia/react-wallet-widget
Getting started
Install dependencies:
pnpm add @initia/react-wallet-widget
If your layer's chain.json
has already been registered in initia-labs/initia-registry:
import { WalletWidgetProvider } from "@initia/react-wallet-widget"
render(
<WalletWidgetProvider chainId="YOUR_CHAIN_ID">
<App />
</WalletWidgetProvider>,
)
or, to manually register your layer:
import { ChainSchema } from "@initia/initia-registry-types/zod"
const layer = ChainSchema.parse({
chain_id: "YOUR_CHAIN_ID",
chain_name: "YOUR_CHAIN_NAME",
apis: {
rpc: [{ address: "YOUR_RPC_URL" }],
rest: [{ address: "YOUR_LCD_URL" }],
},
fees: {
fee_tokens: [{ denom: "YOUR_FEE_DENOM", fixed_min_gas_price: 0.15 }],
},
bech32_prefix: "init",
})
render(
<WalletWidgetProvider customLayer={layer}>
<App />
</WalletWidgetProvider>,
)
Simple example
import { useAddress, useWallet } from "@initia/react-wallet-widget"
import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"
const App = () => {
const address = useAddress()
const { onboard, view, requestTx } = useWallet()
if (address) {
const send = async () => {
const messages = [
{
typeUrl: "/cosmos.bank.v1beta1.MsgSend",
value: MsgSend.fromPartial({
fromAddress: address,
toAddress: address,
amount: [{ amount: "1000000", denom: "uinit" }],
}),
},
]
const transactionHash = await requestTx({ messages })
console.log(transactionHash)
}
return (
<>
<button onClick={view}>{address}</button>
<button onClick={send}>Send</button>
</>
)
}
return <button onClick={onboard}>Connect</button>
}
Simple example using @initia/initia.js
import { useAddress, useWallet } from "@initia/react-wallet-widget"
import { MsgSend } from "@initia/initia.js"
const App = () => {
const address = useAddress()
const { onboard, view, requestTx } = useWallet()
if (address) {
const send = async () => {
const msgs = [
MsgSend.fromProto({
fromAddress: address,
toAddress: address,
amount: [{ amount: "1000000", denom: "uinit" }],
}),
]
// or
const msgs = [new MsgSend(address, recipientAddress, { [denom]: toAmount(amount) })]
const transactionHash = await requestInitiaTx({ msgs, memo })
console.log(transactionHash)
}
return (
<>
<button onClick={view}>{address}</button>
<button onClick={send}>Send</button>
</>
)
}
return <button onClick={onboard}>Connect</button>
}
Interface
interface ReactWalletWidget {
/** The current wallet address. */
address: string
/** The current wallet account. */
account: AccountData | null
/** The current connected wallet. */
wallet: WidgetWallet | null
/** Current connected Ethereum provider. */
ethereum: Eip1193Provider | null
/** Indicates whether the wallet connection is being established. */
isLoading: boolean
/** Triggers the wallet connection process. */
onboard(): void
/** Displays the wallet interface for managing assets. */
view(event: React.MouseEvent): void
/** Signs and broadcasts a transaction, returning the transaction hash. */
requestTx(
txBodyValue: { messages: { typeUrl: string; value: Record<string, any> }[]; memo?: string },
options?: { chainId?: string; gas?: number },
): Promise<string>
/** Utilizes the @initia/initia.js library to broadcast transactions. */
requestInitiaTx(tx: { msgs: Msg[]; memo?: string }, options?: { chainId?: string; gas?: number }): Promise<string>
/** Estimate a transaction gas, returning the expected gas required. */
estimateTx(
txBodyValue: { messages: { typeUrl: string; value: Record<string, any> }[]; memo?: string },
chainId?: string,
): Promise<number>
/** Utilizes the @initia/initia.js library to estimate transactions. */
estimateInitiaTx(tx: { msgs: Msg[]; memo?: string }, chainId?: string): Promise<number>
/** Signs arbitrary data with the wallet. */
signArbitrary(data: string | Uint8Array): Promise<string>
/** Verifies a signature against the provided data. */
verifyArbitrary(data: string | Uint8Array, signature: string): Promise<boolean>
/** Disconnects the wallet. */
disconnect(): Promise<void>
}
interface WidgetConfig {
/**
* The chain ID for the wallet connection.
* This only works if your chain is registered in initia-registry.
* Default: "initiation-2".
*/
chainId?: string
/**
* Custom layer configuration.
* This option is for when your chain is not yet registered in initia-registry.
*/
customLayer?: Chain
/**
* Protobuf types for transaction serialization.
* Only required if you need custom message signing.
*/
protoTypes?: Iterable<[string, GeneratedType]>
/**
* Amino converters for encoding/decoding transactions.
* Only required if you need custom message signing.
*/
aminoConverters?: AminoConverters
/**
* Flag to use the Initia Wallet as a signer only, without other functionalities.
* Set to `true` if you want to use the gas value estimated by the widget instead of the Initia wallet extension.
*/
useWalletAsSignerOnly?: boolean
/**
* Flag to use Keplr as a Direct signer.
* Set to `true` if you want to use Keplr as a Direct signer instead of a the Amino signer.
*/
useKeplrAsDirectSigner?: boolean
/**
* Additional wallets to be supported by the widget.
* Use this if you want to declare custom wallet extension providers that we do not provide.
*/
additionalWallets?: WidgetWallet[]
/** Function to filter and select specific types of wallets. */
filterWallet?: (type: WidgetWallet) => boolean
/** Adjustment factor for transaction gas estimation. */
gasAdjustment?: number
/** URL for api. */
apiUrl?: string
/** URL for dex api. */
dexApiUrl?: string
/** URL for block explorer. */
explorerUrl?: string
/** URL for fetching registry information. */
registryUrl?: string
/** URL for fetching the swap list configuration. */
swaplistUrl?: string
/** URL for fetching error messages or logs. */
errorsUrl?: string
/** URLs for various module configurations. */
modules?: {
usernames: string
dex_utils: string
swap_transfer: string
}
/** Theme configuration for the widget UI. */
theme?: WidgetTheme
}
Usage in non-React projects
If you are not using React but wish to use the Wallet Widget in your project, you can leverage the core functionality by installing @initia/wallet-widget.