Files
smom-dbis-138/contracts/bridge/atomic/AtomicSettlementRouter.sol
defiQUG 76aa419320 feat: bridges, PMM, flash workflow, token-aggregation, and deployment docs
- CCIP/trustless bridge contracts, GRU tokens, DEX/PMM tests, reserve vault.
- Token-aggregation service routes, planner, chain config, relay env templates.
- Config snapshots and multi-chain deployment markdown updates.
- gitignore services/btc-intake/dist/ (tsc output); do not track dist.

Run forge build && forge test before deploy (large solc graph).

Made-with: Cursor
2026-04-07 23:40:52 -07:00

60 lines
2.0 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IAtomicSettlementAdapter} from "./interfaces/IAtomicSettlementAdapter.sol";
contract AtomicSettlementRouter is AccessControl {
using SafeERC20 for IERC20;
bytes32 public constant COORDINATOR_ROLE = keccak256("COORDINATOR_ROLE");
bytes32 public constant ADAPTER_MANAGER_ROLE = keccak256("ADAPTER_MANAGER_ROLE");
mapping(bytes32 => address) public adapters;
event AdapterSet(bytes32 indexed settlementMode, address indexed adapter);
event SettlementExecuted(
bytes32 indexed obligationId,
bytes32 indexed settlementMode,
address indexed token,
uint256 amount,
bytes32 settlementId
);
error MissingAdapter();
constructor(address admin) {
_grantRole(DEFAULT_ADMIN_ROLE, admin);
_grantRole(ADAPTER_MANAGER_ROLE, admin);
}
function setAdapter(bytes32 settlementMode, address adapter) external onlyRole(ADAPTER_MANAGER_ROLE) {
adapters[settlementMode] = adapter;
emit AdapterSet(settlementMode, adapter);
}
function executeSettlement(
bytes32 obligationId,
bytes32 settlementMode,
address token,
uint256 amount,
address recipient,
bytes calldata data
) external payable onlyRole(COORDINATOR_ROLE) returns (bytes32 settlementId) {
address adapter = adapters[settlementMode];
if (adapter == address(0)) revert MissingAdapter();
IERC20(token).safeTransfer(adapter, amount);
settlementId = IAtomicSettlementAdapter(adapter).executeSettlement{value: msg.value}(
obligationId,
token,
amount,
recipient,
data
);
emit SettlementExecuted(obligationId, settlementMode, token, amount, settlementId);
}
}