├── .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 |
--------------------------------------------------------------------------------