The radar is the product.
Every holder has a deterministic position on the circle and a receiver sector sized by balance. The beam moves on every swap — whoever it crosses, it pays.
- POSITION
- 0.00°
- WIDTH
- 0.00°
- COVERAGE
- 0.00%
THE ADDRESS IS PUBLISHED HERE AT LAUNCH · ANY OTHER CONTRACT IS NOT SWEEP
Your balance is your antenna.
Connect a wallet and the protocol reads your position straight from your address. Rewards land in ETH the moment the beam crosses your arc — there is nothing to stake and nothing to position by hand.
- 01 Position is derived from your address and never moves.
- 02 Width grows with balance, under diminishing returns.
- 03 Each crossing splits the fee equally across everyone in range.
Expand your receiver.
More SWEEP means wider reception — with diminishing returns, so no single sector can swallow the circle.
SIMULATION ONLY · NO TRANSACTION IS SENT
- Current Balance
- 4,210
- After Buy
- 7,210
- Current Width
- 3.07°
- New Width
- 4.03°
- Gain
- +0.96°
The beam never stops.
No staking. No epochs. No reward rounds. No manual positioning. Every swap simply moves the beam and settles what it touches.
- 01SWAP
- 02BEAM MOVES
- 03POSITION UPDATES
- 04ACTIVE RECEIVERS
- 05FEE ALLOCATED
- 06ETH CLAIMABLE
position = keccak256(holder) % PRECISION_360
halfWidth = K_WIDTH * sqrt(balance / 1e18)
share = reward / activeReceivers
pendingRewards[holder] += share
Catch the beam.
A small game, nothing more. Lock your receiver the moment the beam crosses it — every hit narrows your sector and speeds the beam up. Three missed locks and the signal is lost.
- Streak
- 0
- Receiver Width
- 44.00°
- Beam Speed
- 1.00×
- Best
- 0
PRESS START
Written into the pool itself.
The radar is not a dashboard bolted onto a token — it is the hook Uniswap v4 calls on every swap. SWEEP is three contracts: the token, the hook that owns the beam, and the vault that holds the ETH. Condensed to the parts that matter:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract SweepRadarHook is BaseHook {
uint256 public constant SUPPLY = 555_000e18;
uint256 public constant BUY_FEE_BPS = 200; // 2%
uint256 public constant SELL_FEE_BPS = 300; // 3%
uint256 public constant PRECISION_360 = 360_000_000; // the dial, in units
uint256 public constant K_WIDTH = 24_000;
uint256 public constant MAX_HALF_WIDTH = PRECISION_360 / 12; // 30°
uint256 public beam; // a point on the dial, not an arc
ISWEEPRewards public immutable rewards; // the vault — cannot be redirected
event BeamMoved(uint256 indexed sweepId, uint256 from, uint256 to, uint256 movement);
/// deterministic, permanent, never assigned by hand
function radarPosition(address holder) public pure returns (uint256) {
return uint256(keccak256(abi.encode(holder))) % PRECISION_360;
}
/// more SWEEP, wider reception — sqrt, and capped at 30° either side
function receiverWidth(uint256 balance) public pure returns (uint256) {
if (balance < 1e18) return 0;
uint256 w = K_WIDTH * sqrt(balance / 1e18);
return w > MAX_HALF_WIDTH ? MAX_HALF_WIDTH : w;
}
function _afterSwap(...) internal override returns (bytes4, int128) {
uint256 fee = _takeFee(isBuy, delta);
// movement is a hash of the swap itself — no oracle, no operator
beam = (beam + _moveBeam(fee, isBuy, delta)) % PRECISION_360;
// only the buckets within 30° of the beam are opened — never a holder loop
address[] memory found = _findReceivers(beam);
// 100% of the fee leaves in the same call; the hook keeps nothing
rewards.allocate{value: fee}(found);
return (IHooks.afterSwap.selector, 0);
}
}
// …and in the vault, the split itself:
function allocate(address[] calldata receivers) external payable {
uint256 share = (msg.value + carry) / receivers.length; // equal, not by width
for (uint256 i; i < receivers.length; ++i) {
pendingRewards[receivers[i]] += share; // pull-based: no ETH is sent here
}
carry = (msg.value + carry) - share * receivers.length; // remainder is never dropped
}
CONDENSED FROM THE REAL SOURCE · READ THE FULL CONTRACTS BEFORE TRADING
Overlapping sectors, one circle.
Receivers are allowed to overlap. Where they do, the field grows brighter — and the fee for that crossing is split equally across everyone in range, whatever their balance.
- POSITION
- 0.00°
- WIDTH
- 0.00°
- COVERAGE
- 0.00%
SCROLL TO SWEEP THE BEAM · HOVER A NODE TO INSPECT ITS RECEIVER
More SWEEP. Wider reception.
Coverage expands with balance while diminishing returns prevent linear domination.
More SWEEP. Wider reception.
555,000 SWEEP. 2% buy, 3% sell. 100% of protocol fees to the sectors the beam crosses.