Skip to main content
The USDC contract enforces blocklist restrictions at runtime. The Memo and Multicall3From contracts route transactions while preserving the original msg.sender through the CallFrom precompile; your monitoring must attribute these to the original sender. Subscribe to Blocklisted and UnBlocklisted events to maintain a local copy of the blocklist.

Prerequisites

Before you begin:
  • Access to an Arc RPC endpoint (https://rpc.testnet.arc.io) or WebSocket (wss://rpc.testnet.arc.io)
  • Familiarity with Ethereum event log filtering and transaction tracing
  • A local database or cache for storing blocklisted addresses
  • Understanding of your regulatory obligations (AML/CFT screening requirements)

Contracts and addresses

Steps

Step 1. Understand blocklist enforcement

Arc enforces the USDC blocklist across multiple stages of the transaction lifecycle:

Step 2. Monitor blocklist events

Subscribe to the Blocklisted and UnBlocklisted events on the USDC contract to maintain a real-time view of restricted addresses.
Build transfer history from the system emitter (0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE), not the ERC-20 contract (0x3600000000000000000000000000000000000000). Native USDC transfers emit no log at the ERC-20 address, so filtering on the ERC-20 address alone misses them. An ERC-20 transfer() emits from both addresses, so filtering on both double-counts every ERC-20 transfer.

Step 3. Include Memo and Multicall3From in your monitoring scope

The Memo and Multicall3From contracts use the CallFrom precompile to execute calls on behalf of the original sender. The blocklist is still enforced (the CallFrom precompile checks the original sender’s blocklist status), but compliance monitors must attribute activity correctly.
If you only monitor direct from addresses in transaction receipts, you will miss the true sender for transactions routed through Memo or Multicall3From. You must inspect calls to these contracts and attribute them to the original msg.sender.

Step 4. Build a transaction decision tree

Use the following logic to determine whether a transaction involves a blocklisted address:

Step 5. Integrate compliance vendor APIs

Connect your monitoring pipeline to Elliptic or TRM Labs for automated risk scoring and sanctions screening. These vendors provide Arc-compatible APIs for real-time transaction analysis.
For vendor-specific integration details, see Compliance vendors. When your own system submits a USDC transfer, also check receipt.status after it confirms. A blocklist revert is onchain: the transaction is included and gas is consumed, but state rolls back. Monitoring Blocklisted events won’t catch reverts that already occurred; receipt.status === 0 is the authoritative signal.

See also