gasgasgas/js/booteth/wallet.js

118 lines
3.0 KiB
JavaScript

WALLETS = [
'boot',
'brave',
'metamask',
];
provider_rpc_url = 'http://localhost:8545';
wallet_fallback = undefined;
wallet_init = false;
wallet_registered = {};
provider_registered = {};
var current_provider = null;
var current_signer = null;
ethers = undefined;
function register_ethers(m) {
ethers = m;
}
function wallet_register(wallet_key, wallet_constructor) {
if (!wallet_key in WALLETS) {
throw 'unknown wallet: ' + wallet;
}
if (wallet_registered[wallet_key] != undefined) {
console.warn('wallet already registered', wallet_key);
return;
}
console.log('registered wallet', wallet_key);
wallet_registered[wallet_key] = wallet_constructor;
}
function provider_register(provider_key, provider_constructor) {
if (provider_registered[provider_key] != undefined) {
console.warn('provider already registered', provider_key);
return;
}
console.log('registered provider', provider_key);
provider_registered[provider_key] = provider_constructor;
}
async function wallet_connect(wallet_key, instanceId, passphrase) {
if (!passphrase) {
passphrase = undefined;
}
const fn = wallet_registered[wallet_key];
let signer = await fn(instanceId, passphrase);
let signed_connected;
try {
signer_connected = await signer.connect(current_provider);
} catch(e) {
console.debug('signer connect error', e);
signer_connected = await current_provider.getSigner();
}
current_signer = signer_connected;
console.log('connected to wallet', wallet_key, current_signer);
return current_signer;
}
async function provider_connect(provider_key) {
const fn = provider_registered[provider_key];
current_provider = await fn();
console.log('registered provider', provider_key);
return current_provider;
}
function wallet_detect(ethers_instance) {
if (wallet_init) {
return;
}
ethers = ethers_instance;
if (wallet_fallback !== undefined) {
wallet_register('default', wallet_fallback);
}
if (window.ethereum != null) {
if (window.ethereum.isBraveWallet) {
wallet_register('brave', metamaskish_signer_connect);
provider_register('brave', metamaskish_provider_connect);
} else if (window.ethereum.isMetaMask) {
wallet_register('metamask', metamaskish_signer_connect);
provider_register('metamask', metamaskish_provider_connect);
}
}
wallet_init = true;
}
async function metamaskish_provider_connect() {
let provider;
return new ethers.BrowserProvider(window.ethereum)
}
async function metamaskish_signer_connect() {
let signer_provider;
if (current_provider != null) {
signer_provider = current_provider;
} else {
current_provider = new ethers.BrowserProvider(window.ethereum);
signer_provider = current_provider;
}
return await signer_provider.getSigner();
}
async function jsonrpc_provider_connect(url) {
if (url === undefined) {
url = provider_rpc_url;
}
return new ethers.JsonRpcProvider(url);
}
function getWallet(id) {
return wallet_registered[id];
}
provider_register('default', jsonrpc_provider_connect);
function getProvider(id) {
return provider_registered[id];
}