# Transaction Fees

The transaction fee for the current Klaytn virtual machine (KLVM) is calculated as follows:

(Transaction Fee) := (Gas Used) * (Base Fee)

- The
`Gas Used`

is computed by KLVM based on the gas cost of the opcode and the intrinsic gas cost. `Base Fee`

is the actual gas price used for the transaction. It has the same meaning as the`Effective Gas Price`

.

This calculated transaction fee is subtracted from the sender's or fee payer's account balance, depending on the transaction.

Every action that changes the state of the blockchain requires gas. When a node processes a user's transaction, such as sending KLAY, using KIP-7 tokens, or executing a contract, the user has to pay for the computation and storage usage. The payment amount is decided by the amount of

`gas`

required.`Gas`

is a measuring unit representing how much calculation is needed to process the user's transaction.Since the Klaytn v1.9.0 hard fork, a dynamic gas fee mechanism has replaced the existing fixed fee policy. Dynamic gas fee policy provides a stable service to users by preventing network abuse and storage overuse. The gas fee changes according to the network situation. Seven parameters affect the

`base fee(gas fee)`

:- 1.PREVIOUS_BASE_FEE: Base fee of the previous block
- 2.GAS_USED_FOR_THE_PREVIOUS_BLOCK: Gas used to process all transactions of the previous block
- 3.GAS_TARGET: The gas amount that determines the increase or decrease of the base fee (30 million at the moment)
- 4.MAX_BLOCK_GAS_USED_FOR_BASE_FEE: Implicit block gas limit to enforce the max basefee change rate (60 million at the moment)
- 5.BASE_FEE_DELTA_REDUCING_DENOMINATOR: The value to set the maximum base fee change to 5% per block (20 at the moment, can be changed later by governance)
- 6.UPPER_BOUND_BASE_FEE: The maximum value for the base fee (750 ston at the moment, can be changed later by governance)
- 7.LOWER_BOUND_BASE_FEE: The minimum value for the base fee (25 ston at the moment, can be changed later by governance)

The basic idea of this algorithm is that the

`base fee`

would go up if the gas used exceeds the base gas and vice versa. It is closely related to the number of transactions in the network and the gas used in the process. There is an upper and lower limit for the `base fee`

to prevent the fee from increasing or decreasing indefinitely. There is also a cap for the gas and an adjustment value for the fluctuation to prevent abrupt changes in the `base fee`

. The values can be changed by governance.(BASE_FEE_CHANGE_RATE) = (GAS_USED_FOR_THE_PREVIOUS_BLOCK - GAS_TARGET)

(ADJUSTED_BASE_FEE_CHANGE_RATE) = (BASE_FEE_CHANGE_RATE) / (GAS_TARGET) / (BASE_FEE_DELTA_REDUCING_DENOMINATOR)

(BASE_FEE_CHANGE_RANGE) = (PREVIOUS_BASE_FEE) * (ADJUSTED_BASE_FEE_CHANGE_RATE)

(BASE_FEE) = (PREVIOUS_BASE_FEE) + (BASE_FEE_CHANGE_RANGE)

The

`base fee`

is calculated for every block; there could be changes every second. Transactions from a single block use the same `base fee`

to calculate transaction fees. Only transactions with a gas price higher than the block `base fee`

can be included in the block. Half of the transaction fee for each block is burned (BURN_RATIO = 0.5, cannot be changed by governance).NOTE: An important feature that sets Klaytn apart from Ethereum's EIP-1559 is that it does not have tips. Klaytn follows the First Come, First Served(FCFS) principle for its transactions.

Klaytn currently does not provide a way to replace a transaction using the unit price but may support different methods for the transaction replacement in the future. Note that in Ethereum, a transaction with a given nonce can be replaced by a new one with a higher gas price.

Basically, Klaytn is keeping compatibility with Ethereum. So Klaytn's gas table is pretty similar with that of Ethereum. But there are some features unique to Klaytn that require several new constants.

NOTE: The gas table has changed with the

`IstanbulEVM`

protocol upgrade, or the "hard fork". If you want the previous document, please refer to previous document.`IstanbulEVM`

protocol upgrade block number is as follows.- Baobab Testnet:
`#75373312`

- Cypress Mainnet:
`#86816005`

Item | Gas | Description |
---|---|---|

G_zero | 0 | Nothing paid for operations of the set Wzero |

G_base | 2 | Amount of gas to pay for operations of the set Wbase |

G_verylow | 3 | Amount of gas to pay for operations of the set Wverylow |

G_low | 5 | Amount of gas to pay for operations of the set Wlow |

G_mid | 8 | Amount of gas to pay for operations of the set Wmid |

G_high | 10 | Amount of gas to pay for operations of the set Whigh |

G_blockhash | 20 | Payment for BLOCKHASH operation |

G_extcode | 700 | Amount of gas to pay for operations of the set Wextcode |

G_balance | 700 | Amount of gas to pay for a BALANCE operation |

G_sload | 800 | Paid for a SLOAD operation |

G_jumpdest | 1 | Paid for a JUMPDEST operation |

G_sset | 20000 | Paid for an SSTORE operation when the storage value is set to non-zero from zero |

G_sreset | 5000 | Paid for an SSTORE operation when the storage value’s zeroness remains unchanged or is set to zero |

G_sclear | 15000 | Refund given (added into refund counter) when the storage value is set to zero from non-zero |

R_selfdestruct | 24000 | Refund given (added into refund counter) for self-destructing an account |

