public Block MapBlock(Core.Block block, bool returnFullTransactionObjects) { var blockModel = new Block { Hash = new Data(block.Hash.Bytes), Uncles = block.Ommers?.Select(x => new Data(x.Hash.Bytes)).ToArray(), Transactions = returnFullTransactionObjects ? block.Transactions?.Select(x => MapTransaction(x, block)).ToArray() : null, TransactionHashes = !returnFullTransactionObjects?block.Transactions?.Select(x => new Data(x.Hash.Bytes)).ToArray() : null }; if (block.Header == null) { return(blockModel); } blockModel.Number = new Quantity(block.Header.Number); blockModel.ParentHash = new Data(block.Header.ParentHash.Bytes); blockModel.Nonce = new Data(block.Header.Nonce.ToString()); blockModel.Sha3Uncles = new Data(block.Header.OmmersHash.Bytes); blockModel.LogsBloom = new Data(block.Header.Bloom?.Bytes); blockModel.TransactionsRoot = new Data(block.Header.TransactionsRoot.Bytes); blockModel.StateRoot = new Data(block.Header.StateRoot.Bytes); blockModel.ReceiptsRoot = new Data(block.Header.ReceiptsRoot.Bytes); blockModel.Miner = block.Header.Beneficiary != null ? new Data(block.Header.Beneficiary.Hex) : null; blockModel.Difficulty = new Quantity(block.Header.Difficulty); //TotalDifficulty = new Quantity(block.Header.Difficulty), blockModel.ExtraData = new Data(block.Header.ExtraData); //Size = new Quantity(block.Header.) blockModel.GasLimit = new Quantity(block.Header.GasLimit); blockModel.GasUsed = new Quantity(block.Header.GasUsed); blockModel.Timestamp = new Quantity(block.Header.Timestamp); return(blockModel); }
public Block MapBlock(Core.Block block, bool returnFullTransactionObjects) { Transaction[] transactions = null; Data[] transactionHashes = null; if (returnFullTransactionObjects) { transactions = new Transaction[block.Transactions.Length]; } else { transactionHashes = new Data[block.Transactions.Length]; } for (int i = 0; i < block.Transactions.Length; i++) { if (returnFullTransactionObjects) { transactions[i] = MapTransaction(block.Hash, block.Number, i, block.Transactions[i]); } else { transactionHashes[i] = new Data(block.Transactions[i].Hash); } } var blockModel = new Block { Hash = new Data(block.Hash.Bytes), Uncles = block.Ommers?.Select(x => new Data(x.Hash)).ToArray(), Transactions = transactions, TransactionHashes = transactionHashes }; if (block.Header == null) { return(blockModel); } blockModel.Number = new Quantity(block.Header.Number); blockModel.ParentHash = new Data(block.Header.ParentHash); blockModel.Nonce = new Data(block.Header.Nonce.ToString()); blockModel.MixHash = new Data(block.Header.MixHash?.ToString()); blockModel.Sha3Uncles = new Data(block.Header.OmmersHash); blockModel.LogsBloom = new Data(block.Header.Bloom?.Bytes); blockModel.TransactionsRoot = new Data(block.Header.TransactionsRoot); blockModel.StateRoot = new Data(block.Header.StateRoot); blockModel.ReceiptsRoot = new Data(block.Header.ReceiptsRoot); blockModel.Miner = block.Header.Beneficiary != null ? new Data(block.Header.Beneficiary) : null; blockModel.Difficulty = new Quantity(block.Header.Difficulty); blockModel.TotalDifficulty = new Quantity(block.Header.TotalDifficulty ?? 0); blockModel.ExtraData = new Data(block.Header.ExtraData); //Size = new Quantity(block.Header.) blockModel.GasLimit = new Quantity(block.Header.GasLimit); blockModel.GasUsed = new Quantity(block.Header.GasUsed); blockModel.Timestamp = new Quantity(block.Header.Timestamp); return(blockModel); }
private BigInteger GetTransactionIndex(Core.Transaction transaction, Core.Block block) { for (var i = 0; i < block.Transactions.Length; i++) { var trans = block.Transactions[i]; if (trans.Hash.Equals(transaction.Hash)) { return(i); } } throw new Exception($"Cannot find transaction in block transactions based on transaction hash: {transaction.Hash}, blockHash: {block.Hash}."); }
public Transaction MapTransaction(Core.Transaction transaction, Core.Block block) { return(new Transaction { Hash = new Data(transaction.Hash.Bytes), Nonce = new Quantity(transaction.Nonce), BlockHash = block != null ? new Data(block.Hash.Bytes) : null, BlockNumber = block?.Header != null ? new Quantity(block.Header.Number) : null, TransactionIndex = block?.Transactions != null ? new Quantity(GetTransactionIndex(transaction, block)) : null, From = new Data(_signer.RecoverAddress(transaction, block.Number).Bytes), To = new Data(transaction.To.Bytes), Value = new Quantity(transaction.Value), GasPrice = new Quantity(transaction.GasPrice), Gas = new Quantity(transaction.GasLimit), Data = new Data(transaction.Data) }); }
public Transaction MapTransaction(Core.Transaction transaction, Core.Block block) { throw new NotImplementedException(); // TODO: look at new transaction recover (that takes block number) return(new Transaction { Hash = new Data(transaction.Hash.Bytes), Nonce = new Quantity(transaction.Nonce), BlockHash = block != null ? new Data(block.Hash.Bytes) : null, BlockNumber = block?.Header != null ? new Quantity(block.Header.Number) : null, TransactionIndex = block?.Transactions != null ? new Quantity(GetTransactionIndex(transaction, block)) : null, From = new Data(_signer.RecoverAddress(transaction, block.Number).Hex), To = new Data(transaction.To.Hex), Value = new Quantity(transaction.Value), GasPrice = new Quantity(transaction.GasPrice), Gas = new Quantity(transaction.GasLimit), Data = new Data(transaction.Data) }); }
public ResultWrapper <Transaction> eth_getTransactionByBlockNumberAndIndex(BlockParameter blockParameter, Quantity positionIndex) { if (_blockchainBridge.Head == null) { return(ResultWrapper <Transaction> .Fail($"Incorrect head block: {(_blockchainBridge.Head != null ? "HeadBlock is null" : "HeadBlock header is null")}")); } var result = GetBlock(blockParameter); if (result.Result.ResultType == ResultType.Failure) { return(ResultWrapper <Transaction> .Fail(result.Result.Error, result.ErrorType)); } var index = positionIndex.AsNumber(); if (!index.HasValue) { return(ResultWrapper <Transaction> .Fail("Position Index is required", ErrorType.InvalidParams)); } if (index.Value < 0 || index.Value > result.Data.Transactions.Length - 1) { return(ResultWrapper <Transaction> .Fail("Position Index is incorrect", ErrorType.InvalidParams)); } Core.Block block = result.Data; var transaction = block.Transactions[(int)index.Value]; var transactionModel = _modelMapper.MapTransaction(block.Hash, block.Number, (int)index.Value, transaction); if (Logger.IsDebug) { Logger.Debug($"eth_getTransactionByBlockNumberAndIndex request {blockParameter}, index: {positionIndex.ToJson()}, result: {GetJsonLog(transactionModel.ToJson())}"); } return(ResultWrapper <Transaction> .Success(transactionModel)); }
public ResultWrapper <Data> eth_call(Transaction transactionCall, BlockParameter blockParameter) { Core.Block block = GetBlock(blockParameter).Data; byte[] result = _blockchainBridge.Call(block, _modelMapper.MapTransaction(transactionCall)); return(ResultWrapper <Data> .Success(new Data(result))); }
public TransactionReceipt MapTransactionReceipt(Core.TransactionReceipt receipt, Core.Transaction transaction, Core.Block block) { return(new TransactionReceipt { TransactionHash = new Data(transaction.Hash.Bytes), TransactionIndex = block?.Transactions != null ? new Quantity(GetTransactionIndex(transaction, block)) : null, BlockHash = block != null ? new Data(block.Hash.Bytes) : null, BlockNumber = block?.Header != null ? new Quantity(block.Header.Number) : null, //CumulativeGasUsed = new Quantity(receipt.GasUsed), GasUsed = new Quantity(receipt.GasUsed), ContractAddress = transaction.IsContractCreation && receipt.Recipient != null ? new Data(receipt.Recipient.Hex) : null, Logs = receipt.Logs?.Select(MapLog).ToArray(), LogsBloom = new Data(receipt.Bloom?.Bytes), Status = new Quantity(receipt.StatusCode) }); }