module EVM.FeeSchedule where

data FeeSchedule n = FeeSchedule
  { forall n. FeeSchedule n -> n
g_zero :: n
  , forall n. FeeSchedule n -> n
g_base :: n
  , forall n. FeeSchedule n -> n
g_verylow :: n
  , forall n. FeeSchedule n -> n
g_low :: n
  , forall n. FeeSchedule n -> n
g_mid :: n
  , forall n. FeeSchedule n -> n
g_high :: n
  , forall n. FeeSchedule n -> n
g_extcode :: n
  , forall n. FeeSchedule n -> n
g_balance :: n
  , forall n. FeeSchedule n -> n
g_sload :: n
  , forall n. FeeSchedule n -> n
g_jumpdest :: n
  , forall n. FeeSchedule n -> n
g_sset :: n
  , forall n. FeeSchedule n -> n
g_sreset :: n
  , forall n. FeeSchedule n -> n
r_sclear :: n
  , forall n. FeeSchedule n -> n
g_selfdestruct :: n
  , forall n. FeeSchedule n -> n
g_selfdestruct_newaccount :: n
  , forall n. FeeSchedule n -> n
r_selfdestruct :: n
  , forall n. FeeSchedule n -> n
g_create :: n
  , forall n. FeeSchedule n -> n
g_codedeposit :: n
  , forall n. FeeSchedule n -> n
g_call :: n
  , forall n. FeeSchedule n -> n
g_callvalue :: n
  , forall n. FeeSchedule n -> n
g_callstipend :: n
  , forall n. FeeSchedule n -> n
g_newaccount :: n
  , forall n. FeeSchedule n -> n
g_exp :: n
  , forall n. FeeSchedule n -> n
g_expbyte :: n
  , forall n. FeeSchedule n -> n
g_memory :: n
  , forall n. FeeSchedule n -> n
g_txcreate :: n
  , forall n. FeeSchedule n -> n
g_txdatazero :: n
  , forall n. FeeSchedule n -> n
g_txdatanonzero :: n
  , forall n. FeeSchedule n -> n
g_transaction :: n
  , forall n. FeeSchedule n -> n
g_log :: n
  , forall n. FeeSchedule n -> n
g_logdata :: n
  , forall n. FeeSchedule n -> n
g_logtopic :: n
  , forall n. FeeSchedule n -> n
g_sha3 :: n
  , forall n. FeeSchedule n -> n
g_sha3word :: n
  , forall n. FeeSchedule n -> n
g_initcodeword :: n
  , forall n. FeeSchedule n -> n
g_copy :: n
  , forall n. FeeSchedule n -> n
g_blockhash :: n
  , forall n. FeeSchedule n -> n
g_extcodehash :: n
  , forall n. FeeSchedule n -> n
g_quaddivisor :: n
  , forall n. FeeSchedule n -> n
g_ecadd :: n
  , forall n. FeeSchedule n -> n
g_ecmul :: n
  , forall n. FeeSchedule n -> n
g_pairing_point :: n
  , forall n. FeeSchedule n -> n
g_pairing_base :: n
  , forall n. FeeSchedule n -> n
g_fround :: n
  , forall n. FeeSchedule n -> n
r_block :: n
  , forall n. FeeSchedule n -> n
g_cold_sload :: n
  , forall n. FeeSchedule n -> n
g_cold_account_access :: n
  , forall n. FeeSchedule n -> n
g_warm_storage_read :: n
  , forall n. FeeSchedule n -> n
g_access_list_address :: n
  , forall n. FeeSchedule n -> n
g_access_list_storage_key :: n
  } deriving Int -> FeeSchedule n -> ShowS
forall n. Show n => Int -> FeeSchedule n -> ShowS
forall n. Show n => [FeeSchedule n] -> ShowS
forall n. Show n => FeeSchedule n -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FeeSchedule n] -> ShowS
$cshowList :: forall n. Show n => [FeeSchedule n] -> ShowS
show :: FeeSchedule n -> String
$cshow :: forall n. Show n => FeeSchedule n -> String
showsPrec :: Int -> FeeSchedule n -> ShowS
$cshowsPrec :: forall n. Show n => Int -> FeeSchedule n -> ShowS
Show

-- For the purposes of this module, we define an EIP as just a fee
-- schedule modification.
type EIP n = Num n => FeeSchedule n -> FeeSchedule n

