/
eip_86_basic_account.se
28 lines (28 loc) · 1.18 KB
/
eip_86_basic_account.se
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Expects input 224+x bytes: v, r, s, nonce, gasprice, to, value, data
with zero = ~mload(0):
# Anti re-entrancy
~jumpi(~pc(), msg.sender != ~sub(zero, 1))
# Copy calldata
~calldatacopy(32, zero, ~calldatasize())
# Compute sighash
~mstore(zero, ~sha3(32, 32 + ~calldatasize()))
# Do elliptic curve verification
~call(3000, 1, zero, zero, 128, zero, 32)
# Memory: hash, v, r, s, nonce, gasprice, to, value, data
# Check sig is correct
~jumpi(~pc(), ~mload(zero) != 0xfe2ec957647679d210034b65e9c7db2452910b0c)
with s = ~sload(zero):
# Check nonce is correct
~jumpi(~pc(), s != ~mload(128))
# Increment nonce
~sstore(zero, s + 1)
with gasprice = ~mload(160):
# Check balance
~jumpi(~pc(), self.balance < gasprice * msg.gas)
with g1 = msg.gas:
# Make the main call
~call(msg.gas - 25000, ~mload(192), ~mload(224), 256, ~calldatasize() - 224, zero, 10000)
# Pay the miner
~call(zero, block.coinbase, (g1 - msg.gas + 5000) * gasprice, zero, zero, zero, zero)
# Log to establish that the tx passed through successfully
~log0(zero, zero)