public static TransactionForRpc ToTransactionForRpc(this IWeb3EthApi api, DeltaWithCid deltaWithCid, int transactionIndex) { var(delta, deltaCid) = deltaWithCid; var publicEntry = delta.PublicEntries[transactionIndex]; var deltaNumber = delta.DeltaNumber; return(new TransactionForRpc { GasPrice = publicEntry.GasPrice.ToUInt256(), BlockHash = deltaCid, BlockNumber = (UInt256)deltaNumber, Nonce = publicEntry.Nonce, To = ToAddress(publicEntry.ReceiverAddress), From = ToAddress(publicEntry.SenderAddress), Value = publicEntry.Amount.ToUInt256(), Hash = publicEntry.GetHash(api.HashProvider), Data = publicEntry.Data.ToByteArray(), R = new byte[0], S = new byte[0], V = UInt256.Zero, Gas = publicEntry.GasLimit, TransactionIndex = (UInt256)transactionIndex }); }
public static bool TryGetDeltaWithCid(this IWeb3EthApi api, BlockParameter block, out DeltaWithCid delta) { Cid cid; switch (block.Type) { case BlockParameterType.Earliest: cid = api.DeltaCache.GenesisHash; break; case BlockParameterType.Latest: cid = api.DeltaResolver.LatestDelta; break; case BlockParameterType.Pending: cid = api.DeltaResolver.LatestDelta; break; case BlockParameterType.BlockNumber: var blockNumber = block.BlockNumber.Value; if (!api.DeltaResolver.TryResolve(blockNumber, out cid)) { delta = default; return(false); } break; default: throw new ArgumentOutOfRangeException(); } delta = api.GetDeltaWithCid(cid); return(true); }
public static CallOutputTracer CallAndRestore(this IWeb3EthApi api, TransactionForRpc transactionCall, DeltaWithCid deltaWithCid) { var parentDelta = deltaWithCid.Delta; Keccak root = parentDelta.StateRoot.ToKeccak(); if (transactionCall.Gas == null) { transactionCall.Gas = parentDelta.GasLimit; } var publicEntry = api.ToPublicEntry(transactionCall, root); var newDelta = deltaWithCid.CreateOneOffDelta(publicEntry); CallOutputTracer callOutputTracer = new CallOutputTracer(); api.StateProvider.StateRoot = root; api.Executor.CallAndReset(newDelta, callOutputTracer); api.StateProvider.Reset(); api.StorageProvider.Reset(); return(callOutputTracer); }