feat: add phantom

This commit is contained in:
bartosz-lipinski 2021-03-22 09:22:06 -05:00
parent be26b0e9fc
commit 10e46652da
8 changed files with 109 additions and 14 deletions

View File

@ -38,7 +38,7 @@ export class MetamaskWalletAdapter
async signTransaction(transaction: Transaction) {
return (window as any).ethereum.signTransaction(transaction);
}
async signMultipleTransaction(transactions: Transaction[]) {
async signAllTransactions(transactions: Transaction[]) {
return transactions;
}

View File

@ -42,7 +42,7 @@ export class WalletConnectWalletAdapter
async signTransaction(transaction: Transaction) {
return this._provider.signTransaction(transaction);
}
async signMultipleTransaction(transactions: Transaction[]) {
async signAllTransactions(transactions: Transaction[]) {
return transactions;
}

View File

@ -24,6 +24,11 @@ export type ENV =
| 'lending';
export const ENDPOINTS = [
{
name: 'devnet' as ENV,
endpoint: clusterApiUrl('devnet'),
ChainId: ChainId.Devnet,
},
{
name: 'mainnet-beta' as ENV,
endpoint: 'https://solana-api.projectserum.com/',
@ -34,11 +39,6 @@ export const ENDPOINTS = [
endpoint: clusterApiUrl('testnet'),
ChainId: ChainId.Testnet,
},
{
name: 'devnet' as ENV,
endpoint: clusterApiUrl('devnet'),
ChainId: ChainId.Devnet,
},
{
name: 'localnet' as ENV,
endpoint: 'http://127.0.0.1:8899',
@ -85,7 +85,7 @@ const ConnectionContext = React.createContext<ConnectionConfig>({
export function ConnectionProvider({ children = undefined as any }) {
const [endpoint, setEndpoint] = useLocalStorageState(
'connectionEndpts',
'connectionEndpoint',
ENDPOINTS[0].endpoint,
);

View File

@ -8,6 +8,7 @@ import { useConnectionConfig } from "./connection";
import { useLocalStorageState } from "./../utils/utils";
import { LedgerProvider } from "@solana/wallet-ledger";
import { SolongWalletAdapter } from "../wallet-adapters/solong";
import { PhantomWalletAdapter } from "../wallet-adapters/phantom";
const ASSETS_URL = 'https://raw.githubusercontent.com/solana-labs/oyster/main/assets/wallets/';
export const WALLET_PROVIDERS = [
@ -29,7 +30,13 @@ export const WALLET_PROVIDERS = [
url: "https://mathwallet.org",
icon: `${ASSETS_URL}mathwallet.svg`,
},
LedgerProvider
LedgerProvider,
{
name: "Phantom",
url: "https://www.phantom.app",
icon: `https://www.phantom.app/img/logo.png`,
adapter: PhantomWalletAdapter,
},
];
const WalletContext = React.createContext<{

View File

@ -0,0 +1,90 @@
import EventEmitter from "eventemitter3";
import { PublicKey, Transaction } from "@solana/web3.js";
import { notify } from "../../utils/notifications";
import { WalletAdapter } from "@solana/wallet-base";
type PhantomEvent = "disconnect" | "connect";
type PhantomRequestMethod =
| "connect"
| "disconnect"
| "signTransaction"
| "signAllTransactions";
interface PhantomProvider {
publicKey?: PublicKey;
isConnected?: boolean;
autoApprove?: boolean;
signTransaction: (transaction: Transaction) => Promise<Transaction>;
signAllTransactions: (transactions: Transaction[]) => Promise<Transaction[]>;
connect: () => Promise<void>;
disconnect: () => Promise<void>;
on: (event: PhantomEvent, handler: (args: any) => void) => void;
request: (method: PhantomRequestMethod, params: any) => Promise<any>;
}
export class PhantomWalletAdapter
extends EventEmitter
implements WalletAdapter {
_provider: PhantomProvider | undefined;
constructor() {
super();
this.connect = this.connect.bind(this);
}
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 || null;
}
async signTransaction(transaction: Transaction) {
if (!this._provider) {
return transaction;
}
return this._provider.signTransaction(transaction);
}
connect() {
if (this._provider) {
return;
}
if ((window as any)?.solana?.isPhantom) {
this._provider = (window as any).solana;
} else {
window.open("https://phantom.app/", "_blank");
notify({
message: "Phantom Error",
description: "Please install Phantom wallet from Chrome ",
});
return;
}
return this._provider?.connect().then(() => this.emit("connect"));
}
disconnect() {
if (this._provider) {
this._provider.disconnect();
this._provider = undefined;
this.emit("disconnect");
}
}
}

View File

@ -21,7 +21,7 @@ export class SolongWalletAdapter extends EventEmitter implements WalletAdapter {
return (window as any).solong.signTransaction(transaction);
}
async signMultipleTransaction(transactions: Transaction[]) {
async signAllTransactions(transactions: Transaction[]) {
return transactions;
}

View File

@ -4,9 +4,7 @@ import EventEmitter from 'eventemitter3';
export interface WalletAdapter extends EventEmitter {
publicKey: PublicKey | null;
signTransaction: (transaction: Transaction) => Promise<Transaction>;
signMultipleTransaction: (
transaction: Transaction[],
) => Promise<Transaction[]>;
signAllTransactions: (transaction: Transaction[]) => Promise<Transaction[]>;
connect: () => any;
disconnect: () => any;
}

View File

@ -36,7 +36,7 @@ export class LedgerWalletAdapter extends EventEmitter implements WalletAdapter {
return transaction;
}
async signMultipleTransaction(transactions: Transaction[]) {
async signAllTransactions(transactions: Transaction[]) {
return transactions;
}