Fee Schedule
Fees are charged in three different ways:
- running opcodes
- expanding memory
- calls to EEI methods
Opcodes
All fees for opcodes are currently 1 gas. This needs to be updated before finalising this specification.
Registers
| Opcode |
Price |
| get_local |
1 |
| set_local |
1 |
| tee_local |
1 |
| get_global |
1 |
| set_global |
1 |
Memory
| Opcode |
Price |
| i32.load8_s |
1 |
| i32.load8_u |
1 |
| i32.load16_s |
1 |
| i32.load16_u |
1 |
| i32.load |
1 |
| i64.load8_s |
1 |
| i64.load8_u |
1 |
| i64.load16_s |
1 |
| i64.load16_u |
1 |
| i64.load32_s |
1 |
| i64.load32_u |
1 |
| i64.load |
1 |
| grow_memory |
1 |
| current_memory |
1 |
Flow Control
| Opcode |
Price |
| nop |
1 |
| block |
1 |
| loop |
1 |
| if |
1 |
| br |
1 |
| br_if |
1 |
| br_table |
1 |
| return |
1 |
Calls
| Opcode |
Price |
| call |
1 |
| call_indirect |
1 |
| call_import |
1 |
Constants
| Opcode |
Price |
| i32.const |
1 |
| i64.const |
1 |
32-bit Integer operators
| Opcode |
Price |
| i32.add |
1 |
| i32.sub |
1 |
| i32.mul |
1 |
| i32.div_s |
1 |
| i32.div_u |
1 |
| i32.rem_s |
1 |
| i32.rem_u |
1 |
| i32.and |
1 |
| i32.or |
1 |
| i32.xor |
1 |
| i32.shl |
1 |
| i32.shr_u |
1 |
| i32.shr_s |
1 |
| i32.rotl |
1 |
| i32.rotr |
1 |
| i32.eq |
1 |
| i32.ne |
1 |
| i32.lt_s |
1 |
| i32.le_s |
1 |
| i32.lt_u |
1 |
| i32.le_u |
1 |
| i32.gt_sa |
1 |
| i32.ge_s |
1 |
| i32.gt_u |
1 |
| i32.ge_u |
1 |
| i32.clz |
1 |
| i32.ctz |
1 |
| i32.popcnt |
1 |
| i32.eqz |
1 |
64-bit Integer operators
| Opcode |
Price |
| i64.add |
1 |
| i64.sub |
1 |
| i64.mul |
1 |
| i64.div_s |
1 |
| i64.div_u |
1 |
| i64.rem_s |
1 |
| i64.rem_u |
1 |
| i64.and |
1 |
| i64.or |
1 |
| i64.xor |
1 |
| i64.shl |
1 |
| i64.shr_u |
1 |
| i64.shr_s |
1 |
| i64.rotl |
1 |
| i64.rotr |
1 |
| i64.eq |
1 |
| i64.ne |
1 |
| i64.lt_s |
1 |
| i64.le_s |
1 |
| i64.lt_u |
1 |
| i64.le_u |
1 |
| i64.gt_sa |
1 |
| i64.ge_s |
1 |
| i64.gt_u |
1 |
| i64.ge_u |
1 |
| i64.clz |
1 |
| i64.ctz |
1 |
| i64.popcnt |
1 |
| i64.eqz |
1 |
| Opcode |
Price |
| i32.wrap/i64 |
1 |
| i64.extend_s/i32 |
1 |
| i64.extend_u/i32 |
1 |
Type-parametric operators.
| Opcode |
Price |
| drop |
1 |
| select |
1 |
Other
| Opcode |
Price |
| unreachable |
1 |
Expanding memory
Memory can be expanded in pages, where a page corresponds to 65536 bytes of space.
The EVM1 formula for extending memory is words * 3 + words ^ 2 / 512 where word corresponds to 32 bytes.
From this we can calculate that a 65536 byte page should cost 14336 gas.
Calls to the EEI
Calls to the EEI are charged the same price as their equivalent EVM1 opcode.
| Method |
EVM1 Opcode |
| getAddress |
ADDRESS |
| getBalance |
BALANCE |
| getBlockHash |
BLOCKHASH |
| call |
CALL |
| callDataCopy |
CALLDATACOPY |
| getCallDataSize |
CALLDATASIZE |
| callCode |
CALLCODE |
| callDelegate |
DELEGATECALL |
| storageStore |
SSTORE |
| storageLoad |
SLOAD |
| getCaller |
CALLER |
| getCallValue |
CALLVALUE |
| codeCopy |
CODECOPY |
| getCodeSize |
CODESIZE |
| getBlockCoinbase |
COINBASE |
| create |
CREATE |
| getBlockDifficulty |
DIFFICULTY |
| externalCodeCopy |
EXTCODECOPY |
| getExternalCodeSize |
EXTCODESIZE |
| getGasLeft |
GAS |
| getBlockGasLimit |
GASLIMIT |
| getTxGasPrice |
GASPRICE |
| log |
LOGn |
| getBlockNumber |
NUMBER |
| getTxOrigin |
ORIGIN |
| return |
RETURN |
| selfDestruct |
SELFDESTRUCT |
| getBlockTimestamp |
TIMESTAMP |