-- EIP150: Gas cost changes for IO-heavy operations
-- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-150.md>
eip150 :: EIP n
eip150 :: forall n. EIP n
eip150 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_extcode:FeeSchedule :: n
g_extcode = n
700
  , $sel:g_balance:FeeSchedule :: n
g_balance = n
400
  , $sel:g_sload:FeeSchedule :: n
g_sload = n
200
  , $sel:g_call:FeeSchedule :: n
g_call = n
700
  , $sel:g_selfdestruct:FeeSchedule :: n
g_selfdestruct = n
5000
  , $sel:g_selfdestruct_newaccount:FeeSchedule :: n
g_selfdestruct_newaccount = n
25000
  }

-- EIP160: EXP cost increase
-- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-160.md>
eip160 :: EIP n
eip160 :: forall n. EIP n
eip160 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_expbyte:FeeSchedule :: n
g_expbyte = n
50 }

homestead :: Num n => FeeSchedule n
homestead :: forall n. Num n => FeeSchedule n
homestead = FeeSchedule
  { $sel:g_zero:FeeSchedule :: n
g_zero = n
0
  , $sel:g_base:FeeSchedule :: n
g_base = n
2
  , $sel:g_verylow:FeeSchedule :: n
g_verylow = n
3
  , $sel:g_low:FeeSchedule :: n
g_low = n
5
  , $sel:g_mid:FeeSchedule :: n
g_mid = n
8
  , $sel:g_high:FeeSchedule :: n
g_high = n
10
  , $sel:g_extcode:FeeSchedule :: n
g_extcode = n
20
  , $sel:g_balance:FeeSchedule :: n
g_balance = n
20
  , $sel:g_sload:FeeSchedule :: n
g_sload = n
50
  , $sel:g_jumpdest:FeeSchedule :: n
g_jumpdest = n
1
  , $sel:g_sset:FeeSchedule :: n
g_sset = n
20000
  , $sel:g_sreset:FeeSchedule :: n
g_sreset = n
5000
  , $sel:r_sclear:FeeSchedule :: n
r_sclear = n
15000
  , $sel:g_selfdestruct:FeeSchedule :: n
g_selfdestruct = n
0
  , $sel:g_selfdestruct_newaccount:FeeSchedule :: n
g_selfdestruct_newaccount = n
0
  , $sel:r_selfdestruct:FeeSchedule :: n
r_selfdestruct = n
24000
  , $sel:g_create:FeeSchedule :: n
g_create = n
32000
  , $sel:g_codedeposit:FeeSchedule :: n
g_codedeposit = n
200
  , $sel:g_call:FeeSchedule :: n
g_call = n
40
  , $sel:g_callvalue:FeeSchedule :: n
g_callvalue = n
9000
  , $sel:g_callstipend:FeeSchedule :: n
g_callstipend = n
2300
  , $sel:g_newaccount:FeeSchedule :: n
g_newaccount = n
25000
  , $sel:g_exp:FeeSchedule :: n
g_exp = n
10
  , $sel:g_expbyte:FeeSchedule :: n
g_expbyte = n
10
  , $sel:g_memory:FeeSchedule :: n
g_memory = n
3
  , $sel:g_txcreate:FeeSchedule :: n
g_txcreate = n
32000
  , $sel:g_txdatazero:FeeSchedule :: n
g_txdatazero = n
4
  , $sel:g_txdatanonzero:FeeSchedule :: n
g_txdatanonzero = n
68
  , $sel:g_transaction:FeeSchedule :: n
g_transaction = n
21000
  , $sel:g_log:FeeSchedule :: n
g_log = n
375
  , $sel:g_logdata:FeeSchedule :: n
g_logdata = n
8
  , $sel:g_logtopic:FeeSchedule :: n
g_logtopic = n
375
  , $sel:g_sha3:FeeSchedule :: n
g_sha3 = n
30
  , $sel:g_sha3word:FeeSchedule :: n
g_sha3word = n
6
  , $sel:g_initcodeword:FeeSchedule :: n
g_initcodeword = n
2
  , $sel:g_copy:FeeSchedule :: n
g_copy = n
3
  , $sel:g_blockhash:FeeSchedule :: n
g_blockhash = n
20
  , $sel:g_extcodehash:FeeSchedule :: n
g_extcodehash = n
400
  , $sel:g_quaddivisor:FeeSchedule :: n
g_quaddivisor = n
20
  , $sel:g_ecadd:FeeSchedule :: n
g_ecadd = n
500
  , $sel:g_ecmul:FeeSchedule :: n
g_ecmul = n
40000
  , $sel:g_pairing_point:FeeSchedule :: n
g_pairing_point = n
80000
  , $sel:g_pairing_base:FeeSchedule :: n
g_pairing_base = n
100000
  , $sel:g_fround:FeeSchedule :: n
g_fround = n
1
  , $sel:r_block:FeeSchedule :: n
r_block = n
2000000000000000000
  , $sel:g_cold_sload:FeeSchedule :: n
g_cold_sload = n
2100
  , $sel:g_cold_account_access:FeeSchedule :: n
g_cold_account_access = n
2600
  , $sel:g_warm_storage_read:FeeSchedule :: n
g_warm_storage_read = n
100
  , $sel:g_access_list_address:FeeSchedule :: n
g_access_list_address = n
2400
  , $sel:g_access_list_storage_key:FeeSchedule :: n
g_access_list_storage_key = n
1900
  }

