diff --git a/.circleci/config.yml b/.circleci/config.yml index 41f8d4262..592235c1b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -243,6 +243,12 @@ jobs: working_directory: ~/web3-onboard-monorepo/packages/trezor steps: - node-build-steps + build-trust: + docker: + - image: cimg/node:16.13.1 + working_directory: ~/web3-onboard-monorepo/packages/trust + steps: + - node-build-steps build-frontier: docker: - image: cimg/node:16.13.1 @@ -431,6 +437,12 @@ jobs: working_directory: ~/web3-onboard-monorepo/packages/trezor steps: - node-staging-build-steps + build-staging-trust: + docker: + - image: cimg/node:16.13.1 + working_directory: ~/web3-onboard-monorepo/packages/trust + steps: + - node-staging-build-steps build-staging-frontier: docker: - image: cimg/node:16.13.1 @@ -621,6 +633,12 @@ workflows: <<: *deploy_production_filters - build-staging-trezor: <<: *deploy_staging_filters + trust: + jobs: + - build-trust: + <<: *deploy_production_filters + - build-staging-trust: + <<: *deploy_staging_filters frontier: jobs: - build-frontier: diff --git a/.github/ISSUE_TEMPLATE/BUG.yml b/.github/ISSUE_TEMPLATE/BUG.yml index 0e36ced02..b3472c21e 100644 --- a/.github/ISSUE_TEMPLATE/BUG.yml +++ b/.github/ISSUE_TEMPLATE/BUG.yml @@ -1,6 +1,6 @@ name: Bug Report description: File a bug report -title: "[Bug]: " +title: '[Bug]: ' labels: [bug] assignees: - taylorjdawson @@ -40,27 +40,28 @@ body: attributes: label: What package is effected by this issue? options: - - "@web3-onboard/core" - - "@web3-onboard/common" - - "@web3-onboard/coinbase" - - "@web3-onboard/decent" - - "@web3-onboard/formatic" - - "@web3-onboard/gnosis" - - "@web3-onboard/injected" - - "@web3-onboard/keepkey" - - "@web3-onboard/keystone" - - "@web3-onboard/ledger" - - "@web3-onboard/magic" - - "@web3-onboard/mew" - - "@web3-onboard/portis" - - "@web3-onboard/react" - - "@web3-onboard/torus" - - "@web3-onboard/trezor" - - "@web3-onboard/frontier" - - "@web3-onboard/vue" - - "@web3-onboard/walletconnect" - - "@web3-onboard/walletlink" - - "@web3-onboard/web3auth" + - '@web3-onboard/core' + - '@web3-onboard/common' + - '@web3-onboard/coinbase' + - '@web3-onboard/decent' + - '@web3-onboard/formatic' + - '@web3-onboard/gnosis' + - '@web3-onboard/injected' + - '@web3-onboard/keepkey' + - '@web3-onboard/keystone' + - '@web3-onboard/ledger' + - '@web3-onboard/magic' + - '@web3-onboard/mew' + - '@web3-onboard/portis' + - '@web3-onboard/react' + - '@web3-onboard/torus' + - '@web3-onboard/trezor' + - '@web3-onboard/trust' + - '@web3-onboard/frontier' + - '@web3-onboard/vue' + - '@web3-onboard/walletconnect' + - '@web3-onboard/walletlink' + - '@web3-onboard/web3auth' - bnc-onboard (v1) validations: required: true diff --git a/README.md b/README.md index 16d761582..5c2b45bff 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ For full documentation, check out the README.md for each package or the [docs pa **SDK Wallets** - [Coinbase](packages/coinbase/README.md) +- [Trust](packages/trust/README.md) - [WalletConnect](packages/walletconnect/README.md) - [Gnosis](packages/gnosis/README.md) - [Magic](packages/magic/README.md) diff --git a/docs/package.json b/docs/package.json index 13de43f20..588169fd1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -72,6 +72,7 @@ "@web3-onboard/tallyho": "^2.0.1", "@web3-onboard/torus": "^2.2.0", "@web3-onboard/trezor": "^2.3.3", + "@web3-onboard/trust": "^2.0.0-alpha.1", "@web3-onboard/uauth": "^2.0.1", "@web3-onboard/walletconnect": "^2.2.1", "@web3-onboard/web3auth": "^2.1.4", diff --git a/docs/src/lib/components/examples/connect-wallet/ReactConnectWallet.md b/docs/src/lib/components/examples/connect-wallet/ReactConnectWallet.md index e0b56147e..679388e18 100644 --- a/docs/src/lib/components/examples/connect-wallet/ReactConnectWallet.md +++ b/docs/src/lib/components/examples/connect-wallet/ReactConnectWallet.md @@ -1,4 +1,3 @@ - ## Step 1: Import + Configure Import the libraries and any wallets you would like to use. For this example, we are going to use the injected wallets module. You can easily add more wallet support to your dapp via our other wallet modules. Additionally, we'll setup web3-onboard to support 2 chains: Ethereum mainnet and Polygon mainnet. @@ -22,6 +21,7 @@ import web3authModule from '@web3-onboard/web3auth' import dcentModule from '@web3-onboard/dcent' import sequenceModule from '@web3-onboard/sequence' import tallyHoModule from '@web3-onboard/tallyho' +import trustModule from '@web3-onboard/trust' import frontierModule from '@web3-onboard/frontier' const INFURA_KEY = '' @@ -45,6 +45,7 @@ const keepkey = keepkeyModule() const gnosis = gnosisModule() const sequence = sequenceModule() const tally = tallyModule() +const trust = trustModule() const frontier = frontierModule() const trezorOptions = { @@ -65,6 +66,7 @@ const wallets = [ keepkey, sequence, injected, + trust, frontier, tally, ledger, @@ -233,4 +235,3 @@ export default function ConnectWallet() { ) } ``` - diff --git a/docs/src/lib/components/examples/connect-wallet/SvelteConnectWallet.md b/docs/src/lib/components/examples/connect-wallet/SvelteConnectWallet.md index 18f81c427..d763918c3 100644 --- a/docs/src/lib/components/examples/connect-wallet/SvelteConnectWallet.md +++ b/docs/src/lib/components/examples/connect-wallet/SvelteConnectWallet.md @@ -21,6 +21,7 @@ import web3authModule from '@web3-onboard/web3auth' import dcentModule from '@web3-onboard/dcent' import sequenceModule from '@web3-onboard/sequence' import tallyHoModule from '@web3-onboard/tallyho' +import trustModule from '@web3-onboard/trust' import frontierModule from '@web3-onboard/frontier' const INFURA_KEY = '' @@ -44,6 +45,7 @@ const keepkey = keepkeyModule() const gnosis = gnosisModule() const sequence = sequenceModule() const tally = tallyModule() +const trust = trustModule() const frontier = frontierModule() const trezorOptions = { @@ -68,6 +70,7 @@ const wallets = [ ledger, coinbase, dcent, + trust, frontier, trezor, walletConnect, diff --git a/docs/src/lib/services/onboard.js b/docs/src/lib/services/onboard.js index 73d608b35..5ab8a4615 100644 --- a/docs/src/lib/services/onboard.js +++ b/docs/src/lib/services/onboard.js @@ -50,6 +50,7 @@ const intiOnboard = async (theme) => { const { default: torusModule } = await import('@web3-onboard/torus') const { default: web3authModule } = await import('@web3-onboard/web3auth') const { default: uauthModule } = await import('@web3-onboard/uauth') + const { default: trustModule } = await import('@web3-onboard/trust') const INFURA_ID = '8b60d52405694345a99bcb82e722e0af' const injected = injectedModule() @@ -65,6 +66,7 @@ const intiOnboard = async (theme) => { const mewWallet = mewWalletModule() const tally = tallyModule() const torus = torusModule() + const trust = trustModule() const portis = portisModule({ apiKey: 'b2b7586f-2b1e-4c30-a7fb-c2d1533b153b' @@ -91,6 +93,7 @@ const intiOnboard = async (theme) => { scope: 'openid wallet email:optional humanity_check:optional profile:optional social:optional' } const uauth = uauthModule(uauthOptions) + const magic = magicModule({ apiKey: 'pk_live_02207D744E81C2BA' }) @@ -102,6 +105,7 @@ const intiOnboard = async (theme) => { coinbase, ledger, trezor, + trust, gnosis, uauth, tally, diff --git a/packages/core/README.md b/packages/core/README.md index 5ca9646a7..73b41229b 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -7,6 +7,7 @@ This is the core package that contains all of the UI and logic to be able to seamlessly connect user's wallets to your app and track the state of those wallets. Onboard no longer contains any wallet specific code, so wallets need to be passed in upon initialization. ## Quick start + Checkout our full library of quick start examples for connecting and interacting with EVM based wallets - **[React](https://github.com/blocknative/react-demo)** @@ -26,12 +27,12 @@ Install the core module: If you would like to support all wallets, then you can install all of the wallet modules: -```bash -npm i @web3-onboard/coinbase @web3-onboard/fortmatic @web3-onboard/gnosis -@web3-onboard/injected-wallets @web3-onboard/keepkey @web3-onboard/keystone -@web3-onboard/ledger @web3-onboard/magic @web3-onboard/portis @web3-onboard/torus -@web3-onboard/trezor @web3-onboard/walletconnect @web3-onboard/web3auth -@web3-onboard/dcent @web3-onboard/sequence @web3-onboard/enkrypt +```bash +npm i @web3-onboard/coinbase @web3-onboard/fortmatic @web3-onboard/gnosis @web3-onboard/trust +@web3-onboard/injected-wallets @web3-onboard/keepkey @web3-onboard/keystone +@web3-onboard/ledger @web3-onboard/magic @web3-onboard/portis @web3-onboard/torus +@web3-onboard/trezor @web3-onboard/walletconnect @web3-onboard/web3auth +@web3-onboard/dcent @web3-onboard/sequence @web3-onboard/enkrypt @web3-onboard/mew-wallet @web3-onboard/uauth @web3-onboard/zeal @web3-onboard/frontier ``` @@ -139,9 +140,10 @@ type ConnectModalOptions = { **`theme`** A string or an object that defines the color theme web3-onboard will render the components. -Define a custom or predefined theme for Web3Onboard using either: - * BuiltInThemes: ['default', 'dark', 'light', 'system'] - * ThemingMap object to create a totally custom theme +Define a custom or predefined theme for Web3Onboard using either: + +- BuiltInThemes: ['default', 'dark', 'light', 'system'] +- ThemingMap object to create a totally custom theme Note: `system` will default to the theme set by the users system. diff --git a/packages/demo/package.json b/packages/demo/package.json index cb3e0544c..9fa95d2ed 100644 --- a/packages/demo/package.json +++ b/packages/demo/package.json @@ -34,7 +34,7 @@ "@web3-onboard/keepkey": "^2.3.3", "@web3-onboard/keystone": "^2.3.3", "@web3-onboard/ledger": "^2.4.2", - "@web3-onboard/injected-wallets": "^2.6.2-alpha.1", + "@web3-onboard/injected-wallets": "^2.6.2-alpha.2", "@web3-onboard/magic": "^2.1.3", "@web3-onboard/phantom": "^2.0.0-alpha.1", "@web3-onboard/portis": "^2.1.3", diff --git a/packages/demo/src/App.svelte b/packages/demo/src/App.svelte index ea2b1953e..6457941fe 100644 --- a/packages/demo/src/App.svelte +++ b/packages/demo/src/App.svelte @@ -23,6 +23,7 @@ import mewWalletModule from '@web3-onboard/mew-wallet' import uauthModule from '@web3-onboard/uauth' import phantomModule from '@web3-onboard/phantom' + import trustModule from '@web3-onboard/trust' import frontierModule from '@web3-onboard/frontier' import { recoverAddress, @@ -125,6 +126,7 @@ const tallyho = tallyHoModule() const zeal = zealModule() const phantom = phantomModule() + const trust = trustModule() const frontier = frontierModule() const trezorOptions = { @@ -163,6 +165,7 @@ ledger, trezor, walletConnect, + trust, enkrypt, mewWallet, keepkey, diff --git a/packages/injected/package.json b/packages/injected/package.json index f22eeb132..151a21ee8 100644 --- a/packages/injected/package.json +++ b/packages/injected/package.json @@ -1,6 +1,6 @@ { "name": "@web3-onboard/injected-wallets", - "version": "2.6.2-alpha.1", + "version": "2.6.2-alpha.2", "description": "Injected wallet module for connecting browser extension and mobile wallets to Web3-Onboard. 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, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", "keywords": [ "Ethereum", diff --git a/packages/injected/src/constants.ts b/packages/injected/src/constants.ts index 84941f881..f88a28b6d 100644 --- a/packages/injected/src/constants.ts +++ b/packages/injected/src/constants.ts @@ -17,6 +17,7 @@ export const WALLET_NAMES: { [key: string]: string } = { sequence: 'Sequence', core: 'Core', enkrypt: 'Enkrypt', + trust: 'Trust Wallet', frontier: 'Frontier', zerion: 'Zerion', rainbow: 'Rainbow' diff --git a/packages/injected/src/helpers.ts b/packages/injected/src/helpers.ts index 6075e1a8a..5f863be96 100644 --- a/packages/injected/src/helpers.ts +++ b/packages/injected/src/helpers.ts @@ -22,11 +22,20 @@ export const isWalletAvailable = ( checkProviderIdentity: InjectedWalletModule['checkProviderIdentity'], device: Device ): boolean => { - if (provider && provider.providers && Array.isArray(provider.providers)) { - return !!provider.providers.filter(provider => - checkProviderIdentity({ provider, device }) - ).length - } else { - return checkProviderIdentity({ provider, device }) + // No injected providers exist. + if (!provider) { + return false } + + // Many injected providers add their own object into window. + if (checkProviderIdentity({ provider, device })) { + return true + } + + // For multiple injected providers, check providers array + // example coinbase inj wallet pushes over-ridden wallets + // into a providers array at window.ethereum + return !!provider.providers?.some(provider => + checkProviderIdentity({ provider, device }) + ) } diff --git a/packages/injected/src/types.ts b/packages/injected/src/types.ts index 20e236c0c..cc3f239cf 100644 --- a/packages/injected/src/types.ts +++ b/packages/injected/src/types.ts @@ -127,8 +127,9 @@ export enum InjectedNameSpace { Bitski = 'Bitski', Enkrypt = 'enkrypt', Zeal = 'zeal', - Frontier = 'frontier', - Phantom = 'phantom' + Phantom = 'phantom', + Trust = 'trustwallet', + Frontier = 'frontier' } export interface CustomWindow extends Window { @@ -160,6 +161,7 @@ export interface CustomWindow extends Window { phantom: { ethereum: InjectedProvider } + trustwallet: InjectedProvider } export type InjectedProvider = ExternalProvider & diff --git a/packages/injected/src/wallets.ts b/packages/injected/src/wallets.ts index 8bcb70135..4ae7feb6c 100644 --- a/packages/injected/src/wallets.ts +++ b/packages/injected/src/wallets.ts @@ -190,21 +190,30 @@ const detected: InjectedWalletModule = { const trust: InjectedWalletModule = { label: ProviderLabel.Trust, - injectedNamespace: InjectedNameSpace.Ethereum, + injectedNamespace: InjectedNameSpace.Trust, checkProviderIdentity: ({ provider }) => - !!provider && - !!provider[ProviderIdentityFlag.Trust] && - !!provider && - !provider[ProviderIdentityFlag.TokenPocket], - + !!provider && !!provider[ProviderIdentityFlag.Trust], getIcon: async () => (await import('./icons/trust.js')).default, - getInterface: async () => ({ - provider: createEIP1193Provider(window.ethereum, { - wallet_switchEthereumChain: UNSUPPORTED_METHOD, - eth_selectAccounts: UNSUPPORTED_METHOD - }) - }), - platforms: ['mobile'] + getInterface: async () => { + const ethereumInjectionExists = window.hasOwnProperty( + InjectedNameSpace.Ethereum + ) + + let provider: EIP1193Provider + + // check if trust is injected into window.ethereum + if (ethereumInjectionExists && window[InjectedNameSpace.Ethereum].isTrust) { + provider = window[InjectedNameSpace.Ethereum] + } else { + // directly use the window.trustwallet injection + provider = window[InjectedNameSpace.Trust] + } + + return { + provider + } + }, + platforms: ['all'] } const opera: InjectedWalletModule = { diff --git a/packages/trust/README.md b/packages/trust/README.md new file mode 100644 index 000000000..e88fb34a4 --- /dev/null +++ b/packages/trust/README.md @@ -0,0 +1,33 @@ +# @web3-onboard/trust + +## Wallet module for connecting Trust Wallet through web3-onboard + +Trust Wallet SDK wallet module for connecting to Web3-Onboard. Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardized spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications. + +### Install + +**NPM** +`npm i @web3-onboard/core @web3-onboard/trust` + +**Yarn** +`yarn add @web3-onboard/core @web3-onboard/trust` + +## Usage + +```typescript +import Onboard from '@web3-onboard/core' +import trustModule from '@web3-onboard/trust' + +const trust = trustModule() + +const onboard = Onboard({ + // ... other Onboard options + wallets: [ + trust + //... other wallets + ] +}) + +const connectedWallets = await onboard.connectWallet() +console.log(connectedWallets) +``` diff --git a/packages/trust/package.json b/packages/trust/package.json new file mode 100644 index 000000000..ed5b13d51 --- /dev/null +++ b/packages/trust/package.json @@ -0,0 +1,66 @@ +{ + "name": "@web3-onboard/trust", + "version": "2.0.0-alpha.1", + "description": "Trust Wallet SDK wallet module for connecting to Web3-Onboard. Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardized spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", + "keywords": [ + "Ethereum", + "Web3", + "EVM", + "dapp", + "Multichain", + "Wallet", + "Transaction", + "Provider", + "Hardware Wallet", + "Notifications", + "React", + "Svelte", + "Vue", + "Next", + "Nuxt", + "MetaMask", + "Coinbase", + "WalletConnect", + "Ledger", + "Trezor", + "Connect Wallet", + "Ethereum Hooks", + "Blocknative", + "Mempool", + "pending", + "confirmed", + "Injected Wallet", + "Crypto", + "Crypto Wallet", + "Enkrypt", + "Trust" + ], + "repository": { + "type": "git", + "url": "https://github.com/blocknative/web3-onboard.git", + "directory": "packages/trust" + }, + "homepage": "https://www.blocknative.com/onboard", + "bugs": "https://github.com/blocknative/web3-onboard/issues", + "module": "dist/index.js", + "browser": "dist/index.js", + "main": "dist/index.js", + "type": "module", + "typings": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "dev": "tsc -w", + "type-check": "tsc --noEmit" + }, + "license": "MIT", + "devDependencies": { + "@types/node": "^17.0.21", + "typescript": "^4.5.5" + }, + "dependencies": { + "@web3-onboard/common": "^2.2.3" + } +} diff --git a/packages/trust/src/icon.ts b/packages/trust/src/icon.ts new file mode 100644 index 000000000..64890a79d --- /dev/null +++ b/packages/trust/src/icon.ts @@ -0,0 +1,8 @@ +export default ` + + + +` diff --git a/packages/trust/src/index.ts b/packages/trust/src/index.ts new file mode 100644 index 000000000..5c7b4414a --- /dev/null +++ b/packages/trust/src/index.ts @@ -0,0 +1,38 @@ +import type { WalletInit, EIP1193Provider } from '@web3-onboard/common' +import { CustomWindow } from './types.js' +declare const window: CustomWindow + +function trust(): WalletInit { + if (typeof window === 'undefined') return () => null + + return () => { + return { + label: 'Trust Wallet', + getIcon: async () => (await import('./icon.js')).default, + getInterface: async () => { + const ethereumInjectionExists = window.hasOwnProperty('ethereum') + + let provider: EIP1193Provider + + // check if trust is injected into window.ethereum + if (ethereumInjectionExists && window['ethereum'].isTrust) { + provider = window['ethereum'] + } else if (window['trustwallet']) { + // directly use the window.trustwallet injection + provider = window['trustwallet'] + } else { + // trustwallet extension is not installed + // send user to install page + window.open('https://trustwallet.com/browser-extension', '_blank') + throw new Error('Please Install Trust to use this wallet') + } + + return { + provider + } + } + } + } +} + +export default trust diff --git a/packages/trust/src/types.ts b/packages/trust/src/types.ts new file mode 100644 index 000000000..faed9ea7f --- /dev/null +++ b/packages/trust/src/types.ts @@ -0,0 +1,7 @@ +import { EIP1193Provider } from '@web3-onboard/common' +export interface CustomWindow extends Window { + ethereum: EIP1193Provider & { + isTrust?: boolean + } + trustwallet: EIP1193Provider +} diff --git a/packages/trust/tsconfig.json b/packages/trust/tsconfig.json new file mode 100644 index 000000000..09ae989f9 --- /dev/null +++ b/packages/trust/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src/**/*"], + + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true, + "declarationDir": "dist", + "paths": { + "*": ["./src/*", "./node_modules/*"] + }, + "typeRoots": ["node_modules/@types"] + } +} \ No newline at end of file