/*
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 { Web3RequestManager } from 'web3-core';
import {
Address,
BlockNumberOrTag,
Filter,
HexString32Bytes,
HexString8Bytes,
HexStringBytes,
TransactionCallAPI,
TransactionWithSenderAPI,
Uint,
Uint256,
Web3EthExecutionAPI,
Eip712TypedData,
} from 'web3-types';
import { validator } from 'web3-validator';
export async function getProtocolVersion(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_protocolVersion',
params: [],
});
}
export async function getSyncing(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_syncing',
params: [],
});
}
export async function getCoinbase(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_coinbase',
params: [],
});
}
export async function getMining(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_mining',
params: [],
});
}
export async function getHashRate(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_hashrate',
params: [],
});
}
export async function getGasPrice(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_gasPrice',
params: [],
});
}
export async function getMaxPriorityFeePerGas(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_maxPriorityFeePerGas',
params: [],
});
}
export async function getAccounts(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_accounts',
params: [],
});
}
export async function getBlockNumber(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_blockNumber',
params: [],
});
}
export async function getBalance(
requestManager: Web3RequestManager,
address: Address,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['address', 'blockNumberOrTag'], [address, blockNumber]);
return requestManager.send({
method: 'eth_getBalance',
params: [address, blockNumber],
});
}
export async function getStorageAt(
requestManager: Web3RequestManager,
address: Address,
storageSlot: Uint256,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['address', 'hex', 'blockNumberOrTag'], [address, storageSlot, blockNumber]);
return requestManager.send({
method: 'eth_getStorageAt',
params: [address, storageSlot, blockNumber],
});
}
export async function getTransactionCount(
requestManager: Web3RequestManager,
address: Address,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['address', 'blockNumberOrTag'], [address, blockNumber]);
return requestManager.send({
method: 'eth_getTransactionCount',
params: [address, blockNumber],
});
}
export async function getBlockTransactionCountByHash(
requestManager: Web3RequestManager,
blockHash: HexString32Bytes,
) {
validator.validate(['bytes32'], [blockHash]);
return requestManager.send({
method: 'eth_getBlockTransactionCountByHash',
params: [blockHash],
});
}
export async function getBlockTransactionCountByNumber(
requestManager: Web3RequestManager,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['blockNumberOrTag'], [blockNumber]);
return requestManager.send({
method: 'eth_getBlockTransactionCountByNumber',
params: [blockNumber],
});
}
export async function getUncleCountByBlockHash(
requestManager: Web3RequestManager,
blockHash: HexString32Bytes,
) {
validator.validate(['bytes32'], [blockHash]);
return requestManager.send({
method: 'eth_getUncleCountByBlockHash',
params: [blockHash],
});
}
export async function getUncleCountByBlockNumber(
requestManager: Web3RequestManager,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['blockNumberOrTag'], [blockNumber]);
return requestManager.send({
method: 'eth_getUncleCountByBlockNumber',
params: [blockNumber],
});
}
export async function getCode(
requestManager: Web3RequestManager,
address: Address,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['address', 'blockNumberOrTag'], [address, blockNumber]);
return requestManager.send({
method: 'eth_getCode',
params: [address, blockNumber],
});
}
export async function sign(
requestManager: Web3RequestManager,
address: Address,
message: HexStringBytes,
) {
validator.validate(['address', 'hex'], [address, message]);
return requestManager.send({
method: 'eth_sign',
params: [address, message],
});
}
// TODO - Validation should be:
// isTransactionWithSender(transaction)
// ? validateTransactionWithSender(transaction)
// : validateTransactionWithSender(transaction, true) with true being a isPartial flag
export async function signTransaction(
requestManager: Web3RequestManager,
transaction: TransactionWithSenderAPI | Partial,
) {
return requestManager.send({
method: 'eth_signTransaction',
params: [transaction],
});
}
// TODO - Validation should be:
// isTransactionWithSender(transaction)
// ? validateTransactionWithSender(transaction)
// : validateTransactionWithSender(transaction, true) with true being a isPartial flag
export async function sendTransaction(
requestManager: Web3RequestManager,
transaction: TransactionWithSenderAPI | Partial,
) {
return requestManager.send({
method: 'eth_sendTransaction',
params: [transaction],
});
}
export async function sendRawTransaction(
requestManager: Web3RequestManager,
transaction: HexStringBytes,
) {
validator.validate(['hex'], [transaction]);
return requestManager.send({
method: 'eth_sendRawTransaction',
params: [transaction],
});
}
// TODO - validate transaction
export async function call(
requestManager: Web3RequestManager,
transaction: TransactionCallAPI,
blockNumber: BlockNumberOrTag,
) {
// validateTransactionCall(transaction);
validator.validate(['blockNumberOrTag'], [blockNumber]);
return requestManager.send({
method: 'eth_call',
params: [transaction, blockNumber],
});
}
// TODO Not sure how to best validate Partial
export async function estimateGas(
requestManager: Web3RequestManager,
transaction: Partial,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['blockNumberOrTag'], [blockNumber]);
return requestManager.send({
method: 'eth_estimateGas',
params: [transaction, blockNumber],
});
}
export async function getBlockByHash(
requestManager: Web3RequestManager,
blockHash: HexString32Bytes,
hydrated: boolean,
) {
validator.validate(['bytes32', 'bool'], [blockHash, hydrated]);
return requestManager.send({
method: 'eth_getBlockByHash',
params: [blockHash, hydrated],
});
}
export async function getBlockByNumber(
requestManager: Web3RequestManager,
blockNumber: BlockNumberOrTag,
hydrated: boolean,
) {
validator.validate(['blockNumberOrTag', 'bool'], [blockNumber, hydrated]);
return requestManager.send({
method: 'eth_getBlockByNumber',
params: [blockNumber, hydrated],
});
}
export async function getTransactionByHash(
requestManager: Web3RequestManager,
transactionHash: HexString32Bytes,
) {
validator.validate(['bytes32'], [transactionHash]);
return requestManager.send({
method: 'eth_getTransactionByHash',
params: [transactionHash],
});
}
export async function getTransactionByBlockHashAndIndex(
requestManager: Web3RequestManager,
blockHash: HexString32Bytes,
transactionIndex: Uint,
) {
validator.validate(['bytes32', 'hex'], [blockHash, transactionIndex]);
return requestManager.send({
method: 'eth_getTransactionByBlockHashAndIndex',
params: [blockHash, transactionIndex],
});
}
export async function getTransactionByBlockNumberAndIndex(
requestManager: Web3RequestManager,
blockNumber: BlockNumberOrTag,
transactionIndex: Uint,
) {
validator.validate(['blockNumberOrTag', 'hex'], [blockNumber, transactionIndex]);
return requestManager.send({
method: 'eth_getTransactionByBlockNumberAndIndex',
params: [blockNumber, transactionIndex],
});
}
export async function getTransactionReceipt(
requestManager: Web3RequestManager,
transactionHash: HexString32Bytes,
) {
validator.validate(['bytes32'], [transactionHash]);
return requestManager.send({
method: 'eth_getTransactionReceipt',
params: [transactionHash],
});
}
export async function getUncleByBlockHashAndIndex(
requestManager: Web3RequestManager,
blockHash: HexString32Bytes,
uncleIndex: Uint,
) {
validator.validate(['bytes32', 'hex'], [blockHash, uncleIndex]);
return requestManager.send({
method: 'eth_getUncleByBlockHashAndIndex',
params: [blockHash, uncleIndex],
});
}
export async function getUncleByBlockNumberAndIndex(
requestManager: Web3RequestManager,
blockNumber: BlockNumberOrTag,
uncleIndex: Uint,
) {
validator.validate(['blockNumberOrTag', 'hex'], [blockNumber, uncleIndex]);
return requestManager.send({
method: 'eth_getUncleByBlockNumberAndIndex',
params: [blockNumber, uncleIndex],
});
}
export async function getCompilers(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_getCompilers',
params: [],
});
}
export async function compileSolidity(requestManager: Web3RequestManager, code: string) {
validator.validate(['string'], [code]);
return requestManager.send({
method: 'eth_compileSolidity',
params: [code],
});
}
export async function compileLLL(requestManager: Web3RequestManager, code: string) {
validator.validate(['string'], [code]);
return requestManager.send({
method: 'eth_compileLLL',
params: [code],
});
}
export async function compileSerpent(requestManager: Web3RequestManager, code: string) {
validator.validate(['string'], [code]);
return requestManager.send({
method: 'eth_compileSerpent',
params: [code],
});
}
export async function newFilter(requestManager: Web3RequestManager, filter: Filter) {
validator.validate(['filter'], [filter]);
return requestManager.send({
method: 'eth_newFilter',
params: [filter],
});
}
export async function newBlockFilter(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_newBlockFilter',
params: [],
});
}
export async function newPendingTransactionFilter(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_newPendingTransactionFilter',
params: [],
});
}
export async function uninstallFilter(requestManager: Web3RequestManager, filterIdentifier: Uint) {
validator.validate(['hex'], [filterIdentifier]);
return requestManager.send({
method: 'eth_uninstallFilter',
params: [filterIdentifier],
});
}
export async function getFilterChanges(requestManager: Web3RequestManager, filterIdentifier: Uint) {
validator.validate(['hex'], [filterIdentifier]);
return requestManager.send({
method: 'eth_getFilterChanges',
params: [filterIdentifier],
});
}
export async function getFilterLogs(requestManager: Web3RequestManager, filterIdentifier: Uint) {
validator.validate(['hex'], [filterIdentifier]);
return requestManager.send({
method: 'eth_getFilterLogs',
params: [filterIdentifier],
});
}
export async function getLogs(requestManager: Web3RequestManager, filter: Filter) {
validator.validate(['filter'], [filter]);
return requestManager.send({
method: 'eth_getLogs',
params: [filter],
});
}
export async function getWork(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_getWork',
params: [],
});
}
export async function submitWork(
requestManager: Web3RequestManager,
nonce: HexString8Bytes,
hash: HexString32Bytes,
digest: HexString32Bytes,
) {
validator.validate(['bytes8', 'bytes32', 'bytes32'], [nonce, hash, digest]);
return requestManager.send({
method: 'eth_submitWork',
params: [nonce, hash, digest],
});
}
export async function submitHashrate(
requestManager: Web3RequestManager,
hashRate: HexString32Bytes,
id: HexString32Bytes,
) {
validator.validate(['bytes32', 'bytes32'], [hashRate, id]);
return requestManager.send({
method: 'eth_submitHashrate',
params: [hashRate, id],
});
}
export async function getFeeHistory(
requestManager: Web3RequestManager,
blockCount: Uint,
newestBlock: BlockNumberOrTag,
rewardPercentiles: number[],
) {
validator.validate(['hex', 'blockNumberOrTag'], [blockCount, newestBlock]);
for (const rewardPercentile of rewardPercentiles) {
validator.validate(['number'], [rewardPercentile]);
}
return requestManager.send({
method: 'eth_feeHistory',
params: [blockCount, newestBlock, rewardPercentiles],
});
}
export async function getPendingTransactions(
requestManager: Web3RequestManager,
) {
return requestManager.send({
method: 'eth_pendingTransactions',
params: [],
});
}
export async function requestAccounts(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_requestAccounts',
params: [],
});
}
export async function getChainId(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'eth_chainId',
params: [],
});
}
export async function getProof(
requestManager: Web3RequestManager,
address: Address,
storageKeys: HexString32Bytes[],
blockNumber: BlockNumberOrTag,
) {
validator.validate(
['address', 'bytes32[]', 'blockNumberOrTag'],
[address, storageKeys, blockNumber],
);
return requestManager.send({
method: 'eth_getProof',
params: [address, storageKeys, blockNumber],
});
}
export async function getNodeInfo(requestManager: Web3RequestManager) {
return requestManager.send({
method: 'web3_clientVersion',
params: [],
});
}
export async function createAccessList(
requestManager: Web3RequestManager,
transaction: TransactionWithSenderAPI | Partial,
blockNumber: BlockNumberOrTag,
) {
validator.validate(['blockNumberOrTag'], [blockNumber]);
return requestManager.send({
method: 'eth_createAccessList',
params: [transaction, blockNumber],
});
}
export async function signTypedData(
requestManager: Web3RequestManager,
address: Address,
typedData: Eip712TypedData,
useLegacy = false,
): Promise {
// TODO Add validation for typedData
validator.validate(['address'], [address]);
return requestManager.send({
method: `eth_signTypedData${useLegacy ? '' : '_v4'}`,
params: [address, typedData],
});
}