66 lines
1.6 KiB
Solidity
66 lines
1.6 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity >=0.8.0 <0.9.0;
|
|
|
|
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
|
import "@openzeppelin/contracts/access/Ownable.sol";
|
|
|
|
contract ORA is ERC20, Ownable {
|
|
//////////////////
|
|
/// Constants ////
|
|
//////////////////
|
|
|
|
// 0.5 ETH = 100 ORA => 1 ETH = 200 ORA (18 decimals)
|
|
uint256 public constant ORA_PER_ETH = 200;
|
|
|
|
//////////////////////
|
|
/// State Variables //
|
|
//////////////////////
|
|
|
|
////////////////
|
|
/// Events /////
|
|
////////////////
|
|
|
|
event OraPurchased(address indexed buyer, uint256 ethIn, uint256 oraOut);
|
|
event EthWithdrawn(address indexed to, uint256 amount);
|
|
|
|
/////////////////
|
|
/// Errors //////
|
|
/////////////////
|
|
|
|
error EthTransferFailed();
|
|
|
|
constructor() ERC20("Oracle Token", "ORA") Ownable(msg.sender) {
|
|
// Mint initial supply to the contract deployer
|
|
_mint(msg.sender, 1000000000000 ether);
|
|
}
|
|
|
|
function mint(address to, uint256 amount) public onlyOwner {
|
|
_mint(to, amount);
|
|
}
|
|
|
|
function burn(uint256 amount) public {
|
|
_burn(msg.sender, amount);
|
|
}
|
|
|
|
/**
|
|
* @notice Buy ORA at a fixed rate by sending ETH. Mints directly to the buyer.
|
|
*/
|
|
receive() external payable {
|
|
_buy(msg.sender);
|
|
}
|
|
|
|
function buy() external payable {
|
|
_buy(msg.sender);
|
|
}
|
|
|
|
function quoteOra(uint256 ethAmountWei) public pure returns (uint256) {
|
|
return ethAmountWei * ORA_PER_ETH;
|
|
}
|
|
|
|
function _buy(address buyer) internal {
|
|
uint256 oraOut = quoteOra(msg.value);
|
|
_mint(buyer, oraOut);
|
|
emit OraPurchased(buyer, msg.value, oraOut);
|
|
}
|
|
}
|