EVM-Compatible Provider
Binance Web3 Wallet Provider API
The Provider API is a JavaScript API that connects wallets with dApps. The dApps you visit can access your wallet, read on-chain data, sign messages, and send transactions.
Below are some common usage examples
// Wallet connection
if (typeof window.binancew3w.ethereum !== 'undefined') {
try {
const accounts = await window.binancew3w.ethereum.request({
method: 'eth_requestAccounts'
});
console.log("connected:", accounts[0]);
} catch (error) {
console.error("connection rejected:", error);
}
} else {
alert("Please install wallet!");
}
// Send transaction
const transactionParameters = {
from: accounts[0], // sender address
to: '0xRecipientAddress', // recipient address
value: '0xDE0B6B3A7640000',
gasLimit: '0x5208', // 21000 gas
};
try {
const txHash = await window.binancew3w.ethereum.request({
method: 'eth_sendTransaction',
params: [transactionParameters],
});
console.log("Transaction hash:", txHash);
} catch (error) {
console.error("Transaction failed:", error);
}
// Switch accounts
window.binancew3w.ethereum.on('accountsChanged', (accounts) => {
if (accounts.length === 0) {
console.log("Wallet has been disconnected");
} else {
console.log("Current account:", accounts[0]);
}
});
// Switch chains
window.binancew3w.ethereum.on('chainChanged', (chainId) => {
console.log("Current chain id:", chainId);
});
Installation
The installation process may vary depending on the technology stack you are using.
Integration
Integration with RainbowKit 2.x
Add Packages
npm install @binance/w3w-rainbow-connector-v2 @rainbow-me/rainbowkit@2.1.2 wagmi@2.x viem@2.x @tanstack/react-query
Usage
import '@rainbow-me/rainbowkit/styles.css'
import { connectorsForWallets, RainbowKitProvider, WalletList } from '@rainbow-me/rainbowkit'
import { injectedWallet } from '@rainbow-me/rainbowkit/wallets'
import { WagmiProvider, createConfig, http } from 'wagmi'
import { bsc, mainnet, sepolia } from 'wagmi/chains'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import binanceWallet from '@binance/w3w-rainbow-connector-v2'
const WALLET_CONNECT_PROJECT_ID = 'xxxxxxxxxx'
const APP_NAME = 'xxx'
const recommendedWalletList: WalletList = [
{
groupName: 'Recommended',
wallets: [
injectedWallet,
binanceWallet,
],
},
]
const connectors = connectorsForWallets(
recommendedWalletList,
{ projectId: WALLET_CONNECT_PROJECT_ID, appName: APP_NAME }
)
const config = createConfig({
ssr: true,
connectors,
chains: [mainnet, sepolia, bsc],
transports: {
[mainnet.id]: http(),
[sepolia.id]: http(),
[bsc.id]: http(),
},
})
const queryClient = new QueryClient()
export default function RainbowProvider({ children }) {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<RainbowKitProvider>{children}</RainbowKitProvider>
</QueryClientProvider>
</WagmiProvider>
)
}
Integration with BlockNative
Add Packages
npm install @web3-onboard/core @binance/w3w-blocknative-connector
Usage
import Onboard from '@web3-onboard/core'
import binanceModule from '@binance/w3w-blocknative-connector'
// initialize the module with options
const binance = binanceModule({options:{lng:'en'}})
// can also initialize with no options...
// const binance = binanceModule()
const onboard = Onboard({
// ... other Onboard options
wallets: [
binance
//... other wallets
]
})
const connectedWallets = await onboard.connectWallet()
console.log(connectedWallets)
Integration with wagmi v2
Add Packages
npm install wagmi@2.x viem@2.x @tanstack/react-query @binance/w3w-wagmi-connector-v2
Integrate with your projects
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { http, createConfig, WagmiProvider } from 'wagmi'
import { injected } from 'wagmi/connectors'
import { getWagmiConnectorV2 } from '@binance/w3w-wagmi-connector-v2'
import { bsc, mainnet, sepolia } from 'wagmi/chains'
const connector = getWagmiConnectorV2()
const config = createConfig({
chains: [mainnet, sepolia, bsc],
connectors: [injected(), connector()],
transports: {
[mainnet.id]: http(),
[sepolia.id]: http(),
[bsc.id]: http(),
},
})
const queryClient = new QueryClient()
export default function WagmiV2() {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<Home />
</QueryClientProvider>
</WagmiProvider>
)
}
Use wagmi v2 API
wagmi v2 provides many useful API for you to use, here is a basic example.
import { Connector, useConnect, useDisconnect, useSignMessage } from 'wagmi'
function WalletOption({ connector, onClick }: { connector: Connector, onClick: () => void}) {
const [ready, setReady] = React.useState(false)
React.useEffect(() => {
;(async () => {
const provider = await connector.getProvider()
setReady(!!provider)
})()
}, [connector])
return (
<button disabled={!ready} onClick={onClick}>
{connector.name}
</button>
)
}
function Home() {
const { connectors, connect } = useConnect()
const { disconnect } = useDisconnect()
const { signMessage, data } = useSignMessage()
return (
<main>
<section>
<h2>wagmi v2 connector</h2>
<div>
{connectors.map((connector) => (
<WalletOption
key={connector.uid}
connector={connector}
onClick={() => connect({ connector })}
/>
))}
</div>
<button onClick={() => disconnect()}>disconnect</button>
<button onClick={() => signMessage()}>signMessage</button>
</section>
</main>
)
}
Get connector by id from wagmi
If you need to getConnector by id, you can use the following code
const connector = connectors.find(connector => {
return connector.id === 'BinanceW3WSDK' || connector.id === 'wallet.binance.com';
});
Wagmi injected connector
If you like to inject Binance web3 wallet, you can use the following code
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { http, createConfig, WagmiProvider } from 'wagmi' // wagmi v2 API
import { injected } from 'wagmi/connectors'
import { bsc, mainnet, sepolia } from 'wagmi/chains'
const config = createConfig({
ssr: true,
chains: [mainnet, sepolia, bsc],
connectors: [
injected({
target: { // Provide the injected target to avoid window.ethereum provider overwrite conflict
id: 'wallet.binance.com',
name: 'Binance Wallet Injected',
provider: () => window.binancew3w.ethereum,
},
}),
],
transports: {
[mainnet.id]: http(),
[sepolia.id]: http(),
[bsc.id]: http(),
},
})
const queryClient = new QueryClient()
export default function WagmiV2Injected() {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<Home />
</QueryClientProvider>
</WagmiProvider>
)
}
Utility
isInBinance
Return true if the dApp is in the dApp browser of the Binance Web3 Wallet.
import { isInBinance } from '@binance/w3w-utils'
isInBinance() // return boolean
// Or you can detect without install any packages
window.ethereum.isBinance // boolean
getDeeplink
By this way, you can guide users to open your dapp in Binance dApp browser.
import {getDeeplink} fom '@binance/w3w-utils'
getDeeplink(url, defaultChainId) // return {bnc, http}
For the response, bnc is the deeplink and http is the universal link.
Example code
Here is the example project which integrating the SDK. https://github.com/sunopar/test-sdk
Troubleshooting
buffer is not defined
While using wagmi or Rainbowkit, if you are using regular React(not SSR), you may encounter the error buffer is not defined.
You can try to install buffer package.
npm install buffer
// src/index.ts
import { Buffer } from 'buffer'
window.Buffer = Buffer
// public/index.html
<script>
var global = global || window
</script>
Non-React project
For Non-React project, you can refer this example https://github.com/sunopar/test-sdk/blob/main/src/app/ethereum/page.js