// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
interface IERC20 {
function mintTo(address to, uint256 amount) external;
function burnFrom(address from, uint256 amount) external;
function transfer(address to, uint256 amount) external returns (bool);
}
contract BridgeB {
mapping(string => bool) public _usedTxRefs;
event IncomingBridgeRequest(address indexed sender, uint256 amount);
event BridgeProcessed(address indexed receiver, uint256 amount, string txRef);
address public owner;
IERC20 public token = IERC20(0x1D7ECbD285bC74D88d922E40D7b443CFa52420e9);
modifier onlyOwner {
require(msg.sender == owner, "Caller is not the owner");
_;
}
constructor() {
owner = msg.sender;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "New owner cannot be zero address");
owner = newOwner;
}
function changeToken(address erc20Address) public onlyOwner{
token = IERC20(erc20Address);
}
function processBridgeRequest(address receiver, uint256 amount, string memory txRef) external onlyOwner {
require(receiver != address(0), "Invalid receiver address");
require(amount > 0, "Amount must be greater than zero");
require(!_usedTxRefs[txRef], "Transaction reference already used");
_usedTxRefs[txRef] = true;
token.mintTo(receiver, amount);
emit BridgeProcessed(receiver, amount, txRef);
}
function createBridgeRequest(uint256 amount) external {
require(amount > 0, "Amount must be greater than zero");
// Burn tokens from the sender
token.burnFrom(msg.sender, amount);
emit IncomingBridgeRequest(msg.sender, amount);
}
function recoverERC20(address tokenAddress, uint256 amount) external onlyOwner {
require(tokenAddress != address(0), "Invalid token address");
require(amount > 0, "Amount must be greater than zero");
IERC20 recoverToken = IERC20(tokenAddress);
bool success = recoverToken.transfer(owner, amount);
require(success, "Recover ERC20 failed");
}
function recoverNativeCurrency() external onlyOwner {
(bool success, ) = owner.call{value: address(this).balance}("");
require(success, "Recover native currency failed");
}
}
{
"compilationTarget": {
"contracts/BridgeB.sol": "BridgeB"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"txRef","type":"string"}],"name":"BridgeProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"IncomingBridgeRequest","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"_usedTxRefs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Address","type":"address"}],"name":"changeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createBridgeRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"txRef","type":"string"}],"name":"processBridgeRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverNativeCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]