G_selfdestruct | 5000 | Amount of gas to pay for a SELFDESTRUCT operation |

G_create | 32000 | Paid for a CREATE operation |

G_codedeposit | 200 | Paid per byte for a CREATE operation to succeed in placing code into state |

G_call | 700 | Paid for a CALL operation |

G_callvalue | 9000 | Paid for a non-zero value transfer as part of the CALL operation |

G_callstipend | 2300 | A stipend for the called contract subtracted from Gcallvalue for a non-zero value transfer |

G_newaccount | 25000 | Paid for a CALL or SELFDESTRUCT operation which creates an account |

G_exp | 10 | Partial payment for an EXP operation |

G_expbyte | 50 | Partial payment when multiplied by dlog256(exponent)e for the EXP operation |

G_memory | 3 | Paid for every additional word when expanding memory |

G_txcreate | 32000 | Paid by all contract-creating transactions |

G_transaction | 21000 | Paid for every transaction |

G_log | 375 | Partial payment for a LOG operation |

G_logdata | 8 | Paid for each byte in a LOG operation’s data |

G_logtopic | 375 | Paid for each topic of a LOG operation |

G_sha3 | 30 | Paid for each SHA3 operation |

G_sha3word | 6 | Paid for each word (rounded up) for input data to a SHA3 operation |

G_copy | 3 | Partial payment for *COPY operations, multiplied by words copied, rounded up |

G_blockhash | 20 | Payment for BLOCKHASH operation |

G_extcodehash | 700 | Paid for getting keccak256 hash of a contract's code |

G_create2 | 32000 | Paid for opcode CREATE2 which bahaves identically with CREATE but use different arguments |

Precompiled contracts are special kind of contracts which usually perform complex cryptographic computations and are initiated by other contracts.

Item | Gas | Description |
---|---|---|

EcrecoverGas | 3000 | Perform ECRecover operation |

Sha256BaseGas | 60 | Perform sha256 hash operation |

Sha256PerWordGas | 12 | |

Ripemd160BaseGas | 600 | Perform Ripemd160 operation |

Ripemd160PerWordGas | 120 | |

IdentityBaseGas | 15 | |

IdentityPerWordGas | 3 | |

ModExpQuadCoeffDiv | 20 | |

Bn256AddGas | 150 | Perform Bn256 elliptic curve operation |

Bn256ScalarMulGas | 6000 | |

Bn256PairingBaseGas | 45000 | |

Bn256PairingPerPointGas | 34000 | |

VMLogBaseGas | 100 | Write logs to node's log file - Klaytn only |

VMLogPerByteGas | 20 | Klaytn only |

FeePayerGas | 300 | Get feePayer's address - Klaytn only |

ValidateSenderGas | 5000 per signature | Validate the sender's address and signature - Klaytn only |

Total gas of those items which has XXXBaseGas and XXXPerWordGas (e.g. Sha256BaseGas, Sha256PerWordGas) are calculated as

TotalGas = XXXBaseGas + (number of words * XXXPerWordGas)

ValidateSenderGas have to be paid per signature basis.

TotalGas = number of signatures * ValidateSenderGas

Blake2f gas cost is calculated based on the below formula.

`input`

is the input of the blake2f call.Gas = uint64(binary.BigEndian.Uint32(input[0:4]))

Item | Gas | Description |
---|---|---|

TxAccountCreationGasPerKey | 20000 | Gas required for a key-pair creation |

TxValidationGasPerKey | 15000 | Gas required for a key validation |

TxGasAccountUpdate | 21000 | Gas required for an account update |

TxGasFeeDelegated | 10000 | Gas required for a fee delegation |

TxGasFeeDelegatedWithRatio | 15000 | Gas required for a fee delegation with ratio |

TxGasCancel | 21000 | Gas required to cancel a transaction which has a same nonce |

TxGasValueTransfer | 21000 | Gas required to transfer KLAY |

TxGasContractExecution | 21000 | Base gas for contract execution |

TxDataGas | 100 | Gas required per transaction's single byte |

Gas for payload data is calculated as below

GasPayload = number_of_bytes * TxDataGas

TxType | Gas |
---|---|

LegacyTransaction | TxGas + PayloadGas + KeyValidationGas |

ValueTransfer | TxGasValueTransfer + KeyValidationGas |

ValueTransferMemo | TxGasValueTransfer + PayloadGas + KeyValidationGas |

AccountUpdate | TxGasAccountUpdate + KeyCreationGas + KeyValidationGas |

SmartContractDeploy | TxGasContractCreation + PayloadGas + KeyValidationGas |

SmartContractExecution | TxGasContractExecution + PayloadGas + KeyValidationGas |

Cancel | TxGasCancel + KeyValidationGas |

KeyValidationGas is defined as below based on the key type,

Key Type | Gas |
---|---|

Nil | N/A |

Legacy | 0 |

Fail | 0 |

Public | 0 |

MultiSig | (number of signatures - 1) * GasValidationPerKey (15000) |

RoleBased | Based on keys in the role used in the validation |

KeyCreationGas is defined as below based on the key type,

Key Type | Gas |
---|---|

Nil | N/A |

Legacy | 0 |

Fail | 0 |

Public | GasCreationPerKey (20000) |

MultiSig | (keys) * GasCreationPerKey |

RoleBased | Gas fee calculated based on keys in each role. e.g., GasRoleTransaction = (keys) GasCreationPerKey GasRoleAccountUpdate = (keys) GasCreationPerKey GasRoleFeePayer = (keys) * GasCreationPerKey |

Last modified 1mo ago