├── .editorconfig ├── .github └── workflows │ ├── lint.yml │ └── publish-npm.yml ├── .gitignore ├── LICENSE ├── README.md ├── connectors ├── fortmatic.ts ├── gnosis.ts ├── injected.ts ├── kaikas.ts ├── portis.ts ├── stargazer.ts ├── torus.ts ├── walletconnect.ts └── walletlink.ts ├── package.json ├── plugins ├── vue.ts └── vue3.ts ├── rollup.config.js ├── src ├── connector.ts ├── index.ts ├── lock.ts ├── utils.ts └── wallets.json ├── test └── index.html ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = LF 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | on: [push] 3 | jobs: 4 | lint: 5 | uses: snapshot-labs/actions/.github/workflows/lint.yml@main 6 | secrets: inherit 7 | -------------------------------------------------------------------------------- /.github/workflows/publish-npm.yml: -------------------------------------------------------------------------------- 1 | name: Publish NPM package 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | publish-npm: 9 | uses: snapshot-labs/actions/.github/workflows/publish-npm.yml@main 10 | secrets: inherit 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | dist 4 | 5 | # Remove some common IDE working directories 6 | .idea 7 | .vscode 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Snapshot Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lock.js 2 | 3 | A lightweight JavaScript library for log in to Ethereum. 4 | 5 | ### Install 6 | To install Lock.js, open your terminal and run: 7 | ``` 8 | npm install github:snapshot-labs/lock 9 | ``` 10 | 11 | #### Browser 12 | You can create an index.html file and include Lock.js with: 13 | ```html 14 | 15 | ``` 16 | 17 | ### Usage 18 | ```js 19 | import { Lock } from '@snapshot-labs/lock'; 20 | import injected from '@snapshot-labs/lock/connectors/injected'; 21 | import walletconnect from '@snapshot-labs/lock/connectors/walletconnect'; 22 | 23 | // Init Lock 24 | const lock = new Lock(); 25 | 26 | // Add injected connector 27 | lock.addConnector({ 28 | key: 'injected', 29 | connector: injected 30 | }); 31 | 32 | // Add WalletConnect connector 33 | lock.addConnector({ 34 | key: 'walletconnect', 35 | connector: walletconnect, 36 | options: { 37 | infuraId: 'c00cb721...' 38 | } 39 | }); 40 | 41 | // Log in with injected web3 42 | const connector = lock.getConnector('injected'); 43 | const provider = await connector.connect('injected'); 44 | 45 | // Log out from WalletConnect 46 | const connector = lock.getConnector('walletconnect'); 47 | await connector.logout(); 48 | 49 | // Is logged in? 50 | const isLoggedIn = await connector.isLoggedIn(); 51 | ``` 52 | 53 | ## License 54 | 55 | [MIT](LICENSE). 56 | -------------------------------------------------------------------------------- /connectors/fortmatic.ts: -------------------------------------------------------------------------------- 1 | const get = () => import(/* webpackChunkName: "fortmatic" */ 'fortmatic'); 2 | import LockConnector from '../src/connector'; 3 | 4 | export default class Connector extends LockConnector { 5 | async connect() { 6 | let provider; 7 | try { 8 | const Fortmatic = (await get()).default; 9 | const fm: any = new Fortmatic(this.options.apiKey); 10 | provider = await fm.getProvider(); 11 | await fm.user.login(); 12 | const isLoggedIn = await fm.user.isLoggedIn(); 13 | if (!isLoggedIn) return; 14 | } catch (e) { 15 | console.error(e); 16 | return; 17 | } 18 | provider.connectorName = 'fortmatic'; 19 | return provider; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /connectors/gnosis.ts: -------------------------------------------------------------------------------- 1 | import LockConnector from '../src/connector'; 2 | 3 | export default class Connector extends LockConnector { 4 | async connect() { 5 | let provider; 6 | try { 7 | if (window?.parent === window) { 8 | return; 9 | } 10 | 11 | let SafeAppsSDK = await import('@safe-global/safe-apps-sdk'!); 12 | if (SafeAppsSDK?.default) SafeAppsSDK = SafeAppsSDK.default; 13 | if (SafeAppsSDK?.default) SafeAppsSDK = SafeAppsSDK.default; 14 | 15 | const sdk = new SafeAppsSDK(); 16 | const safe = await sdk.safe.getInfo(); 17 | 18 | let SafeAppProvider = await import('@safe-global/safe-apps-provider'!); 19 | if (SafeAppProvider?.default) SafeAppProvider = SafeAppProvider.default; 20 | if (SafeAppProvider?.default) SafeAppProvider = SafeAppProvider.default; 21 | if (SafeAppProvider?.SafeAppProvider) 22 | SafeAppProvider = SafeAppProvider.SafeAppProvider; 23 | 24 | provider = new SafeAppProvider(safe, sdk); 25 | } catch (e) { 26 | console.error(e); 27 | } 28 | provider.connectorName = 'gnosis'; 29 | return provider; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /connectors/injected.ts: -------------------------------------------------------------------------------- 1 | import LockConnector from '../src/connector'; 2 | 3 | export default class Connector extends LockConnector { 4 | async connect() { 5 | let provider; 6 | if (window['ethereum']) { 7 | provider = window['ethereum']; 8 | try { 9 | await window['ethereum'].request({ method: 'eth_requestAccounts' }); 10 | } catch (e: any) { 11 | console.log(e); 12 | if (e.code === 4001 || e.code === -32002) return; 13 | } 14 | } else if (window['web3']) { 15 | provider = window['web3'].currentProvider; 16 | } 17 | return provider; 18 | } 19 | 20 | async autoConnect() { 21 | let provider; 22 | 23 | if (window['ethereum']) { 24 | provider = window['ethereum']; 25 | } else if (window['web3']) { 26 | provider = window['web3'].currentProvider; 27 | } 28 | 29 | const accounts = await provider.request({ method: 'eth_accounts' }); 30 | 31 | return accounts.length > 0 ? provider : null; 32 | } 33 | 34 | async isLoggedIn() { 35 | if (!window['ethereum']) return false; 36 | if (window['ethereum'].request({ method: 'eth_accounts' })) return true; 37 | await new Promise(r => setTimeout(r, 400)); 38 | return !!window['ethereum'].request({ method: 'eth_accounts' }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /connectors/kaikas.ts: -------------------------------------------------------------------------------- 1 | import LockConnector from '../src/connector'; 2 | 3 | export default class Connector extends LockConnector { 4 | async connect() { 5 | let provider; 6 | if (window['klaytn']) { 7 | provider = window['klaytn']; 8 | try { 9 | await window['klaytn'].enable(); 10 | } catch (e) { 11 | console.error(e); 12 | // Return when the error is Error: User denied account authorization 13 | if (e.code === -32603) return; 14 | } 15 | } else if (window['caver']) { 16 | provider = window['caver'].currentProvider; 17 | } 18 | return provider; 19 | } 20 | 21 | async isLoggedIn() { 22 | if (!window['klaytn']) return false; 23 | if (window['klaytn'].selectedAddress) return true; 24 | await new Promise(r => setTimeout(r, 400)); 25 | return !!window['klaytn'].selectedAddress; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /connectors/portis.ts: -------------------------------------------------------------------------------- 1 | const get = () => import(/* webpackChunkName: "portis" */ '@portis/web3/umd'); 2 | import LockConnector from '../src/connector'; 3 | 4 | export default class Connector extends LockConnector { 5 | async connect() { 6 | let provider; 7 | try { 8 | const Portis = (await get()).default; 9 | const portis: any = new Portis(this.options.dappId, this.options.network); 10 | await portis.provider.enable(); 11 | // @ts-ignore 12 | portis.provider._portis = portis; 13 | provider = portis.provider; 14 | } catch (e) { 15 | console.error(e); 16 | } 17 | provider.connectorName = 'portis'; 18 | return provider; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /connectors/stargazer.ts: -------------------------------------------------------------------------------- 1 | import LockConnector from '../src/connector'; 2 | 3 | export default class Connector extends LockConnector { 4 | getProvider() { 5 | const walletProvider = window['stargazer']; 6 | 7 | if (!walletProvider) { 8 | return null; 9 | } 10 | 11 | return walletProvider.getProvider('ethereum'); 12 | } 13 | 14 | async connect() { 15 | const provider = this.getProvider(); 16 | 17 | if (!provider) { 18 | return; 19 | } 20 | 21 | try { 22 | await provider.activate(); 23 | } catch (e) { 24 | console.error(e); 25 | return; 26 | } 27 | 28 | return provider; 29 | } 30 | 31 | async isLoggedIn() { 32 | const ethProvider = this.getProvider(); 33 | return ethProvider !== null && ethProvider.activated; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /connectors/torus.ts: -------------------------------------------------------------------------------- 1 | const get = () => 2 | import(/* webpackChunkName: "torus" */ '@toruslabs/torus-embed'); 3 | import LockConnector from '../src/connector'; 4 | 5 | export default class Connector extends LockConnector { 6 | async connect() { 7 | let provider; 8 | try { 9 | const Torus = (await get()).default; 10 | const torus = new Torus({}); 11 | await torus.init({ showTorusButton: false }); 12 | await torus.login({}); 13 | provider = torus.provider; 14 | } catch (e) { 15 | console.error(e); 16 | } 17 | provider.connectorName = 'torus'; 18 | return provider; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /connectors/walletconnect.ts: -------------------------------------------------------------------------------- 1 | import LockConnector from '../src/connector'; 2 | 3 | let provider: any; 4 | export default class Connector extends LockConnector { 5 | async connect() { 6 | try { 7 | const imports = await import('@walletconnect/ethereum-provider'!); 8 | const { EthereumProvider } = imports; 9 | 10 | provider = await EthereumProvider.init(this.options); 11 | await provider.enable(); 12 | } catch (e) { 13 | console.error(e); 14 | return; 15 | } 16 | provider.connectorName = 'walletconnect'; 17 | return provider; 18 | } 19 | 20 | removeHashFromLocalStorage() { 21 | if (!localStorage) return; 22 | 23 | const wcKeys: string[] = []; 24 | for (let i = 0; i < localStorage.length; i++) { 25 | const key = localStorage.key(i) as string; 26 | if (key.startsWith('wc@2:')) { 27 | wcKeys.push(key); 28 | } 29 | } 30 | 31 | wcKeys.forEach(key => localStorage.removeItem(key)); 32 | } 33 | 34 | logout() { 35 | if ('disconnect' in provider) { 36 | provider.disconnect().catch(this.removeHashFromLocalStorage); 37 | provider = null; 38 | } else { 39 | this.removeHashFromLocalStorage(); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /connectors/walletlink.ts: -------------------------------------------------------------------------------- 1 | import LockConnector from '../src/connector'; 2 | 3 | export default class Connector extends LockConnector { 4 | async connect() { 5 | let provider; 6 | try { 7 | let CoinbaseWalletSDK = await import('@coinbase/wallet-sdk'!); 8 | if (CoinbaseWalletSDK.default) 9 | CoinbaseWalletSDK = CoinbaseWalletSDK.default; 10 | if (CoinbaseWalletSDK.default) 11 | CoinbaseWalletSDK = CoinbaseWalletSDK.default; 12 | const walletSDK = new CoinbaseWalletSDK(this.options); 13 | provider = walletSDK.makeWeb3Provider( 14 | this.options.ethJsonrpcUrl, 15 | this.options.chainId 16 | ); 17 | await provider.enable(); 18 | } catch (e) { 19 | console.error(e); 20 | return; 21 | } 22 | provider.connectorName = 'walletlink'; 23 | return provider; 24 | } 25 | 26 | logout() { 27 | if (localStorage) { 28 | localStorage.removeItem( 29 | '-walletlink:https://www.walletlink.org:session:id' 30 | ); 31 | localStorage.removeItem( 32 | '-walletlink:https://www.walletlink.org:session:secret' 33 | ); 34 | localStorage.removeItem( 35 | '-walletlink:https://www.walletlink.org:session:linked' 36 | ); 37 | localStorage.removeItem( 38 | '-walletlink:https://www.walletlink.org:Addresses' 39 | ); 40 | } 41 | return; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@snapshot-labs/lock", 3 | "version": "0.2.11", 4 | "repository": "snapshot-labs/lock", 5 | "license": "MIT", 6 | "main": "dist/lock.cjs.js", 7 | "module": "dist/lock.esm.js", 8 | "browser": "dist/lock.min.js", 9 | "scripts": { 10 | "build": "rollup -c", 11 | "dev": "rollup -c -w", 12 | "pretest": "npm run build", 13 | "lint": "eslint src/ connectors/ plugins/ --ext .ts", 14 | "lint:fix": "yarn lint --fix", 15 | "typecheck": "tsc --noEmit" 16 | }, 17 | "dependencies": { 18 | "@coinbase/wallet-sdk": "^4.3.0", 19 | "@portis/web3": "^4.0.6", 20 | "@safe-global/safe-apps-provider": "^0.17.1", 21 | "@safe-global/safe-apps-sdk": "^8.0.0", 22 | "@toruslabs/torus-embed": "^1.12.1", 23 | "@walletconnect/ethereum-provider": "^2.10.6", 24 | "@walletconnect/modal": "^2.6.2", 25 | "fortmatic": "^2.2.1" 26 | }, 27 | "devDependencies": { 28 | "@rollup/plugin-commonjs": "^17.0.0", 29 | "@rollup/plugin-node-resolve": "^11.0.1", 30 | "@snapshot-labs/eslint-config": "^0.1.0-beta.18", 31 | "@snapshot-labs/prettier-config": "^0.1.0-beta.18", 32 | "@types/node": "^13.9.5", 33 | "eslint": "^8.56.0", 34 | "prettier": "^3.1.0", 35 | "rollup": "^2.79.2", 36 | "rollup-plugin-filesize": "^9.1.0", 37 | "rollup-plugin-json": "^4.0.0", 38 | "rollup-plugin-node-builtins": "^2.1.2", 39 | "rollup-plugin-node-globals": "^1.4.0", 40 | "rollup-plugin-terser": "^7.0.0", 41 | "rollup-plugin-typescript2": "^0.27.0", 42 | "ts-node": "^10.9.2", 43 | "typescript": "^5.2.2" 44 | }, 45 | "eslintConfig": { 46 | "extends": "@snapshot-labs" 47 | }, 48 | "prettier": "@snapshot-labs/prettier-config", 49 | "files": [ 50 | "dist", 51 | "src", 52 | "connectors", 53 | "plugins" 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /plugins/vue.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import Vue from 'vue'; // v^2.6.11 3 | import Lock from '../src/lock'; 4 | 5 | const name = 'lock'; 6 | 7 | let instance; 8 | 9 | export const getInstance = () => instance; 10 | 11 | export const useLock = ({ ...options }) => { 12 | if (instance) return instance; 13 | 14 | instance = new Vue({ 15 | data() { 16 | return { 17 | isAuthenticated: false, 18 | lockClient: null, 19 | provider: null, 20 | web3: null 21 | }; 22 | }, 23 | methods: { 24 | async login(connector) { 25 | // @ts-ignore 26 | const lockConnector = this.lockClient.getConnector(connector); 27 | const provider = await lockConnector.connect(); 28 | if (provider) { 29 | localStorage.setItem(`_${name}.connector`, connector); 30 | this.isAuthenticated = true; 31 | this.provider = provider; 32 | } 33 | return provider; 34 | }, 35 | async logout() { 36 | const connector = await this.getConnector(); 37 | if (connector) { 38 | // @ts-ignore 39 | const lockConnector = this.lockClient.getConnector(connector); 40 | await lockConnector.logout(); 41 | localStorage.removeItem(`_${name}.connector`); 42 | this.isAuthenticated = false; 43 | this.provider = null; 44 | } 45 | }, 46 | async getConnector() { 47 | const connector: any = localStorage.getItem(`_${name}.connector`); 48 | if (connector) { 49 | // @ts-ignore 50 | const lockConnector = this.lockClient.getConnector(connector); 51 | const isLoggedIn = await lockConnector.isLoggedIn(); 52 | return isLoggedIn ? connector : false; 53 | } 54 | return false; 55 | } 56 | }, 57 | async created() { 58 | const lock = new Lock(); 59 | options.connectors.forEach(connector => { 60 | lock.addConnector(connector); 61 | }); 62 | // @ts-ignore 63 | this.lockClient = lock; 64 | } 65 | }); 66 | 67 | return instance; 68 | }; 69 | 70 | export const LockPlugin = { 71 | install(Vue, options) { 72 | Vue.prototype.$auth = useLock(options); 73 | } 74 | }; 75 | -------------------------------------------------------------------------------- /plugins/vue3.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import { ref } from 'vue'; 3 | import Lock from '../src/lock'; 4 | 5 | const name = 'lock'; 6 | 7 | let instance; 8 | 9 | export const getInstance = () => instance; 10 | 11 | export const useLock = ({ ...options }) => { 12 | if (instance) return instance; 13 | 14 | const isAuthenticated = ref(false); 15 | const provider = ref(); 16 | 17 | const lockClient = new Lock(); 18 | options.connectors.forEach(connector => { 19 | lockClient.addConnector(connector); 20 | }); 21 | 22 | async function login(connector) { 23 | const lockConnector = lockClient.getConnector(connector); 24 | const localProvider = await lockConnector.connect(); 25 | if (localProvider !== null) { 26 | provider.value = localProvider; 27 | } 28 | if (provider.value) { 29 | localStorage.setItem(`_${name}.connector`, connector); 30 | isAuthenticated.value = true; 31 | } 32 | return provider; 33 | } 34 | 35 | async function autoLogin(connector: string) { 36 | const lockConnector = lockClient.getConnector(connector); 37 | const localProvider = await lockConnector.autoConnect(); 38 | 39 | if (!localProvider) return; 40 | 41 | provider.value = localProvider; 42 | localStorage.setItem(`_${name}.connector`, connector); 43 | isAuthenticated.value = true; 44 | 45 | return provider; 46 | } 47 | 48 | async function logout() { 49 | const connector = await getConnector(); 50 | if (connector) { 51 | const lockConnector = lockClient.getConnector(connector as string); 52 | await lockConnector.logout(); 53 | localStorage.removeItem(`_${name}.connector`); 54 | isAuthenticated.value = false; 55 | provider.value = null; 56 | } 57 | } 58 | 59 | async function getConnector(): Promise { 60 | const connector = localStorage.getItem(`_${name}.connector`); 61 | if (connector) { 62 | const lockConnector = lockClient.getConnector(connector); 63 | const isLoggedIn = await lockConnector.isLoggedIn(); 64 | return isLoggedIn ? connector : false; 65 | } 66 | return false; 67 | } 68 | 69 | instance = { 70 | isAuthenticated, 71 | provider, 72 | lockClient, 73 | login, 74 | logout, 75 | autoLogin, 76 | getConnector 77 | }; 78 | 79 | return instance; 80 | }; 81 | 82 | export const LockPlugin = { 83 | install(app, options) { 84 | app.config.globalProperties.$auth = useLock(options); 85 | } 86 | }; 87 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from 'rollup-plugin-typescript2'; 2 | import { terser } from 'rollup-plugin-terser'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import globals from 'rollup-plugin-node-globals'; 5 | import builtins from 'rollup-plugin-node-builtins'; 6 | import { nodeResolve } from '@rollup/plugin-node-resolve'; 7 | import filesize from 'rollup-plugin-filesize'; 8 | import json from 'rollup-plugin-json'; 9 | import pkg from './package.json'; 10 | 11 | const name = 'lock'; 12 | const input = 'src/index.ts'; 13 | const external = [...Object.keys(pkg.dependencies || {})]; 14 | 15 | export default [ 16 | { 17 | input, 18 | context: 'window', 19 | output: [ 20 | { name, file: pkg.browser, format: 'umd' } 21 | ], 22 | plugins: [ 23 | json(), 24 | builtins(), 25 | typescript({ clean: true }), 26 | nodeResolve({ preferBuiltins: true, browser: true }), 27 | commonjs(), 28 | globals(), 29 | terser(), 30 | filesize() 31 | ] 32 | }, 33 | { 34 | input, 35 | external, 36 | output: [ 37 | { file: pkg.main, format: 'cjs' }, 38 | { file: pkg.module, format: 'es' } 39 | ], 40 | plugins: [ 41 | json(), 42 | typescript({ clean: true }) 43 | ] 44 | } 45 | ]; 46 | -------------------------------------------------------------------------------- /src/connector.ts: -------------------------------------------------------------------------------- 1 | export default class Connector { 2 | public options: any; 3 | 4 | constructor(options: string) { 5 | this.options = options; 6 | } 7 | 8 | async connect() { 9 | return; 10 | } 11 | 12 | async autoConnect(): Promise { 13 | return this.connect(); 14 | } 15 | 16 | logout(): any { 17 | return true; 18 | } 19 | 20 | async isLoggedIn(): Promise { 21 | return true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import Lock from './lock'; 2 | import * as utils from './utils'; 3 | 4 | export { Lock, utils }; 5 | -------------------------------------------------------------------------------- /src/lock.ts: -------------------------------------------------------------------------------- 1 | import Connector from './connector'; 2 | 3 | export default class Lock { 4 | public connectors: Record = {}; 5 | public options = {}; 6 | 7 | addConnector(connector: any) { 8 | this.connectors[connector.key] = new connector.connector(connector.options); 9 | this.options[connector.key] = connector.options; 10 | } 11 | 12 | getConnector(key: string): Connector { 13 | return this.connectors[key]; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import wallets from './wallets.json'; 2 | 3 | export function getInjected() { 4 | const web3: any = window['ethereum']; 5 | 6 | if (!web3) return; 7 | 8 | let injected = { 9 | name: 'Injected', 10 | id: 'web3', 11 | icon: 'ipfs://QmXUov1JMszHkizCf3HvmcKWKm9PrG2KHpd5bDnE5YbZN8' 12 | }; 13 | 14 | for (const wallet of wallets) { 15 | if (web3[wallet.flag]) { 16 | injected = { 17 | name: wallet.name, 18 | id: wallet.id, 19 | icon: wallet.icon 20 | }; 21 | } 22 | } 23 | 24 | return injected; 25 | } 26 | -------------------------------------------------------------------------------- /src/wallets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "flag": "isMetaMask", 4 | "name": "MetaMask", 5 | "id": "metamask", 6 | "icon": "ipfs://QmTE7VPXMhriKAobMWEiC5S3oG22p4G6AXGyGdNWQTQ3Fv" 7 | }, 8 | { 9 | "flag": "isCoinbaseWallet", 10 | "name": "Coinbase", 11 | "id": "coinbase", 12 | "icon": "ipfs://QmbJKEaeMz6qR3DmJSTxtYtrZeQPptVfnnYK72QBsvAw5q" 13 | }, 14 | { 15 | "flag": "isTrust", 16 | "name": "Trust Wallet", 17 | "id": "trustwallet", 18 | "icon": "ipfs://QmQzchPwEa7UnRqSS7kSt4EJWMw5mcj9u3YtTp9uig9UT5" 19 | }, 20 | { 21 | "flag": "isMixin", 22 | "name": "Mixin Messenger", 23 | "id": "mixinmessenger", 24 | "icon": "ipfs://QmT4ZcGMNoW34ZNgzjPJ6pqaoB5Fpk7z2d9yQqwGtCuEJC" 25 | }, 26 | { 27 | "flag": "isStatus", 28 | "name": "Status", 29 | "id": "status", 30 | "icon": "ipfs://QmWQhPEvpEH3xW8wwuTr9G5vsUz8ufy25dqe394UJzwsXE" 31 | }, 32 | { 33 | "flag": "isFrame", 34 | "name": "Frame", 35 | "id": "frame", 36 | "icon": "ipfs://QmReuKRvC7YTTEmW521nKJwEMFuocWgM9GYwUFedF6Q1BL" 37 | }, 38 | { 39 | "flag": "isAlphaWallet", 40 | "name": "AlphaWallet", 41 | "id": "alphawallet", 42 | "icon": "ipfs://QmT7mrsAgpu4V2UJAukaEU9V6fEWYHAo7aahUxfyDdBns9" 43 | }, 44 | { 45 | "flag": "isImToken", 46 | "name": "imToken", 47 | "id": "imtoken", 48 | "icon": "ipfs://QmacaenFbh6WXfoPVWzXiijRC8gcBT8N6yt4ZsdMWTWX5J" 49 | }, 50 | { 51 | "flag": "isTokenPocket", 52 | "name": "TokenPocket", 53 | "id": "tokenpocket", 54 | "icon": "ipfs://QmSetXfvpWqZVCzh23XQthPFYNQTPAfJaZbkHbWdDdCHzx" 55 | }, 56 | { 57 | "flag": "isBitpie", 58 | "name": "Bitpie", 59 | "id": "bitpie", 60 | "icon": "ipfs://QmVUZ8gznsZ2nNv85GFZuTQj31YenyUi5K4HGfhXB3jrAF" 61 | }, 62 | { 63 | "flag": "isTally", 64 | "name": "Tally", 65 | "id": "tally", 66 | "icon": "ipfs://Qma4EJoXZ2CyPfKQHbtjqnLVXP28xFwiXg3KwZa7nMZC19" 67 | }, 68 | { 69 | "flag": "isBitKeep", 70 | "name": "Bitget Wallet", 71 | "id": "bitkeep", 72 | "icon": "ipfs://bafkreigkcq5ntckkv3x6xs4qysngwgh77pmbj7apzq4ptavs4lvczq7kni" 73 | }, 74 | { 75 | "flag": "isExodus", 76 | "name": "Exodus", 77 | "id": "exodus", 78 | "icon": "ipfs://bafkreigvws44zebhc7unv6o2or5erxaizgvkymmnor4desblddl6a2zzya" 79 | }, 80 | { 81 | "flag": "isXDCPay", 82 | "name": "XDCPay", 83 | "id": "xdcpay", 84 | "icon": "ipfs://QmaX3pqjWGg97bR6jjxvTopRkJVxrvwp6VB4jf1Lknq111" 85 | }, 86 | { 87 | "flag": "isBraveWallet", 88 | "name": "Brave", 89 | "id": "brave", 90 | "icon": "ipfs://bafkreibwywapshu3b7f26o2wmx5o4hlvkbtlduubo2r2gcgfsscylh72ca" 91 | }, 92 | { 93 | "flag": "__XDEFI", 94 | "name": "XDEFI Wallet", 95 | "id": "xdefi", 96 | "icon": "ipfs://QmR9khDAzYSAzRJvzoWVwm91QcbdhLcnZQR8t7NUDPpeyu" 97 | }, 98 | { 99 | "flag": "isUniswapWallet", 100 | "name": "Uniswap Wallet", 101 | "id": "uniswap", 102 | "icon": "ipfs://bafkreifgmrzdpybyn3r4k237ezbh75435gunbx5ge5yyzz7sdrljz2n35e" 103 | }, 104 | { 105 | "flag": "isRainbow", 106 | "name": "Rainbow", 107 | "id": "rainbow", 108 | "icon": "ipfs://bafkreih43rhelvsujcaqlepauc5timgckmm4x6kegrhivrthzy7syptgye" 109 | }, 110 | { 111 | "flag": "isFamily", 112 | "name": "Family Wallet", 113 | "id": "Family", 114 | "icon": "ipfs://bafkreifu2f2xjihcsazqcpucw4ryaufy4bhlffijs732f2nviqbnvgiuvy" 115 | }, 116 | { 117 | "flag": "isRabby", 118 | "name": "Rabby Wallet", 119 | "id": "rabby", 120 | "icon": "ipfs://bafkreih6dp7hhqwwdireoxd2jqs5ath3rl32lieta4iksydanrtzzssr5q" 121 | }, 122 | { 123 | "flag": "isPhantom", 124 | "name": "Phantom", 125 | "id": "phantom", 126 | "icon": "ipfs://bafkreifsncdauiiwlvpcr2fm4cbwqheot2e2fwe7l5ixvwmayzc3nq6xai" 127 | }, 128 | { 129 | "flag": "isOneInchIOSWallet", 130 | "name": "1inch Wallet", 131 | "id": "1inch", 132 | "icon": "ipfs://bafkreia2o6gwjmvsf4thcvnehyiknya6ryygphsq5r2zbitkub7jdlirnu" 133 | } 134 | ] 135 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lock 6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "./dist", 5 | "module": "es6", 6 | "noImplicitAny": false, 7 | "outDir": "./dist", 8 | "target": "es5", 9 | "moduleResolution": "node", 10 | "resolveJsonModule": true, 11 | "allowSyntheticDefaultImports": true 12 | }, 13 | "include": [ 14 | "src/**/*" 15 | ], 16 | "exclude": ["node_modules"] 17 | } 18 | --------------------------------------------------------------------------------