Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- KYCWhitelistTestnet
- Optimization enabled
- false
- Compiler version
- v0.8.24+commit.e11b9ed9
- EVM Version
- Verified at
- 2026-08-25T19:40:39.830072Z
Constructor Arguments
0000000000000000000000005a5db3d01a38d640a81182b1769a9f1e4d1f0f74
Arg [0] (address) : 0x5a5db3d01a38d640a81182b1769a9f1e4d1f0f74
contracts/KYCWhitelistTestnet.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "./KYCWhitelist.sol";
/**
* @title KYCWhitelistTestnet
* @notice TESTNET varianta bele liste — poleg obicajnega (owner) odobravanja
* omogoca se samopostrezno odobritev prek mockApproveMe().
*
* ZAKAJ LOCEN KONTRAKT:
* Prej je mockApproveMe() zivel v KYCWhitelist.sol z opozorilom
* "ODSTRANI PRED MAINNETOM". To je zanasanje na cloveski spomin — klasicna
* tocka odpovedi. Zdaj je mock v LOCENEM kontraktu, ki se na mainnet preprosto
* ne deploya. Mainnet dobi cisto KYCWhitelist, ki te funkcije NIMA — ne glede
* na to, ali se je kdo spomnil nanjo.
*
* ⚠️ TA KONTRAKT NE SME NIKOLI NA MAINNET (chainId 369).
*/
contract KYCWhitelistTestnet is KYCWhitelist {
constructor(address initialOwner) KYCWhitelist(initialOwner) {}
/// @notice SAMO TESTNET: vsak se lahko sam doda na belo listo
/// (simulacija opravljenega KYC, da je testiranje prijazno).
function mockApproveMe() external {
isWhitelisted[msg.sender] = true;
emit KYCApproved(msg.sender);
}
}
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
contracts/KYCWhitelist.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title KYCWhitelist
* @notice Bela lista KYC-preverjenih naslovov za trgovanje na mojdelez.si.
*
* TA KONTRAKT JE MAINNET-VARIANTA: na belo listo doda SAMO owner
* (approveKYC / approveBatch), ki ga klice pravi (placljivi) KYC ponudnik po
* opravljenem preverjanju osebe. Samopostrezne bele liste TU NI.
*
* TESTNET: uporabi contracts/KYCWhitelistTestnet.sol, ki temu kontraktu doda
* mockApproveMe() za samopostrezno testiranje. Locitev je namerna — mock se
* tako FIZICNO ne more znajti na mainnetu (ni odvisno od tega, ali se kdo
* spomni izbrisati funkcijo pred deployem).
*/
contract KYCWhitelist is Ownable {
mapping(address => bool) public isWhitelisted;
event KYCApproved(address indexed account);
event KYCRevoked(address indexed account);
constructor(address initialOwner) Ownable(initialOwner) {}
/// @notice Owner (ali pravi KYC backend) doda preverjen naslov.
function approveKYC(address account) external onlyOwner {
require(account != address(0), "Zero address");
isWhitelisted[account] = true;
emit KYCApproved(account);
}
/// @notice Batch dodajanje vec naslovov hkrati (owner).
function approveBatch(address[] calldata accounts) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
if (accounts[i] != address(0)) {
isWhitelisted[accounts[i]] = true;
emit KYCApproved(accounts[i]);
}
}
}
function revokeKYC(address account) external onlyOwner {
isWhitelisted[account] = false;
emit KYCRevoked(account);
}
/// @notice Onemogoceno: pomotoma poslan renounceOwnership() bi trajno ubil
/// KYC upravljanje (nihce vec ne bi mogel odobriti/preklicati naslova).
function renounceOwnership() public pure override {
revert("Renounce onemogocen");
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"initialOwner","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"KYCApproved","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"KYCRevoked","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approveBatch","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approveKYC","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWhitelisted","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mockApproveMe","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeKYC","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5060405161066838038061066883398101604081905261002f916100c0565b80806001600160a01b03811661005f57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61006881610070565b5050506100f0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d257600080fd5b81516001600160a01b03811681146100e957600080fd5b9392505050565b610569806100ff6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638351a1811161005b5780638351a181146100f55780638da5cb5b146100fd578063c06a7bff14610118578063f2fde38b1461012b57600080fd5b80630e27324d1461008d57806339ba645b146100a25780633af32abf146100b5578063715018a6146100ed575b600080fd5b6100a061009b366004610478565b61013e565b005b6100a06100b0366004610478565b6101df565b6100d86100c3366004610478565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100a0610230565b6100a061026e565b6000546040516001600160a01b0390911681526020016100e4565b6100a06101263660046104a8565b6102b3565b6100a0610139366004610478565b6103bb565b6101466103f9565b6001600160a01b0381166101905760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064015b60405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f333bb19eeef0621b32888db778cc7a481a89fc1d59adb2cecb59b40ef048941e9190a250565b6101e76103f9565b6001600160a01b038116600081815260016020526040808220805460ff19169055517ffb4ca6a2470de95e9f648557fae63380f22c4b760bd27b0571caf5977a30278a9190a250565b60405162461bcd60e51b81526020600482015260136024820152722932b737bab731b29037b732b6b7b3b7b1b2b760691b6044820152606401610187565b336000818152600160208190526040808320805460ff1916909217909155517f333bb19eeef0621b32888db778cc7a481a89fc1d59adb2cecb59b40ef048941e9190a2565b6102bb6103f9565b60005b818110156103b65760008383838181106102da576102da61051d565b90506020020160208101906102ef9190610478565b6001600160a01b0316146103ae5760018060008585858181106103145761031461051d565b90506020020160208101906103299190610478565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558282828181106103635761036361051d565b90506020020160208101906103789190610478565b6001600160a01b03167f333bb19eeef0621b32888db778cc7a481a89fc1d59adb2cecb59b40ef048941e60405160405180910390a25b6001016102be565b505050565b6103c36103f9565b6001600160a01b0381166103ed57604051631e4fbdf760e01b815260006004820152602401610187565b6103f681610428565b50565b6000546001600160a01b031633146104265760405163118cdaa760e01b8152336004820152602401610187565b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561048a57600080fd5b81356001600160a01b03811681146104a157600080fd5b9392505050565b600080602083850312156104bb57600080fd5b823567ffffffffffffffff808211156104d357600080fd5b818501915085601f8301126104e757600080fd5b8135818111156104f657600080fd5b8660208260051b850101111561050b57600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220edbffb12a4eaf6d4d25adfe3844172e4dee25985a9e526d11e9a4eee08dad6a364736f6c634300081800330000000000000000000000005a5db3d01a38d640a81182b1769a9f1e4d1f0f74
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638351a1811161005b5780638351a181146100f55780638da5cb5b146100fd578063c06a7bff14610118578063f2fde38b1461012b57600080fd5b80630e27324d1461008d57806339ba645b146100a25780633af32abf146100b5578063715018a6146100ed575b600080fd5b6100a061009b366004610478565b61013e565b005b6100a06100b0366004610478565b6101df565b6100d86100c3366004610478565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100a0610230565b6100a061026e565b6000546040516001600160a01b0390911681526020016100e4565b6100a06101263660046104a8565b6102b3565b6100a0610139366004610478565b6103bb565b6101466103f9565b6001600160a01b0381166101905760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064015b60405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f333bb19eeef0621b32888db778cc7a481a89fc1d59adb2cecb59b40ef048941e9190a250565b6101e76103f9565b6001600160a01b038116600081815260016020526040808220805460ff19169055517ffb4ca6a2470de95e9f648557fae63380f22c4b760bd27b0571caf5977a30278a9190a250565b60405162461bcd60e51b81526020600482015260136024820152722932b737bab731b29037b732b6b7b3b7b1b2b760691b6044820152606401610187565b336000818152600160208190526040808320805460ff1916909217909155517f333bb19eeef0621b32888db778cc7a481a89fc1d59adb2cecb59b40ef048941e9190a2565b6102bb6103f9565b60005b818110156103b65760008383838181106102da576102da61051d565b90506020020160208101906102ef9190610478565b6001600160a01b0316146103ae5760018060008585858181106103145761031461051d565b90506020020160208101906103299190610478565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558282828181106103635761036361051d565b90506020020160208101906103789190610478565b6001600160a01b03167f333bb19eeef0621b32888db778cc7a481a89fc1d59adb2cecb59b40ef048941e60405160405180910390a25b6001016102be565b505050565b6103c36103f9565b6001600160a01b0381166103ed57604051631e4fbdf760e01b815260006004820152602401610187565b6103f681610428565b50565b6000546001600160a01b031633146104265760405163118cdaa760e01b8152336004820152602401610187565b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561048a57600080fd5b81356001600160a01b03811681146104a157600080fd5b9392505050565b600080602083850312156104bb57600080fd5b823567ffffffffffffffff808211156104d357600080fd5b818501915085601f8301126104e757600080fd5b8135818111156104f657600080fd5b8660208260051b850101111561050b57600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220edbffb12a4eaf6d4d25adfe3844172e4dee25985a9e526d11e9a4eee08dad6a364736f6c63430008180033