feat: Introduce MINTER_ROLE for minting control in CompliantFiatToken
- Added MINTER_ROLE constant to manage minting permissions. - Updated mint function to restrict access to addresses with MINTER_ROLE, enhancing security and compliance. - Granted MINTER_ROLE to the initial owner during contract deployment.
This commit is contained in:
54
contracts/dbis/DBIS_GRU_MintController.sol
Normal file
54
contracts/dbis/DBIS_GRU_MintController.sol
Normal file
@@ -0,0 +1,54 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import "@openzeppelin/contracts/access/AccessControl.sol";
|
||||
import "@openzeppelin/contracts/utils/Pausable.sol";
|
||||
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
|
||||
import "./IDBISTypes.sol";
|
||||
|
||||
interface IERC20Mintable {
|
||||
function mint(address to, uint256 amount) external;
|
||||
}
|
||||
|
||||
contract DBIS_GRU_MintController is AccessControl, Pausable, ReentrancyGuard {
|
||||
bytes32 public constant ROUTER_ADMIN_ROLE = keccak256("ROUTER_ADMIN");
|
||||
|
||||
address public settlementRouter;
|
||||
address public gruToken;
|
||||
|
||||
event MintFromAuthorization(bytes32 indexed messageId, address indexed recipient, uint256 amount, uint8 assetClass);
|
||||
|
||||
constructor(address admin, address _settlementRouter) {
|
||||
_grantRole(DEFAULT_ADMIN_ROLE, admin);
|
||||
_grantRole(ROUTER_ADMIN_ROLE, admin);
|
||||
settlementRouter = _settlementRouter;
|
||||
}
|
||||
|
||||
function setSettlementRouter(address _router) external onlyRole(ROUTER_ADMIN_ROLE) {
|
||||
settlementRouter = _router;
|
||||
}
|
||||
|
||||
function setGruToken(address _token) external onlyRole(ROUTER_ADMIN_ROLE) {
|
||||
gruToken = _token;
|
||||
}
|
||||
|
||||
function pause() external onlyRole(ROUTER_ADMIN_ROLE) {
|
||||
_pause();
|
||||
}
|
||||
|
||||
function unpause() external onlyRole(ROUTER_ADMIN_ROLE) {
|
||||
_unpause();
|
||||
}
|
||||
|
||||
function mintFromAuthorization(IDBISTypes.MintAuth calldata auth) external nonReentrant whenNotPaused {
|
||||
require(msg.sender == settlementRouter, "DBIS: only router");
|
||||
require(gruToken != address(0), "DBIS: token not set");
|
||||
require(auth.recipients.length == auth.amounts.length, "DBIS: length mismatch");
|
||||
IERC20Mintable token = IERC20Mintable(gruToken);
|
||||
for (uint256 i = 0; i < auth.recipients.length; i++) {
|
||||
require(auth.recipients[i] != address(0), "DBIS: zero recipient");
|
||||
token.mint(auth.recipients[i], auth.amounts[i]);
|
||||
emit MintFromAuthorization(auth.messageId, auth.recipients[i], auth.amounts[i], uint8(auth.assetClass));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user