Skip to main content


ArbOS provides L2-specific precompiles with methods smart contracts can call the same way they can solidity functions. This reference exhaustively documents the specific calls ArbOS makes available. For more details on the infrastructure that makes this possible, please refer to the ArbOS documentation. For an abbreviated reference on the precompiles we expect users to most often use, please see the common precompiles documentation.

From the perspective of user applications, precompiles live as contracts at the following addresses. Click on any to jump to their section.

PrecompileAddress  Purpose
ArbAddressTable0x66Supporting compression of addresses
ArbAggregator0x6dConfiguring transaction aggregation
ArbBLS0x67Managing BLS keys
ArbDebug0xffTesting tools
ArbFunctionTable  0x68No longer used
ArbGasInfo0x6cInfo about gas pricing
ArbInfo0x65Info about accounts
ArbOwner0x70Chain administration, callable only by chain owner
ArbOwnerPublic0x6bInfo about chain owners
ArbosTest0x69No longer used
ArbRetryableTx0x6eManaging retryables
ArbStatistics0x6fInfo about the pre-Nitro state
ArbSys0x64System-level functionality


Provides the ability to create short-hands for commonly used accounts.

AddressExists(address)Checks if an address exists in the table
Compress(address)Gets bytes that represent the address
Decompress(buffer, offset)  Replaces the compressed bytes at the given offset with those of the corresponding account
Lookup(address)Gets the index of an address in the table
LookupIndex(index)Gets the address at an index in the table
Register(address)Adds an address to the table, shrinking its compressed representation
Size()Gets the number of addresses in the table


Provides aggregators and their users methods for configuring how they participate in L1 aggregation. Arbitrum One's default aggregator is the Sequencer, which a user will prefer unless SetPreferredAggregator is invoked to change it.

Compression ratios are measured in basis points. Methods that are checkmarked are access-controlled and will revert if not called by the aggregator, its fee collector, or a chain owner.

GetPreferredAggregator(account)Gets an account's preferred aggregator
SetPreferredAggregator(aggregator)Sets the caller's preferred aggregator to that provided
GetDefaultAggregator()Gets the chain's default aggregator
SetDefaultAggregator(default)Sets the chain's default aggregator✔️
GetCompressionRatio(aggregator)Gets the aggregator's compression ratio
SetCompressionRatio(aggregator, ratio)Set the aggregator's compression ratio✔️
GetFeeCollector(aggregator)Gets an aggregator's fee collector
SetFeeCollector(aggregator, collector)  Sets an aggregator's fee collector✔️
Deprecated Methods
GetTxBaseFee(aggregator)Returns 0
SetTxBaseFee(aggregator, fee)Does nothing


Provides a registry of BLS public keys for accounts.

RegisterAltBN128(x0, x1, y0, y1)  Associate an AltBN128 public key with the caller's address
GetAltBN128(account)Gets the AltBN128 public key associated with an address
RegisterBLS12381(key)Associate a BLS 12-381 public key with the caller's address
GetBLS12381(account)Gets the BLS 12-381 public key associated with an address
Deprecated Methods
Register(x0, x1, y0, y1)  equivalent to registerAltBN128
GetPublicKey(account)equivalent to getAltBN128


Provides mechanisms useful for testing. The methods of ArbDebug are only available for chains with the AllowDebugPrecompiles chain parameter set. Otherwise, calls to this precompile will revert.

BecomeChainOwner()Caller becomes a chain owner
Events(flag, value)  Emit events with values based on the args provided
Basic  Emitted in Events for testing
MixedEmitted in Events for testing
StoreNever emitted (used for testing log sizes)


Provided aggregator's the ability to manage function tables, to enable one form of transaction compression. The Nitro aggregator implementation does not use these, so these methods have been stubbed and their effects disabled. They are kept for backwards compatibility.

Get(address, index)  Reverts since the table is empty
Size(address)Returns the empty table's size, which is 0
Upload(bytes)Does nothing


Provides insight into the cost of using the chain. These methods have been adjusted to account for Nitro's heavy use of calldata compression. Of note to end-users, we no longer make a distinction between non-zero and zero-valued calldata bytes.

GetPricesInWeiWithAggregator(aggregator)Get prices in wei when using the provided aggregator
GetPricesInWei()Get prices in wei when using the caller's preferred aggregator
GetPricesInArbGasWithAggregator(aggregator)Get prices in ArbGas when using the provided aggregator
GetPricesInArbGas()Get prices in ArbGas when using the caller's preferred aggregator
GetGasAccountingParams()Get the chain speed limit, pool size, and tx gas limit
GetMinimumGasPrice()Get the minimum gas price needed for a transaction to succeed
GetGasPoolSeconds()Get the number of seconds worth of the speed limit the gas pool contains
GetGasPoolTarget()Get the target fullness in bips the pricing model will try to keep the pool at
GetGasPoolWeight()Get the extent in bips to which the pricing model favors filling the pool over increasing speeds
GetRateEstimate()Get ArbOS's estimate of the amount of gas being burnt per second
GetRateEstimateInertia()Get how slowly ArbOS updates its estimate the amount of gas being burnt per second
GetL1BaseFeeEstimate()Get ArbOS's estimate of the L1 basefee in wei
GetL1BaseFeeEstimateInertia()Get how slowly ArbOS updates its estimate of the L1 basefee
GetL1GasPriceEstimate()Deprecated -- Same as getL1BaseFeeEstimate()
GetCurrentTxL1GasFees()Get L1 gas fees paid by the current transaction


