saepenatus
Version:
Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, mul
145 lines (117 loc) • 5.25 kB
text/typescript
import { Network, Networkish } from "@ethersproject/networks";
import { getStatic } from "@ethersproject/properties";
import { ConnectionInfo } from "@ethersproject/web";
import { Logger } from "@ethersproject/logger";
import { version } from "./_version";
const logger = new Logger(version);
import { UrlJsonRpcProvider } from "./url-json-rpc-provider";
// These are load-balancer-based application IDs
const defaultApplicationIds: Record<string, string> = {
homestead: "6004bcd10040261633ade990",
ropsten: "6004bd4d0040261633ade991",
rinkeby: "6004bda20040261633ade994",
goerli: "6004bd860040261633ade992",
};
export class PocketProvider extends UrlJsonRpcProvider {
readonly applicationId: string;
readonly applicationSecretKey: string;
readonly loadBalancer: boolean;
constructor(network?: Networkish, apiKey?: any) {
// We need a bit of creativity in the constructor because
// Pocket uses different default API keys based on the network
if (apiKey == null) {
const n = getStatic<(network: Networkish) => Network>(new.target, "getNetwork")(network);
if (n) {
const applicationId = defaultApplicationIds[n.name];
if (applicationId) {
apiKey = {
applicationId: applicationId,
loadBalancer: true
};
}
}
// If there was any issue above, we don't know this network
if (apiKey == null) {
logger.throwError("unsupported network", Logger.errors.INVALID_ARGUMENT, {
argument: "network",
value: network
});
}
}
super(network, apiKey);
}
static getApiKey(apiKey: any): any {
// Most API Providers allow null to get the default configuration, but
// Pocket requires the network to decide the default provider, so we
// rely on hijacking the constructor to add a sensible default for us
if (apiKey == null) {
logger.throwArgumentError("PocketProvider.getApiKey does not support null apiKey", "apiKey", apiKey);
}
const apiKeyObj: { applicationId: string, applicationSecretKey: string, loadBalancer: boolean } = {
applicationId: null,
loadBalancer: false,
applicationSecretKey: null
};
// Parse applicationId and applicationSecretKey
if (typeof (apiKey) === "string") {
apiKeyObj.applicationId = apiKey;
} else if (apiKey.applicationSecretKey != null) {
logger.assertArgument((typeof (apiKey.applicationId) === "string"),
"applicationSecretKey requires an applicationId", "applicationId", apiKey.applicationId);
logger.assertArgument((typeof (apiKey.applicationSecretKey) === "string"),
"invalid applicationSecretKey", "applicationSecretKey", "[REDACTED]");
apiKeyObj.applicationId = apiKey.applicationId;
apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey;
apiKeyObj.loadBalancer = !!apiKey.loadBalancer;
} else if (apiKey.applicationId) {
logger.assertArgument((typeof (apiKey.applicationId) === "string"),
"apiKey.applicationId must be a string", "apiKey.applicationId", apiKey.applicationId);
apiKeyObj.applicationId = apiKey.applicationId;
apiKeyObj.loadBalancer = !!apiKey.loadBalancer;
} else {
logger.throwArgumentError("unsupported PocketProvider apiKey", "apiKey", apiKey);
}
return apiKeyObj;
}
static getUrl(network: Network, apiKey: any): ConnectionInfo {
let host: string = null;
switch (network ? network.name : "unknown") {
case "homestead":
host = "eth-mainnet.gateway.pokt.network";
break;
case "ropsten":
host = "eth-ropsten.gateway.pokt.network";
break;
case "rinkeby":
host = "eth-rinkeby.gateway.pokt.network";
break;
case "goerli":
host = "eth-goerli.gateway.pokt.network";
break;
default:
logger.throwError("unsupported network", Logger.errors.INVALID_ARGUMENT, {
argument: "network",
value: network
});
}
let url = null;
if (apiKey.loadBalancer) {
url = `https:/\/${ host }/v1/lb/${ apiKey.applicationId }`
} else {
url = `https:/\/${ host }/v1/${ apiKey.applicationId }`
}
const connection: ConnectionInfo = { url };
// Initialize empty headers
connection.headers = {}
// Apply application secret key
if (apiKey.applicationSecretKey != null) {
connection.user = "";
connection.password = apiKey.applicationSecretKey
}
return connection;
}
isCommunityResource(): boolean {
return (this.applicationId === defaultApplicationIds[this.network.name]);
}
}
;