67 lines
2.0 KiB
JavaScript
67 lines
2.0 KiB
JavaScript
"use strict";
|
|
import { ethers } from "ethers";
|
|
import { version } from "./_version";
|
|
const logger = new ethers.utils.Logger(version);
|
|
export class MetamaskProvider extends ethers.providers.Web3Provider {
|
|
constructor(ethereum) {
|
|
if (!ethereum) {
|
|
ethereum = global.ethereum;
|
|
if (!ethereum) {
|
|
logger.throwError("could not auto-detect global.ethereum", ethers.errors.UNSUPPORTED_OPERATION, {
|
|
operation: "window.ethereum"
|
|
});
|
|
}
|
|
}
|
|
super(ethereum);
|
|
let _account = null;
|
|
ethers.utils.defineReadOnly(this, "_pollAccountFunc", () => {
|
|
let account = null;
|
|
if (account === _account) {
|
|
return;
|
|
}
|
|
console.log("poll");
|
|
this.emit("account", account, _account);
|
|
_account = account;
|
|
});
|
|
super(ethereum);
|
|
}
|
|
getSigner(addressOrIndex) {
|
|
if (!this.enabled) {
|
|
return null;
|
|
}
|
|
return super.getSigner(addressOrIndex);
|
|
}
|
|
get enabled() {
|
|
return false;
|
|
}
|
|
_startPollingAccount() {
|
|
if (this._pollingAccount) {
|
|
return;
|
|
}
|
|
console.log("start polling for account changes including to/from null");
|
|
this._pollingAccount = setInterval(this._pollAccountFunc, 1000);
|
|
}
|
|
_stopPollingAccount() {
|
|
if (!this._pollingAccount) {
|
|
return;
|
|
}
|
|
console.log("stop polling for account changes including to/from null");
|
|
clearInterval(this._pollingAccount);
|
|
this._pollingAccount = null;
|
|
}
|
|
on(eventName, listener) {
|
|
super.on(eventName, listener);
|
|
if (this.listenerCount("account") > 0) {
|
|
this._startPollingAccount();
|
|
}
|
|
return this;
|
|
}
|
|
off(eventName, listener) {
|
|
super.off(eventName, listener);
|
|
if (this.listenerCount("account") === 0) {
|
|
this._stopPollingAccount();
|
|
}
|
|
return this;
|
|
}
|
|
}
|