/*
This file is part of web3.js.
web3.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
web3.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see .
*/
import {
EthExecutionAPI,
JsonRpcResponseWithResult,
Web3APIMethod,
Web3APIPayload,
Web3APIReturnType,
Web3APISpec,
} from 'web3-types';
import { ResponseError } from 'web3-errors';
import { HttpProviderOptions } from 'web3-providers-http';
import { Transport, Network, SocketOptions } from './types.js';
import { Web3ExternalProvider } from './web3_provider.js';
import { QuickNodeRateLimitError } from './errors.js';
const isValid = (str: string) => str !== undefined && str.trim().length > 0;
export class QuickNodeProvider<
API extends Web3APISpec = EthExecutionAPI,
> extends Web3ExternalProvider {
// eslint-disable-next-line default-param-last
public constructor(
network: Network = Network.ETH_MAINNET,
transport: Transport = Transport.HTTPS,
token = '',
host = '',
providerConfigOptions?: HttpProviderOptions | SocketOptions,
) {
super(network, transport, token, host, providerConfigOptions);
}
public async request<
Method extends Web3APIMethod,
ResultType = Web3APIReturnType,
>(
payload: Web3APIPayload,
requestOptions?: RequestInit,
): Promise> {
try {
return await super.request(payload, requestOptions);
} catch (error) {
if (error instanceof ResponseError && error.statusCode === 429) {
throw new QuickNodeRateLimitError(error);
}
throw error;
}
}
// eslint-disable-next-line class-methods-use-this
public getRPCURL(network: Network, transport: Transport, _token: string, _host: string) {
let host = '';
let token = '';
switch (network) {
case Network.ETH_MAINNET:
host = isValid(_host) ? _host : 'powerful-holy-bush.quiknode.pro';
token = isValid(_token) ? _token : '3240624a343867035925ff7561eb60dfdba2a668';
break;
case Network.ETH_SEPOLIA:
host = isValid(_host)
? _host
: 'dimensional-fabled-glitter.ethereum-sepolia.quiknode.pro';
token = isValid(_token) ? _token : '382a3b5a4b938f2d6e8686c19af4b22921fde2cd';
break;
case Network.ETH_HOLESKY:
host = isValid(_host) ? _host : 'yolo-morning-card.ethereum-holesky.quiknode.pro';
token = isValid(_token) ? _token : '481ebe70638c4dcf176af617a16d02ab866b9af9';
break;
case Network.ARBITRUM_MAINNET:
host = isValid(_host)
? _host
: 'autumn-divine-dinghy.arbitrum-mainnet.quiknode.pro';
token = isValid(_token) ? _token : 'a5d7bfbf60b5ae9ce3628e53d69ef50d529e9a8c';
break;
case Network.ARBITRUM_SEPOLIA:
host = isValid(_host) ? _host : 'few-patient-pond.arbitrum-sepolia.quiknode.pro';
token = isValid(_token) ? _token : '3be985450970628c860b959c65cd2642dcafe53c';
break;
case Network.BNB_MAINNET:
host = isValid(_host) ? _host : 'purple-empty-reel.bsc.quiknode.pro';
token = isValid(_token) ? _token : 'ebf6c532961e21f092ff2facce1ec4c89c540158';
break;
case Network.BNB_TESTNET:
host = isValid(_host) ? _host : 'floral-rough-scion.bsc-testnet.quiknode.pro';
token = isValid(_token) ? _token : '5b297e5acff5f81f4c37ebf6f235f7299b6f9d28';
break;
case Network.POLYGON_MAINNET:
host = isValid(_host) ? _host : 'small-chaotic-moon.matic.quiknode.pro';
token = isValid(_token) ? _token : '847569f8a017e84d985e10d0f44365d965a951f1';
break;
case Network.POLYGON_AMOY:
host = isValid(_host) ? _host : 'prettiest-side-shape.matic-amoy.quiknode.pro';
token = isValid(_token) ? _token : '79a9476eea661d4f82de614db1d8a895b14b881c';
break;
default:
throw new Error('Network info not avalible.');
}
return `${transport}://${host}/${token}`;
}
}