MockUSDT

Description:

ERC20 token contract with Factory, Oracle capabilities. Standard implementation for fungible tokens on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "USDT.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.20;\r
\r
/*\r
  WalletUsdViewer + mocks (MockV3Aggregator e MockUSDT)\r
  Arquivo completo e corrigido — pronto para deploy no Remix.\r
*/\r
\r
/// INTERFACES\r
interface AggregatorV3Interface {\r
    function decimals() external view returns (uint8);\r
    function latestRoundData() external view returns (\r
        uint80 roundId,\r
        int256 answer,\r
        uint256 startedAt,\r
        uint256 updatedAt,\r
        uint80 answeredInRound\r
    );\r
}\r
\r
interface IERC20 {\r
    function totalSupply() external view returns (uint256);\r
    function decimals() external view returns (uint8);\r
    function balanceOf(address account) external view returns (uint256);\r
    function transfer(address to, uint256 amount) external returns (bool);\r
    function allowance(address owner, address spender) external view returns (uint256);\r
    function approve(address spender, uint256 amount) external returns (bool);\r
    function transferFrom(address from, address to, uint256 amount) external returns (bool);\r
\r
    event Transfer(address indexed from, address indexed to, uint256 value);\r
    event Approval(address indexed owner, address indexed spender, uint256 value);\r
}\r
\r
\r
/// WALLET USD VIEWER\r
contract WalletUsdViewer {\r
    address public owner;\r
    mapping(address => address) public priceFeeds; // token -> feed\r
    event PriceFeedSet(address indexed token, address indexed feed);\r
    event OwnerTransferred(address indexed oldOwner, address indexed newOwner);\r
\r
    modifier onlyOwner() {\r
        require(msg.sender == owner, "somente owner");\r
        _;\r
    }\r
\r
    constructor() {\r
        owner = msg.sender;\r
    }\r
\r
    function transferOwnership(address newOwner) external onlyOwner {\r
        require(newOwner != address(0), "owner invalido");\r
        emit OwnerTransferred(owner, newOwner);\r
        owner = newOwner;\r
    }\r
\r
    function setPriceFeed(address token, address feed) external onlyOwner {\r
        require(feed != address(0), "feed invalido");\r
        priceFeeds[token] = feed;\r
        emit PriceFeedSet(token, feed);\r
    }\r
\r
    function getLatestPriceAndDecimals(address feed) public view returns (int256 price, uint8 feedDecimals, uint256 updatedAt) {\r
        require(feed != address(0), "feed nao definido");\r
        AggregatorV3Interface aggregator = AggregatorV3Interface(feed);\r
        (, int256 answer, , uint256 updated, ) = aggregator.latestRoundData();\r
        uint8 d = aggregator.decimals();\r
        return (answer, d, updated);\r
    }\r
\r
    function getEthUsdValue(address who) public view returns (uint256 usdAmount, uint8 feedDecimals, uint256 priceUpdatedAt) {\r
        address feed = priceFeeds[address(0)];\r
        require(feed != address(0), "price feed ETH nao configurado");\r
        (int256 price, uint8 d, uint256 updatedAt) = getLatestPriceAndDecimals(feed);\r
        require(price > 0, "preco invalido");\r
        uint256 priceU = uint256(price);\r
        uint256 balanceWei = who.balance;\r
        usdAmount = (balanceWei * priceU) / 1e18;\r
        return (usdAmount, d, updatedAt);\r
    }\r
\r
    function getTokenUsdValue(address who, address token) public view returns (uint256 usdAmount, uint8 feedDecimals, uint256 priceUpdatedAt) {\r
        address feed = priceFeeds[token];\r
        require(feed != address(0), "price feed do token nao configurado");\r
        (int256 price, uint8 d, uint256 updatedAt) = getLatestPriceAndDecimals(feed);\r
        require(price > 0, "preco invalido");\r
        uint256 priceU = uint256(price);\r
        IERC20 tokenContract = IERC20(token);\r
        uint8 tokenDecimals = tokenContract.decimals();\r
        uint256 tokenBalance = tokenContract.balanceOf(who);\r
        usdAmount = (tokenBalance * priceU) / (10 ** tokenDecimals);\r
        return (usdAmount, d, updatedAt);\r
    }\r
}\r
\r
\r
/// MOCK CHAINLINK AGGREGATOR (para testes)\r
contract MockV3Aggregator is AggregatorV3Interface {\r
    uint8 private _decimals;\r
    int256 private _answer;\r
    uint80 private _roundId;\r
    uint256 private _updatedAt;\r
\r
    constructor(uint8 decimals_, int256 initialAnswer) {\r
        _decimals = decimals_;\r
        _answer = initialAnswer;\r
        _roundId = 1;\r
        _updatedAt = block.timestamp;\r
    }\r
\r
    function decimals() external view override returns (uint8) {\r
        return _decimals;\r
    }\r
\r
    function updateAnswer(int256 newAnswer) external {\r
        _answer = newAnswer;\r
        _roundId += 1;\r
        _updatedAt = block.timestamp;\r
    }\r
\r
    function latestRoundData() external view override returns (\r
        uint80 roundId,\r
        int256 answer,\r
        uint256 startedAt,\r
        uint256 updatedAt,\r
        uint80 answeredInRound\r
    ) {\r
        return (_roundId, _answer, 0, _updatedAt, _roundId);\r
    }\r
}\r
\r
\r
/// MOCK ERC20 (USDT-like)\r
contract MockUSDT is IERC20 {\r
    string public name = "Mock USDT";\r
    string public symbol = "mUSDT";\r
    uint8 public override decimals = 6; // USDT real usa 6\r
    uint256 private _totalSupply;\r
    mapping(address => uint256) private _balances;\r
    mapping(address => mapping(address => uint256)) private _allowances;\r
\r
    constructor(uint256 initialSupply) {\r
        _mint(msg.sender, initialSupply);\r
    }\r
\r
    function totalSupply() public view override returns (uint256) { return _totalSupply; }\r
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }\r
\r
    function transfer(address to, uint256 amount) public override returns (bool) {\r
        require(_balances[msg.sender] >= amount, "Saldo insuficiente");\r
        _balances[msg.sender] -= amount;\r
        _balances[to] += amount;\r
        emit Transfer(msg.sender, to, amount);\r
        return true;\r
    }\r
\r
    function allowance(address owner, address spender) public view override returns (uint256) {\r
        return _allowances[owner][spender];\r
    }\r
\r
    function approve(address spender, uint256 amount) public override returns (bool) {\r
        _allowances[msg.sender][spender] = amount;\r
        emit Approval(msg.sender, spender, amount);\r
        return true;\r
    }\r
\r
    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {\r
        require(_balances[from] >= amount, "Saldo insuficiente");\r
        require(_allowances[from][msg.sender] >= amount, "Sem aprovacao");\r
        _allowances[from][msg.sender] -= amount;\r
        _balances[from] -= amount;\r
        _balances[to] += amount;\r
        emit Transfer(from, to, amount);\r
        return true;\r
    }\r
\r
    function _mint(address to, uint256 amount) internal {\r
        _totalSupply += amount;\r
        _balances[to] += amount;\r
        emit Transfer(address(0), to, amount);\r
    }\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, Token, Factory, Oracle|addr:0x501a8124f9f13b1234b297386316adbc28f22b83|verified:true|block:23696305|tx:0x2824159b8f4c98c8b84d483edf957968b7933c1002c16c4d8f5f1eef4558416f|first_check:1761913476

Submitted on: 2025-10-31 13:24:36

Comments

Log in to comment.

No comments yet.