Provides the ability to lookup basic info about accounts and contracts.

GetBalance(account)  Retrieves an account's balance
GetCode(account)Retrieves a contract's deployed code


Provides a method of burning arbitrary amounts of gas, which exists for historical reasons. In Classic, ArbosTest had additional methods only the zero address could call. These have been removed since users don't use them and calls to missing methods revert.

MethodsNitro changes
BurnArbGas(amount)  unproductively burns the amount of L2 ArbGas  Now pure


Provides owners with tools for managing the rollup. Calls by non-owners will always revert.

Most of Arbitrum Classic's owner methods have been removed since they no longer make sense in Nitro:

  • What were once chain parameters are now parts of ArbOS's state, and those that remain are set at genesis.
  • ArbOS upgrades happen with the rest of the system rather than being independent
  • Exemptions to address aliasing are no longer offered. Exemptions were intended to support backward compatibility for contracts deployed before aliasing was introduced, but no exemptions were ever requested.
AddChainOwner(account)Add account as a chain owner
RemoveChainOwner(account)Remove account from the list of chain owners
IsChainOwner(account)See if account is a chain owner
GetAllChainOwners()Retrieves the list of chain owners
SetL1BaseFeeEstimate(price)Set the L1 basefee estimate directly, bypassing the autoregression
SetL1BaseFeeEstimateInertia(inertia)Set how slowly ArbOS updates its estimate of the L1 basefee
SetL2GasPrice(price)Set the L2 gas price directly, bypassing the pool calculus
SetMinimumGasPrice(price)Set the minimum gas price needed for a transaction to succeed
SetSpeedLimit(limit)Set the computational speed limit for the chain
SetGasPoolSeconds(seconds)Set the number of seconds worth of the speed limit the gas pool contains
SetGasPoolTarget(target)Set the target fullness in bips the pricing model will try to keep the pool at
SetGasPoolWeight(weight)Set the extent in bips to which the pricing model favors filling the pool over increasing speeds
SetRateEstimateInertia(inertia)Set how slowly ArbOS updates its estimate the amount of gas being burnt per second
SetMaxTxGasLimit(limit)Set the maximum size a tx (and block) can be
GetNetworkFeeAccount()Get the network fee collector
SetNetworkFeeAccount(account)Set the network fee collector
OwnerActs  Emitted when a successful call is made to this precompile


Provides non-owners with info about the current chain owners.

IsChainOwner(account)  See if account is a chain owner
GetAllChainOwners()Gets the list of chain owners
GetNetworkFeeAccount()Gets the network fee collector


Provides methods for managing retryables. The model has been adjusted for Nitro, most notably in terms of how retry transactions are scheduled. For more information on retryables, please see the retryable documentation.

MethodsNitro changes
Cancel(ticket)Cancel the ticket and refund its callvalue to its beneficiary
GetBeneficiary(ticket)  Gets the beneficiary of the ticket
GetLifetime()Gets the default lifetime period a retryable has at creationReverts when not found
GetTimeout(ticket)Gets the timestamp for when ticket will expire
Keepalive(ticket)Adds one lifetime period to the ticket's expiryDoesn't add callvalue
Redeem(ticket)Schedule an attempt to redeem the retryable, donating all of the call's gas  Happens in a future tx
EventsNitro Changes
TicketCreatedEmitted when creating a retryable
LifetimeExtended  Emitted when extending a retryable's expiry  
RedeemScheduledEmitted when scheduling a retryableReplaces Redeemed
CanceledEmitted when cancelling a retryable


Provides statistics about the chain as of just before the Nitro upgrade. In Arbitrum Classic, this was how a user would get info such as the total number of accounts, but there are better ways to get that info in Nitro.

GetStats()  Returns the current block number and some statistics about the rollup's pre-Nitro state


Provides system-level functionality for interacting with L1 and understanding the call stack.

MethodsNitro changes
ArbBlockNumber()Gets the current L2 block number
ArbBlockHash(blocknum)Gets the L2 block hash at blocknum, if blocknum is sufficiently recent
ArbChainID()Gets the chain's ChainID
ArbOSVersion()Gets the current ArbOS versionNow view
GetStorageGasAvailable()Returns 0 since Nitro has no concept of storage gasNow always 0
IsTopLevelCall()Checks if the caller is top-level (i.e. if the caller was called directly by an EOA or an L1 contract)
MapL1SenderContractAddressToL2Alias(contract, unused)  Gets contract's L2 alias2nd arg is unused
WasMyCallersAddressAliased()Checks if the caller's caller was aliased
MyCallersAddressWithoutAliasing()Gets the caller's caller without any potential address aliasingNew outbox scheme
SendTxToL1(destination, calldataForL1)Sends a transaction to L1, adding it to the outbox; callvalue is sent to L1 attached to the sent transactionNew outbox scheme
SendMerkleTreeState()Gets the root, size, and partials of the outbox Merkle tree stateNew outbox scheme
WithdrawEth(destination)Send callvalue to the destination address on L1
L2ToL1Transaction  Logs a send tx from L2 to L1, including data for outbox proving
SendMerkleUpdateLogs a new merkle branch needed for constructing outbox proofs
Removed Methods
GetStorageAt(account, index)  Nitro doesn't need this introspection, and users couldn't call it
GetTransactionCount(account)Nitro doesn't need this introspection, and users couldn't call it