Skip to main content

ReflexAfterSwap

Abstract base contract for DEX plugin integration with failsafe mechanisms.

Constructor​

constructor(address _router, bytes32 _configId)

Parameters:

  • _router - Address of the ReflexRouter contract
  • _configId - Configuration ID for profit distribution

Validation:

  • Router address must be non-zero
  • Fetches admin address from the router contract

State Variables​

address reflexRouter;      // Address of the Reflex router contract
address reflexAdmin; // Address of the reflex admin (authorized controller)
bytes32 reflexConfigId; // Configuration ID for profit distribution

Administrative Functions​

setReflexRouter​

function setReflexRouter(address _router) external onlyReflexAdmin

Updates the Reflex router address and refreshes admin.

Parameters:

  • _router - New router address to set

Access: Reflex admin only

setReflexConfigId​

function setReflexConfigId(bytes32 _configId) external onlyReflexAdmin

Updates the configuration ID for profit distribution.

Parameters:

  • _configId - New configuration ID to set

Access: Reflex admin only

View Functions​

getRouter​

function getRouter() public view returns (address)

Returns the current router address.

getReflexAdmin​

function getReflexAdmin() external view returns (address)

Returns the current reflex admin address.

getConfigId​

function getConfigId() external view returns (bytes32)

Returns the current configuration ID for profit distribution.

Internal Functions​

_reflexAfterSwap​

function _reflexAfterSwap(
bytes32 triggerPoolId,
int256 amount0Delta,
int256 amount1Delta,
bool zeroForOne,
address recipient
) internal gracefulNonReentrant returns (uint256 profit, address profitToken)

Main entry point for post-swap profit extraction via backrunning.

Parameters:

  • triggerPoolId - Unique identifier for the pool that triggered the swap
  • amount0Delta - The change in token0 balance from the original swap
  • amount1Delta - The change in token1 balance from the original swap
  • zeroForOne - Direction of the original swap (true if token0 → token1)
  • recipient - Address that should receive the extracted profits

Returns:

  • profit - Amount of profit extracted (0 if router call fails)
  • profitToken - Address of the token in which profit was extracted (address(0) if failed)

Features:

  • ✅ Failsafe operation with try-catch mechanism
  • ✅ Router failures won't break main swap operations
  • ✅ Reentrancy protection via graceful reentrancy guard
  • ✅ Automatic profit distribution using configured settings

Modifiers​

onlyReflexAdmin​

modifier onlyReflexAdmin() {
require(msg.sender == reflexAdmin, "Caller is not the reflex admin");
_;
}

Restricts access to reflex admin only.

Implementation Example​

pragma solidity ^0.8.20;

import "@reflex/contracts/base/ReflexAfterSwap.sol";

contract AlgebraPlugin is ReflexAfterSwap {
address public immutable pool;

constructor(
address _reflexRouter,
address _pool,
bytes32 _configId
) ReflexAfterSwap(_reflexRouter, _configId) {
pool = _pool;
}

modifier onlyPool() {
require(msg.sender == pool, "Only pool can call");
_;
}

function afterSwap(
address,
address,
bool zeroForOne,
int256 amount0Delta,
int256 amount1Delta,
uint160,
uint128,
int24,
bytes calldata hookData
) external override onlyPool returns (bytes4) {
// Extract recipient from hook data
address recipient = abi.decode(hookData, (address));

// Trigger backrun using base contract's internal function
_reflexAfterSwap(
bytes32(uint256(uint160(pool))),
amount0Delta,
amount1Delta,
zeroForOne,
recipient
);

return this.afterSwap.selector;
}
}

Error Messages​

  • "Invalid router address" - Router address is zero in constructor or setReflexRouter
  • "Caller is not the reflex admin" - Access control for admin-only functions