mirror of https://github.com/certusone/oyster.git
feat: add phantom
This commit is contained in:
parent
be26b0e9fc
commit
10e46652da
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
|
||||
|
|
|
@ -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<{
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ export class LedgerWalletAdapter extends EventEmitter implements WalletAdapter {
|
|||
return transaction;
|
||||
}
|
||||
|
||||
async signMultipleTransaction(transactions: Transaction[]) {
|
||||
async signAllTransactions(transactions: Transaction[]) {
|
||||
return transactions;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue