Reuse transaction utils from eth-common
This commit is contained in:
parent
6ac750551e
commit
4f0404fa2d
|
@ -8,18 +8,8 @@
|
||||||
import
|
import
|
||||||
constants, errors, eth/[common, rlp, keys], nimcrypto, utils
|
constants, errors, eth/[common, rlp, keys], nimcrypto, utils
|
||||||
|
|
||||||
proc initTransaction*(nonce: AccountNonce, gasPrice, gasLimit: GasInt, to: EthAddress,
|
import eth/common/transaction as common_transaction
|
||||||
value: UInt256, payload: Blob, V: byte, R, S: UInt256, isContractCreation = false): Transaction =
|
export common_transaction
|
||||||
result.accountNonce = nonce
|
|
||||||
result.gasPrice = gasPrice
|
|
||||||
result.gasLimit = gasLimit
|
|
||||||
result.to = to
|
|
||||||
result.value = value
|
|
||||||
result.payload = payload
|
|
||||||
result.V = V
|
|
||||||
result.R = R
|
|
||||||
result.S = S
|
|
||||||
result.isContractCreation = isContractCreation
|
|
||||||
|
|
||||||
func intrinsicGas*(data: openarray[byte]): GasInt =
|
func intrinsicGas*(data: openarray[byte]): GasInt =
|
||||||
result = 21_000 # GasTransaction
|
result = 21_000 # GasTransaction
|
||||||
|
@ -42,63 +32,6 @@ proc validate*(t: Transaction) =
|
||||||
raise newException(ValidationError, "Insufficient gas")
|
raise newException(ValidationError, "Insufficient gas")
|
||||||
# self.check_signature_validity()
|
# self.check_signature_validity()
|
||||||
|
|
||||||
type
|
|
||||||
TransHashObj = object
|
|
||||||
accountNonce: AccountNonce
|
|
||||||
gasPrice: GasInt
|
|
||||||
gasLimit: GasInt
|
|
||||||
to {.rlpCustomSerialization.}: EthAddress
|
|
||||||
value: UInt256
|
|
||||||
payload: Blob
|
|
||||||
mIsContractCreation {.rlpIgnore.}: bool
|
|
||||||
|
|
||||||
proc read(rlp: var Rlp, t: var TransHashObj, _: type EthAddress): EthAddress {.inline.} =
|
|
||||||
if rlp.blobLen != 0:
|
|
||||||
result = rlp.read(EthAddress)
|
|
||||||
else:
|
|
||||||
t.mIsContractCreation = true
|
|
||||||
|
|
||||||
proc append(rlpWriter: var RlpWriter, t: TransHashObj, a: EthAddress) {.inline.} =
|
|
||||||
if t.mIsContractCreation:
|
|
||||||
rlpWriter.append("")
|
|
||||||
else:
|
|
||||||
rlpWriter.append(a)
|
|
||||||
|
|
||||||
const
|
|
||||||
EIP155_CHAIN_ID_OFFSET = 35
|
|
||||||
|
|
||||||
func rlpEncode*(transaction: Transaction): auto =
|
|
||||||
# Encode transaction without signature
|
|
||||||
return rlp.encode(TransHashObj(
|
|
||||||
accountNonce: transaction.accountNonce,
|
|
||||||
gasPrice: transaction.gasPrice,
|
|
||||||
gasLimit: transaction.gasLimit,
|
|
||||||
to: transaction.to,
|
|
||||||
value: transaction.value,
|
|
||||||
payload: transaction.payload,
|
|
||||||
mIsContractCreation: transaction.isContractCreation
|
|
||||||
))
|
|
||||||
|
|
||||||
func rlpEncodeEIP155*(tx: Transaction): auto =
|
|
||||||
let V = (tx.V.int - EIP155_CHAIN_ID_OFFSET) div 2
|
|
||||||
# Encode transaction without signature
|
|
||||||
return rlp.encode(Transaction(
|
|
||||||
accountNonce: tx.accountNonce,
|
|
||||||
gasPrice: tx.gasPrice,
|
|
||||||
gasLimit: tx.gasLimit,
|
|
||||||
to: tx.to,
|
|
||||||
value: tx.value,
|
|
||||||
payload: tx.payload,
|
|
||||||
isContractCreation: tx.isContractCreation,
|
|
||||||
V: V.byte,
|
|
||||||
R: 0.u256,
|
|
||||||
S: 0.u256
|
|
||||||
))
|
|
||||||
|
|
||||||
func txHashNoSignature*(tx: Transaction): Hash256 =
|
|
||||||
# Hash transaction without signature
|
|
||||||
return keccak256.digest(if tx.V.int >= EIP155_CHAIN_ID_OFFSET: tx.rlpEncodeEIP155 else: tx.rlpEncode)
|
|
||||||
|
|
||||||
proc getSignature*(transaction: Transaction, output: var Signature): bool =
|
proc getSignature*(transaction: Transaction, output: var Signature): bool =
|
||||||
var bytes: array[65, byte]
|
var bytes: array[65, byte]
|
||||||
bytes[0..31] = transaction.R.toByteArrayBE()
|
bytes[0..31] = transaction.R.toByteArrayBE()
|
||||||
|
|
Loading…
Reference in New Issue