Added support for fetching block transactions with blocks.
This commit is contained in:
parent
b5408bcbd0
commit
32a070d909
@ -125,7 +125,7 @@ export abstract class Provider implements OnceBlockable {
|
|||||||
abstract call(transaction: TransactionRequest): Promise<string>;
|
abstract call(transaction: TransactionRequest): Promise<string>;
|
||||||
abstract estimateGas(transaction: TransactionRequest): Promise<BigNumber>;
|
abstract estimateGas(transaction: TransactionRequest): Promise<BigNumber>;
|
||||||
|
|
||||||
abstract getBlock(blockHashOrBlockTag: BlockTag | string | Promise<BlockTag | string>): Promise<Block>;
|
abstract getBlock(blockHashOrBlockTag: BlockTag | string | Promise<BlockTag | string>, includeTransactions?: boolean): Promise<Block>;
|
||||||
abstract getTransaction(transactionHash: string): Promise<TransactionResponse>;
|
abstract getTransaction(transactionHash: string): Promise<TransactionResponse>;
|
||||||
abstract getTransactionReceipt(transactionHash: string): Promise<TransactionReceipt>;
|
abstract getTransactionReceipt(transactionHash: string): Promise<TransactionReceipt>;
|
||||||
|
|
||||||
|
@ -149,40 +149,7 @@ function checkBlockTag(blockTag: BlockTag): string {
|
|||||||
throw new Error('invalid blockTag');
|
throw new Error('invalid blockTag');
|
||||||
}
|
}
|
||||||
|
|
||||||
var formatBlock = {
|
const formatTransaction = {
|
||||||
hash: checkHash,
|
|
||||||
parentHash: checkHash,
|
|
||||||
number: checkNumber,
|
|
||||||
|
|
||||||
timestamp: checkNumber,
|
|
||||||
nonce: allowNull(hexlify),
|
|
||||||
difficulty: checkDifficulty,
|
|
||||||
|
|
||||||
gasLimit: bigNumberify,
|
|
||||||
gasUsed: bigNumberify,
|
|
||||||
|
|
||||||
miner: getAddress,
|
|
||||||
extraData: hexlify,
|
|
||||||
|
|
||||||
//transactions: allowNull(arrayOf(checkTransaction)),
|
|
||||||
transactions: allowNull(arrayOf(checkHash)),
|
|
||||||
|
|
||||||
//transactionRoot: checkHash,
|
|
||||||
//stateRoot: checkHash,
|
|
||||||
//sha3Uncles: checkHash,
|
|
||||||
|
|
||||||
//logsBloom: hexlify,
|
|
||||||
};
|
|
||||||
|
|
||||||
function checkBlock(block: any): Block {
|
|
||||||
if (block.author != null && block.miner == null) {
|
|
||||||
block.miner = block.author;
|
|
||||||
}
|
|
||||||
return check(formatBlock, block);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var formatTransaction = {
|
|
||||||
hash: checkHash,
|
hash: checkHash,
|
||||||
|
|
||||||
blockHash: allowNull(checkHash, null),
|
blockHash: allowNull(checkHash, null),
|
||||||
@ -278,7 +245,35 @@ function checkTransactionResponse(transaction: any): TransactionResponse {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
var formatTransactionRequest = {
|
const formatBlock = {
|
||||||
|
hash: checkHash,
|
||||||
|
parentHash: checkHash,
|
||||||
|
number: checkNumber,
|
||||||
|
|
||||||
|
timestamp: checkNumber,
|
||||||
|
nonce: allowNull(hexlify),
|
||||||
|
difficulty: checkDifficulty,
|
||||||
|
|
||||||
|
gasLimit: bigNumberify,
|
||||||
|
gasUsed: bigNumberify,
|
||||||
|
|
||||||
|
miner: getAddress,
|
||||||
|
extraData: hexlify,
|
||||||
|
|
||||||
|
transactions: allowNull(arrayOf(checkHash)),
|
||||||
|
};
|
||||||
|
|
||||||
|
const formatBlockWithTransactions = shallowCopy(formatBlock);
|
||||||
|
formatBlockWithTransactions.transactions = allowNull(arrayOf(checkTransactionResponse));
|
||||||
|
|
||||||
|
function checkBlock(block: any, includeTransactions: boolean): Block {
|
||||||
|
if (block.author != null && block.miner == null) {
|
||||||
|
block.miner = block.author;
|
||||||
|
}
|
||||||
|
return check(includeTransactions ? formatBlockWithTransactions: formatBlock, block);
|
||||||
|
}
|
||||||
|
|
||||||
|
const formatTransactionRequest = {
|
||||||
from: allowNull(getAddress),
|
from: allowNull(getAddress),
|
||||||
nonce: allowNull(checkNumber),
|
nonce: allowNull(checkNumber),
|
||||||
gasLimit: allowNull(bigNumberify),
|
gasLimit: allowNull(bigNumberify),
|
||||||
@ -292,7 +287,7 @@ function checkTransactionRequest(transaction: any): any {
|
|||||||
return check(formatTransactionRequest, transaction);
|
return check(formatTransactionRequest, transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
var formatTransactionReceiptLog = {
|
const formatTransactionReceiptLog = {
|
||||||
transactionLogIndex: allowNull(checkNumber),
|
transactionLogIndex: allowNull(checkNumber),
|
||||||
transactionIndex: checkNumber,
|
transactionIndex: checkNumber,
|
||||||
blockNumber: checkNumber,
|
blockNumber: checkNumber,
|
||||||
@ -308,7 +303,7 @@ function checkTransactionReceiptLog(log: any): any {
|
|||||||
return check(formatTransactionReceiptLog, log);
|
return check(formatTransactionReceiptLog, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
var formatTransactionReceipt = {
|
const formatTransactionReceipt = {
|
||||||
contractAddress: allowNull(getAddress, null),
|
contractAddress: allowNull(getAddress, null),
|
||||||
transactionIndex: checkNumber,
|
transactionIndex: checkNumber,
|
||||||
root: allowNull(checkHash),
|
root: allowNull(checkHash),
|
||||||
@ -351,7 +346,7 @@ function checkTopics(topics: any): any {
|
|||||||
return topics;
|
return topics;
|
||||||
}
|
}
|
||||||
|
|
||||||
var formatFilter = {
|
const formatFilter = {
|
||||||
fromBlock: allowNull(checkBlockTag, undefined),
|
fromBlock: allowNull(checkBlockTag, undefined),
|
||||||
toBlock: allowNull(checkBlockTag, undefined),
|
toBlock: allowNull(checkBlockTag, undefined),
|
||||||
address: allowNull(getAddress, undefined),
|
address: allowNull(getAddress, undefined),
|
||||||
@ -362,7 +357,7 @@ function checkFilter(filter: any): any {
|
|||||||
return check(formatFilter, filter);
|
return check(formatFilter, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
var formatLog = {
|
const formatLog = {
|
||||||
blockNumber: allowNull(checkNumber),
|
blockNumber: allowNull(checkNumber),
|
||||||
blockHash: allowNull(checkHash),
|
blockHash: allowNull(checkHash),
|
||||||
transactionIndex: checkNumber,
|
transactionIndex: checkNumber,
|
||||||
@ -832,21 +827,21 @@ export class BaseProvider extends Provider {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getBlock(blockHashOrBlockTag: BlockTag | string | Promise<BlockTag | string>): Promise<Block> {
|
getBlock(blockHashOrBlockTag: BlockTag | string | Promise<BlockTag | string>, includeTransactions?: boolean): Promise<Block> {
|
||||||
return this.ready.then(() => {
|
return this.ready.then(() => {
|
||||||
return resolveProperties({ blockHashOrBlockTag: blockHashOrBlockTag }).then(({ blockHashOrBlockTag }) => {
|
return resolveProperties({ blockHashOrBlockTag: blockHashOrBlockTag }).then(({ blockHashOrBlockTag }) => {
|
||||||
try {
|
try {
|
||||||
var blockHash = hexlify(blockHashOrBlockTag);
|
var blockHash = hexlify(blockHashOrBlockTag);
|
||||||
if (hexDataLength(blockHash) === 32) {
|
if (hexDataLength(blockHash) === 32) {
|
||||||
return poll(() => {
|
return poll(() => {
|
||||||
return this.perform('getBlock', { blockHash: blockHash }).then((block) => {
|
return this.perform('getBlock', { blockHash: blockHash, includeTransactions: !!includeTransactions }).then((block) => {
|
||||||
if (block == null) {
|
if (block == null) {
|
||||||
if (this._emitted['b:' + blockHash] == null) {
|
if (this._emitted['b:' + blockHash] == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return checkBlock(block);
|
return checkBlock(block, includeTransactions);
|
||||||
});
|
});
|
||||||
}, { onceBlock: this });
|
}, { onceBlock: this });
|
||||||
|
|
||||||
@ -862,14 +857,14 @@ export class BaseProvider extends Provider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return poll(() => {
|
return poll(() => {
|
||||||
return this.perform('getBlock', { blockTag: blockTag }).then((block) => {
|
return this.perform('getBlock', { blockTag: blockTag, includeTransactions: !!includeTransactions }).then((block) => {
|
||||||
if (block == null) {
|
if (block == null) {
|
||||||
if (blockNumber > this._emitted.block) {
|
if (blockNumber > this._emitted.block) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return checkBlock(block);
|
return checkBlock(block, includeTransactions);
|
||||||
});
|
});
|
||||||
}, { onceBlock: this });
|
}, { onceBlock: this });
|
||||||
} catch (error) { }
|
} catch (error) { }
|
||||||
|
@ -170,7 +170,11 @@ export class EtherscanProvider extends BaseProvider{
|
|||||||
case 'getBlock':
|
case 'getBlock':
|
||||||
if (params.blockTag) {
|
if (params.blockTag) {
|
||||||
url += '/api?module=proxy&action=eth_getBlockByNumber&tag=' + params.blockTag;
|
url += '/api?module=proxy&action=eth_getBlockByNumber&tag=' + params.blockTag;
|
||||||
url += '&boolean=false';
|
if (params.includeTransactions) {
|
||||||
|
url += '&boolean=true';
|
||||||
|
} else {
|
||||||
|
url += '&boolean=false';
|
||||||
|
}
|
||||||
url += apiKey;
|
url += apiKey;
|
||||||
return fetchJson(url, null, getJsonResult);
|
return fetchJson(url, null, getJsonResult);
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ export class FallbackProvider extends BaseProvider {
|
|||||||
return this._providers.slice(0);
|
return this._providers.slice(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
perform(method: string, params: any): any {
|
perform(method: string, params: { [name: string]: any }): any {
|
||||||
// Creates a copy of the providers array
|
// Creates a copy of the providers array
|
||||||
var providers = this.providers;
|
var providers = this.providers;
|
||||||
|
|
||||||
|
@ -283,9 +283,9 @@ export class JsonRpcProvider extends BaseProvider {
|
|||||||
|
|
||||||
case 'getBlock':
|
case 'getBlock':
|
||||||
if (params.blockTag) {
|
if (params.blockTag) {
|
||||||
return this.send('eth_getBlockByNumber', [ params.blockTag, false ]);
|
return this.send('eth_getBlockByNumber', [ params.blockTag, !!params.includeTransactions ]);
|
||||||
} else if (params.blockHash) {
|
} else if (params.blockHash) {
|
||||||
return this.send('eth_getBlockByHash', [ params.blockHash, false ]);
|
return this.send('eth_getBlockByHash', [ params.blockHash, !!params.includeTransactions ]);
|
||||||
}
|
}
|
||||||
return Promise.reject(new Error('invalid block tag or block hash'));
|
return Promise.reject(new Error('invalid block tag or block hash'));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user