From 5de70b8043b82de16f942cb165a90955f44946f8 Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Wed, 24 Dec 2025 14:28:36 +0100 Subject: [PATCH 1/8] Add ArbCensoredTransactionsManager precompile --- ArbCensoredTransactionsManager.sol | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 ArbCensoredTransactionsManager.sol diff --git a/ArbCensoredTransactionsManager.sol b/ArbCensoredTransactionsManager.sol new file mode 100644 index 0000000..f847a96 --- /dev/null +++ b/ArbCensoredTransactionsManager.sol @@ -0,0 +1,31 @@ +// Copyright 2025, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.4.21 <0.9.0; + +/** + * @title Enables ability to censor transactions by authorized callers. + * @notice Authorized callers are added/removed through ArbOwner precompile. + * Available in ArbOS version 60 and above + */ +interface ArbCensoredTransactionsManager { + /// @notice Marks the given transaction hash as censored + /// @param txHash The transaction hash to censor + function addCensoredTransaction( + bytes32 txHash + ) external; + + /// @notice Removes censorship mark for the given transaction hash + /// @param txHash The transaction hash to uncensor + function deleteCensoredTransaction( + bytes32 txHash + ) external; + + /// @notice Checks whether the given transaction hash is censored + /// @param txHash The transaction hash to check + /// @return True if censored, false otherwise + function isTransactionCensored( + bytes32 txHash + ) external view returns (bool); +} From 9e9bb9f2d33d0a2c925eaae5157dbe634ba751e9 Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Fri, 26 Dec 2025 14:53:35 +0100 Subject: [PATCH 2/8] ArbOwner: add interfaces to manage transaction censors --- ArbOwner.sol | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/ArbOwner.sol b/ArbOwner.sol index 47c9f6a..bc90613 100644 --- a/ArbOwner.sol +++ b/ArbOwner.sol @@ -63,6 +63,28 @@ interface ArbOwner { /// @notice Available in ArbOS version 41 and above function getAllNativeTokenOwners() external view returns (address[] memory); + /// @notice Add account as a transaction censor (authorized to use ArbCensoredTransactionsManager) + /// @notice Available in ArbOS version 60 and above + function addTransactionCensor( + address newCensor + ) external; + + /// @notice Remove account from the list of transaction censors + /// @notice Available in ArbOS version 60 and above + function removeTransactionCensor( + address censorToRemove + ) external; + + /// @notice See if the user is a transaction censor + /// @notice Available in ArbOS version 60 and above + function isTransactionCensor( + address addr + ) external view returns (bool); + + /// @notice Retrieves the list of transaction censors + /// @notice Available in ArbOS version 60 and above + function getAllTransactionCensors() external view returns (address[] memory); + /// @notice Set how slowly ArbOS updates its estimate of the L1 basefee function setL1BaseFeeEstimateInertia( uint64 inertia From 43f3f066ec91f9cd50d6d8cb68a37f8ef7a8fc2c Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Fri, 26 Dec 2025 17:19:41 +0100 Subject: [PATCH 3/8] Rename: censored -> filtered --- ArbCensoredTransactionsManager.sol | 31 ------------------------------ ArbFilteredTransactionsManager.sol | 31 ++++++++++++++++++++++++++++++ ArbOwner.sol | 8 ++++---- 3 files changed, 35 insertions(+), 35 deletions(-) delete mode 100644 ArbCensoredTransactionsManager.sol create mode 100644 ArbFilteredTransactionsManager.sol diff --git a/ArbCensoredTransactionsManager.sol b/ArbCensoredTransactionsManager.sol deleted file mode 100644 index f847a96..0000000 --- a/ArbCensoredTransactionsManager.sol +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2025, Offchain Labs, Inc. -// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity >=0.4.21 <0.9.0; - -/** - * @title Enables ability to censor transactions by authorized callers. - * @notice Authorized callers are added/removed through ArbOwner precompile. - * Available in ArbOS version 60 and above - */ -interface ArbCensoredTransactionsManager { - /// @notice Marks the given transaction hash as censored - /// @param txHash The transaction hash to censor - function addCensoredTransaction( - bytes32 txHash - ) external; - - /// @notice Removes censorship mark for the given transaction hash - /// @param txHash The transaction hash to uncensor - function deleteCensoredTransaction( - bytes32 txHash - ) external; - - /// @notice Checks whether the given transaction hash is censored - /// @param txHash The transaction hash to check - /// @return True if censored, false otherwise - function isTransactionCensored( - bytes32 txHash - ) external view returns (bool); -} diff --git a/ArbFilteredTransactionsManager.sol b/ArbFilteredTransactionsManager.sol new file mode 100644 index 0000000..eedbd0a --- /dev/null +++ b/ArbFilteredTransactionsManager.sol @@ -0,0 +1,31 @@ +// Copyright 2025, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.4.21 <0.9.0; + +/** + * @title Enables ability to filter transactions by authorized callers. + * @notice Authorized callers are added/removed through ArbOwner precompile. + * Available in ArbOS version 60 and above + */ +interface ArbFilteredTransactionsManager { + /// @notice Marks the given transaction hash as filtered + /// @param txHash The transaction hash to filter + function addFilteredTransaction( + bytes32 txHash + ) external; + + /// @notice Removes filtering mark for the given transaction hash + /// @param txHash The transaction hash to unfilter + function deleteFilteredTransaction( + bytes32 txHash + ) external; + + /// @notice Checks whether the given transaction hash is filtered + /// @param txHash The transaction hash to check + /// @return True if filtered, false otherwise + function isTransactionFiltered( + bytes32 txHash + ) external view returns (bool); +} diff --git a/ArbOwner.sol b/ArbOwner.sol index bc90613..6bae665 100644 --- a/ArbOwner.sol +++ b/ArbOwner.sol @@ -63,22 +63,22 @@ interface ArbOwner { /// @notice Available in ArbOS version 41 and above function getAllNativeTokenOwners() external view returns (address[] memory); - /// @notice Add account as a transaction censor (authorized to use ArbCensoredTransactionsManager) + /// @notice Add account as a transaction censor (authorized to use ArbFilteredTransactionsManager) /// @notice Available in ArbOS version 60 and above function addTransactionCensor( - address newCensor + address censor ) external; /// @notice Remove account from the list of transaction censors /// @notice Available in ArbOS version 60 and above function removeTransactionCensor( - address censorToRemove + address censor ) external; /// @notice See if the user is a transaction censor /// @notice Available in ArbOS version 60 and above function isTransactionCensor( - address addr + address censor ) external view returns (bool); /// @notice Retrieves the list of transaction censors From 38135f2be42850186f8b9ed331a8b09d7a3e951f Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Tue, 30 Dec 2025 11:29:37 +0100 Subject: [PATCH 4/8] ArbFilteredTransactionsManager: add events for added/deleted filtered transactions --- ArbFilteredTransactionsManager.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ArbFilteredTransactionsManager.sol b/ArbFilteredTransactionsManager.sol index eedbd0a..0fef736 100644 --- a/ArbFilteredTransactionsManager.sol +++ b/ArbFilteredTransactionsManager.sol @@ -10,6 +10,12 @@ pragma solidity >=0.4.21 <0.9.0; * Available in ArbOS version 60 and above */ interface ArbFilteredTransactionsManager { + /// @notice Emitted when a transaction hash is added to the filtered transactions list. + event FilteredTransactionAdded(bytes32 indexed txHash); + + /// @notice Emitted when a transaction hash is removed from the filtered transactions list. + event FilteredTransactionDeleted(bytes32 indexed txHash); + /// @notice Marks the given transaction hash as filtered /// @param txHash The transaction hash to filter function addFilteredTransaction( From 422a912a91b617b0a727c6760bd0f5dff8f45f87 Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Mon, 5 Jan 2026 17:17:44 +0100 Subject: [PATCH 5/8] ArbOwner: add setter and getter for transaction filtering feature enabled --- ArbOwner.sol | 6 ++++++ ArbOwnerPublic.sol | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/ArbOwner.sol b/ArbOwner.sol index 6bae665..6cde79e 100644 --- a/ArbOwner.sol +++ b/ArbOwner.sol @@ -41,6 +41,12 @@ interface ArbOwner { uint64 timestamp ) external; + /// @notice Sets the TransactionFilteringFrom time + /// @notice Available in ArbOS version 60 and above + function setTransactionFilteringFrom( + uint64 timestamp + ) external; + /// @notice Add account as a native token owner /// @notice Available in ArbOS version 41 and above function addNativeTokenOwner( diff --git a/ArbOwnerPublic.sol b/ArbOwnerPublic.sol index 50490cf..1437051 100644 --- a/ArbOwnerPublic.sol +++ b/ArbOwnerPublic.sol @@ -27,6 +27,11 @@ interface ArbOwnerPublic { /// @notice Available in ArbOS version 50 and above function getNativeTokenManagementFrom() external view returns (uint64); + /// @notice Retrieves the timestamp from when the transaction filtering + /// modifications are enabled. + /// @notice Available in ArbOS version 60 and above + function getTransactionFilteringFrom() external view returns (uint64); + /// @notice See if the user is a native token owner /// @notice Available in ArbOS version 41 and above function isNativeTokenOwner( From c1f9e0594282f04eacf3b1ccd4b2ac0781e014b3 Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Fri, 9 Jan 2026 12:58:03 +0100 Subject: [PATCH 6/8] Better naming for transaction filterers --- ArbOwner.sol | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ArbOwner.sol b/ArbOwner.sol index 6cde79e..0f09174 100644 --- a/ArbOwner.sol +++ b/ArbOwner.sol @@ -69,27 +69,27 @@ interface ArbOwner { /// @notice Available in ArbOS version 41 and above function getAllNativeTokenOwners() external view returns (address[] memory); - /// @notice Add account as a transaction censor (authorized to use ArbFilteredTransactionsManager) + /// @notice Add account as a transaction filterer (authorized to use ArbFilteredTransactionsManager) /// @notice Available in ArbOS version 60 and above - function addTransactionCensor( - address censor + function AddTransactionFilterer( + address filterer ) external; - /// @notice Remove account from the list of transaction censors + /// @notice Remove account from the list of transaction filterers /// @notice Available in ArbOS version 60 and above - function removeTransactionCensor( - address censor + function removeTransactionFilterer( + address filterer ) external; - /// @notice See if the user is a transaction censor + /// @notice See if the user is a transaction filterer /// @notice Available in ArbOS version 60 and above - function isTransactionCensor( - address censor + function isTransactionFilterer( + address filterer ) external view returns (bool); - /// @notice Retrieves the list of transaction censors + /// @notice Retrieves the list of transaction filterers /// @notice Available in ArbOS version 60 and above - function getAllTransactionCensors() external view returns (address[] memory); + function getAllTransactionFilterers() external view returns (address[] memory); /// @notice Set how slowly ArbOS updates its estimate of the L1 basefee function setL1BaseFeeEstimateInertia( From 3033065dd270577b2abcd4360bdfd472c6b041fe Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Mon, 12 Jan 2026 14:58:55 +0100 Subject: [PATCH 7/8] Add events and public methods for transaction filterers --- ArbOwner.sol | 8 +++++++- ArbOwnerPublic.sol | 20 +++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ArbOwner.sol b/ArbOwner.sol index 0f09174..af2a714 100644 --- a/ArbOwner.sol +++ b/ArbOwner.sol @@ -17,6 +17,12 @@ import {ArbMultiGasConstraintsTypes} from "./ArbMultiGasConstraintsTypes.sol"; * */ interface ArbOwner { + /// @notice Emitted when an address is added as a transaction filterer. + event TransactionFiltererAdded(address indexed filterer); + + /// @notice Emitted when an address is removed as a transaction filterer. + event TransactionFiltererRemoved(address indexed filterer); + /// @notice Add account as a chain owner function addChainOwner( address newOwner @@ -71,7 +77,7 @@ interface ArbOwner { /// @notice Add account as a transaction filterer (authorized to use ArbFilteredTransactionsManager) /// @notice Available in ArbOS version 60 and above - function AddTransactionFilterer( + function addTransactionFilterer( address filterer ) external; diff --git a/ArbOwnerPublic.sol b/ArbOwnerPublic.sol index 1437051..8f53323 100644 --- a/ArbOwnerPublic.sol +++ b/ArbOwnerPublic.sol @@ -27,11 +27,6 @@ interface ArbOwnerPublic { /// @notice Available in ArbOS version 50 and above function getNativeTokenManagementFrom() external view returns (uint64); - /// @notice Retrieves the timestamp from when the transaction filtering - /// modifications are enabled. - /// @notice Available in ArbOS version 60 and above - function getTransactionFilteringFrom() external view returns (uint64); - /// @notice See if the user is a native token owner /// @notice Available in ArbOS version 41 and above function isNativeTokenOwner( @@ -42,6 +37,21 @@ interface ArbOwnerPublic { /// @notice Available in ArbOS version 41 and above function getAllNativeTokenOwners() external view returns (address[] memory); + /// @notice Retrieves the timestamp from when the transaction filtering + /// modifications are enabled. + /// @notice Available in ArbOS version 60 and above + function getTransactionFilteringFrom() external view returns (uint64); + + /// @notice See if the user is a transaction filterer + /// @notice Available in ArbOS version 60 and above + function isTransactionFilterer( + address filterer + ) external view returns (bool); + + /// @notice Retrieves the list of transaction filterers + /// @notice Available in ArbOS version 60 and above + function getAllTransactionFilterers() external view returns (address[] memory); + /// @notice Gets the network fee collector function getNetworkFeeAccount() external view returns (address); From 0e455541b5dc9203506d995b153575f18cf71cdd Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Fri, 16 Jan 2026 10:50:40 +0100 Subject: [PATCH 8/8] ArbOwner and ArbOwnerPublic: polish comments --- ArbOwner.sol | 2 +- ArbOwnerPublic.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ArbOwner.sol b/ArbOwner.sol index af2a714..e04442b 100644 --- a/ArbOwner.sol +++ b/ArbOwner.sol @@ -93,7 +93,7 @@ interface ArbOwner { address filterer ) external view returns (bool); - /// @notice Retrieves the list of transaction filterers + /// @notice Retrieves the list of transaction filterers /// @notice Available in ArbOS version 60 and above function getAllTransactionFilterers() external view returns (address[] memory); diff --git a/ArbOwnerPublic.sol b/ArbOwnerPublic.sol index 8f53323..3223893 100644 --- a/ArbOwnerPublic.sol +++ b/ArbOwnerPublic.sol @@ -48,7 +48,7 @@ interface ArbOwnerPublic { address filterer ) external view returns (bool); - /// @notice Retrieves the list of transaction filterers + /// @notice Retrieves the list of transaction filterers /// @notice Available in ArbOS version 60 and above function getAllTransactionFilterers() external view returns (address[] memory);