ethers.js/lib.commonjs/providers/provider-browser.js
2023-06-01 17:52:58 -04:00

102 lines
3.6 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BrowserProvider = void 0;
const index_js_1 = require("../utils/index.js");
const provider_jsonrpc_js_1 = require("./provider-jsonrpc.js");
;
/**
* A **BrowserProvider** is intended to wrap an injected provider which
* adheres to the [[link-eip-1193]] standard, which most (if not all)
* currently do.
*/
class BrowserProvider extends provider_jsonrpc_js_1.JsonRpcApiPollingProvider {
#request;
/**
* Connnect to the %%ethereum%% provider, optionally forcing the
* %%network%%.
*/
constructor(ethereum, network) {
super(network, { batchMaxCount: 1 });
this.#request = async (method, params) => {
const payload = { method, params };
this.emit("debug", { action: "sendEip1193Request", payload });
try {
const result = await ethereum.request(payload);
this.emit("debug", { action: "receiveEip1193Result", result });
return result;
}
catch (e) {
const error = new Error(e.message);
error.code = e.code;
error.data = e.data;
error.payload = payload;
this.emit("debug", { action: "receiveEip1193Error", error });
throw error;
}
};
}
async send(method, params) {
await this._start();
return await super.send(method, params);
}
async _send(payload) {
(0, index_js_1.assertArgument)(!Array.isArray(payload), "EIP-1193 does not support batch request", "payload", payload);
try {
const result = await this.#request(payload.method, payload.params || []);
return [{ id: payload.id, result }];
}
catch (e) {
return [{
id: payload.id,
error: { code: e.code, data: e.data, message: e.message }
}];
}
}
getRpcError(payload, error) {
error = JSON.parse(JSON.stringify(error));
// EIP-1193 gives us some machine-readable error codes, so rewrite
// them into
switch (error.error.code || -1) {
case 4001:
error.error.message = `ethers-user-denied: ${error.error.message}`;
break;
case 4200:
error.error.message = `ethers-unsupported: ${error.error.message}`;
break;
}
return super.getRpcError(payload, error);
}
/**
* Resolves to ``true`` if the provider manages the %%address%%.
*/
async hasSigner(address) {
if (address == null) {
address = 0;
}
const accounts = await this.send("eth_accounts", []);
if (typeof (address) === "number") {
return (accounts.length > address);
}
address = address.toLowerCase();
return accounts.filter((a) => (a.toLowerCase() === address)).length !== 0;
}
async getSigner(address) {
if (address == null) {
address = 0;
}
if (!(await this.hasSigner(address))) {
try {
//const resp =
await this.#request("eth_requestAccounts", []);
//console.log("RESP", resp);
}
catch (error) {
const payload = error.payload;
throw this.getRpcError(payload, { id: payload.id, error });
}
}
return await super.getSigner(address);
}
}
exports.BrowserProvider = BrowserProvider;
//# sourceMappingURL=provider-browser.js.map