From 5e80f009d5448e85f6883e1c3054a940319815b8 Mon Sep 17 00:00:00 2001 From: web3max Date: Fri, 12 Apr 2024 11:08:10 +0800 Subject: [PATCH 01/10] feat: support UniSat wallet protocol. --- README-CN.md | 6 +- README.md | 6 +- package.json | 2 +- src/lib/constant/chain.ts | 95 ++++---------- src/lib/constant/errno.ts | 1 - src/lib/constant/index.ts | 1 + src/lib/store/index.ts | 2 +- src/lib/ui/LoggedIn/LoggedIn.tsx | 6 +- src/lib/ui/LoggedIn/bg/btc.svg | 25 ++++ src/lib/ui/Login/ChainList.tsx | 9 +- src/lib/ui/Login/WalletList.tsx | 8 +- src/lib/ui/Login/icon/btc-icon.svg | 4 + src/lib/ui/Login/icon/chain-list.png | Bin 6533 -> 7114 bytes src/lib/ui/Login/icon/unisat-icon.svg | 36 ++++++ src/lib/ui/Wallet/wallet.stories.tsx | 37 ++++-- src/lib/utils/index.ts | 6 +- .../WalletConnectorHandler/TorusConnector.ts | 6 +- .../WalletConnectorHandler/UnisatConnector.ts | 57 +++++++++ .../WalletConnectConnector.ts | 6 +- .../WalletConnectorHandler/WalletConnector.ts | 2 +- .../wallets/WalletConnectorHandler/index.ts | 2 + src/lib/wallets/WalletContext.ts | 30 ++++- .../TorusEventListener.ts | 24 ++-- .../TronLinkEventListener.ts | 119 +++++++++++++----- .../UnisatEventListener.ts | 98 +++++++++++++++ .../WalletConnectEventListener.ts | 24 ++-- .../WalletEventListenerHandler/index.ts | 2 + src/lib/wallets/WalletHandlerFactory.ts | 18 ++- .../WalletSignerHandler/UnisatSigner.ts | 8 ++ src/lib/wallets/WalletSignerHandler/index.ts | 2 + .../UnisatTransaction.ts | 10 ++ .../wallets/WalletTransactionHandler/index.ts | 2 + src/lib/wallets/index.ts | 21 +--- src/locales/en.po | 74 ++++++----- src/locales/en.ts | 2 +- src/locales/zh-CN.po | 74 ++++++----- src/locales/zh-CN.ts | 2 +- src/locales/zh-HK.po | 74 ++++++----- src/locales/zh-HK.ts | 2 +- src/types/global.d.ts | 1 + 40 files changed, 626 insertions(+), 278 deletions(-) create mode 100644 src/lib/ui/LoggedIn/bg/btc.svg create mode 100644 src/lib/ui/Login/icon/btc-icon.svg create mode 100644 src/lib/ui/Login/icon/unisat-icon.svg create mode 100644 src/lib/wallets/WalletConnectorHandler/UnisatConnector.ts create mode 100644 src/lib/wallets/WalletEventListenerHandler/UnisatEventListener.ts create mode 100644 src/lib/wallets/WalletSignerHandler/UnisatSigner.ts create mode 100644 src/lib/wallets/WalletTransactionHandler/UnisatTransaction.ts diff --git a/README-CN.md b/README-CN.md index e74311a..5af3560 100644 --- a/README-CN.md +++ b/README-CN.md @@ -4,8 +4,8 @@ ## 主要特性 -- **支持的链**: Ethereum、BNB Smart Chain、Polygon、TRON、Dogecoin。 -- **登录方式**: Passkey、Torus。 +- **支持的链**: Bitcoin、Ethereum、BNB Smart Chain、Polygon、TRON、Dogecoin。 +- **登录方式**: Unisat、WalletConnect、Passkey、Torus。 - **行业标准**: 我们依赖于 [viem](https://viem.sh/)、[@wagmi/core](https://wagmi.sh/core/getting-started) 和 [@wagmi/connectors](https://wagmi.sh/core/api/connectors) 这是 Web3 中最常用的库。 [Documentation in English](README.md) @@ -247,7 +247,7 @@ await onClose() - `customWallets`: 自定义显示的钱包,类型为`CustomWallet[]`。 - `alias`: 当前登录的钱包地址设置的 .bit alias,类型为`string`。 - `locale`: 当前使用的语言,类型为`string`。 - - `chainId`: 当使用 EVM 链钱包登录时表示对应的链 ID,类型为`number`。 + - `chainId`: 当使用 EVM 链钱包登录时表示对应的链 ID,类型为`number`。当使用 Bitcoin、TRON 钱包登录时表示对应的链 ID,类型为`string` **示例**: diff --git a/README.md b/README.md index 1643848..38d2c5e 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ ## Features -- **Supported Chains**: Ethereum, BNB Smart Chain, Polygon, TRON, Dogecoin. -- **Login Methods**: Passkey, Torus. +- **Supported Chains**: Bitcoin, Ethereum, BNB Smart Chain, Polygon, TRON, Dogecoin. +- **Login Methods**: Unisat, WalletConnect, Passkey, Torus. - **Industry Standards**: We rely on [viem](https://viem.sh/), [@wagmi/core](https://wagmi.sh/core/getting-started), and [@wagmi/connectors](https://wagmi.sh/core/api/connectors), which are among the most commonly used libraries in Web3. [中文文档](README-CN.md) @@ -247,7 +247,7 @@ await onClose() - `customWallets`: Custom wallets to be displayed, of type `CustomWallet[]`. - `alias`: The .bit alias set for the currently logged-in wallet address, of type `string`. - `locale`: The language currently in use, of type `string`. - - `chainId`: When logging in with an EVM chain wallet, it represents the corresponding chain ID, of type `number`. + - `chainId`: When logging in with an EVM chain wallet, it represents the corresponding chain ID, of type `number`. When logging in with an Bitcoin, TRON wallet, it represents the corresponding chain ID, of type `string`. **Example**: diff --git a/package.json b/package.json index 3a34a50..7c699e8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wallet-bridge", "private": false, - "version": "1.0.0-beta.5", + "version": "1.0.0-beta.7", "main": "./dist/wallet-bridge.umd.js", "module": "./dist/wallet-bridge.es.js", "types": "./dist/index.d.ts", diff --git a/src/lib/constant/chain.ts b/src/lib/constant/chain.ts index 623203f..25a0bfa 100644 --- a/src/lib/constant/chain.ts +++ b/src/lib/constant/chain.ts @@ -6,8 +6,10 @@ export enum ChainId { bscTestnet = 97, polygon = 137, polygonMumbai = 80001, - tron = 728126428, - tronNile = 3448148188, + tron = '0x2b6653dc', + tronNile = '0xcd8690dc', + btc = 'livenet', + btcTestnet = 'testnet', } // SLIP-0044 : Registered coin types for BIP-0044 https://github.com/satoshilabs/slips/blob/master/slip-0044.md @@ -21,18 +23,20 @@ export enum CoinType { matic = '966', } -export const CoinTypeToChainIdMap: Record = { +export const CoinTypeToChainIdMap: Record = { [CoinType.eth]: ChainId.eth, [CoinType.bsc]: ChainId.bsc, [CoinType.matic]: ChainId.polygon, [CoinType.trx]: ChainId.tron, + [CoinType.btc]: ChainId.btc, } -export const CoinTypeToTestNetChainIdMap: Record = { +export const CoinTypeToTestNetChainIdMap: Record = { [CoinType.eth]: ChainId.ethHolesky, [CoinType.bsc]: ChainId.bscTestnet, [CoinType.matic]: ChainId.polygonMumbai, [CoinType.trx]: ChainId.tronNile, + [CoinType.btc]: ChainId.btcTestnet, } export const CoinTypeToTorusHostMap: Record = { @@ -47,15 +51,12 @@ export const CoinTypeToTorusHostTestNetMap: Record = { [CoinType.matic]: 'mumbai', } -export const CoinTypeToGenesisHash: Record = { - [CoinType.doge]: '1a91e3dace36e2be3bf030a65679fe821aa1d6ef92e7c9902eb318182c355691', -} - export const ChainIdToCoinTypeMap: Record = { [ChainId.eth]: CoinType.eth, [ChainId.bsc]: CoinType.bsc, [ChainId.polygon]: CoinType.matic, [ChainId.tron]: CoinType.trx, + [ChainId.btc]: CoinType.btc, } export const ChainIdToCoinTypeTestNetMap: Record = { @@ -63,6 +64,7 @@ export const ChainIdToCoinTypeTestNetMap: Record = { [ChainId.bscTestnet]: CoinType.bsc, [ChainId.polygonMumbai]: CoinType.matic, [ChainId.tronNile]: CoinType.trx, + [ChainId.btcTestnet]: CoinType.btc, } export enum SIGN_TYPE { @@ -75,6 +77,7 @@ export enum SIGN_TYPE { ed25519, doge, webauthn, + btc, } export enum CustomChain { @@ -83,6 +86,7 @@ export enum CustomChain { bsc = 'BNB Smart Chain', tron = 'TRON', doge = 'Dogecoin', + btc = 'Bitcoin', polygon = 'Polygon', torus = 'Torus', } @@ -154,17 +158,6 @@ export const Polygon: IMainChain = { testExplorerTrx: 'https://mumbai.polygonscan.com/tx/', } -export const BTC: IMainChain = { - // eslint-disable-next-line lingui/no-unlocalized-strings - name: 'Bitcoin', - symbol: 'BTC', - coinType: CoinType.btc, - decimals: 8, - icon: 'bitcoin', - tokenId: 'btc_btc', - explorerTrx: 'https://explorer.btc.com/btc/address/', - testExplorerTrx: '', -} export const DOGE: IMainChain = { name: CustomChain.doge, symbol: 'DOGE', @@ -176,63 +169,24 @@ export const DOGE: IMainChain = { testExplorerTrx: 'https://dogechain.info/tx/', } +export const BTC: IMainChain = { + name: CustomChain.btc, + symbol: 'BTC', + coinType: CoinType.btc, + decimals: 8, + icon: 'bitcoin', + tokenId: 'btc_btc', + explorerTrx: 'https://blockchair.com/bitcoin/transaction/', + testExplorerTrx: 'https://blockchair.com/bitcoin/testnet/transaction/', +} + export const CoinTypeToChainMap: Record = { [CoinType.eth]: ETH, [CoinType.bsc]: BSC, [CoinType.matic]: Polygon, [CoinType.trx]: TRON, [CoinType.doge]: DOGE, -} - -export const ChainIdToChainInfoMap: Record = { - [ChainId.eth]: { - // eslint-disable-next-line lingui/no-unlocalized-strings - networkName: 'Ethereum Mainnet', - symbol: 'ETH', - decimals: 18, - rpcUrl: 'https://mainnet.infura.io/v3/', - blockExplorerUrl: 'https://etherscan.io', - }, - [ChainId.ethHolesky]: { - // eslint-disable-next-line lingui/no-unlocalized-strings - networkName: 'Ethereum Holesky Testnet', - symbol: 'ETH', - decimals: 18, - rpcUrl: 'https://rpc.ankr.com/eth_holesky/', - blockExplorerUrl: 'https://holesky.etherscan.io', - }, - [ChainId.bsc]: { - // eslint-disable-next-line lingui/no-unlocalized-strings - networkName: 'Binance Smart Chain Mainnet', - symbol: 'BNB', - decimals: 18, - rpcUrl: 'https://bsc-dataseed1.binance.org', - blockExplorerUrl: 'https://bscscan.com', - }, - [ChainId.bscTestnet]: { - // eslint-disable-next-line lingui/no-unlocalized-strings - networkName: 'Binance Smart Chain Testnet', - symbol: 'BNB', - decimals: 18, - rpcUrl: 'https://data-seed-prebsc-1-s1.binance.org:8545', - blockExplorerUrl: 'https://testnet.bscscan.com', - }, - [ChainId.polygon]: { - // eslint-disable-next-line lingui/no-unlocalized-strings - networkName: 'Polygon Mainnet', - symbol: 'MATIC', - decimals: 18, - rpcUrl: 'https://polygon-rpc.com/', - blockExplorerUrl: 'https://polygonscan.com', - }, - [ChainId.polygonMumbai]: { - // eslint-disable-next-line lingui/no-unlocalized-strings - networkName: 'Polygon Testnet Mumbai', - symbol: 'MATIC', - decimals: 18, - rpcUrl: 'https://matic-mumbai.chainstacklabs.com', - blockExplorerUrl: 'https://mumbai.polygonscan.com', - }, + [CoinType.btc]: BTC, } export enum CustomWallet { @@ -240,6 +194,7 @@ export enum CustomWallet { trustWallet = 'TrustWallet', imToken = 'imToken', tokenPocket = 'TokenPocket', + unisat = 'Unisat', oneKey = 'OneKey', iToken = 'iToken', tronLink = 'TronLink', diff --git a/src/lib/constant/errno.ts b/src/lib/constant/errno.ts index 8dd9af8..33ed5a3 100644 --- a/src/lib/constant/errno.ts +++ b/src/lib/constant/errno.ts @@ -1,4 +1,3 @@ -/* eslint-disable lingui/no-unlocalized-strings */ import { ActionErrorCode } from 'connect-did-sdk' const errno = { diff --git a/src/lib/constant/index.ts b/src/lib/constant/index.ts index 7243243..348b70e 100644 --- a/src/lib/constant/index.ts +++ b/src/lib/constant/index.ts @@ -14,6 +14,7 @@ export enum WalletProtocol { tronLink = 'tronLink', torus = 'torus', tokenPocketUTXO = 'tokenPocketUTXO', + unisat = 'unisat', walletConnect = 'walletConnect', webAuthn = 'webAuthn', } diff --git a/src/lib/store/index.ts b/src/lib/store/index.ts index d378558..1d3d994 100644 --- a/src/lib/store/index.ts +++ b/src/lib/store/index.ts @@ -25,7 +25,7 @@ export interface WalletState { protocol?: WalletProtocol address?: string coinType?: CoinType - chainId?: number + chainId?: number | string walletName?: string hardwareWalletTipsShow?: boolean deviceData?: IDeviceData diff --git a/src/lib/ui/LoggedIn/LoggedIn.tsx b/src/lib/ui/LoggedIn/LoggedIn.tsx index 8e1428d..0eac1fe 100644 --- a/src/lib/ui/LoggedIn/LoggedIn.tsx +++ b/src/lib/ui/LoggedIn/LoggedIn.tsx @@ -22,9 +22,11 @@ import BscIcon from '../Login/icon/bsc-icon.svg' import PolygonIcon from '../Login/icon/polygon-icon.svg' import TronIcon from '../Login/icon/tron-icon.svg' import DogecoinIcon from '../Login/icon/dogecoin-icon.svg' +import BtcIcon from '../Login/icon/btc-icon.svg' import BscBg from './bg/bsc.svg' import DeviceBg from './bg/device.svg' import DogeBg from './bg/doge.svg' +import BtcBg from './bg/btc.svg' import EthBg from './bg/eth.svg' import PolygonBg from './bg/polygon.svg' import TronBg from './bg/tron.svg' @@ -54,7 +56,6 @@ export const LoggedIn = ({ transitionRef, transitionStyle }: SwapChildProps) => } const icons: Record = { - [CoinType.btc]: , [CoinType.ckb]: , [CoinType.eth]: ETH, [CoinType.bsc]: BSC, @@ -64,16 +65,17 @@ export const LoggedIn = ({ transitionRef, transitionStyle }: SwapChildProps) => [CoinType.trx]: Tron, // eslint-disable-next-line lingui/no-unlocalized-strings [CoinType.doge]: Dogecoin, + [CoinType.btc]: BTC, } const bgImage: Record = { - [CoinType.btc]: , [CoinType.ckb]: , [CoinType.eth]: , [CoinType.bsc]: , [CoinType.matic]: , [CoinType.trx]: , [CoinType.doge]: , + [CoinType.btc]: , } const close = () => { diff --git a/src/lib/ui/LoggedIn/bg/btc.svg b/src/lib/ui/LoggedIn/bg/btc.svg new file mode 100644 index 0000000..a2a8d4b --- /dev/null +++ b/src/lib/ui/LoggedIn/bg/btc.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/ui/Login/ChainList.tsx b/src/lib/ui/Login/ChainList.tsx index 03b3b3b..c8f0a4d 100644 --- a/src/lib/ui/Login/ChainList.tsx +++ b/src/lib/ui/Login/ChainList.tsx @@ -12,6 +12,7 @@ import BscIcon from './icon/bsc-icon.svg' import PolygonIcon from './icon/polygon-icon.svg' import TronIcon from './icon/tron-icon.svg' import DogecoinIcon from './icon/dogecoin-icon.svg' +import BtcIcon from './icon/btc-icon.svg' import TorusIcon from './icon/torus-icon.svg' import { t } from '@lingui/macro' @@ -55,6 +56,12 @@ const doge: IChain = { coinType: CoinType.doge, } +const btc: IChain = { + icon: Bitcoin, + name: CustomChain.btc, + coinType: CoinType.btc, +} + const torus: IChain = { // eslint-disable-next-line lingui/no-unlocalized-strings icon: Torus, @@ -75,7 +82,7 @@ export const ChainList = ({ transitionStyle, transitionRef }: SwapChildProps) => const chains: IChain[] = useMemo(() => { const customChains = walletSnap.customChains - let walletList: IChain[] = [eth, bsc, polygon, tron, doge] + let walletList: IChain[] = [btc, eth, bsc, polygon, tron, doge] let socialList: IChain[] = [torus] const list = [] diff --git a/src/lib/ui/Login/WalletList.tsx b/src/lib/ui/Login/WalletList.tsx index 19268e1..3f1340a 100644 --- a/src/lib/ui/Login/WalletList.tsx +++ b/src/lib/ui/Login/WalletList.tsx @@ -11,6 +11,7 @@ import MetaMaskIcon from './icon/metamask-icon.svg' import TrustWalletIcon from './icon/trustwallet-icon.svg' import ImTokenIcon from './icon/imtoken-icon.svg' import TokenPocketIcon from './icon/tokenpocket-icon.svg' +import UnisatIcon from './icon/unisat-icon.svg' import OneKeyIcon from './icon/onekey-icon.svg' import TronLinkIcon from './icon/tronlink-icon.svg' import WalletConnectIcon from './icon/walletconnect-icon.svg' @@ -55,11 +56,16 @@ export const WalletList = ({ transitionRef, transitionStyle }: SwapChildProps) = name: CustomWallet.imToken, supportList: [CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx], }, + { + icon: Unisat, + name: CustomWallet.unisat, + supportList: [CoinType.btc], + }, { // eslint-disable-next-line lingui/no-unlocalized-strings icon: TokenPocket, name: CustomWallet.tokenPocket, - supportList: [CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx, CoinType.doge], + supportList: [CoinType.btc, CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx, CoinType.doge], }, { // eslint-disable-next-line lingui/no-unlocalized-strings diff --git a/src/lib/ui/Login/icon/btc-icon.svg b/src/lib/ui/Login/icon/btc-icon.svg new file mode 100644 index 0000000..7a84a20 --- /dev/null +++ b/src/lib/ui/Login/icon/btc-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/lib/ui/Login/icon/chain-list.png b/src/lib/ui/Login/icon/chain-list.png index 7eaee7f3295def76249798bfbee1dc18dc0eeafa..a8f670fcacffb2c2801435fcc7376d81a51e9a8d 100644 GIT binary patch literal 7114 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 diff --git a/src/lib/ui/Login/icon/unisat-icon.svg b/src/lib/ui/Login/icon/unisat-icon.svg new file mode 100644 index 0000000..a26b841 --- /dev/null +++ b/src/lib/ui/Login/icon/unisat-icon.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/ui/Wallet/wallet.stories.tsx b/src/lib/ui/Wallet/wallet.stories.tsx index b020938..2987246 100644 --- a/src/lib/ui/Wallet/wallet.stories.tsx +++ b/src/lib/ui/Wallet/wallet.stories.tsx @@ -118,7 +118,7 @@ const TemplateConnectWallet = () => { } } - const onSendTransaction = async () => { + const onSendETH = async () => { const signature = await wallet.sendTransaction({ to: '0x7df93d9F500fD5A9537FEE086322a988D4fDCC38', value: '10000000000000000', @@ -127,22 +127,31 @@ const TemplateConnectWallet = () => { console.log(signature) } + const onSendBTC = async () => { + const signature = await wallet.sendTransaction({ + to: 'tb1qgej835qcnd59ln79ayfrcxv6awv7mge3ljfpqd', + value: '10000', + data: '0x123abc', + }) + console.log(signature) + } + const setLocale = (locale: string) => { wallet.setLocale(locale) } - useEffect(() => { - loadScript('//cdn.jsdelivr.net/npm/eruda', 'eruda').then(() => { - // @ts-ignore - window.eruda.init() - }) - }) + // useEffect(() => { + // loadScript('//cdn.jsdelivr.net/npm/eruda', 'eruda').then(() => { + // // @ts-ignore + // window.eruda.init() + // }) + // }) - useEffect(() => { - if (wallet && !walletSnap?.address) { - wallet.connectWallet() - } - }, [wallet, walletSnap?.address]) + // useEffect(() => { + // if (wallet && !walletSnap?.address) { + // wallet.connectWallet() + // } + // }, [wallet, walletSnap?.address]) return ( <> @@ -168,7 +177,9 @@ const TemplateConnectWallet = () => {

- + +
+