// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; import './access/OwnerWithdrawable.sol'; import './proxy/AdminWrapper.sol'; contract Registration is AdminWrapper, OwnerWithdrawable { uint256 public fee; mapping(bytes32 => bool) public accountExists; event Register(address provider, bytes32 account, uint256 value, uint256 fee); event FeeChanged(uint256 fee); function initialize(address newOwner, uint256 _fee) external initializer { _transferOwnership(newOwner); fee = _fee; } function register(address provider, bytes32 account) external payable { require(!accountExists[account], 'Registration: account exists'); require(msg.value >= fee, 'Registration: insufficient registration fee'); if (msg.value > fee) { payable(msg.sender).call{value: msg.value - fee}(''); } accountExists[account] = true; emit Register(provider, account, msg.value, fee); } function changeFee(uint256 _fee) external onlyOwner { _changeFee(_fee); } function _changeFee(uint256 _fee) internal { fee = _fee; emit FeeChanged(fee); } }