Fix EIP-155 signatures

This commit is contained in:
Mark Spanbroek 2023-07-03 15:51:42 +02:00 committed by markspanbroek
parent 5127991117
commit c89701016a
2 changed files with 18 additions and 25 deletions

View File

@ -58,6 +58,10 @@ method getAddress(wallet: Wallet): Future[Address] {.async.} =
return wallet.address
proc signTransaction(tr: var SignableTransaction, pk: PrivateKey) =
# Temporary V value, used to signal to the hashing function the
# chain id that we'd like to use for an EIP-155 signature
tr.V = int64(uint64(tr.chainId)) * 2 + 35
let h = tr.txHashNoSignature
let s = sign(pk, SkMessage(h.data))
@ -69,8 +73,7 @@ proc signTransaction(tr: var SignableTransaction, pk: PrivateKey) =
case tr.txType:
of TxLegacy:
#tr.V = int64(v) + int64(tr.chainId)*2 + 35 #TODO does not work, not sure why. Sending the tx results in error of too little funds. Maybe something wrong with signature and a wrong sender gets encoded?
tr.V = int64(v) + 27
tr.V = int64(v) + int64(uint64(tr.chainId))*2 + 35
of TxEip1559:
tr.V = int64(v)
else:

View File

@ -56,29 +56,19 @@ suite "Wallet":
check $wallet.address == "0x328809bc894f92807417d2dad6b7c998c1afdac6"
test "Can sign manually created transaction":
let wallet = Wallet.new(pk1)
let tx = Transaction(
to: wallet.address,
nonce: some 0.u256,
chainId: some 31337.u256,
gasPrice: some 1_000_000_000.u256,
gasLimit: some 21_000.u256,
# Example from EIP-155
let wallet = Wallet.new("0x4646464646464646464646464646464646464646464646464646464646464646")
let transaction = Transaction(
to: !Address.init("0x3535353535353535353535353535353535353535"),
nonce: some 9.u256,
chainId: some 1.u256,
gasPrice: some 20 * 10.u256.pow(9),
gasLimit: some 21000.u256,
value: 10.u256.pow(18),
data: @[]
)
let signedTx = await wallet.signTransaction(tx)
check signedTx.toHex == "f86380843b9aca0082520894328809bc894f92807417d2dad6b7c998c1afdac680801ba04ae9b24cba72103bb30a1e91c016796fc2bf2d46d2b75ca80211fae0337c3c03a05e3c81ce9944a07f18b65142a1847c5b72f993c8e7c28d5d4360ff36a2fed049"
test "Can sign manually created contract call":
let wallet = Wallet.new(pk1)
let tx = Transaction(
to: wallet.address,
data: @[24.byte, 22, 13, 221], # Arbitrary Calldata for totalsupply()
nonce: some 0.u256,
chainId: some 31337.u256,
gasPrice: some 1_000_000_000.u256,
gasLimit: some 21_000.u256,
)
let signedTx = await wallet.signTransaction(tx)
check signedTx.toHex == "f86780843b9aca0082520894328809bc894f92807417d2dad6b7c998c1afdac6808418160ddd1ca029261fc74ffbbb5ce3d0a3b6eac9726f05d8a849e0f1535722e057bdd83b9659a044f857852bd8b7bb8c0c0a5a61c2c56fce42edacab73f42301b509edb7600ff1"
let signed = await wallet.signTransaction(transaction)
check signed.toHex == "f86c098504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a028ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa636276a067cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d83"
test "Can sign manually created tx with EIP1559":
let wallet = Wallet.new(pk1)
@ -104,7 +94,7 @@ suite "Wallet":
)
let signedTx = await wallet.signTransaction(tx)
let txHash = await provider.sendTransaction(signedTx)
check txHash.hash == TransactionHash([167.byte, 105, 79, 222, 144, 123, 214, 138, 4, 199, 124, 181, 35, 236, 79, 93, 84, 4, 85, 172, 40, 50, 189, 187, 219, 6, 172, 98, 243, 196, 93, 64])
check txHash.hash != TransactionHash.default
test "Can call state-changing function automatically":
#TODO add actual token contract, not random address. Should work regardless