Overview
TheBondToken contract (Across Bond Token, or ABT) is a specialized WETH9-based token that adds permissioning controls to protect the HubPool from unauthorized root bundle proposals. It serves as the required bond token for data workers submitting proposals.
Location: contracts/BondToken.solSymbol: ABT (Across Bond Token)
Based on: WETH9 (Wrapped Ether)
Purpose
BondToken dramatically reduces the attack surface of the HubPool by:- Requiring explicit approval before addresses can submit root bundle proposals
- Preventing unauthorized actors from staking bonds and proposing malicious bundles
- Maintaining permissionless dispute capabilities (anyone can still dispute)
- Providing a governance-controlled allowlist for proposers
Key Design Features
WETH9 Compatibility
BondToken extends WETH9, providing:- 1:1 backing with Ether
- Standard ERC-20 interface
- Deposit and withdrawal functions
- Compatibility with existing DeFi tooling
Selective Transfer Restrictions
Unlike typical tokens, BondToken only restricts transfers to the HubPool and only for unauthorized proposers. All other transfers remain permissionless.Dispute Preservation
The permissioning does not affect dispute capabilities—any address can transfer ABT to the HubPool to dispute a bundle, maintaining the protocol’s decentralized security model.Contract Structure
Core Functions
Constructor
Initializes the BondToken with a reference to the HubPool._hubPool: Address of the target HubPool contract
setProposer
Enables or disables an address as an allowed proposer.proposer: The address to modifyenabled:trueto allow proposing,falseto revoke
ProposerModified(proposer, enabled)
Example:
transferFrom
Overrides WETH9’stransferFrom to add permissioning logic.
src: Source addressdst: Destination addressamt: Amount to transfer
true on success
Logic:
- Destination is the HubPool, AND
- Source is not an approved proposer, AND
- Source is the current proposer of an active bundle
How It Works
Proposal Flow with BondToken
- Data Worker Approval: Governance calls
setProposer(dataWorker, true) - Depositing Ether: Data worker deposits ETH to receive ABT:
- Approval: Data worker approves HubPool to spend ABT:
- Proposal Submission: Data worker calls
HubPool.proposeRootBundle():- HubPool calls
bondToken.transferFrom(dataWorker, hubPool, bondAmount) - BondToken checks if data worker is in
proposersmapping - If authorized, transfer succeeds and proposal is recorded
- HubPool calls
Dispute Flow (Permissionless)
Any address can dispute, regardless of proposer status:- Disputer deposits ETH to receive ABT
- Disputer approves HubPool
- Disputer calls
HubPool.disputeRootBundle() - BondToken allows transfer because disputer is not the current proposer (the check
HUB_POOL.rootBundleProposal().proposer != srcpasses)
Security Considerations
HubPool State Dependency
ThetransferFrom verification relies on the HubPool’s internal state ordering:
bondToken.safeTransferFrom() after updating proposedRootBundle.proposer. Changing the order of HubPool operations could invalidate this verification.
Attack Surface Reduction
Without BondToken, any address with sufficient capital could:- Stake a bond
- Propose a malicious root bundle
- Force the protocol into a dispute/resolution cycle
Governance Control
Theproposers mapping is controlled by the contract owner (governance), ensuring:
- Only trusted data workers can propose
- Compromised data workers can be quickly removed
- Emergency response to security incidents
Integration with HubPool
HubPool is configured to use BondToken as the required bond token:proposeRootBundle(), HubPool attempts:
Staking and Bonding
Bond Requirements
- Data workers must hold sufficient ABT to cover the bond amount
- Bond amounts are configurable per proposal based on protocol parameters
- Bonds are returned after successful execution or dispute resolution
Slashing
If a proposal is disputed and found invalid:- Data worker’s bond is slashed
- Slashed funds are distributed to the disputer as a reward
- The data worker may be removed from the proposers list
Related Contracts
- HubPool: Consumes BondToken for proposal bonds
- WETH9: Base implementation for wrapping ETH
- Optimistic Oracle (UMA): Resolves disputes over invalid proposals