Submit Wallet PR
Submit Wallet PR
Submit a PR to https://github.com/UnyxTech/tomo-wallet-provider
The example PR can be found here
Implement Your BTC Provider
import {
Network,
WalletInfo,
BTCProvider
} from '@tomo-inc/tomo-wallet-provider'
import { parseUnits } from '@tomo-inc/tomo-wallet-provider'
export const xyzProvider = 'xyz'
export class XYZWallet extends BTCProvider {
private xyzWalletInfo: WalletInfo | undefined
private bitcoinNetworkProvider: any
constructor() {
super()
if (!window[xyzProvider]) {
throw new Error('XYZ Wallet extension not found')
}
this.bitcoinNetworkProvider = window[xyzProvider]
}
connectWallet = async (): Promise<this> => {
const workingVersion = '1.0.0'
if (!this.bitcoinNetworkProvider) {
throw new Error('XYZ Wallet extension not found')
}
if (this.bitcoinNetworkProvider.getVersion) {
const version = await this.bitcoinNetworkProvider.getVersion()
if (version < workingVersion) {
throw new Error('Please update XYZ Wallet to the latest version')
}
}
let addresses = null
let pubKey = null
try {
addresses = await this.bitcoinNetworkProvider.connectWallet()
pubKey = await this.bitcoinNetworkProvider.getPublicKey()
if (!addresses || addresses.length === 0 || !pubKey) {
throw new Error('BTC is not enabled in XYZ Wallet')
}
} catch (error) {
throw new Error('BTC is not enabled in XYZ Wallet')
}
this.xyzWalletInfo = {
publicKeyHex: pubKey,
address: addresses[0]
}
return this
}
getWalletProviderName = async (): Promise<string> => {
return 'XYZ'
}
getAddress = async (): Promise<string> => {
return (await this.bitcoinNetworkProvider.getAccounts())[0]
}
getPublicKeyHex = async (): Promise<string> => {
if (!this.xyzWalletInfo) {
throw new Error('XYZ Wallet not connected')
}
return this.xyzWalletInfo.publicKeyHex
}
signPsbt = async (psbtHex: string): Promise<string> => {
if (!this.xyzWalletInfo) {
throw new Error('XYZ Wallet not connected')
}
return await this.bitcoinNetworkProvider.signPsbt(psbtHex)
}
signPsbts = async (psbtsHexes: string[]): Promise<string[]> => {
if (!this.xyzWalletInfo) {
throw new Error('XYZ Wallet not connected')
}
return await this.bitcoinNetworkProvider.signPsbts(psbtsHexes)
}
signMessage = async (message: string, type: 'ecdsa' | 'bip322-simple' = 'ecdsa'): Promise<string> => {
if (!this.xyzWalletInfo) {
throw new Error('XYZ Wallet not connected')
}
return await this.bitcoinNetworkProvider.signMessage(
message,
type
)
}
getNetwork = async (): Promise<Network> => {
return await this.bitcoinNetworkProvider.getNetwork()
}
on = (eventName: string, callBack: () => void) => {
return this.bitcoinNetworkProvider.on(eventName, callBack)
}
off = (eventName: string, callBack: () => void) => {
return this.bitcoinNetworkProvider.off(eventName, callBack)
}
getBalance = async (): Promise<number> => {
const result = await this.bitcoinNetworkProvider.getBalance()
return result
}
pushTx = async (txHex: string): Promise<string> => {
return await this.bitcoinNetworkProvider.pushTx(txHex)
}
async switchNetwork(network: Network) {
return await this.bitcoinNetworkProvider.switchNetwork(network)
}
async sendBitcoin(to: string, satAmount: number) {
const result = await this.bitcoinNetworkProvider.sendBitcoin(
to,
Number(parseUnits(satAmount.toString(), 8))
)
return result
}
}
Then you can use it in the wallet context provider
<TomoContextProvider
additionalWallets={[
{
id: 'xyz',
name: 'XYZ BTC Wallet',
chainType: 'bitcoin',
connectProvider: XYZWallet, // XYZWallet should extends BTCProvider
type: 'extension',
img: 'https://your wallet logo.svg'
}, {
id: 'abc',
name: 'ABC Cosmos Wallet',
chainType: 'cosmos',
connectProvider: ABCWallet, // ABCWallet should extends CosmosProvider
type: 'extension',
img: 'https://your wallet logo.svg'
},
]}
>
</TomoContextProvider>
Submitting a PR makes it more universal, allowing other projects that have integrated Tomo Connect Lite to automatically support your wallet.
Last updated