Description:
Smart contract deployed on Ethereum.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/// @title Gold 24K Reserve (GOLDX) - ERC20 compliant token representing physical gold
/// @notice 1 GOLDX = 1 onza troy (31.1035 g) de oro 24K (999.9), respaldado por bóvedas auditadas o activos institucionales como PAXG.
/// Standard ERC20 with admin mint/burn, address freeze, reentrancy guard, and 2-step ownership transfer
contract Gold24KReserve {
string public constant name = "Gold 24K Reserve";
string public constant symbol = "GOLDX";
uint8 public constant decimals = 18;
uint256 public totalSupply;
uint256 public constant INITIAL_SUPPLY = 1_000_000_000 * 1e18;
address public owner;
address public pendingOwner;
address public compliance;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
mapping(address => bool) public frozen;
// ReentrancyGuard
uint256 private _entered;
modifier nonReentrant() {
require(_entered == 0, "REENTRANCY");
_entered = 1;
_;
_entered = 0;
}
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed ownerAddr, address indexed spender, uint256 value);
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event ComplianceTransferred(address indexed previousCompliance, address indexed newCompliance);
event AddressFrozen(address indexed account, bool frozen);
event Mint(address indexed to, uint256 amount);
event Burn(address indexed from, uint256 amount);
error NotOwner();
error NotCompliance();
error FrozenAddress();
error InsufficientBalance();
error AllowanceExceeded();
error ZeroAddress();
constructor() {
owner = msg.sender;
compliance = msg.sender;
totalSupply = INITIAL_SUPPLY;
balanceOf[msg.sender] = INITIAL_SUPPLY;
emit Transfer(address(0), msg.sender, INITIAL_SUPPLY);
}
modifier onlyOwner() {
if (msg.sender != owner) revert NotOwner();
_;
}
modifier onlyCompliance() {
if (msg.sender != compliance) revert NotCompliance();
_;
}
modifier notFrozen(address account) {
if (frozen[account]) revert FrozenAddress();
_;
}
function transfer(address to, uint256 value)
external
notFrozen(msg.sender)
notFrozen(to)
returns (bool)
{
require(to != address(0), "ZeroAddress");
uint256 senderBalance = balanceOf[msg.sender];
if (senderBalance < value) revert InsufficientBalance();
unchecked {
balanceOf[msg.sender] = senderBalance - value;
balanceOf[to] += value;
}
emit Transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value)
external
notFrozen(msg.sender)
notFrozen(spender)
returns (bool)
{
require(spender != address(0), "ZeroAddress");
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value)
external
notFrozen(msg.sender)
notFrozen(from)
notFrozen(to)
nonReentrant
returns (bool)
{
require(to != address(0), "ZeroAddress");
uint256 fromBalance = balanceOf[from];
if (fromBalance < value) revert InsufficientBalance();
uint256 allowed = allowance[from][msg.sender];
if (allowed < value) revert AllowanceExceeded();
if (allowed != type(uint256).max) {
unchecked {
allowance[from][msg.sender] = allowed - value;
}
emit Approval(from, msg.sender, allowance[from][msg.sender]);
}
unchecked {
balanceOf[from] = fromBalance - value;
balanceOf[to] += value;
}
emit Transfer(from, to, value);
return true;
}
function increaseAllowance(address spender, uint256 addedValue)
external
notFrozen(msg.sender)
notFrozen(spender)
returns (bool)
{
require(spender != address(0), "ZeroAddress");
uint256 newAllowance = allowance[msg.sender][spender] + addedValue;
allowance[msg.sender][spender] = newAllowance;
emit Approval(msg.sender, spender, newAllowance);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue)
external
notFrozen(msg.sender)
notFrozen(spender)
returns (bool)
{
require(spender != address(0), "ZeroAddress");
uint256 current = allowance[msg.sender][spender];
uint256 newAllowance = (subtractedValue >= current) ? 0 : current - subtractedValue;
allowance[msg.sender][spender] = newAllowance;
emit Approval(msg.sender, spender, newAllowance);
return true;
}
function mint(address to, uint256 amount)
external
onlyOwner
nonReentrant
{
require(to != address(0), "ZeroAddress");
totalSupply += amount;
balanceOf[to] += amount;
emit Mint(to, amount);
emit Transfer(address(0), to, amount);
}
function burn(address from, uint256 amount)
external
onlyOwner
nonReentrant
{
require(from != address(0), "ZeroAddress");
uint256 bal = balanceOf[from];
if (bal < amount) revert InsufficientBalance();
unchecked {
balanceOf[from] = bal - amount;
totalSupply -= amount;
}
emit Burn(from, amount);
emit Transfer(from, address(0), amount);
}
function burnFrom(address from, uint256 amount)
external
notFrozen(msg.sender)
notFrozen(from)
nonReentrant
{
require(from != address(0), "ZeroAddress");
uint256 allowed = allowance[from][msg.sender];
if (allowed < amount) revert AllowanceExceeded();
if (allowed != type(uint256).max) {
unchecked {
allowance[from][msg.sender] = allowed - amount;
}
emit Approval(from, msg.sender, allowance[from][msg.sender]);
}
uint256 bal = balanceOf[from];
if (bal < amount) revert InsufficientBalance();
unchecked {
balanceOf[from] = bal - amount;
totalSupply -= amount;
}
emit Burn(from, amount);
emit Transfer(from, address(0), amount);
}
function setCompliance(address newCompliance) external onlyOwner {
require(newCompliance != address(0), "ZeroAddress");
emit ComplianceTransferred(compliance, newCompliance);
compliance = newCompliance;
}
// Ownership transfer in 2 steps
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "ZeroAddress");
pendingOwner = newOwner;
emit OwnershipTransferStarted(owner, newOwner);
}
function acceptOwnership() external {
require(msg.sender == pendingOwner, "Not pending owner");
emit OwnershipTransferred(owner, pendingOwner);
owner = pendingOwner;
pendingOwner = address(0);
}
function setFrozen(address account, bool isFrozen) external onlyCompliance {
frozen[account] = isFrozen;
emit AddressFrozen(account, isFrozen);
}
}
Submitted on: 2025-10-12 21:50:31
Comments
Log in to comment.
No comments yet.