metropolis :: Num n => FeeSchedule n
metropolis :: forall n. Num n => FeeSchedule n
metropolis = forall n. EIP n
eip160 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. EIP n
eip150 forall a b. (a -> b) -> a -> b
$ forall n. Num n => FeeSchedule n
homestead

-- EIP1108: Reduce alt_bn128 precompile gas costs
-- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1108.md>
eip1108 :: EIP n
eip1108 :: forall n. EIP n
eip1108 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_ecadd:FeeSchedule :: n
g_ecadd = n
150
  , $sel:g_ecmul:FeeSchedule :: n
g_ecmul = n
6000
  , $sel:g_pairing_point:FeeSchedule :: n
g_pairing_point = n
34000
  , $sel:g_pairing_base:FeeSchedule :: n
g_pairing_base = n
45000
  }

-- EIP1884: Repricing for trie-size-dependent opcodes
-- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1884.md>
eip1884 :: EIP n
eip1884 :: forall n. EIP n
eip1884 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_sload:FeeSchedule :: n
g_sload = n
800
  , $sel:g_balance:FeeSchedule :: n
g_balance = n
700
  , $sel:g_extcodehash:FeeSchedule :: n
g_extcodehash = n
700
  }

-- EIP2028: Transaction data gas cost reduction
-- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2028.md>
eip2028 :: EIP n
eip2028 :: forall n. EIP n
eip2028 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_txdatanonzero:FeeSchedule :: n
g_txdatanonzero = n
16
  }

-- EIP2200: Structured definitions for gas metering
-- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2200.md>
eip2200 :: EIP n
eip2200 :: forall n. EIP n
eip2200 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_sload:FeeSchedule :: n
g_sload = n
800
  , $sel:g_sset:FeeSchedule :: n
g_sset = n
20000   -- not changed
  , $sel:g_sreset:FeeSchedule :: n
g_sreset = n
5000  -- not changed
  , $sel:r_sclear:FeeSchedule :: n
r_sclear = n
15000 -- not changed
  }

istanbul :: Num n => FeeSchedule n
istanbul :: forall n. Num n => FeeSchedule n
istanbul = forall n. EIP n
eip1108 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. EIP n
eip1884 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. EIP n
eip2028 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. EIP n
eip2200 forall a b. (a -> b) -> a -> b
$ forall n. Num n => FeeSchedule n
metropolis

  -- EIP2929: Gas cost increases for state access opcodes
  -- <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2929.md>
eip2929 :: EIP n
eip2929 :: forall n. EIP n
eip2929 FeeSchedule n
fees = FeeSchedule n
fees
  { $sel:g_sload:FeeSchedule :: n
g_sload = n
100
  , $sel:g_sreset:FeeSchedule :: n
g_sreset = n
5000 forall a. Num a => a -> a -> a
- n
2100
  , $sel:g_call:FeeSchedule :: n
g_call = n
2600
  , $sel:g_balance:FeeSchedule :: n
g_balance = n
2600
  , $sel:g_extcode:FeeSchedule :: n
g_extcode = n
2600
  , $sel:g_extcodehash:FeeSchedule :: n
g_extcodehash = n
2600
  }

berlin :: Num n => FeeSchedule n
berlin :: forall n. Num n => FeeSchedule n
berlin = forall n. EIP n
eip2929 forall n. Num n => FeeSchedule n
istanbul