This commit is contained in:
Varga-Somogyi Ákos 2021-08-14 09:01:54 +02:00 committed by GitHub
parent b4555b7560
commit bdaf04b876
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 113 additions and 0 deletions

View File

@ -17,11 +17,23 @@ import {
PhantomWalletAdapter,
SolletExtensionAdapter,
MathWalletAdapter,
SolflareExtensionWalletAdapter,
} from '../wallet-adapters';
const ASSET_URL =
'https://cdn.jsdelivr.net/gh/solana-labs/oyster@main/assets/wallets';
export const WALLET_PROVIDERS = [
{
name: 'Solflare',
url: 'https://solflare.com/access-wallet',
icon: `${ASSET_URL}/solflare.svg`,
},
{
name: 'Solflare Extension',
url: 'https://solflare.com',
icon: `${ASSET_URL}/solflare.svg`,
adapter: SolflareExtensionWalletAdapter,
},
{
name: 'sollet.io',
url: 'https://www.sollet.io',

View File

@ -3,3 +3,4 @@ export * from './phantom';
export * from './sollet-extension';
export * from './math';
export * from './types';
export * from './solflare-extension';

View File

@ -0,0 +1,100 @@
import EventEmitter from 'eventemitter3';
import { PublicKey, Transaction } from '@solana/web3.js';
import { notify } from '../../utils/notifications';
import { DEFAULT_PUBLIC_KEY, WalletAdapter } from '../types';
type SolflareExtensionEvent = 'disconnect' | 'connect';
type SolflareExtensionRequestMethod =
| 'connect'
| 'disconnect'
| 'signTransaction'
| 'signAllTransactions';
interface SolflareExtensionProvider {
publicKey?: PublicKey;
isConnected?: boolean;
autoApprove?: boolean;
signTransaction: (transaction: Transaction) => Promise<Transaction>;
signAllTransactions: (transactions: Transaction[]) => Promise<Transaction[]>;
connect: () => Promise<void>;
disconnect: () => Promise<void>;
on: (event: SolflareExtensionEvent, handler: (args: any) => void) => void;
off: (event: SolflareExtensionEvent, handler: (args: any) => void) => void;
request: (method: SolflareExtensionRequestMethod, params: any) => Promise<any>;
}
export class SolflareExtensionWalletAdapter
extends EventEmitter
implements WalletAdapter {
constructor() {
super();
this.connect = this.connect.bind(this);
}
private get _provider(): SolflareExtensionProvider | undefined {
if ((window as any)?.solflare?.isSolflare) {
return (window as any).solflare;
}
return undefined;
}
private _handleConnect = (...args) => {
this.emit('connect', ...args);
}
private _handleDisconnect = (...args) => {
this._provider?.off('connect', this._handleConnect);
this._provider?.off('disconnect', this._handleDisconnect);
this.emit('disconnect', ...args);
}
get connected() {
return this._provider?.isConnected || false;
}
get autoApprove() {
return this._provider?.autoApprove || false;
}
async signAllTransactions(
transactions: Transaction[],
): Promise<Transaction[]> {
if (!this._provider) {
return transactions;
}
return this._provider.signAllTransactions(transactions);
}
get publicKey() {
return this._provider?.publicKey || DEFAULT_PUBLIC_KEY;
}
async signTransaction(transaction: Transaction) {
if (!this._provider) {
return transaction;
}
return this._provider.signTransaction(transaction);
}
async connect() {
if (!this._provider) {
window.open('https://solflare.com/', '_blank');
notify({
message: 'Connection Error',
description: 'Please install Solflare extension',
});
return;
}
this._provider?.on('connect', this._handleConnect);
this._provider?.on('disconnect', this._handleDisconnect);
return this._provider?.connect();
}
async disconnect() {
if (this._provider) {
this._provider.disconnect();
}
}
}