142 lines
5.1 KiB
Solidity
142 lines
5.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
import "@openzeppelin/contracts/access/AccessControl.sol";
|
|
import "../interop/BridgeRegistry.sol";
|
|
import "../../vault/VaultFactory.sol";
|
|
import "../../vault/tokens/DepositToken.sol";
|
|
|
|
/**
|
|
* @title VaultBridgeIntegration
|
|
* @notice Automatically registers vault deposit tokens with BridgeRegistry
|
|
* @dev Extends VaultFactory to auto-register deposit tokens on creation
|
|
*/
|
|
contract VaultBridgeIntegration is AccessControl {
|
|
bytes32 public constant INTEGRATOR_ROLE = keccak256("INTEGRATOR_ROLE");
|
|
|
|
VaultFactory public vaultFactory;
|
|
BridgeRegistry public bridgeRegistry;
|
|
|
|
// Default bridge configuration for vault tokens
|
|
uint256 public defaultMinBridgeAmount = 1e18; // 1 token minimum
|
|
uint256 public defaultMaxBridgeAmount = 1_000_000e18; // 1M tokens maximum
|
|
uint8 public defaultRiskLevel = 50; // Medium risk
|
|
uint256 public defaultBridgeFeeBps = 10; // 0.1% default fee
|
|
|
|
// Destination chain IDs allowed by default (Polygon, Optimism, Base, Arbitrum, Avalanche, BNB Chain, Monad)
|
|
uint256[] public defaultDestinations;
|
|
|
|
event DepositTokenRegistered(
|
|
address indexed depositToken,
|
|
address indexed vault,
|
|
uint256[] destinationChainIds
|
|
);
|
|
|
|
constructor(
|
|
address admin,
|
|
address vaultFactory_,
|
|
address bridgeRegistry_
|
|
) {
|
|
_grantRole(DEFAULT_ADMIN_ROLE, admin);
|
|
_grantRole(INTEGRATOR_ROLE, admin);
|
|
|
|
require(vaultFactory_ != address(0), "VaultBridgeIntegration: zero vault factory");
|
|
require(bridgeRegistry_ != address(0), "VaultBridgeIntegration: zero bridge registry");
|
|
|
|
vaultFactory = VaultFactory(vaultFactory_);
|
|
bridgeRegistry = BridgeRegistry(bridgeRegistry_);
|
|
|
|
// Set default destinations (EVM chains only for now)
|
|
defaultDestinations.push(137); // Polygon
|
|
defaultDestinations.push(10); // Optimism
|
|
defaultDestinations.push(8453); // Base
|
|
defaultDestinations.push(42161); // Arbitrum
|
|
defaultDestinations.push(43114); // Avalanche
|
|
defaultDestinations.push(56); // BNB Chain
|
|
defaultDestinations.push(10143); // Monad (example chain ID)
|
|
defaultDestinations.push(42793); // Etherlink (Tezos EVM L2)
|
|
}
|
|
|
|
/**
|
|
* @notice Register a deposit token with bridge registry
|
|
* @param depositToken Deposit token address
|
|
* @param destinationChainIds Array of allowed destination chain IDs
|
|
* @param minAmount Minimum bridge amount
|
|
* @param maxAmount Maximum bridge amount
|
|
* @param riskLevel Risk level (0-255)
|
|
* @param bridgeFeeBps Bridge fee in basis points
|
|
*/
|
|
function registerDepositToken(
|
|
address depositToken,
|
|
uint256[] memory destinationChainIds,
|
|
uint256 minAmount,
|
|
uint256 maxAmount,
|
|
uint8 riskLevel,
|
|
uint256 bridgeFeeBps
|
|
) public onlyRole(INTEGRATOR_ROLE) {
|
|
require(depositToken != address(0), "VaultBridgeIntegration: zero deposit token");
|
|
require(destinationChainIds.length > 0, "VaultBridgeIntegration: no destinations");
|
|
|
|
bridgeRegistry.registerToken(
|
|
depositToken,
|
|
minAmount,
|
|
maxAmount,
|
|
destinationChainIds,
|
|
riskLevel,
|
|
bridgeFeeBps
|
|
);
|
|
|
|
// Find associated vault (would need to track this in VaultFactory)
|
|
// For now, emit event with deposit token only
|
|
emit DepositTokenRegistered(depositToken, address(0), destinationChainIds);
|
|
}
|
|
|
|
/**
|
|
* @notice Register a deposit token with default configuration
|
|
* @param depositToken Deposit token address
|
|
*/
|
|
function registerDepositTokenDefault(address depositToken) external onlyRole(INTEGRATOR_ROLE) {
|
|
registerDepositToken(
|
|
depositToken,
|
|
defaultDestinations,
|
|
defaultMinBridgeAmount,
|
|
defaultMaxBridgeAmount,
|
|
defaultRiskLevel,
|
|
defaultBridgeFeeBps
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @notice Set default bridge configuration
|
|
*/
|
|
function setDefaultMinBridgeAmount(uint256 minAmount) external onlyRole(DEFAULT_ADMIN_ROLE) {
|
|
defaultMinBridgeAmount = minAmount;
|
|
}
|
|
|
|
function setDefaultMaxBridgeAmount(uint256 maxAmount) external onlyRole(DEFAULT_ADMIN_ROLE) {
|
|
defaultMaxBridgeAmount = maxAmount;
|
|
}
|
|
|
|
function setDefaultRiskLevel(uint8 riskLevel) external onlyRole(DEFAULT_ADMIN_ROLE) {
|
|
require(riskLevel <= 255, "VaultBridgeIntegration: invalid risk level");
|
|
defaultRiskLevel = riskLevel;
|
|
}
|
|
|
|
function setDefaultBridgeFeeBps(uint256 feeBps) external onlyRole(DEFAULT_ADMIN_ROLE) {
|
|
require(feeBps <= 10000, "VaultBridgeIntegration: fee > 100%");
|
|
defaultBridgeFeeBps = feeBps;
|
|
}
|
|
|
|
function setDefaultDestinations(uint256[] memory chainIds) external onlyRole(DEFAULT_ADMIN_ROLE) {
|
|
require(chainIds.length > 0, "VaultBridgeIntegration: no destinations");
|
|
defaultDestinations = chainIds;
|
|
}
|
|
|
|
/**
|
|
* @notice Get default destinations
|
|
*/
|
|
function getDefaultDestinations() external view returns (uint256[] memory) {
|
|
return defaultDestinations;
|
|
}
|
|
}
|