{"file_path":"contracts/USDKG.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: GPL-3.0\npragma solidity =0.8.24;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ncontract USDKG is IERC20 {\n\n    string public name;\n    string public symbol;\n    uint256 public decimals;\n\n    // ownable\n    address public owner;\n    address public compliance;\n\n    // ERC20 Basic\n    uint256 public _totalSupply;\n    mapping(address => uint256) public balances;\n    mapping (address => mapping (address => uint256)) public allowed;\n\n    uint256 public constant MAX_BASIS_POINTS = 20;\n    uint256 public constant FEE_PRECISION = 10000;\n\n    // variables to manage optional transaction fees, if such functionality is enabled in the future\n    uint256 public basisPointsRate = 0;\n\n    // pausable\n    bool public paused = false;\n\n    // blacklist\n    mapping (address => bool) public isBlackListed;\n\n    event Pause();\n    event Unpause();\n    event DestroyedBlackFunds(address _blackListedUser, uint256 _balance);\n    event AddedBlackList(address _user);\n    event RemovedBlackList(address _user);\n    // called when new token are issued\n    event Issue(uint256 amount);\n    // called when tokens are redeemed\n    event Redeem(uint256 amount);\n    // called if contract ever adds fees\n    event Params(uint256 feeBasisPoints);\n\n    constructor (address _owner, address _compliance) {\n        require(_owner != address(0) && _compliance != address(0), \"Owner and Compliance must be non zero addresses\");\n        owner = _owner;\n        compliance = _compliance;\n        _totalSupply = 0;\n        name = \"USDKG\";\n        symbol = \"USDKG\";\n        decimals = 6;\n    }\n\n    /**\n      * @dev Throws if called by any account other than the owner.\n      */\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"not owner\");\n        _;\n    }\n\n    /**\n      * @dev Throws if called by any account other than the compliance.\n      */\n    modifier onlyCompliance() {\n        require(msg.sender == compliance, \"not compliance\");\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     */\n    modifier whenNotPaused() {\n        require(!paused, \"paused\");\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     */\n    modifier whenPaused() {\n        require(paused, \"not paused\");\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when sender is not blacklisted.\n     */\n    modifier notBlackListed(address sender) {\n        require(!isBlackListed[sender], \"user blacklisted\");\n        _;\n    }\n\n    ////////////////////////\n    // PUBLIC FUNCTIONS\n    ////////////////////////\n\n    /**\n    * @dev transfer token for a specified address\n    * @param _to The address to transfer to\n    * @param _value The amount to be transferred\n    */\n    function transfer(address _to, uint256 _value) public whenNotPaused notBlackListed(msg.sender) returns (bool) {\n        uint256 fee = _value * basisPointsRate / FEE_PRECISION;\n        uint256 sendAmount = _value - fee;\n        balances[msg.sender] = balances[msg.sender] - _value;\n        balances[_to] = balances[_to] + sendAmount;\n        if (fee > 0) {\n            balances[owner] = balances[owner] + fee;\n            emit Transfer(msg.sender, owner, fee);\n        }\n        emit Transfer(msg.sender, _to, sendAmount);\n        return true;\n    }\n\n    /**\n    * @dev transfer tokens from one address to another\n    * @param _from address The address which you want to send tokens from\n    * @param _to address The address which you want to transfer to\n    * @param _value uint256 the amount of tokens to be transferred\n    */\n    function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused notBlackListed(_from) notBlackListed(msg.sender) returns (bool) {\n        uint256 _allowance = allowed[_from][msg.sender];\n\n        // check is not needed because sub(_allowance, _value) will already throw if this condition is not met\n        // if (_value > _allowance) throw;\n\n        uint256 fee = _value * basisPointsRate / FEE_PRECISION;\n        if (_allowance < type(uint256).max) {\n            allowed[_from][msg.sender] = _allowance - _value;\n        }\n        uint256 sendAmount = _value - fee;\n        balances[_from] = balances[_from] - _value;\n        balances[_to] = balances[_to] + sendAmount;\n        if (fee > 0) {\n            balances[owner] = balances[owner] + fee;\n            emit Transfer(_from, owner, fee);\n        }\n        emit Transfer(_from, _to, sendAmount);\n        return true;\n    }\n\n    /**\n    * @dev approve the passed address to spend the specified amount of tokens on behalf of msg.sender\n    * @param _spender the address which will spend the funds\n    * @param _value the amount of tokens to be spent\n    */\n    function approve(address _spender, uint256 _value) public returns (bool) {\n        require(msg.sender != address(0), \"caller can't be zero address\");\n        allowed[msg.sender][_spender] = _value;\n        emit Approval(msg.sender, _spender, _value);\n        return true;\n    }\n\n    ////////////////////////\n    // SERVICE FUNCTIONS\n    ////////////////////////\n\n    /**\n     * @dev called by the owner to pause, triggers stopped state\n     */\n    function pause() onlyOwner whenNotPaused public {\n        paused = true;\n        emit Pause();\n    }\n\n    /**\n     * @dev called by the owner to unpause, returns to normal state\n     */\n    function unpause() onlyOwner whenPaused public {\n        paused = false;\n        emit Unpause();\n    }\n\n    function addBlackList (address _evilUser) public onlyCompliance {\n        isBlackListed[_evilUser] = true;\n        emit AddedBlackList(_evilUser);\n    }\n\n    function removeBlackList (address _clearedUser) public onlyCompliance {\n        isBlackListed[_clearedUser] = false;\n        emit RemovedBlackList(_clearedUser);\n    }\n\n    function destroyBlackFunds (address _blackListedUser) public onlyCompliance {\n        require(isBlackListed[_blackListedUser], \"user should be blacklisted\");\n        uint256 dirtyFunds = balanceOf(_blackListedUser);\n        balances[_blackListedUser] = 0;\n        _totalSupply -= dirtyFunds;\n        emit DestroyedBlackFunds(_blackListedUser, dirtyFunds);\n    }\n\n    // issue a new amount of tokens\n    // @param _amount number of tokens to be issued\n    // @param _to address of tokens receiver\n    function issue(address _to, uint256 amount) public onlyOwner {\n        balances[_to] += amount;\n        _totalSupply += amount;\n        emit Issue(amount);\n    }\n\n    // redeem tokens\n    // these tokens are withdrawn from the owner address\n    // if the balance must be enough to cover the redeem\n    // or the call will fail\n    // @param _amount number of tokens to be burnt\n    function redeem(uint256 amount) public onlyOwner {\n        require(_totalSupply >= amount, \"not enough tokens to redeem\");\n        require(balances[owner] >= amount, \"not enough tokens to redeem\");\n\n        _totalSupply -= amount;\n        balances[owner] -= amount;\n        emit Redeem(amount);\n    }\n\n    function setParams(uint256 newBasisPoints) public onlyOwner {\n        // ensure transparency by hardcoding limit beyond which fees can never be added\n        require(newBasisPoints <= MAX_BASIS_POINTS, \"basis points should be less then MAX_BASIS_POINTS\");\n\n        basisPointsRate = newBasisPoints;\n\n        emit Params(basisPointsRate);\n    }\n\n    ////////////////////////\n    // VIEW FUNCTIONS\n    ////////////////////////\n\n    /**\n    * @dev gets the balance of the specified address\n    * @param _owner the address to query the the balance of\n    * @return balance An uint256 representing the amount owned by the passed address\n    */\n    function balanceOf(address _owner) public view returns (uint256 balance) {\n        return balances[_owner];\n    }\n\n    /**\n    * @dev function to check the amount of tokens than an owner allowed to a spender\n    * @param _owner address the address which owns the funds\n    * @param _spender address the address which will spend the funds\n    * @return remaining a uint256 specifying the amount of tokens still available for the spender\n    */\n    function allowance(address _owner, address _spender) public view returns (uint256 remaining) {\n        return allowed[_owner][_spender];\n    }\n\n    function getBlackListStatus(address _maker) external view returns (bool) {\n        return isBlackListed[_maker];\n    }\n\n    function totalSupply() public view returns (uint256) {\n        return _totalSupply;\n    }\n}","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063dd62ed3e11610097578063e4997dc511610071578063e4997dc51461050b578063e63a391f14610527578063f3bdc22814610545578063f4ea93d814610561576101c4565b8063dd62ed3e1461048d578063dd644f72146104bd578063e47d6060146104db576101c4565b80638da5cb5b116100d35780638da5cb5b1461040557806395d89b4114610423578063a9059cbb14610441578063db006a7514610471576101c4565b806370a08231146103af5780638456cb59146103df578063867904b4146103e9576101c4565b80633eaaf86b1161016657806359ded2101161014057806359ded210146103275780635c658165146103435780635c975abb146103735780636290865d14610391576101c4565b80633eaaf86b146102cf5780633f4ba83a146102ed57806359bf1abe146102f7576101c4565b806318160ddd116101a257806318160ddd1461023357806323b872dd1461025157806327e235e314610281578063313ce567146102b1576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630ecb93c014610217575b600080fd5b6101d161057f565b6040516101de9190611f49565b60405180910390f35b61020160048036038101906101fc9190612004565b61060d565b60405161020e919061205f565b60405180910390f35b610231600480360381019061022c919061207a565b61076d565b005b61023b61088f565b60405161024891906120b6565b60405180910390f35b61026b600480360381019061026691906120d1565b610899565b604051610278919061205f565b60405180910390f35b61029b6004803603810190610296919061207a565b610e60565b6040516102a891906120b6565b60405180910390f35b6102b9610e78565b6040516102c691906120b6565b60405180910390f35b6102d7610e7e565b6040516102e491906120b6565b60405180910390f35b6102f5610e84565b005b610311600480360381019061030c919061207a565b610fac565b60405161031e919061205f565b60405180910390f35b610341600480360381019061033c9190612124565b611002565b005b61035d60048036038101906103589190612151565b611119565b60405161036a91906120b6565b60405180910390f35b61037b61113e565b604051610388919061205f565b60405180910390f35b610399611151565b6040516103a691906121a0565b60405180910390f35b6103c960048036038101906103c4919061207a565b611177565b6040516103d691906120b6565b60405180910390f35b6103e76111c0565b005b61040360048036038101906103fe9190612004565b6112e9565b005b61040d611423565b60405161041a91906121a0565b60405180910390f35b61042b611449565b6040516104389190611f49565b60405180910390f35b61045b60048036038101906104569190612004565b6114d7565b604051610468919061205f565b60405180910390f35b61048b60048036038101906104869190612124565b6118d7565b005b6104a760048036038101906104a29190612151565b611b1b565b6040516104b491906120b6565b60405180910390f35b6104c5611ba2565b6040516104d291906120b6565b60405180910390f35b6104f560048036038101906104f0919061207a565b611ba8565b604051610502919061205f565b60405180910390f35b6105256004803603810190610520919061207a565b611bc8565b005b61052f611cea565b60405161053c91906120b6565b60405180910390f35b61055f600480360381019061055a919061207a565b611cf0565b005b610569611eb4565b60405161057691906120b6565b60405180910390f35b6000805461058c906121ea565b80601f01602080910402602001604051908101604052809291908181526020018280546105b8906121ea565b80156106055780601f106105da57610100808354040283529160200191610605565b820191906000526020600020905b8154815290600101906020018083116105e857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490612267565b60405180910390fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161075b91906120b6565b60405180910390a36001905092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f4906122d3565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc8160405161088491906121a0565b60405180910390a150565b6000600554905090565b6000600960009054906101000a900460ff16156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e29061233f565b60405180910390fd5b83600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610970906123ab565b60405180910390fd5b33600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906123ab565b60405180910390fd5b6000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061271060085487610a9b91906123fa565b610aa5919061246b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821015610b5c578582610adb919061249c565b600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008187610b6a919061249c565b905086600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bb7919061249c565b600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c4591906124d0565b600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000821115610deb578160066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cfe91906124d0565b60066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610de291906120b6565b60405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e4891906120b6565b60405180910390a36001955050505050509392505050565b60066020528060005260406000206000915090505481565b60025481565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90612550565b60405180910390fd5b600960009054906101000a900460ff16610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a906125bc565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990612550565b60405180910390fd5b60148111156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd9061264e565b60405180910390fd5b806008819055507f2696a6358e16692f320e4570c01170fd423f0f4acbc8d0120c42a33e5d2e154a60085460405161110e91906120b6565b60405180910390a150565b6007602052816000526040600020602052806000526040600020600091509150505481565b600960009054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790612550565b60405180910390fd5b600960009054906101000a900460ff16156112a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112979061233f565b60405180910390fd5b6001600960006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090612550565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c891906124d0565b9250508190555080600560008282546113e191906124d0565b925050819055507fcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a8160405161141791906120b6565b60405180910390a15050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054611456906121ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611482906121ea565b80156114cf5780601f106114a4576101008083540402835291602001916114cf565b820191906000526020600020905b8154815290600101906020018083116114b257829003601f168201915b505050505081565b6000600960009054906101000a900460ff1615611529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115209061233f565b60405180910390fd5b33600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae906123ab565b60405180910390fd5b6000612710600854856115ca91906123fa565b6115d4919061246b565b9050600081856115e4919061249c565b905084600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611631919061249c565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116bf91906124d0565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000821115611865578160066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461177891906124d0565b60066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161185c91906120b6565b60405180910390a35b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118c291906120b6565b60405180910390a36001935050505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612550565b60405180910390fd5b8060055410156119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a3906126ba565b60405180910390fd5b8060066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a47906126ba565b60405180910390fd5b8060056000828254611a62919061249c565b925050819055508060066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ada919061249c565b925050819055507f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a4481604051611b1091906120b6565b60405180910390a150565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60085481565b600a6020528060005260406000206000915054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f906122d3565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c81604051611cdf91906121a0565b60405180910390a150565b61271081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d77906122d3565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390612726565b60405180910390fd5b6000611e1782611177565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060056000828254611e70919061249c565b925050819055507f61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c68282604051611ea8929190612746565b60405180910390a15050565b601481565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ef3578082015181840152602081019050611ed8565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f1b82611eb9565b611f258185611ec4565b9350611f35818560208601611ed5565b611f3e81611eff565b840191505092915050565b60006020820190508181036000830152611f638184611f10565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f9b82611f70565b9050919050565b611fab81611f90565b8114611fb657600080fd5b50565b600081359050611fc881611fa2565b92915050565b6000819050919050565b611fe181611fce565b8114611fec57600080fd5b50565b600081359050611ffe81611fd8565b92915050565b6000806040838503121561201b5761201a611f6b565b5b600061202985828601611fb9565b925050602061203a85828601611fef565b9150509250929050565b60008115159050919050565b61205981612044565b82525050565b60006020820190506120746000830184612050565b92915050565b6000602082840312156120905761208f611f6b565b5b600061209e84828501611fb9565b91505092915050565b6120b081611fce565b82525050565b60006020820190506120cb60008301846120a7565b92915050565b6000806000606084860312156120ea576120e9611f6b565b5b60006120f886828701611fb9565b935050602061210986828701611fb9565b925050604061211a86828701611fef565b9150509250925092565b60006020828403121561213a57612139611f6b565b5b600061214884828501611fef565b91505092915050565b6000806040838503121561216857612167611f6b565b5b600061217685828601611fb9565b925050602061218785828601611fb9565b9150509250929050565b61219a81611f90565b82525050565b60006020820190506121b56000830184612191565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061220257607f821691505b602082108103612215576122146121bb565b5b50919050565b7f63616c6c65722063616e2774206265207a65726f206164647265737300000000600082015250565b6000612251601c83611ec4565b915061225c8261221b565b602082019050919050565b6000602082019050818103600083015261228081612244565b9050919050565b7f6e6f7420636f6d706c69616e6365000000000000000000000000000000000000600082015250565b60006122bd600e83611ec4565b91506122c882612287565b602082019050919050565b600060208201905081810360008301526122ec816122b0565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000612329600683611ec4565b9150612334826122f3565b602082019050919050565b600060208201905081810360008301526123588161231c565b9050919050565b7f7573657220626c61636b6c697374656400000000000000000000000000000000600082015250565b6000612395601083611ec4565b91506123a08261235f565b602082019050919050565b600060208201905081810360008301526123c481612388565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061240582611fce565b915061241083611fce565b925082820261241e81611fce565b91508282048414831517612435576124346123cb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061247682611fce565b915061248183611fce565b9250826124915761249061243c565b5b828204905092915050565b60006124a782611fce565b91506124b283611fce565b92508282039050818111156124ca576124c96123cb565b5b92915050565b60006124db82611fce565b91506124e683611fce565b92508282019050808211156124fe576124fd6123cb565b5b92915050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b600061253a600983611ec4565b915061254582612504565b602082019050919050565b600060208201905081810360008301526125698161252d565b9050919050565b7f6e6f742070617573656400000000000000000000000000000000000000000000600082015250565b60006125a6600a83611ec4565b91506125b182612570565b602082019050919050565b600060208201905081810360008301526125d581612599565b9050919050565b7f626173697320706f696e74732073686f756c64206265206c657373207468656e60008201527f204d41585f42415349535f504f494e5453000000000000000000000000000000602082015250565b6000612638603183611ec4565b9150612643826125dc565b604082019050919050565b600060208201905081810360008301526126678161262b565b9050919050565b7f6e6f7420656e6f75676820746f6b656e7320746f2072656465656d0000000000600082015250565b60006126a4601b83611ec4565b91506126af8261266e565b602082019050919050565b600060208201905081810360008301526126d381612697565b9050919050565b7f757365722073686f756c6420626520626c61636b6c6973746564000000000000600082015250565b6000612710601a83611ec4565b915061271b826126da565b602082019050919050565b6000602082019050818103600083015261273f81612703565b9050919050565b600060408201905061275b6000830185612191565b61276860208301846120a7565b939250505056fea2646970667358221220c495746848264e13b91207030a82adf72dfba5e20bff1c65a0a9aeecc51cec9564736f6c63430008180033","optimization_enabled":false,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"optimization_runs":null,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/1/0xE820C06321E60d36257C666643Fa5436643445E3/","decoded_constructor_args":[["0xcf355aD32abF378F067fA93A28D96a767FEb7377",{"internalType":"address","name":"_owner","type":"address"}],["0xC8822fb37b7CbFeEdfAaFf4FE0B4Bbb3E5eb7833",{"internalType":"address","name":"_compliance","type":"address"}]],"compiler_version":"0.8.24+commit.e11b9ed9","is_verified_via_verifier_alliance":false,"verified_at":"2025-12-03T12:01:12.990369Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405260006008556000600960006101000a81548160ff0219169083151502179055503480156200003157600080fd5b5060405162002e9c38038062002e9c833981810160405281019062000057919062000296565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015620000c25750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b62000104576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000fb9062000364565b60405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006005819055506040518060400160405280600581526020017f5553444b4700000000000000000000000000000000000000000000000000000081525060009081620001d4919062000600565b506040518060400160405280600581526020017f5553444b47000000000000000000000000000000000000000000000000000000815250600190816200021b919062000600565b5060066002819055505050620006e7565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200025e8262000231565b9050919050565b620002708162000251565b81146200027c57600080fd5b50565b600081519050620002908162000265565b92915050565b60008060408385031215620002b057620002af6200022c565b5b6000620002c0858286016200027f565b9250506020620002d3858286016200027f565b9150509250929050565b600082825260208201905092915050565b7f4f776e657220616e6420436f6d706c69616e6365206d757374206265206e6f6e60008201527f207a65726f206164647265737365730000000000000000000000000000000000602082015250565b60006200034c602f83620002dd565b91506200035982620002ee565b604082019050919050565b600060208201905081810360008301526200037f816200033d565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200040857607f821691505b6020821081036200041e576200041d620003c0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000449565b62000494868362000449565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004e1620004db620004d584620004ac565b620004b6565b620004ac565b9050919050565b6000819050919050565b620004fd83620004c0565b620005156200050c82620004e8565b84845462000456565b825550505050565b600090565b6200052c6200051d565b62000539818484620004f2565b505050565b5b8181101562000561576200055560008262000522565b6001810190506200053f565b5050565b601f821115620005b0576200057a8162000424565b620005858462000439565b8101602085101562000595578190505b620005ad620005a48562000439565b8301826200053e565b50505b505050565b600082821c905092915050565b6000620005d560001984600802620005b5565b1980831691505092915050565b6000620005f08383620005c2565b9150826002028217905092915050565b6200060b8262000386565b67ffffffffffffffff81111562000627576200062662000391565b5b620006338254620003ef565b6200064082828562000565565b600060209050601f83116001811462000678576000841562000663578287015190505b6200066f8582620005e2565b865550620006df565b601f198416620006888662000424565b60005b82811015620006b2578489015182556001820191506020850194506020810190506200068b565b86831015620006d25784890151620006ce601f891682620005c2565b8355505b6001600288020188555050505b505050505050565b6127a580620006f76000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063dd62ed3e11610097578063e4997dc511610071578063e4997dc51461050b578063e63a391f14610527578063f3bdc22814610545578063f4ea93d814610561576101c4565b8063dd62ed3e1461048d578063dd644f72146104bd578063e47d6060146104db576101c4565b80638da5cb5b116100d35780638da5cb5b1461040557806395d89b4114610423578063a9059cbb14610441578063db006a7514610471576101c4565b806370a08231146103af5780638456cb59146103df578063867904b4146103e9576101c4565b80633eaaf86b1161016657806359ded2101161014057806359ded210146103275780635c658165146103435780635c975abb146103735780636290865d14610391576101c4565b80633eaaf86b146102cf5780633f4ba83a146102ed57806359bf1abe146102f7576101c4565b806318160ddd116101a257806318160ddd1461023357806323b872dd1461025157806327e235e314610281578063313ce567146102b1576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630ecb93c014610217575b600080fd5b6101d161057f565b6040516101de9190611f49565b60405180910390f35b61020160048036038101906101fc9190612004565b61060d565b60405161020e919061205f565b60405180910390f35b610231600480360381019061022c919061207a565b61076d565b005b61023b61088f565b60405161024891906120b6565b60405180910390f35b61026b600480360381019061026691906120d1565b610899565b604051610278919061205f565b60405180910390f35b61029b6004803603810190610296919061207a565b610e60565b6040516102a891906120b6565b60405180910390f35b6102b9610e78565b6040516102c691906120b6565b60405180910390f35b6102d7610e7e565b6040516102e491906120b6565b60405180910390f35b6102f5610e84565b005b610311600480360381019061030c919061207a565b610fac565b60405161031e919061205f565b60405180910390f35b610341600480360381019061033c9190612124565b611002565b005b61035d60048036038101906103589190612151565b611119565b60405161036a91906120b6565b60405180910390f35b61037b61113e565b604051610388919061205f565b60405180910390f35b610399611151565b6040516103a691906121a0565b60405180910390f35b6103c960048036038101906103c4919061207a565b611177565b6040516103d691906120b6565b60405180910390f35b6103e76111c0565b005b61040360048036038101906103fe9190612004565b6112e9565b005b61040d611423565b60405161041a91906121a0565b60405180910390f35b61042b611449565b6040516104389190611f49565b60405180910390f35b61045b60048036038101906104569190612004565b6114d7565b604051610468919061205f565b60405180910390f35b61048b60048036038101906104869190612124565b6118d7565b005b6104a760048036038101906104a29190612151565b611b1b565b6040516104b491906120b6565b60405180910390f35b6104c5611ba2565b6040516104d291906120b6565b60405180910390f35b6104f560048036038101906104f0919061207a565b611ba8565b604051610502919061205f565b60405180910390f35b6105256004803603810190610520919061207a565b611bc8565b005b61052f611cea565b60405161053c91906120b6565b60405180910390f35b61055f600480360381019061055a919061207a565b611cf0565b005b610569611eb4565b60405161057691906120b6565b60405180910390f35b6000805461058c906121ea565b80601f01602080910402602001604051908101604052809291908181526020018280546105b8906121ea565b80156106055780601f106105da57610100808354040283529160200191610605565b820191906000526020600020905b8154815290600101906020018083116105e857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490612267565b60405180910390fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161075b91906120b6565b60405180910390a36001905092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f4906122d3565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc8160405161088491906121a0565b60405180910390a150565b6000600554905090565b6000600960009054906101000a900460ff16156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e29061233f565b60405180910390fd5b83600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610970906123ab565b60405180910390fd5b33600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906123ab565b60405180910390fd5b6000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061271060085487610a9b91906123fa565b610aa5919061246b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821015610b5c578582610adb919061249c565b600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008187610b6a919061249c565b905086600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bb7919061249c565b600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c4591906124d0565b600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000821115610deb578160066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cfe91906124d0565b60066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610de291906120b6565b60405180910390a35b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e4891906120b6565b60405180910390a36001955050505050509392505050565b60066020528060005260406000206000915090505481565b60025481565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90612550565b60405180910390fd5b600960009054906101000a900460ff16610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a906125bc565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990612550565b60405180910390fd5b60148111156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd9061264e565b60405180910390fd5b806008819055507f2696a6358e16692f320e4570c01170fd423f0f4acbc8d0120c42a33e5d2e154a60085460405161110e91906120b6565b60405180910390a150565b6007602052816000526040600020602052806000526040600020600091509150505481565b600960009054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790612550565b60405180910390fd5b600960009054906101000a900460ff16156112a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112979061233f565b60405180910390fd5b6001600960006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090612550565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c891906124d0565b9250508190555080600560008282546113e191906124d0565b925050819055507fcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a8160405161141791906120b6565b60405180910390a15050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054611456906121ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611482906121ea565b80156114cf5780601f106114a4576101008083540402835291602001916114cf565b820191906000526020600020905b8154815290600101906020018083116114b257829003601f168201915b505050505081565b6000600960009054906101000a900460ff1615611529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115209061233f565b60405180910390fd5b33600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae906123ab565b60405180910390fd5b6000612710600854856115ca91906123fa565b6115d4919061246b565b9050600081856115e4919061249c565b905084600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611631919061249c565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116bf91906124d0565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000821115611865578160066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461177891906124d0565b60066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161185c91906120b6565b60405180910390a35b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118c291906120b6565b60405180910390a36001935050505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612550565b60405180910390fd5b8060055410156119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a3906126ba565b60405180910390fd5b8060066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a47906126ba565b60405180910390fd5b8060056000828254611a62919061249c565b925050819055508060066000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ada919061249c565b925050819055507f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a4481604051611b1091906120b6565b60405180910390a150565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60085481565b600a6020528060005260406000206000915054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f906122d3565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c81604051611cdf91906121a0565b60405180910390a150565b61271081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d77906122d3565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390612726565b60405180910390fd5b6000611e1782611177565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060056000828254611e70919061249c565b925050819055507f61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c68282604051611ea8929190612746565b60405180910390a15050565b601481565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ef3578082015181840152602081019050611ed8565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f1b82611eb9565b611f258185611ec4565b9350611f35818560208601611ed5565b611f3e81611eff565b840191505092915050565b60006020820190508181036000830152611f638184611f10565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f9b82611f70565b9050919050565b611fab81611f90565b8114611fb657600080fd5b50565b600081359050611fc881611fa2565b92915050565b6000819050919050565b611fe181611fce565b8114611fec57600080fd5b50565b600081359050611ffe81611fd8565b92915050565b6000806040838503121561201b5761201a611f6b565b5b600061202985828601611fb9565b925050602061203a85828601611fef565b9150509250929050565b60008115159050919050565b61205981612044565b82525050565b60006020820190506120746000830184612050565b92915050565b6000602082840312156120905761208f611f6b565b5b600061209e84828501611fb9565b91505092915050565b6120b081611fce565b82525050565b60006020820190506120cb60008301846120a7565b92915050565b6000806000606084860312156120ea576120e9611f6b565b5b60006120f886828701611fb9565b935050602061210986828701611fb9565b925050604061211a86828701611fef565b9150509250925092565b60006020828403121561213a57612139611f6b565b5b600061214884828501611fef565b91505092915050565b6000806040838503121561216857612167611f6b565b5b600061217685828601611fb9565b925050602061218785828601611fb9565b9150509250929050565b61219a81611f90565b82525050565b60006020820190506121b56000830184612191565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061220257607f821691505b602082108103612215576122146121bb565b5b50919050565b7f63616c6c65722063616e2774206265207a65726f206164647265737300000000600082015250565b6000612251601c83611ec4565b915061225c8261221b565b602082019050919050565b6000602082019050818103600083015261228081612244565b9050919050565b7f6e6f7420636f6d706c69616e6365000000000000000000000000000000000000600082015250565b60006122bd600e83611ec4565b91506122c882612287565b602082019050919050565b600060208201905081810360008301526122ec816122b0565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000612329600683611ec4565b9150612334826122f3565b602082019050919050565b600060208201905081810360008301526123588161231c565b9050919050565b7f7573657220626c61636b6c697374656400000000000000000000000000000000600082015250565b6000612395601083611ec4565b91506123a08261235f565b602082019050919050565b600060208201905081810360008301526123c481612388565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061240582611fce565b915061241083611fce565b925082820261241e81611fce565b91508282048414831517612435576124346123cb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061247682611fce565b915061248183611fce565b9250826124915761249061243c565b5b828204905092915050565b60006124a782611fce565b91506124b283611fce565b92508282039050818111156124ca576124c96123cb565b5b92915050565b60006124db82611fce565b91506124e683611fce565b92508282019050808211156124fe576124fd6123cb565b5b92915050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b600061253a600983611ec4565b915061254582612504565b602082019050919050565b600060208201905081810360008301526125698161252d565b9050919050565b7f6e6f742070617573656400000000000000000000000000000000000000000000600082015250565b60006125a6600a83611ec4565b91506125b182612570565b602082019050919050565b600060208201905081810360008301526125d581612599565b9050919050565b7f626173697320706f696e74732073686f756c64206265206c657373207468656e60008201527f204d41585f42415349535f504f494e5453000000000000000000000000000000602082015250565b6000612638603183611ec4565b9150612643826125dc565b604082019050919050565b600060208201905081810360008301526126678161262b565b9050919050565b7f6e6f7420656e6f75676820746f6b656e7320746f2072656465656d0000000000600082015250565b60006126a4601b83611ec4565b91506126af8261266e565b602082019050919050565b600060208201905081810360008301526126d381612697565b9050919050565b7f757365722073686f756c6420626520626c61636b6c6973746564000000000000600082015250565b6000612710601a83611ec4565b915061271b826126da565b602082019050919050565b6000602082019050818103600083015261273f81612703565b9050919050565b600060408201905061275b6000830185612191565b61276860208301846120a7565b939250505056fea2646970667358221220c495746848264e13b91207030a82adf72dfba5e20bff1c65a0a9aeecc51cec9564736f6c63430008180033000000000000000000000000cf355ad32abf378f067fa93a28d96a767feb7377000000000000000000000000c8822fb37b7cbfeedfaaff4fe0b4bbb3e5eb7833","name":"USDKG","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"@openzeppelin/contracts/token/ERC20/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_compliance","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_blackListedUser","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"DestroyedBlackFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeBasisPoints","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"}],"name":"RemovedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"FEE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_evilUser","type":"address"}],"name":"addBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basisPointsRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compliance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"issue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clearedUser","type":"address"}],"name":"removeBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBasisPoints","type":"uint256"}],"name":"setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x000000000000000000000000cf355ad32abf378f067fa93a28d96a767feb7377000000000000000000000000c8822fb37b7cbfeedfaaff4fe0b4bbb3e5eb7833"}